[BACK]Return to pmap.h CVS log [TXT][DIR] Up to [local] / sys / arch / hppa64 / include

Annotation of sys/arch/hppa64/include/pmap.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: pmap.h,v 1.1 2005/04/01 10:40:48 mickey Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2005 Michael Shalayeff
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Permission to use, copy, modify, and distribute this software for any
        !             8:  * purpose with or without fee is hereby granted, provided that the above
        !             9:  * copyright notice and this permission notice appear in all copies.
        !            10:  *
        !            11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            15:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
        !            16:  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            17:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            18:  */
        !            19:
        !            20: #ifndef _MACHINE_PMAP_H_
        !            21: #define _MACHINE_PMAP_H_
        !            22:
        !            23: #include <machine/pte.h>
        !            24: #include <uvm/uvm_pglist.h>
        !            25: #include <uvm/uvm_object.h>
        !            26:
        !            27: struct pmap {
        !            28:        simple_lock_data_t pm_lock;
        !            29:        int             pm_refcount;
        !            30:        struct vm_page  *pm_ptphint;
        !            31:        struct pglist   pm_pglist;
        !            32:        volatile u_int32_t *pm_pdir;    /* page dir (read-only after create) */
        !            33:        pa_space_t      pm_space;       /* space id (read-only after create) */
        !            34:
        !            35:        struct pmap_statistics  pm_stats;
        !            36: };
        !            37: typedef struct pmap *pmap_t;
        !            38:
        !            39: struct pv_entry {                      /* locked by its list's pvh_lock */
        !            40:        struct pv_entry *pv_next;
        !            41:        struct pmap     *pv_pmap;       /* the pmap */
        !            42:        vaddr_t         pv_va;          /* the virtual address */
        !            43:        struct vm_page  *pv_ptp;        /* the vm_page of the PTP */
        !            44: };
        !            45:
        !            46: #ifdef _KERNEL
        !            47:
        !            48: extern struct pmap kernel_pmap_store;
        !            49:
        !            50: /*
        !            51:  * pool quickmaps
        !            52:  */
        !            53: #define        pmap_map_direct(pg)     ((vaddr_t)VM_PAGE_TO_PHYS(pg))
        !            54: #define        pmap_unmap_direct(va) PHYS_TO_VM_PAGE((paddr_t)(va))
        !            55: #define        __HAVE_PMAP_DIRECT
        !            56:
        !            57: /*
        !            58:  * according to the parisc manual aliased va's should be
        !            59:  * different by high 12 bits only.
        !            60:  */
        !            61: #define        PMAP_PREFER(o,h)        do {                                    \
        !            62:        vaddr_t pmap_prefer_hint;                                       \
        !            63:        pmap_prefer_hint = (*(h) & HPPA_PGAMASK) | ((o) & HPPA_PGAOFF); \
        !            64:        if (pmap_prefer_hint < *(h))                                    \
        !            65:                pmap_prefer_hint += HPPA_PGALIAS;                       \
        !            66:        *(h) = pmap_prefer_hint;                                        \
        !            67: } while(0)
        !            68:
        !            69: #define        PMAP_GROWKERNEL
        !            70: #define        PMAP_STEAL_MEMORY
        !            71:
        !            72: #define        pmap_sid2pid(s)                 (((s) + 1) << 1)
        !            73: #define pmap_kernel()                  (&kernel_pmap_store)
        !            74: #define        pmap_resident_count(pmap)       ((pmap)->pm_stats.resident_count)
        !            75: #define        pmap_update(pm)                 (void)(pm)
        !            76: #define pmap_copy(dpmap,spmap,da,len,sa)
        !            77:
        !            78: #define pmap_clear_modify(pg)  pmap_changebit(pg, 0, PTE_DIRTY)
        !            79: #define pmap_clear_reference(pg) pmap_changebit(pg, PTE_REFTRAP, 0)
        !            80: #define pmap_is_modified(pg)   pmap_testbit(pg, PTE_DIRTY)
        !            81: #define pmap_is_referenced(pg) pmap_testbit(pg, PTE_REFTRAP)
        !            82: #define pmap_phys_address(ppn) ((ppn) << PAGE_SHIFT)
        !            83:
        !            84: #define pmap_proc_iflush(p,va,len)     /* nothing */
        !            85: #define pmap_unuse_final(p)            /* nothing */
        !            86:
        !            87: void pmap_bootstrap(vaddr_t);
        !            88: boolean_t pmap_changebit(struct vm_page *, pt_entry_t, pt_entry_t);
        !            89: boolean_t pmap_testbit(struct vm_page *, pt_entry_t);
        !            90: void pmap_write_protect(struct pmap *, vaddr_t, vaddr_t, vm_prot_t);
        !            91: void pmap_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva);
        !            92: void pmap_page_remove(struct vm_page *pg);
        !            93:
        !            94: static __inline void
        !            95: pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
        !            96: {
        !            97:        if ((prot & UVM_PROT_WRITE) == 0) {
        !            98:                if (prot & (UVM_PROT_RX))
        !            99:                        pmap_changebit(pg, 0, PTE_WRITE);
        !           100:                else
        !           101:                        pmap_page_remove(pg);
        !           102:        }
        !           103: }
        !           104:
        !           105: static __inline void
        !           106: pmap_protect(struct pmap *pmap, vaddr_t sva, vaddr_t eva, vm_prot_t prot)
        !           107: {
        !           108:        if ((prot & UVM_PROT_WRITE) == 0) {
        !           109:                if (prot & (UVM_PROT_RX))
        !           110:                        pmap_write_protect(pmap, sva, eva, prot);
        !           111:                else
        !           112:                        pmap_remove(pmap, sva, eva);
        !           113:        }
        !           114: }
        !           115:
        !           116: #endif /* _KERNEL */
        !           117: #endif /* _MACHINE_PMAP_H_ */

CVSweb