1412042e2SAndrew Turner /*- 2412042e2SAndrew Turner * Copyright (c) 1990 The Regents of the University of California. 3412042e2SAndrew Turner * All rights reserved. 4412042e2SAndrew Turner * Copyright (c) 1994 John S. Dyson 5412042e2SAndrew Turner * All rights reserved. 6412042e2SAndrew Turner * 7412042e2SAndrew Turner * This code is derived from software contributed to Berkeley by 8412042e2SAndrew Turner * William Jolitz. 9412042e2SAndrew Turner * 10412042e2SAndrew Turner * Redistribution and use in source and binary forms, with or without 11412042e2SAndrew Turner * modification, are permitted provided that the following conditions 12412042e2SAndrew Turner * are met: 13412042e2SAndrew Turner * 1. Redistributions of source code must retain the above copyright 14412042e2SAndrew Turner * notice, this list of conditions and the following disclaimer. 15412042e2SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright 16412042e2SAndrew Turner * notice, this list of conditions and the following disclaimer in the 17412042e2SAndrew Turner * documentation and/or other materials provided with the distribution. 18f72c920cSEd Maste * 3. Neither the name of the University nor the names of its contributors 19412042e2SAndrew Turner * may be used to endorse or promote products derived from this software 20412042e2SAndrew Turner * without specific prior written permission. 21412042e2SAndrew Turner * 22412042e2SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23412042e2SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24412042e2SAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25412042e2SAndrew Turner * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26412042e2SAndrew Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27412042e2SAndrew Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28412042e2SAndrew Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29412042e2SAndrew Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30412042e2SAndrew Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31412042e2SAndrew Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32412042e2SAndrew Turner * SUCH DAMAGE. 33412042e2SAndrew Turner * from: FreeBSD: src/sys/i386/include/vmparam.h,v 1.33 2000/03/30 34412042e2SAndrew Turner */ 35412042e2SAndrew Turner 36d5d97bedSMike Karels #ifdef __arm__ 37d5d97bedSMike Karels #include <arm/vmparam.h> 38d5d97bedSMike Karels #else /* !__arm__ */ 39d5d97bedSMike Karels 40412042e2SAndrew Turner #ifndef _MACHINE_VMPARAM_H_ 41412042e2SAndrew Turner #define _MACHINE_VMPARAM_H_ 42412042e2SAndrew Turner 43412042e2SAndrew Turner /* 44412042e2SAndrew Turner * Virtual memory related constants, all in bytes 45412042e2SAndrew Turner */ 46412042e2SAndrew Turner #ifndef MAXTSIZ 47412042e2SAndrew Turner #define MAXTSIZ (1*1024*1024*1024) /* max text size */ 48412042e2SAndrew Turner #endif 49412042e2SAndrew Turner #ifndef DFLDSIZ 50412042e2SAndrew Turner #define DFLDSIZ (128*1024*1024) /* initial data size limit */ 51412042e2SAndrew Turner #endif 52412042e2SAndrew Turner #ifndef MAXDSIZ 53412042e2SAndrew Turner #define MAXDSIZ (1*1024*1024*1024) /* max data size */ 54412042e2SAndrew Turner #endif 55412042e2SAndrew Turner #ifndef DFLSSIZ 56412042e2SAndrew Turner #define DFLSSIZ (128*1024*1024) /* initial stack size limit */ 57412042e2SAndrew Turner #endif 58412042e2SAndrew Turner #ifndef MAXSSIZ 59412042e2SAndrew Turner #define MAXSSIZ (1*1024*1024*1024) /* max stack size */ 60412042e2SAndrew Turner #endif 61412042e2SAndrew Turner #ifndef SGROWSIZ 62412042e2SAndrew Turner #define SGROWSIZ (128*1024) /* amount to grow stack */ 63412042e2SAndrew Turner #endif 64412042e2SAndrew Turner 65412042e2SAndrew Turner /* 66412042e2SAndrew Turner * The physical address space is sparsely populated. 67412042e2SAndrew Turner */ 68412042e2SAndrew Turner #define VM_PHYSSEG_SPARSE 69412042e2SAndrew Turner 70412042e2SAndrew Turner /* 719ecd7fdeSWarner Losh * The number of PHYSSEG entries. 72412042e2SAndrew Turner */ 73412042e2SAndrew Turner #define VM_PHYSSEG_MAX 64 74412042e2SAndrew Turner 75412042e2SAndrew Turner /* 76b16b4c22SMark Johnston * Create three free page pools: VM_FREEPOOL_DEFAULT is the default pool from 77b16b4c22SMark Johnston * which physical pages are allocated and VM_FREEPOOL_DIRECT is the pool from 78b16b4c22SMark Johnston * which physical pages for page tables and small UMA objects are allocated. 794441dd40SMark Johnston * VM_FREEPOOL_LAZYINIT is a special-purpose pool that is populated only during 80b16b4c22SMark Johnston * boot and is used to implement deferred initialization of page structures. 81412042e2SAndrew Turner */ 82b16b4c22SMark Johnston #define VM_NFREEPOOL 3 83b16b4c22SMark Johnston #define VM_FREEPOOL_LAZYINIT 0 84b16b4c22SMark Johnston #define VM_FREEPOOL_DEFAULT 1 85b16b4c22SMark Johnston #define VM_FREEPOOL_DIRECT 2 86412042e2SAndrew Turner 87412042e2SAndrew Turner /* 8848d5dab7SMark Johnston * Create two free page lists: VM_FREELIST_DMA32 is for physical pages that have 8948d5dab7SMark Johnston * physical addresses below 4G, and VM_FREELIST_DEFAULT is for all other 9048d5dab7SMark Johnston * physical pages. 91412042e2SAndrew Turner */ 9248d5dab7SMark Johnston #define VM_NFREELIST 2 93412042e2SAndrew Turner #define VM_FREELIST_DEFAULT 0 9448d5dab7SMark Johnston #define VM_FREELIST_DMA32 1 95412042e2SAndrew Turner 96412042e2SAndrew Turner /* 97e59d2023SAlan Cox * When PAGE_SIZE is 4KB, an allocation size of 16MB is supported in order 98e59d2023SAlan Cox * to optimize the use of the direct map by UMA. Specifically, a 64-byte 99e59d2023SAlan Cox * cache line contains at most 8 L2 BLOCK entries, collectively mapping 16MB 100e59d2023SAlan Cox * of physical memory. By reducing the number of distinct 16MB "pages" that 101e59d2023SAlan Cox * are used by UMA, the physical memory allocator reduces the likelihood of 102e59d2023SAlan Cox * both 2MB page TLB misses and cache misses during the page table walk when 103e59d2023SAlan Cox * a 2MB page TLB miss does occur. 1049fabf976SEliot Solomon * 1059fabf976SEliot Solomon * When PAGE_SIZE is 16KB, an allocation size of 32MB is supported. This 1069fabf976SEliot Solomon * size is used by level 0 reservations and L2 BLOCK mappings. 107412042e2SAndrew Turner */ 1089fabf976SEliot Solomon #if PAGE_SIZE == PAGE_SIZE_4K 109e59d2023SAlan Cox #define VM_NFREEORDER 13 1109fabf976SEliot Solomon #elif PAGE_SIZE == PAGE_SIZE_16K 1119fabf976SEliot Solomon #define VM_NFREEORDER 12 1129fabf976SEliot Solomon #else 1139fabf976SEliot Solomon #error Unsupported page size 1149fabf976SEliot Solomon #endif 115412042e2SAndrew Turner 116412042e2SAndrew Turner /* 117*3e00c11aSAlan Cox * Enable superpage reservations: 2 levels. 118412042e2SAndrew Turner */ 119412042e2SAndrew Turner #ifndef VM_NRESERVLEVEL 120*3e00c11aSAlan Cox #define VM_NRESERVLEVEL 2 121412042e2SAndrew Turner #endif 122412042e2SAndrew Turner 123412042e2SAndrew Turner /* 124*3e00c11aSAlan Cox * Level 0 reservations consist of 16 pages when PAGE_SIZE is 4KB, and 128 125*3e00c11aSAlan Cox * pages when PAGE_SIZE is 16KB. Level 1 reservations consist of 32 64KB 126*3e00c11aSAlan Cox * pages when PAGE_SIZE is 4KB, and 16 2M pages when PAGE_SIZE is 16KB. 127412042e2SAndrew Turner */ 1289fabf976SEliot Solomon #if PAGE_SIZE == PAGE_SIZE_4K 129*3e00c11aSAlan Cox #ifndef VM_LEVEL_0_ORDER 130*3e00c11aSAlan Cox #define VM_LEVEL_0_ORDER 4 131*3e00c11aSAlan Cox #endif 132*3e00c11aSAlan Cox #ifndef VM_LEVEL_1_ORDER 133*3e00c11aSAlan Cox #define VM_LEVEL_1_ORDER 5 134*3e00c11aSAlan Cox #endif 1359fabf976SEliot Solomon #elif PAGE_SIZE == PAGE_SIZE_16K 136*3e00c11aSAlan Cox #ifndef VM_LEVEL_0_ORDER 137*3e00c11aSAlan Cox #define VM_LEVEL_0_ORDER 7 138*3e00c11aSAlan Cox #endif 139*3e00c11aSAlan Cox #ifndef VM_LEVEL_1_ORDER 140*3e00c11aSAlan Cox #define VM_LEVEL_1_ORDER 4 141*3e00c11aSAlan Cox #endif 1429fabf976SEliot Solomon #else 1439fabf976SEliot Solomon #error Unsupported page size 1449fabf976SEliot Solomon #endif 145412042e2SAndrew Turner 146412042e2SAndrew Turner /** 147412042e2SAndrew Turner * Address space layout. 148412042e2SAndrew Turner * 149412042e2SAndrew Turner * ARMv8 implements up to a 48 bit virtual address space. The address space is 150412042e2SAndrew Turner * split into 2 regions at each end of the 64 bit address space, with an 151412042e2SAndrew Turner * out of range "hole" in the middle. 152412042e2SAndrew Turner * 1539853d104SAndrew Turner * We use the full 48 bits for each region, however the kernel may only use 1549853d104SAndrew Turner * a limited range within this space. 155412042e2SAndrew Turner * 1560b4890b0SAndrew Turner * Upper region: 0xffffffffffffffff Top of virtual memory 1570b4890b0SAndrew Turner * 1580b4890b0SAndrew Turner * 0xfffffeffffffffff End of DMAP 15989c52f9dSKyle Evans * 0xffffa00000000000 Start of DMAP 16089c52f9dSKyle Evans * 16152bf6257SMark Johnston * 0xffff027fffffffff End of KMSAN origin map 16252bf6257SMark Johnston * 0xffff020000000000 Start of KMSAN origin map 16352bf6257SMark Johnston * 16452bf6257SMark Johnston * 0xffff017fffffffff End of KMSAN shadow map 16552bf6257SMark Johnston * 0xffff010000000000 Start of KMSAN shadow map 16652bf6257SMark Johnston * 16789c52f9dSKyle Evans * 0xffff009fffffffff End of KASAN shadow map 16889c52f9dSKyle Evans * 0xffff008000000000 Start of KASAN shadow map 1690b4890b0SAndrew Turner * 1700b4890b0SAndrew Turner * 0xffff007fffffffff End of KVA 1710b4890b0SAndrew Turner * 0xffff000000000000 Kernel base address & start of KVA 172412042e2SAndrew Turner * 1739853d104SAndrew Turner * Hole: 0xfffeffffffffffff 1749853d104SAndrew Turner * 0x0001000000000000 175412042e2SAndrew Turner * 1760b4890b0SAndrew Turner * Lower region: 0x0000ffffffffffff End of user address space 1770b4890b0SAndrew Turner * 0x0000000000000000 Start of user address space 178412042e2SAndrew Turner * 179412042e2SAndrew Turner * We use the upper region for the kernel, and the lower region for userland. 180412042e2SAndrew Turner * 181412042e2SAndrew Turner * We define some interesting address constants: 182412042e2SAndrew Turner * 183412042e2SAndrew Turner * VM_MIN_ADDRESS and VM_MAX_ADDRESS define the start and end of the entire 184412042e2SAndrew Turner * 64 bit address space, mostly just for convenience. 185412042e2SAndrew Turner * 186412042e2SAndrew Turner * VM_MIN_KERNEL_ADDRESS and VM_MAX_KERNEL_ADDRESS define the start and end of 187412042e2SAndrew Turner * mappable kernel virtual address space. 188412042e2SAndrew Turner * 189412042e2SAndrew Turner * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the 190412042e2SAndrew Turner * user address space. 191412042e2SAndrew Turner */ 192412042e2SAndrew Turner #define VM_MIN_ADDRESS (0x0000000000000000UL) 193412042e2SAndrew Turner #define VM_MAX_ADDRESS (0xffffffffffffffffUL) 194412042e2SAndrew Turner 1959853d104SAndrew Turner /* 512 GiB of kernel addresses */ 1969853d104SAndrew Turner #define VM_MIN_KERNEL_ADDRESS (0xffff000000000000UL) 1979853d104SAndrew Turner #define VM_MAX_KERNEL_ADDRESS (0xffff008000000000UL) 198412042e2SAndrew Turner 19989c52f9dSKyle Evans /* 128 GiB KASAN shadow map */ 20089c52f9dSKyle Evans #define KASAN_MIN_ADDRESS (0xffff008000000000UL) 20189c52f9dSKyle Evans #define KASAN_MAX_ADDRESS (0xffff00a000000000UL) 20289c52f9dSKyle Evans 20352bf6257SMark Johnston /* 512GiB KMSAN shadow map */ 20452bf6257SMark Johnston #define KMSAN_SHAD_MIN_ADDRESS (0xffff010000000000UL) 20552bf6257SMark Johnston #define KMSAN_SHAD_MAX_ADDRESS (0xffff018000000000UL) 20652bf6257SMark Johnston 20752bf6257SMark Johnston /* 512GiB KMSAN origin map */ 20852bf6257SMark Johnston #define KMSAN_ORIG_MIN_ADDRESS (0xffff020000000000UL) 20952bf6257SMark Johnston #define KMSAN_ORIG_MAX_ADDRESS (0xffff028000000000UL) 21052bf6257SMark Johnston 2116713be31SAndrew Turner /* The address bits that hold a pointer authentication code */ 2126713be31SAndrew Turner #define PAC_ADDR_MASK (0xff7f000000000000UL) 2136713be31SAndrew Turner 214b7a78d57SAndrew Turner /* If true addr is in the kernel address space */ 215b7a78d57SAndrew Turner #define ADDR_IS_KERNEL(addr) (((addr) & (1ul << 55)) == (1ul << 55)) 216b7a78d57SAndrew Turner /* If true addr is in its canonical form (i.e. no TBI, PAC, etc.) */ 217b7a78d57SAndrew Turner #define ADDR_IS_CANONICAL(addr) \ 218b7a78d57SAndrew Turner (((addr) & 0xffff000000000000UL) == 0 || \ 219b7a78d57SAndrew Turner ((addr) & 0xffff000000000000UL) == 0xffff000000000000UL) 22085b7c566SAndrew Turner #define ADDR_MAKE_CANONICAL(addr) ({ \ 22185b7c566SAndrew Turner __typeof(addr) _tmp_addr = (addr); \ 22285b7c566SAndrew Turner \ 22385b7c566SAndrew Turner _tmp_addr &= ~0xffff000000000000UL; \ 22485b7c566SAndrew Turner if (ADDR_IS_KERNEL(addr)) \ 22585b7c566SAndrew Turner _tmp_addr |= 0xffff000000000000UL; \ 22685b7c566SAndrew Turner \ 22785b7c566SAndrew Turner _tmp_addr; \ 22885b7c566SAndrew Turner }) 229b7a78d57SAndrew Turner 230d4d2928aSD Scott Phillips /* 95 TiB maximum for the direct map region */ 231d4d2928aSD Scott Phillips #define DMAP_MIN_ADDRESS (0xffffa00000000000UL) 2329853d104SAndrew Turner #define DMAP_MAX_ADDRESS (0xffffff0000000000UL) 233412042e2SAndrew Turner 234ac4dad9eSAndrew Turner #define DMAP_MIN_PHYSADDR (dmap_phys_base) 235f8a39033SAndrew Turner #define DMAP_MAX_PHYSADDR (dmap_phys_max) 236412042e2SAndrew Turner 2379d40492eSAndrew Turner /* 2389d40492eSAndrew Turner * Checks to see if a physical address is in the DMAP range. 2399d40492eSAndrew Turner * - PHYS_IN_DMAP_RANGE will return true that may be within the DMAP range 2409d40492eSAndrew Turner * but not accessible through the DMAP, e.g. device memory between two 2419d40492eSAndrew Turner * DMAP physical address regions. 2429d40492eSAndrew Turner * - PHYS_IN_DMAP will check if DMAP address is mapped before returning true. 2439d40492eSAndrew Turner * 2449d40492eSAndrew Turner * PHYS_IN_DMAP_RANGE should only be used when a check on the address is 2459d40492eSAndrew Turner * performed, e.g. by checking the physical address is within phys_avail, 2469d40492eSAndrew Turner * or checking the virtual address is mapped. 2479d40492eSAndrew Turner */ 2489d40492eSAndrew Turner #define PHYS_IN_DMAP_RANGE(pa) ((pa) >= DMAP_MIN_PHYSADDR && \ 2499853d104SAndrew Turner (pa) < DMAP_MAX_PHYSADDR) 2509d40492eSAndrew Turner #define PHYS_IN_DMAP(pa) (PHYS_IN_DMAP_RANGE(pa) && \ 2519d40492eSAndrew Turner pmap_klookup(PHYS_TO_DMAP(pa), NULL)) 25271d72ea1SAndrew Turner /* True if va is in the dmap range */ 25371d72ea1SAndrew Turner #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \ 254f8a39033SAndrew Turner (va) < (dmap_max_addr)) 255412042e2SAndrew Turner 2569a8196ceSNathan Whitehorn #define PMAP_HAS_DMAP 1 257412042e2SAndrew Turner #define PHYS_TO_DMAP(pa) \ 258412042e2SAndrew Turner ({ \ 2599d40492eSAndrew Turner KASSERT(PHYS_IN_DMAP_RANGE(pa), \ 260412042e2SAndrew Turner ("%s: PA out of range, PA: 0x%lx", __func__, \ 261412042e2SAndrew Turner (vm_paddr_t)(pa))); \ 262e46f2622SWojciech Macek ((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS; \ 263412042e2SAndrew Turner }) 264412042e2SAndrew Turner 265412042e2SAndrew Turner #define DMAP_TO_PHYS(va) \ 266412042e2SAndrew Turner ({ \ 26771d72ea1SAndrew Turner KASSERT(VIRT_IN_DMAP(va), \ 268412042e2SAndrew Turner ("%s: VA out of range, VA: 0x%lx", __func__, \ 269412042e2SAndrew Turner (vm_offset_t)(va))); \ 270e46f2622SWojciech Macek ((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \ 271412042e2SAndrew Turner }) 272412042e2SAndrew Turner 273412042e2SAndrew Turner #define VM_MIN_USER_ADDRESS (0x0000000000000000UL) 274f2f21fafSAndrew Turner #define VM_MAX_USER_ADDRESS (0x0001000000000000UL) 275412042e2SAndrew Turner 276412042e2SAndrew Turner #define VM_MINUSER_ADDRESS (VM_MIN_USER_ADDRESS) 277412042e2SAndrew Turner #define VM_MAXUSER_ADDRESS (VM_MAX_USER_ADDRESS) 278412042e2SAndrew Turner 279412042e2SAndrew Turner #define KERNBASE (VM_MIN_KERNEL_ADDRESS) 2804d22d07aSKonstantin Belousov #define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) 2814d22d07aSKonstantin Belousov #define USRSTACK SHAREDPAGE 282412042e2SAndrew Turner 283412042e2SAndrew Turner /* 284412042e2SAndrew Turner * How many physical pages per kmem arena virtual page. 285412042e2SAndrew Turner */ 286412042e2SAndrew Turner #ifndef VM_KMEM_SIZE_SCALE 2873e3eb5f4SMark Johnston #define VM_KMEM_SIZE_SCALE (1) 288412042e2SAndrew Turner #endif 289412042e2SAndrew Turner 290412042e2SAndrew Turner /* 291412042e2SAndrew Turner * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the 292412042e2SAndrew Turner * kernel map. 293412042e2SAndrew Turner */ 294412042e2SAndrew Turner #ifndef VM_KMEM_SIZE_MAX 295412042e2SAndrew Turner #define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \ 296412042e2SAndrew Turner VM_MIN_KERNEL_ADDRESS + 1) * 3 / 5) 297412042e2SAndrew Turner #endif 298412042e2SAndrew Turner 299412042e2SAndrew Turner /* 300412042e2SAndrew Turner * Initial pagein size of beginning of executable file. 301412042e2SAndrew Turner */ 302412042e2SAndrew Turner #ifndef VM_INITIAL_PAGEIN 303412042e2SAndrew Turner #define VM_INITIAL_PAGEIN 16 304412042e2SAndrew Turner #endif 305412042e2SAndrew Turner 30689c52f9dSKyle Evans #if !defined(KASAN) && !defined(KMSAN) 307da76d349SBojan Novković #define UMA_USE_DMAP 30889c52f9dSKyle Evans #endif 30936baf858SAndrew Turner 310c7d4b461SAndrew Turner #ifndef LOCORE 311c7d4b461SAndrew Turner 312c7d4b461SAndrew Turner extern vm_paddr_t dmap_phys_base; 313f8a39033SAndrew Turner extern vm_paddr_t dmap_phys_max; 314f8a39033SAndrew Turner extern vm_offset_t dmap_max_addr; 315412042e2SAndrew Turner 316c7d4b461SAndrew Turner #endif 317c7d4b461SAndrew Turner 318412042e2SAndrew Turner #define ZERO_REGION_SIZE (64 * 1024) /* 64KB */ 319412042e2SAndrew Turner 32030b72b68SRuslan Bukin #define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS 32130b72b68SRuslan Bukin 322ab041f71SD Scott Phillips /* 32378257765SMark Johnston * The pmap can create non-transparent large page mappings. 32478257765SMark Johnston */ 32578257765SMark Johnston #define PMAP_HAS_LARGEPAGES 1 32678257765SMark Johnston 32778257765SMark Johnston /* 328ab041f71SD Scott Phillips * Need a page dump array for minidump. 329ab041f71SD Scott Phillips */ 330ab041f71SD Scott Phillips #define MINIDUMP_PAGE_TRACKING 1 3310a44b8a5SBojan Novković #define MINIDUMP_STARTUP_PAGE_TRACKING 1 332ab041f71SD Scott Phillips 333412042e2SAndrew Turner #endif /* !_MACHINE_VMPARAM_H_ */ 334d5d97bedSMike Karels 335d5d97bedSMike Karels #endif /* !__arm__ */ 336