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