Annotation of sys/arch/hppa/include/pmap.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: pmap.h,v 1.33 2004/08/06 22:39:12 deraadt Exp $ */
2:
3: /*
4: * Copyright (c) 2002-2004 Michael Shalayeff
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: *
16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
20: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26: * THE POSSIBILITY OF SUCH DAMAGE.
27: */
28:
29: #ifndef _MACHINE_PMAP_H_
30: #define _MACHINE_PMAP_H_
31:
32: #include <machine/pte.h>
33: #include <uvm/uvm_pglist.h>
34: #include <uvm/uvm_object.h>
35:
36: struct pmap {
37: struct uvm_object pm_obj; /* object (lck by object lock) */
38: #define pm_lock pm_obj.vmobjlock
39: struct vm_page *pm_ptphint;
40: struct vm_page *pm_pdir_pg; /* vm_page for pdir */
41: volatile u_int32_t *pm_pdir; /* page dir (read-only after create) */
42: pa_space_t pm_space; /* space id (read-only after create) */
43: u_int pm_pid; /* prot id (read-only after create) */
44:
45: struct pmap_statistics pm_stats;
46: };
47: typedef struct pmap *pmap_t;
48:
49: #define HPPA_MAX_PID 0xfffa
50: #define HPPA_SID_MAX 0x7ffd
51: #define HPPA_SID_KERNEL 0
52: #define HPPA_PID_KERNEL 2
53:
54: #define KERNEL_ACCESS_ID 1
55: #define KERNEL_TEXT_PROT (TLB_AR_KRX | (KERNEL_ACCESS_ID << 1))
56: #define KERNEL_DATA_PROT (TLB_AR_KRW | (KERNEL_ACCESS_ID << 1))
57:
58: struct pv_entry { /* locked by its list's pvh_lock */
59: struct pv_entry *pv_next;
60: struct pmap *pv_pmap; /* the pmap */
61: vaddr_t pv_va; /* the virtual address */
62: struct vm_page *pv_ptp; /* the vm_page of the PTP */
63: };
64:
65: /* also match the hardware tlb walker definition */
66: struct vp_entry {
67: u_int vp_tag;
68: u_int vp_tlbprot;
69: u_int vp_tlbpage;
70: u_int vp_ptr;
71: };
72:
73: #ifdef _KERNEL
74:
75: extern void gateway_page(void);
76: extern struct pmap kernel_pmap_store;
77:
78: #if defined(HP7100LC_CPU) || defined(HP7300LC_CPU)
79: extern int pmap_hptsize;
80: extern struct pdc_hwtlb pdc_hwtlb;
81: #endif
82:
83: /*
84: * pool quickmaps
85: */
86: #define pmap_map_direct(pg) ((vaddr_t)VM_PAGE_TO_PHYS(pg))
87: #define pmap_unmap_direct(va) PHYS_TO_VM_PAGE((paddr_t)(va))
88: #define __HAVE_PMAP_DIRECT
89:
90: /*
91: * according to the parisc manual aliased va's should be
92: * different by high 12 bits only.
93: */
94: #define PMAP_PREFER(o,h) do { \
95: vaddr_t pmap_prefer_hint; \
96: pmap_prefer_hint = (*(h) & HPPA_PGAMASK) | ((o) & HPPA_PGAOFF); \
97: if (pmap_prefer_hint < *(h)) \
98: pmap_prefer_hint += HPPA_PGALIAS; \
99: *(h) = pmap_prefer_hint; \
100: } while(0)
101:
102: #define pmap_sid2pid(s) (((s) + 1) << 1)
103: #define pmap_kernel() (&kernel_pmap_store)
104: #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
105: #define pmap_update(pm) (void)(pm)
106: #define pmap_copy(dpmap,spmap,da,len,sa)
107:
108: #define pmap_clear_modify(pg) pmap_changebit(pg, 0, PTE_PROT(TLB_DIRTY))
109: #define pmap_clear_reference(pg) pmap_changebit(pg, PTE_PROT(TLB_REFTRAP), 0)
110: #define pmap_is_modified(pg) pmap_testbit(pg, PTE_PROT(TLB_DIRTY))
111: #define pmap_is_referenced(pg) pmap_testbit(pg, PTE_PROT(TLB_REFTRAP))
112: #define pmap_phys_address(ppn) ((ppn) << PAGE_SHIFT)
113:
114: #define pmap_proc_iflush(p,va,len) /* nothing */
115: #define pmap_unuse_final(p) /* nothing */
116:
117: void pmap_bootstrap(vaddr_t);
118: boolean_t pmap_changebit(struct vm_page *, u_int, u_int);
119: boolean_t pmap_testbit(struct vm_page *, u_int);
120: void pmap_write_protect(struct pmap *, vaddr_t, vaddr_t, vm_prot_t);
121: void pmap_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva);
122: void pmap_page_remove(struct vm_page *pg);
123:
124: static __inline int
125: pmap_prot(struct pmap *pmap, int prot)
126: {
127: extern u_int hppa_prot[];
128: return (hppa_prot[prot] | (pmap == pmap_kernel()? 0 : TLB_USER));
129: }
130:
131: static __inline void
132: pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
133: {
134: if ((prot & UVM_PROT_WRITE) == 0) {
135: if (prot & (UVM_PROT_RX))
136: pmap_changebit(pg, 0, PTE_PROT(TLB_WRITE));
137: else
138: pmap_page_remove(pg);
139: }
140: }
141:
142: static __inline void
143: pmap_protect(struct pmap *pmap, vaddr_t sva, vaddr_t eva, vm_prot_t prot)
144: {
145: if ((prot & UVM_PROT_WRITE) == 0) {
146: if (prot & (UVM_PROT_RX))
147: pmap_write_protect(pmap, sva, eva, prot);
148: else
149: pmap_remove(pmap, sva, eva);
150: }
151: }
152:
153: #endif /* _KERNEL */
154: #endif /* _MACHINE_PMAP_H_ */
CVSweb