1 | /* $NetBSD: uvm_param.h,v 1.35 2015/09/26 20:28:38 christos Exp $ */ |
2 | |
3 | /* |
4 | * Copyright (c) 1991, 1993 |
5 | * The Regents of the University of California. All rights reserved. |
6 | * |
7 | * This code is derived from software contributed to Berkeley by |
8 | * The Mach Operating System project at Carnegie-Mellon University. |
9 | * |
10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions |
12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. |
15 | * 2. Redistributions in binary form must reproduce the above copyright |
16 | * notice, this list of conditions and the following disclaimer in the |
17 | * documentation and/or other materials provided with the distribution. |
18 | * 3. Neither the name of the University nor the names of its contributors |
19 | * may be used to endorse or promote products derived from this software |
20 | * without specific prior written permission. |
21 | * |
22 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
23 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
24 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
25 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
27 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
28 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
29 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
31 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
32 | * SUCH DAMAGE. |
33 | * |
34 | * @(#)vm_param.h 8.2 (Berkeley) 1/9/95 |
35 | * |
36 | * |
37 | * Copyright (c) 1987, 1990 Carnegie-Mellon University. |
38 | * All rights reserved. |
39 | * |
40 | * Authors: Avadis Tevanian, Jr., Michael Wayne Young |
41 | * |
42 | * Permission to use, copy, modify and distribute this software and |
43 | * its documentation is hereby granted, provided that both the copyright |
44 | * notice and this permission notice appear in all copies of the |
45 | * software, derivative works or modified versions, and any portions |
46 | * thereof, and that both notices appear in supporting documentation. |
47 | * |
48 | * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" |
49 | * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND |
50 | * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. |
51 | * |
52 | * Carnegie Mellon requests users of this software to return to |
53 | * |
54 | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU |
55 | * School of Computer Science |
56 | * Carnegie Mellon University |
57 | * Pittsburgh PA 15213-3890 |
58 | * |
59 | * any improvements or extensions that they make and grant Carnegie the |
60 | * rights to redistribute these changes. |
61 | */ |
62 | |
63 | /* |
64 | * Machine independent virtual memory parameters. |
65 | */ |
66 | |
67 | #ifndef _VM_PARAM_ |
68 | #define _VM_PARAM_ |
69 | |
70 | #ifdef _KERNEL_OPT |
71 | #include "opt_modular.h" |
72 | #include "opt_uvm.h" |
73 | #endif |
74 | #ifdef _KERNEL |
75 | #include <sys/types.h> |
76 | #include <machine/vmparam.h> |
77 | #include <sys/resourcevar.h> |
78 | #endif |
79 | |
80 | #if defined(_KERNEL) |
81 | |
82 | #if defined(PAGE_SIZE) |
83 | |
84 | /* |
85 | * If PAGE_SIZE is defined at this stage, it must be a constant. |
86 | */ |
87 | |
88 | #if PAGE_SIZE == 0 |
89 | #error Invalid PAGE_SIZE definition |
90 | #endif |
91 | |
92 | /* |
93 | * If the platform does not need to support a variable PAGE_SIZE, |
94 | * then provide default values for MIN_PAGE_SIZE and MAX_PAGE_SIZE. |
95 | */ |
96 | |
97 | #if !defined(MIN_PAGE_SIZE) |
98 | #define MIN_PAGE_SIZE PAGE_SIZE |
99 | #endif /* ! MIN_PAGE_SIZE */ |
100 | |
101 | #if !defined(MAX_PAGE_SIZE) |
102 | #define MAX_PAGE_SIZE PAGE_SIZE |
103 | #endif /* ! MAX_PAGE_SIZE */ |
104 | |
105 | #else /* ! PAGE_SIZE */ |
106 | |
107 | /* |
108 | * PAGE_SIZE is not a constant; MIN_PAGE_SIZE and MAX_PAGE_SIZE must |
109 | * be defined. |
110 | */ |
111 | |
112 | #if !defined(MIN_PAGE_SIZE) |
113 | #error MIN_PAGE_SIZE not defined |
114 | #endif |
115 | |
116 | #if !defined(MAX_PAGE_SIZE) |
117 | #error MAX_PAGE_SIZE not defined |
118 | #endif |
119 | |
120 | #endif /* PAGE_SIZE */ |
121 | |
122 | /* |
123 | * MIN_PAGE_SIZE and MAX_PAGE_SIZE must be constants. |
124 | */ |
125 | |
126 | #if MIN_PAGE_SIZE == 0 |
127 | #error Invalid MIN_PAGE_SIZE definition |
128 | #endif |
129 | |
130 | #if MAX_PAGE_SIZE == 0 |
131 | #error Invalid MAX_PAGE_SIZE definition |
132 | #endif |
133 | |
134 | /* |
135 | * If MIN_PAGE_SIZE and MAX_PAGE_SIZE are not equal, then we must use |
136 | * non-constant PAGE_SIZE, et al for LKMs. |
137 | */ |
138 | #if (MIN_PAGE_SIZE != MAX_PAGE_SIZE) |
139 | #define __uvmexp_pagesize |
140 | #if defined(_LKM) || defined(_MODULE) |
141 | #undef PAGE_SIZE |
142 | #undef PAGE_MASK |
143 | #undef PAGE_SHIFT |
144 | #endif |
145 | #endif |
146 | |
147 | /* |
148 | * Now provide PAGE_SIZE, PAGE_MASK, and PAGE_SHIFT if we do not |
149 | * have ones that are compile-time constants. |
150 | */ |
151 | #if !defined(PAGE_SIZE) |
152 | extern const int *const uvmexp_pagesize; |
153 | extern const int *const uvmexp_pagemask; |
154 | extern const int *const uvmexp_pageshift; |
155 | #define PAGE_SIZE (*uvmexp_pagesize) /* size of page */ |
156 | #define PAGE_MASK (*uvmexp_pagemask) /* size of page - 1 */ |
157 | #define PAGE_SHIFT (*uvmexp_pageshift) /* bits to shift for pages */ |
158 | #endif /* PAGE_SIZE */ |
159 | |
160 | #endif /* _KERNEL */ |
161 | |
162 | /* |
163 | * CTL_VM identifiers |
164 | */ |
165 | #define VM_METER 1 /* struct vmmeter */ |
166 | #define VM_LOADAVG 2 /* struct loadavg */ |
167 | #define VM_UVMEXP 3 /* struct uvmexp */ |
168 | #define VM_NKMEMPAGES 4 /* kmem_map pages */ |
169 | #define VM_UVMEXP2 5 /* struct uvmexp_sysctl */ |
170 | #define VM_ANONMIN 6 |
171 | #define VM_EXECMIN 7 |
172 | #define VM_FILEMIN 8 |
173 | #define VM_MAXSLP 9 |
174 | #define VM_USPACE 10 |
175 | #define VM_ANONMAX 11 |
176 | #define VM_EXECMAX 12 |
177 | #define VM_FILEMAX 13 |
178 | #define VM_MINADDRESS 14 |
179 | #define VM_MAXADDRESS 15 |
180 | #define VM_PROC 16 /* process information */ |
181 | |
182 | #define VM_MAXID 17 /* number of valid vm ids */ |
183 | |
184 | #define VM_PROC_MAP 1 /* struct kinfo_vmentry */ |
185 | |
186 | #define CTL_VM_NAMES { \ |
187 | { 0, 0 }, \ |
188 | { "vmmeter", CTLTYPE_STRUCT }, \ |
189 | { "loadavg", CTLTYPE_STRUCT }, \ |
190 | { "uvmexp", CTLTYPE_STRUCT }, \ |
191 | { "nkmempages", CTLTYPE_INT }, \ |
192 | { "uvmexp2", CTLTYPE_STRUCT }, \ |
193 | { "anonmin", CTLTYPE_INT }, \ |
194 | { "execmin", CTLTYPE_INT }, \ |
195 | { "filemin", CTLTYPE_INT }, \ |
196 | { "maxslp", CTLTYPE_INT }, \ |
197 | { "uspace", CTLTYPE_INT }, \ |
198 | { "anonmax", CTLTYPE_INT }, \ |
199 | { "execmax", CTLTYPE_INT }, \ |
200 | { "filemax", CTLTYPE_INT }, \ |
201 | { "minaddress", CTLTYPE_LONG }, \ |
202 | { "maxaddress", CTLTYPE_LONG }, \ |
203 | { "proc", CTLTYPE_STRUCT }, \ |
204 | } |
205 | |
206 | #ifndef ASSEMBLER |
207 | /* |
208 | * Convert addresses to pages and vice versa. |
209 | * No rounding is used. |
210 | */ |
211 | #ifdef _KERNEL |
212 | #define atop(x) (((paddr_t)(x)) >> PAGE_SHIFT) |
213 | #define ptoa(x) (((paddr_t)(x)) << PAGE_SHIFT) |
214 | |
215 | /* |
216 | * Round off or truncate to the nearest page. These will work |
217 | * for either addresses or counts (i.e., 1 byte rounds to 1 page). |
218 | */ |
219 | #define round_page(x) (((x) + PAGE_MASK) & ~PAGE_MASK) |
220 | #define trunc_page(x) ((x) & ~PAGE_MASK) |
221 | |
222 | #ifndef VM_DEFAULT_ADDRESS_BOTTOMUP |
223 | #define VM_DEFAULT_ADDRESS_BOTTOMUP(da, sz) \ |
224 | round_page((vaddr_t)(da) + (vsize_t)maxdmap) |
225 | #endif |
226 | |
227 | #ifndef VM_DEFAULT_ADDRESS_TOPDOWN |
228 | #define VM_DEFAULT_ADDRESS_TOPDOWN(da, sz) \ |
229 | trunc_page(VM_MAXUSER_ADDRESS - MAXSSIZ - (sz)) |
230 | #endif |
231 | |
232 | extern int ubc_nwins; /* number of UBC mapping windows */ |
233 | extern int ubc_winshift; /* shift for a UBC mapping window */ |
234 | extern u_int uvm_emap_size; /* size of emap */ |
235 | |
236 | #else |
237 | /* out-of-kernel versions of round_page and trunc_page */ |
238 | #define round_page(x) \ |
239 | ((((vaddr_t)(x) + (vm_page_size - 1)) / vm_page_size) * \ |
240 | vm_page_size) |
241 | #define trunc_page(x) \ |
242 | ((((vaddr_t)(x)) / vm_page_size) * vm_page_size) |
243 | |
244 | #endif /* _KERNEL */ |
245 | |
246 | /* |
247 | * typedefs, necessary for standard UVM headers. |
248 | */ |
249 | |
250 | typedef unsigned int uvm_flag_t; |
251 | |
252 | typedef int vm_inherit_t; /* XXX: inheritance codes */ |
253 | typedef off_t voff_t; /* XXX: offset within a uvm_object */ |
254 | typedef voff_t pgoff_t; /* XXX: number of pages within a uvm object */ |
255 | |
256 | #endif /* ASSEMBLER */ |
257 | #endif /* _VM_PARAM_ */ |
258 | |