Annotation of sys/arch/vax/include/pmap.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: pmap.h,v 1.28 2007/04/22 10:05:51 miod Exp $ */
2: /* $NetBSD: pmap.h,v 1.37 1999/08/01 13:48:07 ragge Exp $ */
3:
4: /*
5: * Copyright (c) 1987 Carnegie-Mellon University
6: * Copyright (c) 1991 Regents of the University of California.
7: * All rights reserved.
8: *
9: * Changed for the VAX port. /IC
10: *
11: * This code is derived from software contributed to Berkeley by
12: * the Systems Programming Group of the University of Utah Computer
13: * Science Department.
14: *
15: * Redistribution and use in source and binary forms, with or without
16: * modification, are permitted provided that the following conditions
17: * are met:
18: * 1. Redistributions of source code must retain the above copyright
19: * notice, this list of conditions and the following disclaimer.
20: * 2. Redistributions in binary form must reproduce the above copyright
21: * notice, this list of conditions and the following disclaimer in the
22: * documentation and/or other materials provided with the distribution.
23: * 3. Neither the name of the University nor the names of its contributors
24: * may be used to endorse or promote products derived from this software
25: * without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37: * SUCH DAMAGE.
38: *
39: * @(#)pmap.h 7.6 (Berkeley) 5/10/91
40: */
41:
42:
43: #ifndef PMAP_H
44: #define PMAP_H
45:
46: #include <machine/pte.h>
47: #include <machine/mtpr.h>
48: #include <machine/pcb.h>
49:
50: /*
51: * Some constants to make life easier.
52: */
53: #define LTOHPS (PGSHIFT - VAX_PGSHIFT)
54: #define LTOHPN (1 << LTOHPS)
55: #define USRPTSIZE ((MAXTSIZ + 40*1024*1024 + MAXSSIZ) / VAX_NBPG)
56: #define NPTEPGS (USRPTSIZE / (sizeof(pt_entry_t) * LTOHPN))
57:
58: /*
59: * Pmap structure
60: * pm_stack holds lowest allocated memory for the process stack.
61: */
62:
63: typedef struct pmap {
64: vaddr_t pm_stack; /* Base of alloced p1 pte space */
65: int ref_count; /* reference count */
66: pt_entry_t *pm_p0br; /* page 0 base register */
67: long pm_p0lr; /* page 0 length register */
68: pt_entry_t *pm_p1br; /* page 1 base register */
69: long pm_p1lr; /* page 1 length register */
70: int pm_lock; /* Lock entry in MP environment */
71: struct pmap_statistics pm_stats; /* Some statistics */
72: u_char pm_refcnt[NPTEPGS]; /* Refcount per pte page */
73: } *pmap_t;
74:
75: /*
76: * For each vm_page_t, there is a list of all currently valid virtual
77: * mappings of that page. An entry is a pv_entry_t.
78: */
79:
80: struct pv_entry {
81: struct pv_entry *pv_next; /* next pv_entry */
82: pt_entry_t *pv_pte; /* pte for this physical page */
83: struct pmap *pv_pmap; /* pmap this entry belongs to */
84: };
85:
86: /* ROUND_PAGE used before vm system is initialized */
87: #define ROUND_PAGE(x) (((uint)(x) + PGOFSET) & ~PGOFSET)
88: #define TRUNC_PAGE(x) ((uint)(x) & ~PGOFSET)
89:
90: /* Mapping macros used when allocating SPT */
91: #define MAPVIRT(ptr, count) \
92: (vaddr_t)ptr = virtual_avail; \
93: virtual_avail += (count) * VAX_NBPG;
94:
95: #define MAPPHYS(ptr, count, perm) \
96: (paddr_t)ptr = avail_start + KERNBASE; \
97: avail_start += (count) * VAX_NBPG;
98:
99: #ifdef _KERNEL
100:
101: extern struct pmap kernel_pmap_store;
102:
103: #define pmap_kernel() (&kernel_pmap_store)
104:
105: /*
106: * Real nice (fast) routines to get the virtual address of a physical page
107: * (and vice versa).
108: */
109: #define pmap_map_direct(pg) (VM_PAGE_TO_PHYS(pg) | KERNBASE)
110: #define pmap_unmap_direct(va) PHYS_TO_VM_PAGE((va) & ~KERNBASE)
111: #define __HAVE_PMAP_DIRECT
112:
113: #define PMAP_STEAL_MEMORY
114:
115: /*
116: * This is the by far most used pmap routine. Make it inline.
117: */
118:
119: /* Routines that are best to define as macros */
120: #define pmap_phys_address(phys) ((u_int)(phys) << PGSHIFT)
121: #define pmap_copy(a,b,c,d,e) /* Dont do anything */
122: #define pmap_update(pm) /* nothing */
123: #define pmap_collect(pmap) /* No need so far */
124: #define pmap_remove(pmap, start, slut) pmap_protect(pmap, start, slut, 0)
125: #define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
126: #define pmap_deactivate(p) /* Dont do anything */
127: #define pmap_reference(pmap) (pmap)->ref_count++
128:
129: /* These can be done as efficient inline macros */
130: #define pmap_copy_page(srcpg, dstpg) do { \
131: paddr_t __src = VM_PAGE_TO_PHYS(srcpg); \
132: paddr_t __dst = VM_PAGE_TO_PHYS(dstpg); \
133: __asm__("addl3 $0x80000000,%0,r0;addl3 $0x80000000,%1,r1; \
134: movc3 $4096,(r0),(r1)" \
135: :: "r"(__src),"r"(__dst):"r0","r1","r2","r3","r4","r5"); \
136: } while (0)
137:
138: #define pmap_zero_page(pg) do { \
139: paddr_t __pa = VM_PAGE_TO_PHYS(pg); \
140: __asm__("addl3 $0x80000000,%0,r0;movc5 $0,(r0),$0,$4096,(r0)" \
141: :: "r"(__pa): "r0","r1","r2","r3","r4","r5"); \
142: } while (0)
143:
144: #define pmap_proc_iflush(p,va,len) /* nothing */
145: #define pmap_unuse_final(p) /* nothing */
146:
147: /* Prototypes */
148: void pmap_bootstrap(void);
149: vaddr_t pmap_map(vaddr_t, paddr_t, paddr_t, int);
150: void pmap_pinit(pmap_t);
151:
152: #endif /* _KERNEL */
153:
154: #endif /* PMAP_H */
CVSweb