xref: /xnu-11215.61.5/osfmk/mach/i386/vm_param.h (revision 4f1223e81cd707a65cc109d0b8ad6653699da3c4)
1 /*
2  * Copyright (c) 2000-2012 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * @OSF_COPYRIGHT@
30  */
31 /*
32  * Mach Operating System
33  * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University
34  * All Rights Reserved.
35  *
36  * Permission to use, copy, modify and distribute this software and its
37  * documentation is hereby granted, provided that both the copyright
38  * notice and this permission notice appear in all copies of the
39  * software, derivative works or modified versions, and any portions
40  * thereof, and that both notices appear in supporting documentation.
41  *
42  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
43  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
44  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
45  *
46  * Carnegie Mellon requests users of this software to return to
47  *
48  *  Software Distribution Coordinator  or  [email protected]
49  *  School of Computer Science
50  *  Carnegie Mellon University
51  *  Pittsburgh PA 15213-3890
52  *
53  * any improvements or extensions that they make and grant Carnegie Mellon
54  * the rights to redistribute these changes.
55  */
56 
57 /*
58  * Copyright (c) 1994 The University of Utah and
59  * the Computer Systems Laboratory at the University of Utah (CSL).
60  * All rights reserved.
61  *
62  * Permission to use, copy, modify and distribute this software is hereby
63  * granted provided that (1) source code retains these copyright, permission,
64  * and disclaimer notices, and (2) redistributions including binaries
65  * reproduce the notices in supporting documentation, and (3) all advertising
66  * materials mentioning features or use of this software display the following
67  * acknowledgement: ``This product includes software developed by the
68  * Computer Systems Laboratory at the University of Utah.''
69  *
70  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
71  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
72  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
73  *
74  * CSL requests users of this software to return to [email protected] any
75  * improvements that they make and grant CSL redistribution rights.
76  *
77  */
78 
79 /*
80  *	File:	vm_param.h
81  *	Author:	Avadis Tevanian, Jr.
82  *	Date:	1985
83  *
84  *	I386 machine dependent virtual memory parameters.
85  *	Most of the declarations are preceeded by I386_ (or i386_)
86  *	which is OK because only I386 specific code will be using
87  *	them.
88  */
89 
90 #ifndef _MACH_I386_VM_PARAM_H_
91 #define _MACH_I386_VM_PARAM_H_
92 
93 #if defined (__i386__) || defined (__x86_64__)
94 
95 #if !defined(KERNEL) && !defined(__ASSEMBLER__)
96 
97 #include <mach/vm_page_size.h>
98 #endif
99 
100 #define BYTE_SIZE               8               /* byte size in bits */
101 
102 #define I386_PGBYTES            4096            /* bytes per 80386 page */
103 #define I386_PGSHIFT            12              /* bitshift for pages */
104 
105 #if defined(KERNEL)
106 
107 #define PAGE_SIZE               I386_PGBYTES
108 #define PAGE_SHIFT              I386_PGSHIFT
109 #define PAGE_MASK               (PAGE_SIZE - 1)
110 
111 #define PAGE_MAX_SHIFT          PAGE_SHIFT
112 #define PAGE_MAX_SIZE           PAGE_SIZE
113 #define PAGE_MAX_MASK           PAGE_MASK
114 
115 #define PAGE_MIN_SHIFT          PAGE_SHIFT
116 #define PAGE_MIN_SIZE           PAGE_SIZE
117 #define PAGE_MIN_MASK           PAGE_MASK
118 
119 #define I386_LPGBYTES           2*1024*1024     /* bytes per large page */
120 #define I386_LPGSHIFT           21              /* bitshift for large pages */
121 #define I386_LPGMASK            (I386_LPGBYTES-1)
122 
123 /*
124  *	Convert bytes to pages and convert pages to bytes.
125  *	No rounding is used.
126  */
127 
128 #define i386_btop(x)            ((ppnum_t)((x) >> I386_PGSHIFT))
129 #define machine_btop(x)         i386_btop(x)
130 #define i386_ptob(x)            (((pmap_paddr_t)(x)) << I386_PGSHIFT)
131 #define machine_ptob(x)         i386_ptob(x)
132 
133 /*
134  *	Round off or truncate to the nearest page.  These will work
135  *	for either addresses or counts.  (i.e. 1 byte rounds to 1 page
136  *	bytes.
137  */
138 
139 #define i386_round_page(x)      ((((pmap_paddr_t)(x)) + I386_PGBYTES - 1) & \
140 	                                ~(I386_PGBYTES-1))
141 #define i386_trunc_page(x)      (((pmap_paddr_t)(x)) & ~(I386_PGBYTES-1))
142 
143 #else /* KERNEL */
144 
145 #if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || (__MAC_OS_X_VERSION_MIN_REQUIRED < 101600)
146 #define PAGE_SHIFT              I386_PGSHIFT
147 #define PAGE_SIZE               I386_PGBYTES
148 #define PAGE_MASK               (PAGE_SIZE-1)
149 #else /* !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || (__MAC_OS_X_VERSION_MIN_REQUIRED < 101600) */
150 #define PAGE_SHIFT              vm_page_shift
151 #define PAGE_SIZE               vm_page_size
152 #define PAGE_MASK               vm_page_mask
153 #endif /* !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || (__MAC_OS_X_VERSION_MIN_REQUIRED < 101600) */
154 
155 #define PAGE_MAX_SHIFT          14
156 #define PAGE_MAX_SIZE           (1 << PAGE_MAX_SHIFT)
157 #define PAGE_MAX_MASK           (PAGE_MAX_SIZE-1)
158 
159 #define PAGE_MIN_SHIFT          12
160 #define PAGE_MIN_SIZE           (1 << PAGE_MIN_SHIFT)
161 #define PAGE_MIN_MASK           (PAGE_MIN_SIZE-1)
162 
163 #endif /* KERNEL */
164 
165 #define VM_MIN_ADDRESS64        ((user_addr_t) 0x0000000000000000ULL)
166 /*
167  * Default top of user stack, grows down from here.
168  * Address chosen to be 1G (3rd level page table entry) below SHARED_REGION_BASE_X86_64
169  * minus additional 1Meg (1/2 1st level page table coverage) to allow a redzone after it.
170  */
171 #define VM_USRSTACK64           ((user_addr_t) (0x00007FF7C0000000ull - (1024 * 1024)))
172 
173 /*
174  * XXX TODO: Obsolete?
175  */
176 #define VM_DYLD64               ((user_addr_t) 0x00007FFF5FC00000ULL)
177 #define VM_LIB64_SHR_DATA       ((user_addr_t) 0x00007FFF60000000ULL)
178 #define VM_LIB64_SHR_TEXT       ((user_addr_t) 0x00007FFF80000000ULL)
179 /*
180  * the end of the usable user address space , for now about 47 bits.
181  * the 64 bit commpage is past the end of this
182  */
183 #define VM_MAX_PAGE_ADDRESS     ((user_addr_t) 0x00007FFFFFE00000ULL)
184 /*
185  * canonical end of user address space for limits checking
186  */
187 #define VM_MAX_USER_PAGE_ADDRESS ((user_addr_t)0x00007FFFFFFFF000ULL)
188 
189 
190 /* system-wide values */
191 #define MACH_VM_MIN_ADDRESS             ((mach_vm_offset_t) 0)
192 #define MACH_VM_MAX_ADDRESS             ((mach_vm_offset_t) VM_MAX_PAGE_ADDRESS)
193 
194 /* process-relative values (all 32-bit legacy only for now) */
195 #define VM_MIN_ADDRESS          ((vm_offset_t) 0)
196 #define VM_USRSTACK32           ((vm_offset_t) 0xC0000000)      /* ASLR slides stack down by up to 1 MB */
197 #define VM_MAX_ADDRESS          ((vm_offset_t) 0xFFE00000)
198 
199 
200 #ifdef  KERNEL_PRIVATE
201 
202 #define TEST_PAGE_SIZE_16K      FALSE
203 #define TEST_PAGE_SIZE_4K       TRUE
204 
205 /* Kernel-wide values */
206 #define KB              (1024ULL)
207 #define MB              (1024*KB)
208 #define GB              (1024*MB)
209 
210 /*
211  * Maximum physical memory supported.
212  */
213 #define K64_MAXMEM      (2048*GB)
214 #define KERNEL_MAXMEM   K64_MAXMEM
215 
216 /*
217  * +-----------------------+--------+--------+------------------------+
218  * | 0xffff_ffff_ffff_efff |  -4096 | ~512GB | VM_MAX_KERNEL_ADDRESS  |
219  * +-----------------------+--------+--------+------------------------+
220  * | 0xffff_ff80_0000_0000 | -512GB |    0GB | VM_MIN_KERNEL_ADDRESS  |
221  * |                       |        |        | PMAP_HEAP_RANGE_START  |
222  * +-----------------------+--------+--------+------------------------+
223  */
224 
225 #define KERNEL_IMAGE_TO_PHYS(x) (x)
226 #define VM_KERNEL_POINTER_SIGNIFICANT_BITS 39
227 #define VM_MIN_KERNEL_ADDRESS           ((vm_offset_t) 0xFFFFFF8000000000UL)
228 #define VM_MIN_KERNEL_PAGE              ((ppnum_t)0)
229 #define VM_MIN_KERNEL_AND_KEXT_ADDRESS  (VM_MIN_KERNEL_ADDRESS - 0x80000000ULL)
230 #define VM_MAX_KERNEL_ADDRESS           ((vm_offset_t) 0xFFFFFFFFFFFFEFFFUL)
231 #define VM_MAX_KERNEL_ADDRESS_EFI32     ((vm_offset_t) 0xFFFFFF80FFFFEFFFUL)
232 #define KEXT_ALLOC_MAX_OFFSET           (2 * 1024 * 1024 * 1024UL)
233 #define KEXT_ALLOC_BASE(x)              ((x) - KEXT_ALLOC_MAX_OFFSET)
234 #define KEXT_ALLOC_SIZE(x)              (KEXT_ALLOC_MAX_OFFSET - (x))
235 
236 #define VM_USER_STRIP_PTR(_v) (_v)
237 #define VM_KERNEL_STRIP_PTR(_v) (_v)
238 #define VM_KERNEL_STRIP_UPTR(_v) (_v)
239 
240 #define VM_KERNEL_ADDRESS(va) \
241 	(((vm_address_t)(va) >= VM_MIN_KERNEL_AND_KEXT_ADDRESS) && \
242 	((vm_address_t)(va)  <= VM_MAX_KERNEL_ADDRESS))
243 
244 #define VM_MAP_MIN_ADDRESS      MACH_VM_MIN_ADDRESS
245 #define VM_MAP_MAX_ADDRESS      MACH_VM_MAX_ADDRESS
246 
247 /* FIXME  - always leave like this? */
248 #if KASAN
249 /* Increase the stack sizes to account for the redzones that get added to every
250  * stack object. */
251 # define INTSTACK_SIZE (I386_PGBYTES*4*4)
252 # define KERNEL_STACK_SIZE (I386_PGBYTES*4*4)
253 #elif DEBUG
254 # define INTSTACK_SIZE (I386_PGBYTES*4)
255 # define KERNEL_STACK_SIZE (I386_PGBYTES*6)
256 #else
257 /*
258  * KERNEL_STACK_MULTIPLIER can be defined externally to get a larger
259  * kernel stack size. For example, adding "-DKERNEL_STACK_MULTIPLIER=2"
260  * helps avoid kernel stack overflows when compiling with "-O0".
261  */
262 #ifndef KERNEL_STACK_MULTIPLIER
263 #define KERNEL_STACK_MULTIPLIER (1)
264 #endif /* KERNEL_STACK_MULTIPLIER */
265 # define INTSTACK_SIZE (I386_PGBYTES*4)
266 # define KERNEL_STACK_SIZE (I386_PGBYTES*4*KERNEL_STACK_MULTIPLIER)
267 #endif
268 
269 #ifdef  MACH_KERNEL_PRIVATE
270 
271 /* For implementing legacy 32-bit interfaces */
272 #define VM32_SUPPORT                    1
273 #define VM32_MIN_ADDRESS                ((vm32_offset_t) 0)
274 #define VM32_MAX_ADDRESS                ((vm32_offset_t) (VM_MAX_PAGE_ADDRESS & 0xFFFFFFFF))
275 
276 /*
277  * kalloc() parameters:
278  *
279  * Historically kalloc's underlying zones were power-of-2 sizes, with a
280  * KALLOC_MINSIZE of 16 bytes.  The allocator ensured that
281  * (sizeof == alignof) >= 16 for all kalloc allocations.
282  *
283  * Today kalloc may use zones with intermediate sizes, constrained by
284  * KALLOC_MINSIZE and a minimum alignment, expressed by KALLOC_LOG2_MINALIGN.
285  *
286  * The common alignment for LP64 is for longs and pointers i.e. 8 bytes.
287  */
288 #define KALLOC_MINSIZE          16      /* minimum allocation size */
289 #define KALLOC_LOG2_MINALIGN    4       /* log2 minimum alignment */
290 
291 #define LINEAR_KERNEL_ADDRESS   ((vm_offset_t) 0x00000000)
292 
293 #define VM_MIN_KERNEL_LOADED_ADDRESS    ((vm_offset_t) 0xFFFFFF8000000000UL)
294 #define VM_MAX_KERNEL_LOADED_ADDRESS    ((vm_offset_t) 0xFFFFFF801FFFFFFFUL)
295 
296 /*
297  *	Conversion between 80386 pages and VM pages
298  */
299 
300 #define trunc_i386_to_vm(p)     (atop(trunc_page(i386_ptob(p))))
301 #define round_i386_to_vm(p)     (atop(round_page(i386_ptob(p))))
302 #define vm_to_i386(p)           (i386_btop(ptoa(p)))
303 
304 #define PMAP_SET_CACHE_ATTR(mem, object, cache_attr, batch_pmap_op)     \
305 	MACRO_BEGIN                                                     \
306 	        pmap_set_cache_attributes(VM_PAGE_GET_PHYS_PAGE(mem), (cache_attr));    \
307 	        (object)->set_cache_attr = TRUE;                                \
308 	        (void) batch_pmap_op;                                   \
309 	MACRO_END
310 
311 #define PMAP_BATCH_SET_CACHE_ATTR(object, user_page_list, cache_attr, num_pages, batch_pmap_op) \
312 	MACRO_BEGIN                                                     \
313 	(void) user_page_list;                                          \
314 	(void) num_pages;                                               \
315 	(void) batch_pmap_op;                                           \
316 	MACRO_END
317 
318 #define IS_USERADDR64_CANONICAL(addr)                   \
319 	((addr) < (VM_MAX_USER_PAGE_ADDRESS))
320 
321 #endif  /* MACH_KERNEL_PRIVATE */
322 
323 #endif  /* KERNEL_PRIVATE */
324 
325 #endif /* defined (__i386__) || defined (__x86_64__) */
326 
327 #endif  /* _MACH_I386_VM_PARAM_H_ */
328