1a9643ea8Slogwang /*- 2a9643ea8Slogwang * Copyright (c) 1990 The Regents of the University of California. 3a9643ea8Slogwang * All rights reserved. 4a9643ea8Slogwang * Copyright (c) 1994 John S. Dyson 5a9643ea8Slogwang * All rights reserved. 6a9643ea8Slogwang * 7a9643ea8Slogwang * This code is derived from software contributed to Berkeley by 8a9643ea8Slogwang * William Jolitz. 9a9643ea8Slogwang * 10a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without 11a9643ea8Slogwang * modification, are permitted provided that the following conditions 12a9643ea8Slogwang * are met: 13a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright 14a9643ea8Slogwang * notice, this list of conditions and the following disclaimer. 15a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright 16a9643ea8Slogwang * notice, this list of conditions and the following disclaimer in the 17a9643ea8Slogwang * documentation and/or other materials provided with the distribution. 18a9643ea8Slogwang * 3. Neither the name of the University nor the names of its contributors 19a9643ea8Slogwang * may be used to endorse or promote products derived from this software 20a9643ea8Slogwang * without specific prior written permission. 21a9643ea8Slogwang * 22a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24a9643ea8Slogwang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25a9643ea8Slogwang * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26a9643ea8Slogwang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27a9643ea8Slogwang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28a9643ea8Slogwang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29a9643ea8Slogwang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30a9643ea8Slogwang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31a9643ea8Slogwang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32a9643ea8Slogwang * SUCH DAMAGE. 33a9643ea8Slogwang * 34a9643ea8Slogwang * from: @(#)vmparam.h 5.9 (Berkeley) 5/12/91 35a9643ea8Slogwang * from: FreeBSD: src/sys/i386/include/vmparam.h,v 1.33 2000/03/30 36a9643ea8Slogwang * $FreeBSD$ 37a9643ea8Slogwang */ 38a9643ea8Slogwang 39a9643ea8Slogwang #ifndef _MACHINE_VMPARAM_H_ 40a9643ea8Slogwang #define _MACHINE_VMPARAM_H_ 41a9643ea8Slogwang 42a9643ea8Slogwang /* 43a9643ea8Slogwang * Virtual memory related constants, all in bytes 44a9643ea8Slogwang */ 45a9643ea8Slogwang #ifndef MAXTSIZ 46a9643ea8Slogwang #define MAXTSIZ (1*1024*1024*1024) /* max text size */ 47a9643ea8Slogwang #endif 48a9643ea8Slogwang #ifndef DFLDSIZ 49a9643ea8Slogwang #define DFLDSIZ (128*1024*1024) /* initial data size limit */ 50a9643ea8Slogwang #endif 51a9643ea8Slogwang #ifndef MAXDSIZ 52a9643ea8Slogwang #define MAXDSIZ (1*1024*1024*1024) /* max data size */ 53a9643ea8Slogwang #endif 54a9643ea8Slogwang #ifndef DFLSSIZ 55a9643ea8Slogwang #define DFLSSIZ (128*1024*1024) /* initial stack size limit */ 56a9643ea8Slogwang #endif 57a9643ea8Slogwang #ifndef MAXSSIZ 58a9643ea8Slogwang #define MAXSSIZ (1*1024*1024*1024) /* max stack size */ 59a9643ea8Slogwang #endif 60a9643ea8Slogwang #ifndef SGROWSIZ 61a9643ea8Slogwang #define SGROWSIZ (128*1024) /* amount to grow stack */ 62a9643ea8Slogwang #endif 63a9643ea8Slogwang 64a9643ea8Slogwang /* 65a9643ea8Slogwang * The physical address space is sparsely populated. 66a9643ea8Slogwang */ 67a9643ea8Slogwang #define VM_PHYSSEG_SPARSE 68a9643ea8Slogwang 69a9643ea8Slogwang /* 70*22ce4affSfengbojiang * The number of PHYSSEG entries. 71a9643ea8Slogwang */ 72a9643ea8Slogwang #define VM_PHYSSEG_MAX 64 73a9643ea8Slogwang 74a9643ea8Slogwang /* 75a9643ea8Slogwang * Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool 76a9643ea8Slogwang * from which physical pages are allocated and VM_FREEPOOL_DIRECT is 77a9643ea8Slogwang * the pool from which physical pages for small UMA objects are 78a9643ea8Slogwang * allocated. 79a9643ea8Slogwang */ 80a9643ea8Slogwang #define VM_NFREEPOOL 2 81a9643ea8Slogwang #define VM_FREEPOOL_DEFAULT 0 82a9643ea8Slogwang #define VM_FREEPOOL_DIRECT 1 83a9643ea8Slogwang 84a9643ea8Slogwang /* 85*22ce4affSfengbojiang * Create one free page lists: VM_FREELIST_DEFAULT is for all physical 86*22ce4affSfengbojiang * pages. 87a9643ea8Slogwang */ 88*22ce4affSfengbojiang #define VM_NFREELIST 1 89a9643ea8Slogwang #define VM_FREELIST_DEFAULT 0 90a9643ea8Slogwang 91a9643ea8Slogwang /* 92a9643ea8Slogwang * An allocation size of 16MB is supported in order to optimize the 93a9643ea8Slogwang * use of the direct map by UMA. Specifically, a cache line contains 94a9643ea8Slogwang * at most four TTEs, collectively mapping 16MB of physical memory. 95a9643ea8Slogwang * By reducing the number of distinct 16MB "pages" that are used by UMA, 96a9643ea8Slogwang * the physical memory allocator reduces the likelihood of both 4MB 97a9643ea8Slogwang * page TLB misses and cache misses caused by 4MB page TLB misses. 98a9643ea8Slogwang */ 99a9643ea8Slogwang #define VM_NFREEORDER 12 100a9643ea8Slogwang 101a9643ea8Slogwang /* 102a9643ea8Slogwang * Enable superpage reservations: 1 level. 103a9643ea8Slogwang */ 104a9643ea8Slogwang #ifndef VM_NRESERVLEVEL 105a9643ea8Slogwang #define VM_NRESERVLEVEL 1 106a9643ea8Slogwang #endif 107a9643ea8Slogwang 108a9643ea8Slogwang /* 109a9643ea8Slogwang * Level 0 reservations consist of 512 pages. 110a9643ea8Slogwang */ 111a9643ea8Slogwang #ifndef VM_LEVEL_0_ORDER 112a9643ea8Slogwang #define VM_LEVEL_0_ORDER 9 113a9643ea8Slogwang #endif 114a9643ea8Slogwang 115a9643ea8Slogwang /** 116a9643ea8Slogwang * Address space layout. 117a9643ea8Slogwang * 118a9643ea8Slogwang * ARMv8 implements up to a 48 bit virtual address space. The address space is 119a9643ea8Slogwang * split into 2 regions at each end of the 64 bit address space, with an 120a9643ea8Slogwang * out of range "hole" in the middle. 121a9643ea8Slogwang * 122a9643ea8Slogwang * We use the full 48 bits for each region, however the kernel may only use 123a9643ea8Slogwang * a limited range within this space. 124a9643ea8Slogwang * 125a9643ea8Slogwang * Upper region: 0xffffffffffffffff Top of virtual memory 126a9643ea8Slogwang * 127a9643ea8Slogwang * 0xfffffeffffffffff End of DMAP 128a9643ea8Slogwang * 0xfffffd0000000000 Start of DMAP 129a9643ea8Slogwang * 130a9643ea8Slogwang * 0xffff007fffffffff End of KVA 131a9643ea8Slogwang * 0xffff000000000000 Kernel base address & start of KVA 132a9643ea8Slogwang * 133a9643ea8Slogwang * Hole: 0xfffeffffffffffff 134a9643ea8Slogwang * 0x0001000000000000 135a9643ea8Slogwang * 136a9643ea8Slogwang * Lower region: 0x0000ffffffffffff End of user address space 137a9643ea8Slogwang * 0x0000000000000000 Start of user address space 138a9643ea8Slogwang * 139a9643ea8Slogwang * We use the upper region for the kernel, and the lower region for userland. 140a9643ea8Slogwang * 141a9643ea8Slogwang * We define some interesting address constants: 142a9643ea8Slogwang * 143a9643ea8Slogwang * VM_MIN_ADDRESS and VM_MAX_ADDRESS define the start and end of the entire 144a9643ea8Slogwang * 64 bit address space, mostly just for convenience. 145a9643ea8Slogwang * 146a9643ea8Slogwang * VM_MIN_KERNEL_ADDRESS and VM_MAX_KERNEL_ADDRESS define the start and end of 147a9643ea8Slogwang * mappable kernel virtual address space. 148a9643ea8Slogwang * 149a9643ea8Slogwang * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the 150a9643ea8Slogwang * user address space. 151a9643ea8Slogwang */ 152a9643ea8Slogwang #define VM_MIN_ADDRESS (0x0000000000000000UL) 153a9643ea8Slogwang #define VM_MAX_ADDRESS (0xffffffffffffffffUL) 154a9643ea8Slogwang 155a9643ea8Slogwang /* 512 GiB of kernel addresses */ 156a9643ea8Slogwang #define VM_MIN_KERNEL_ADDRESS (0xffff000000000000UL) 157a9643ea8Slogwang #define VM_MAX_KERNEL_ADDRESS (0xffff008000000000UL) 158a9643ea8Slogwang 159*22ce4affSfengbojiang /* 95 TiB maximum for the direct map region */ 160*22ce4affSfengbojiang #define DMAP_MIN_ADDRESS (0xffffa00000000000UL) 161a9643ea8Slogwang #define DMAP_MAX_ADDRESS (0xffffff0000000000UL) 162a9643ea8Slogwang 163a9643ea8Slogwang #define DMAP_MIN_PHYSADDR (dmap_phys_base) 164a9643ea8Slogwang #define DMAP_MAX_PHYSADDR (dmap_phys_max) 165a9643ea8Slogwang 166a9643ea8Slogwang /* True if pa is in the dmap range */ 167a9643ea8Slogwang #define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \ 168a9643ea8Slogwang (pa) < DMAP_MAX_PHYSADDR) 169a9643ea8Slogwang /* True if va is in the dmap range */ 170a9643ea8Slogwang #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \ 171a9643ea8Slogwang (va) < (dmap_max_addr)) 172a9643ea8Slogwang 173*22ce4affSfengbojiang #define PMAP_HAS_DMAP 1 174a9643ea8Slogwang #define PHYS_TO_DMAP(pa) \ 175a9643ea8Slogwang ({ \ 176a9643ea8Slogwang KASSERT(PHYS_IN_DMAP(pa), \ 177a9643ea8Slogwang ("%s: PA out of range, PA: 0x%lx", __func__, \ 178a9643ea8Slogwang (vm_paddr_t)(pa))); \ 179a9643ea8Slogwang ((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS; \ 180a9643ea8Slogwang }) 181a9643ea8Slogwang 182a9643ea8Slogwang #define DMAP_TO_PHYS(va) \ 183a9643ea8Slogwang ({ \ 184a9643ea8Slogwang KASSERT(VIRT_IN_DMAP(va), \ 185a9643ea8Slogwang ("%s: VA out of range, VA: 0x%lx", __func__, \ 186a9643ea8Slogwang (vm_offset_t)(va))); \ 187a9643ea8Slogwang ((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \ 188a9643ea8Slogwang }) 189a9643ea8Slogwang 190a9643ea8Slogwang #define VM_MIN_USER_ADDRESS (0x0000000000000000UL) 191a9643ea8Slogwang #define VM_MAX_USER_ADDRESS (0x0001000000000000UL) 192a9643ea8Slogwang 193a9643ea8Slogwang #define VM_MINUSER_ADDRESS (VM_MIN_USER_ADDRESS) 194a9643ea8Slogwang #define VM_MAXUSER_ADDRESS (VM_MAX_USER_ADDRESS) 195a9643ea8Slogwang 196a9643ea8Slogwang #define KERNBASE (VM_MIN_KERNEL_ADDRESS) 197a9643ea8Slogwang #define SHAREDPAGE (VM_MAXUSER_ADDRESS - PAGE_SIZE) 198a9643ea8Slogwang #define USRSTACK SHAREDPAGE 199a9643ea8Slogwang 200a9643ea8Slogwang /* 201a9643ea8Slogwang * How many physical pages per kmem arena virtual page. 202a9643ea8Slogwang */ 203a9643ea8Slogwang #ifndef VM_KMEM_SIZE_SCALE 204*22ce4affSfengbojiang #define VM_KMEM_SIZE_SCALE (1) 205a9643ea8Slogwang #endif 206a9643ea8Slogwang 207a9643ea8Slogwang /* 208a9643ea8Slogwang * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the 209a9643ea8Slogwang * kernel map. 210a9643ea8Slogwang */ 211a9643ea8Slogwang #ifndef VM_KMEM_SIZE_MAX 212a9643ea8Slogwang #define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \ 213a9643ea8Slogwang VM_MIN_KERNEL_ADDRESS + 1) * 3 / 5) 214a9643ea8Slogwang #endif 215a9643ea8Slogwang 216a9643ea8Slogwang /* 217a9643ea8Slogwang * Initial pagein size of beginning of executable file. 218a9643ea8Slogwang */ 219a9643ea8Slogwang #ifndef VM_INITIAL_PAGEIN 220a9643ea8Slogwang #define VM_INITIAL_PAGEIN 16 221a9643ea8Slogwang #endif 222a9643ea8Slogwang 223a9643ea8Slogwang #define UMA_MD_SMALL_ALLOC 224a9643ea8Slogwang 225a9643ea8Slogwang #ifndef LOCORE 226a9643ea8Slogwang 227a9643ea8Slogwang extern vm_paddr_t dmap_phys_base; 228a9643ea8Slogwang extern vm_paddr_t dmap_phys_max; 229a9643ea8Slogwang extern vm_offset_t dmap_max_addr; 230a9643ea8Slogwang extern vm_offset_t vm_max_kernel_address; 231a9643ea8Slogwang extern vm_offset_t init_pt_va; 232a9643ea8Slogwang 233a9643ea8Slogwang #endif 234a9643ea8Slogwang 235a9643ea8Slogwang #define ZERO_REGION_SIZE (64 * 1024) /* 64KB */ 236a9643ea8Slogwang 237a9643ea8Slogwang #define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS 238a9643ea8Slogwang 239*22ce4affSfengbojiang /* 240*22ce4affSfengbojiang * The pmap can create non-transparent large page mappings. 241*22ce4affSfengbojiang */ 242*22ce4affSfengbojiang #define PMAP_HAS_LARGEPAGES 1 243*22ce4affSfengbojiang 244*22ce4affSfengbojiang /* 245*22ce4affSfengbojiang * Need a page dump array for minidump. 246*22ce4affSfengbojiang */ 247*22ce4affSfengbojiang #define MINIDUMP_PAGE_TRACKING 1 248*22ce4affSfengbojiang 249a9643ea8Slogwang #endif /* !_MACHINE_VMPARAM_H_ */ 250