[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

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