]> git.saurik.com Git - apple/xnu.git/blob - osfmk/mach/arm/vm_param.h
c9d7b44f1dde58fcba13f79165aedd960a261456
[apple/xnu.git] / osfmk / mach / arm / vm_param.h
1 /*
2 * Copyright (c) 2007 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 * FILE_ID: vm_param.h
30 */
31
32 /*
33 * ARM machine dependent virtual memory parameters.
34 */
35
36 #ifndef _MACH_ARM_VM_PARAM_H_
37 #define _MACH_ARM_VM_PARAM_H_
38
39 #if defined(KERNEL_PRIVATE) && __ARM_16K_PG__
40 #include <arm64/proc_reg.h>
41 #endif
42
43 #if !defined (KERNEL) && !defined (__ASSEMBLER__)
44 #include <mach/vm_page_size.h>
45 #endif
46
47 #define BYTE_SIZE 8 /* byte size in bits */
48
49 #if defined (KERNEL)
50
51 #ifndef __ASSEMBLER__
52
53 #ifdef __arm__
54 #define PAGE_SHIFT_CONST 12
55 #elif defined(__arm64__)
56 extern int PAGE_SHIFT_CONST;
57 #else
58 #error Unsupported arch
59 #endif
60
61 #if defined(KERNEL_PRIVATE) && __ARM_16K_PG__
62 #define PAGE_SHIFT ARM_PGSHIFT
63 #else
64 #define PAGE_SHIFT PAGE_SHIFT_CONST
65 #endif
66 #define PAGE_SIZE (1 << PAGE_SHIFT)
67 #define PAGE_MASK (PAGE_SIZE-1)
68
69 #define VM_PAGE_SIZE PAGE_SIZE
70
71 #define machine_ptob(x) ((x) << PAGE_SHIFT)
72
73 /*
74 * Defined for the purpose of testing the pmap advertised page
75 * size; this does not necessarily match the hardware page size.
76 */
77 #define TEST_PAGE_SIZE_16K ((PAGE_SHIFT_CONST == 14))
78 #define TEST_PAGE_SIZE_4K ((PAGE_SHIFT_CONST == 12))
79
80 #endif /* !__ASSEMBLER__ */
81
82 #else
83
84 #define PAGE_SHIFT vm_page_shift
85 #define PAGE_SIZE vm_page_size
86 #define PAGE_MASK vm_page_mask
87
88 #define VM_PAGE_SIZE vm_page_size
89
90 #define machine_ptob(x) ((x) << PAGE_SHIFT)
91
92 #endif
93
94 #define PAGE_MAX_SHIFT 14
95 #define PAGE_MAX_SIZE (1 << PAGE_MAX_SHIFT)
96 #define PAGE_MAX_MASK (PAGE_MAX_SIZE-1)
97
98 #define PAGE_MIN_SHIFT 12
99 #define PAGE_MIN_SIZE (1 << PAGE_MIN_SHIFT)
100 #define PAGE_MIN_MASK (PAGE_MIN_SIZE-1)
101
102 #define VM_MAX_PAGE_ADDRESS MACH_VM_MAX_ADDRESS
103
104 #ifndef __ASSEMBLER__
105
106 #ifdef MACH_KERNEL_PRIVATE
107
108 #define VM32_SUPPORT 1
109 #define VM32_MIN_ADDRESS ((vm32_offset_t) 0)
110 #define VM32_MAX_ADDRESS ((vm32_offset_t) (VM_MAX_ADDRESS & 0xFFFFFFFF))
111
112 /*
113 * kalloc() parameters:
114 *
115 * Historically kalloc's underlying zones were power-of-2 sizes, with a
116 * KALLOC_MINSIZE of 16 bytes. Thus the allocator ensured that
117 * (sizeof == alignof) >= 16 for all kalloc allocations.
118 *
119 * Today kalloc may use zones with intermediate (small) sizes, constrained by
120 * KALLOC_MINSIZE and a minimum alignment, expressed by KALLOC_LOG2_MINALIGN.
121 *
122 * Note that most dynamically allocated data structures contain more than
123 * one int/long/pointer member, so KALLOC_MINSIZE should probably start at 8.
124 */
125
126 #if defined (__arm__)
127
128 #define KALLOC_MINSIZE 8 /* minimum allocation size */
129 #define KALLOC_LOG2_MINALIGN 3 /* log2 minimum alignment */
130
131 #elif defined(__arm64__)
132
133 #define KALLOC_MINSIZE 16 /* minimum allocation size */
134 #define KALLOC_LOG2_MINALIGN 4 /* log2 minimum alignment */
135
136 #else
137 #error Unsupported arch
138 #endif
139
140 #if defined (__arm__)
141 /* existing zone map size limit moved from osfmk/vm/vm_init.c */
142 #define ZONE_MAP_MAX (1024 * 1024 * 1536) /* 1.5GB for 32bit systems */
143 #elif defined(__arm64__)
144 /*
145 * Limits the physical pages in the zone map
146 */
147 #define ZONE_MAP_MAX (31ULL << 30) /* 31GB for 64bit systems */
148 #else
149 #error Unsupported arch
150 #endif
151
152 #endif
153
154 #if defined (__arm__)
155
156 #define VM_MIN_ADDRESS ((vm_address_t) 0x00000000)
157 #define VM_MAX_ADDRESS ((vm_address_t) 0x80000000)
158
159 /* system-wide values */
160 #define MACH_VM_MIN_ADDRESS ((mach_vm_offset_t) 0)
161 #define MACH_VM_MAX_ADDRESS ((mach_vm_offset_t) VM_MAX_ADDRESS)
162
163 #elif defined (__arm64__)
164
165 #define VM_MIN_ADDRESS ((vm_address_t) 0x0000000000000000ULL)
166 #define VM_MAX_ADDRESS ((vm_address_t) 0x0000000080000000ULL)
167
168 /* system-wide values */
169 #define MACH_VM_MIN_ADDRESS_RAW 0x0ULL
170 #if defined(PLATFORM_MacOSX) || defined(PLATFORM_DriverKit)
171 #define MACH_VM_MAX_ADDRESS_RAW 0x00007FFFFE000000ULL
172 #else
173 #define MACH_VM_MAX_ADDRESS_RAW 0x0000000FC0000000ULL
174 #endif
175
176 #define MACH_VM_MIN_ADDRESS ((mach_vm_offset_t) MACH_VM_MIN_ADDRESS_RAW)
177 #define MACH_VM_MAX_ADDRESS ((mach_vm_offset_t) MACH_VM_MAX_ADDRESS_RAW)
178
179
180 #else /* defined(__arm64__) */
181 #error architecture not supported
182 #endif
183
184 #define VM_MAP_MIN_ADDRESS VM_MIN_ADDRESS
185 #define VM_MAP_MAX_ADDRESS VM_MAX_ADDRESS
186
187 #ifdef KERNEL
188
189 #if defined (__arm__)
190 #define VM_KERNEL_POINTER_SIGNIFICANT_BITS 31
191 #define VM_MIN_KERNEL_ADDRESS ((vm_address_t) 0x80000000)
192 #define VM_MAX_KERNEL_ADDRESS ((vm_address_t) 0xFFFEFFFF)
193 #define VM_HIGH_KERNEL_WINDOW ((vm_address_t) 0xFFFE0000)
194 #elif defined (__arm64__)
195 /*
196 * The minimum and maximum kernel address; some configurations may
197 * constrain the address space further.
198 */
199 #define TiB(x) ((0ULL + (x)) << 40)
200 #define GiB(x) ((0ULL + (x)) << 30)
201
202 #if XNU_KERNEL_PRIVATE
203 #if defined(ARM_LARGE_MEMORY)
204 /*
205 * +-----------------------+--------+--------+------------------------+
206 * | 0xffff_fe90_0000_0000 |-1472GB | 576GB | KASAN_SHADOW_MIN |
207 * | | | | VM_MAX_KERNEL_ADDRESS |
208 * +-----------------------+--------+--------+------------------------+
209 * | 0xffff_fe10_0000_0000 |-1984GB | 64GB | PMAP_HEAP_RANGE_START |
210 * +-----------------------+--------+--------+------------------------+
211 * | 0xffff_fe00_0700_4000 | | | VM_KERNEL_LINK_ADDRESS |
212 * +-----------------------+--------+--------+------------------------+
213 * | 0xffff_fe00_0000_0000 | -2TB | 0GB | VM_MIN_KERNEL_ADDRESS |
214 * | | | | LOW_GLOBALS |
215 * +-----------------------+--------+--------+------------------------+
216 */
217 #define VM_KERNEL_POINTER_SIGNIFICANT_BITS 41
218
219 // Kernel VA space starts at -2TB
220 #define VM_MIN_KERNEL_ADDRESS ((vm_address_t) (0ULL - TiB(2)))
221
222 // 1.25TB for static_memory_region, 512GB for kernel heap, 256GB for KASAN
223 #define VM_MAX_KERNEL_ADDRESS ((vm_address_t) (VM_MIN_KERNEL_ADDRESS + GiB(64) + GiB(512) - 1))
224 #else // ARM_LARGE_MEMORY
225 /*
226 * +-----------------------+--------+--------+------------------------+
227 * | 0xffff_fffc_0000_0000 | -16GB | 112GB | KASAN_SHADOW_MIN |
228 * | | | | VM_MAX_KERNEL_ADDRESS |
229 * +-----------------------+--------+--------+------------------------+
230 * | 0xffff_fff0_0700_4000 | | | VM_KERNEL_LINK_ADDRESS |
231 * +-----------------------+--------+--------+------------------------+
232 * | 0xffff_fff0_0000_0000 | -64GB | 64GB | LOW_GLOBALS |
233 * | | | | PMAP_HEAP_RANGE_START | <= H8
234 * +-----------------------+--------+--------+------------------------+
235 * | 0xffff_ffe0_0000_0000 | -128GB | 0GB | VM_MIN_KERNEL_ADDRESS |
236 * | | | | PMAP_HEAP_RANGE_START | >= H9
237 * +-----------------------+--------+--------+------------------------+
238 */
239 #define VM_KERNEL_POINTER_SIGNIFICANT_BITS 37
240 #define VM_MIN_KERNEL_ADDRESS ((vm_address_t) 0xffffffe000000000ULL)
241 #define VM_MAX_KERNEL_ADDRESS ((vm_address_t) 0xfffffffbffffffffULL)
242 #endif // ARM_LARGE_MEMORY
243
244 #else // !XNU_KERNEL_PRIVATE
245 // Inform kexts about largest possible kernel address space
246 #define VM_MIN_KERNEL_ADDRESS ((vm_address_t) (0ULL - TiB(2)))
247 #define VM_MAX_KERNEL_ADDRESS ((vm_address_t) 0xfffffffbffffffffULL)
248 #endif // XNU_KERNEL_PRIVATE
249 #else
250 #error architecture not supported
251 #endif
252
253 #define VM_MIN_KERNEL_AND_KEXT_ADDRESS VM_MIN_KERNEL_ADDRESS
254
255 #if __has_feature(ptrauth_calls)
256 #include <ptrauth.h>
257 #define VM_KERNEL_STRIP_PTR(_v) (ptrauth_strip((void *)(uintptr_t)(_v), ptrauth_key_asia))
258 #else /* !ptrauth_calls */
259 #define VM_KERNEL_STRIP_PTR(_v) (_v)
260 #endif /* ptrauth_calls */
261
262 #define VM_KERNEL_ADDRESS(_va) \
263 ((((vm_address_t)VM_KERNEL_STRIP_PTR(_va)) >= VM_MIN_KERNEL_ADDRESS) && \
264 (((vm_address_t)VM_KERNEL_STRIP_PTR(_va)) <= VM_MAX_KERNEL_ADDRESS))
265
266 #ifdef MACH_KERNEL_PRIVATE
267 /*
268 * Physical memory is mapped linearly at an offset virtual memory.
269 */
270 extern unsigned long gVirtBase, gPhysBase, gPhysSize;
271
272 #define isphysmem(a) (((vm_address_t)(a) - gPhysBase) < gPhysSize)
273 #define physmap_enclosed(a) isphysmem(a)
274
275 /*
276 * gPhysBase/Size only represent kernel-managed memory. These globals represent
277 * the actual DRAM base address and size as reported by iBoot through the device
278 * tree.
279 */
280 #include <stdint.h>
281 extern uint64_t gDramBase, gDramSize;
282 #define is_dram_addr(addr) (((uint64_t)(addr) - gDramBase) < gDramSize)
283
284 #if KASAN
285 /* Increase the stack sizes to account for the redzones that get added to every
286 * stack object. */
287 # define KERNEL_STACK_SIZE (4*4*4096)
288 #elif DEBUG
289 /**
290 * Increase the stack size to account for less efficient use of stack space when
291 * compiling with -O0.
292 */
293 # define KERNEL_STACK_SIZE (2*4*4096)
294 #else
295 /*
296 * KERNEL_STACK_MULTIPLIER can be defined externally to get a larger
297 * kernel stack size. For example, adding "-DKERNEL_STACK_MULTIPLIER=2"
298 * helps avoid kernel stack overflows when compiling with "-O0".
299 */
300 #ifndef KERNEL_STACK_MULTIPLIER
301 #define KERNEL_STACK_MULTIPLIER (1)
302 #endif /* KERNEL_STACK_MULTIPLIER */
303 # define KERNEL_STACK_SIZE (4*4096*KERNEL_STACK_MULTIPLIER)
304 #endif
305
306 #define INTSTACK_SIZE (4*4096)
307
308 #ifdef __arm64__
309 #define EXCEPSTACK_SIZE (4*4096)
310 #else
311 #define FIQSTACK_SIZE (4096)
312 #endif
313
314 #if defined (__arm__)
315 #define HIGH_EXC_VECTORS ((vm_address_t) 0xFFFF0000)
316 #endif
317
318 /*
319 * TODO: We're hardcoding the expected virtual TEXT base here;
320 * that gives us an ugly dependency on a linker argument in
321 * the make files. Clean this up, so we don't hardcode it
322 * twice; this is nothing but trouble.
323 */
324 #if defined (__arm__)
325 #define VM_KERNEL_LINK_ADDRESS ((vm_address_t) 0x80000000)
326 #elif defined (__arm64__)
327 /* VM_KERNEL_LINK_ADDRESS defined in makedefs/MakeInc.def for arm64 platforms */
328 #else
329 #error architecture not supported
330 #endif
331
332 #endif /* MACH_KERNEL_PRIVATE */
333 #endif /* KERNEL */
334
335 #endif /* !__ASSEMBLER__ */
336
337 #define SWI_SYSCALL 0x80
338
339 #endif /* _MACH_ARM_VM_PARAM_H_ */