zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

vmparam.h (9393B) - Raw


      1 /*-
      2  * Copyright (c) 1990 The Regents of the University of California.
      3  * All rights reserved.
      4  * Copyright (c) 1994 John S. Dyson
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to Berkeley by
      8  * William Jolitz.
      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  *	from: @(#)vmparam.h     5.9 (Berkeley) 5/12/91
     35  *	from: FreeBSD: src/sys/i386/include/vmparam.h,v 1.33 2000/03/30
     36  */
     37 
     38 #ifdef __arm__
     39 #include <arm/vmparam.h>
     40 #else /* !__arm__ */
     41 
     42 #ifndef	_MACHINE_VMPARAM_H_
     43 #define	_MACHINE_VMPARAM_H_
     44 
     45 /*
     46  * Virtual memory related constants, all in bytes
     47  */
     48 #ifndef MAXTSIZ
     49 #define	MAXTSIZ		(1*1024*1024*1024)	/* max text size */
     50 #endif
     51 #ifndef DFLDSIZ
     52 #define	DFLDSIZ		(128*1024*1024)		/* initial data size limit */
     53 #endif
     54 #ifndef MAXDSIZ
     55 #define	MAXDSIZ		(1*1024*1024*1024)	/* max data size */
     56 #endif
     57 #ifndef DFLSSIZ
     58 #define	DFLSSIZ		(128*1024*1024)		/* initial stack size limit */
     59 #endif
     60 #ifndef MAXSSIZ
     61 #define	MAXSSIZ		(1*1024*1024*1024)	/* max stack size */
     62 #endif
     63 #ifndef SGROWSIZ
     64 #define	SGROWSIZ	(128*1024)		/* amount to grow stack */
     65 #endif
     66 
     67 /*
     68  * The physical address space is sparsely populated.
     69  */
     70 #define	VM_PHYSSEG_SPARSE
     71 
     72 /*
     73  * The number of PHYSSEG entries.
     74  */
     75 #define	VM_PHYSSEG_MAX		64
     76 
     77 /*
     78  * Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool
     79  * from which physical pages are allocated and VM_FREEPOOL_DIRECT is
     80  * the pool from which physical pages for small UMA objects are
     81  * allocated.
     82  */
     83 #define	VM_NFREEPOOL		2
     84 #define	VM_FREEPOOL_DEFAULT	0
     85 #define	VM_FREEPOOL_DIRECT	1
     86 
     87 /*
     88  * Create two free page lists: VM_FREELIST_DMA32 is for physical pages that have
     89  * physical addresses below 4G, and VM_FREELIST_DEFAULT is for all other
     90  * physical pages.
     91  */
     92 #define	VM_NFREELIST		2
     93 #define	VM_FREELIST_DEFAULT	0
     94 #define	VM_FREELIST_DMA32	1
     95 
     96 /*
     97  * When PAGE_SIZE is 4KB, an allocation size of 16MB is supported in order
     98  * to optimize the use of the direct map by UMA.  Specifically, a 64-byte
     99  * cache line contains at most 8 L2 BLOCK entries, collectively mapping 16MB
    100  * of physical memory.  By reducing the number of distinct 16MB "pages" that
    101  * are used by UMA, the physical memory allocator reduces the likelihood of
    102  * both 2MB page TLB misses and cache misses during the page table walk when
    103  * a 2MB page TLB miss does occur.
    104  */
    105 #define	VM_NFREEORDER		13
    106 
    107 /*
    108  * Enable superpage reservations: 1 level.
    109  */
    110 #ifndef	VM_NRESERVLEVEL
    111 #define	VM_NRESERVLEVEL		1
    112 #endif
    113 
    114 /*
    115  * Level 0 reservations consist of 512 pages.
    116  */
    117 #ifndef	VM_LEVEL_0_ORDER
    118 #define	VM_LEVEL_0_ORDER	9
    119 #endif
    120 
    121 /**
    122  * Address space layout.
    123  *
    124  * ARMv8 implements up to a 48 bit virtual address space. The address space is
    125  * split into 2 regions at each end of the 64 bit address space, with an
    126  * out of range "hole" in the middle.
    127  *
    128  * We use the full 48 bits for each region, however the kernel may only use
    129  * a limited range within this space.
    130  *
    131  * Upper region:    0xffffffffffffffff  Top of virtual memory
    132  *
    133  *                  0xfffffeffffffffff  End of DMAP
    134  *                  0xffffa00000000000  Start of DMAP
    135  *
    136  *                  0xffff009fffffffff  End of KASAN shadow map
    137  *                  0xffff008000000000  Start of KASAN shadow map
    138  *
    139  *                  0xffff007fffffffff  End of KVA
    140  *                  0xffff000000000000  Kernel base address & start of KVA
    141  *
    142  * Hole:            0xfffeffffffffffff
    143  *                  0x0001000000000000
    144  *
    145  * Lower region:    0x0000ffffffffffff End of user address space
    146  *                  0x0000000000000000 Start of user address space
    147  *
    148  * We use the upper region for the kernel, and the lower region for userland.
    149  *
    150  * We define some interesting address constants:
    151  *
    152  * VM_MIN_ADDRESS and VM_MAX_ADDRESS define the start and end of the entire
    153  * 64 bit address space, mostly just for convenience.
    154  *
    155  * VM_MIN_KERNEL_ADDRESS and VM_MAX_KERNEL_ADDRESS define the start and end of
    156  * mappable kernel virtual address space.
    157  *
    158  * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the
    159  * user address space.
    160  */
    161 #define	VM_MIN_ADDRESS		(0x0000000000000000UL)
    162 #define	VM_MAX_ADDRESS		(0xffffffffffffffffUL)
    163 
    164 /* 512 GiB of kernel addresses */
    165 #define	VM_MIN_KERNEL_ADDRESS	(0xffff000000000000UL)
    166 #define	VM_MAX_KERNEL_ADDRESS	(0xffff008000000000UL)
    167 
    168 /* 128 GiB KASAN shadow map */
    169 #define	KASAN_MIN_ADDRESS	(0xffff008000000000UL)
    170 #define	KASAN_MAX_ADDRESS	(0xffff00a000000000UL)
    171 
    172 /* The address bits that hold a pointer authentication code */
    173 #define	PAC_ADDR_MASK		(0xff7f000000000000UL)
    174 
    175 /* If true addr is in the kernel address space */
    176 #define	ADDR_IS_KERNEL(addr)	(((addr) & (1ul << 55)) == (1ul << 55))
    177 /* If true addr is in its canonical form (i.e. no TBI, PAC, etc.) */
    178 #define	ADDR_IS_CANONICAL(addr)	\
    179     (((addr) & 0xffff000000000000UL) == 0 || \
    180      ((addr) & 0xffff000000000000UL) == 0xffff000000000000UL)
    181 #define	ADDR_MAKE_CANONICAL(addr) ({			\
    182 	__typeof(addr) _tmp_addr = (addr);		\
    183 							\
    184 	_tmp_addr &= ~0xffff000000000000UL;		\
    185 	if (ADDR_IS_KERNEL(addr))			\
    186 		_tmp_addr |= 0xffff000000000000UL;	\
    187 							\
    188 	_tmp_addr;					\
    189 })
    190 
    191 /* 95 TiB maximum for the direct map region */
    192 #define	DMAP_MIN_ADDRESS	(0xffffa00000000000UL)
    193 #define	DMAP_MAX_ADDRESS	(0xffffff0000000000UL)
    194 
    195 #define	DMAP_MIN_PHYSADDR	(dmap_phys_base)
    196 #define	DMAP_MAX_PHYSADDR	(dmap_phys_max)
    197 
    198 /*
    199  * Checks to see if a physical address is in the DMAP range.
    200  * - PHYS_IN_DMAP_RANGE will return true that may be within the DMAP range
    201  *   but not accessible through the DMAP, e.g. device memory between two
    202  *   DMAP physical address regions.
    203  * - PHYS_IN_DMAP will check if DMAP address is mapped before returning true.
    204  *
    205  * PHYS_IN_DMAP_RANGE should only be used when a check on the address is
    206  * performed, e.g. by checking the physical address is within phys_avail,
    207  * or checking the virtual address is mapped.
    208  */
    209 #define	PHYS_IN_DMAP_RANGE(pa)	((pa) >= DMAP_MIN_PHYSADDR && \
    210     (pa) < DMAP_MAX_PHYSADDR)
    211 #define	PHYS_IN_DMAP(pa)	(PHYS_IN_DMAP_RANGE(pa) && \
    212     pmap_klookup(PHYS_TO_DMAP(pa), NULL))
    213 /* True if va is in the dmap range */
    214 #define	VIRT_IN_DMAP(va)	((va) >= DMAP_MIN_ADDRESS && \
    215     (va) < (dmap_max_addr))
    216 
    217 #define	PMAP_HAS_DMAP	1
    218 #define	PHYS_TO_DMAP(pa)						\
    219 ({									\
    220 	KASSERT(PHYS_IN_DMAP_RANGE(pa),					\
    221 	    ("%s: PA out of range, PA: 0x%lx", __func__,		\
    222 	    (vm_paddr_t)(pa)));						\
    223 	((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS;			\
    224 })
    225 
    226 #define	DMAP_TO_PHYS(va)						\
    227 ({									\
    228 	KASSERT(VIRT_IN_DMAP(va),					\
    229 	    ("%s: VA out of range, VA: 0x%lx", __func__,		\
    230 	    (vm_offset_t)(va)));					\
    231 	((va) - DMAP_MIN_ADDRESS) + dmap_phys_base;			\
    232 })
    233 
    234 #define	VM_MIN_USER_ADDRESS	(0x0000000000000000UL)
    235 #define	VM_MAX_USER_ADDRESS	(0x0001000000000000UL)
    236 
    237 #define	VM_MINUSER_ADDRESS	(VM_MIN_USER_ADDRESS)
    238 #define	VM_MAXUSER_ADDRESS	(VM_MAX_USER_ADDRESS)
    239 
    240 #define	KERNBASE		(VM_MIN_KERNEL_ADDRESS)
    241 #define	SHAREDPAGE		(VM_MAXUSER_ADDRESS - PAGE_SIZE)
    242 #define	USRSTACK		SHAREDPAGE
    243 
    244 /*
    245  * How many physical pages per kmem arena virtual page.
    246  */
    247 #ifndef VM_KMEM_SIZE_SCALE
    248 #define	VM_KMEM_SIZE_SCALE	(1)
    249 #endif
    250 
    251 /*
    252  * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the
    253  * kernel map.
    254  */
    255 #ifndef VM_KMEM_SIZE_MAX
    256 #define	VM_KMEM_SIZE_MAX	((VM_MAX_KERNEL_ADDRESS - \
    257     VM_MIN_KERNEL_ADDRESS + 1) * 3 / 5)
    258 #endif
    259 
    260 /*
    261  * Initial pagein size of beginning of executable file.
    262  */
    263 #ifndef	VM_INITIAL_PAGEIN
    264 #define	VM_INITIAL_PAGEIN	16
    265 #endif
    266 
    267 #if !defined(KASAN) && !defined(KMSAN)
    268 #define	UMA_MD_SMALL_ALLOC
    269 #endif
    270 
    271 #ifndef LOCORE
    272 
    273 extern vm_paddr_t dmap_phys_base;
    274 extern vm_paddr_t dmap_phys_max;
    275 extern vm_offset_t dmap_max_addr;
    276 
    277 #endif
    278 
    279 #define	ZERO_REGION_SIZE	(64 * 1024)	/* 64KB */
    280 
    281 #define	DEVMAP_MAX_VADDR	VM_MAX_KERNEL_ADDRESS
    282 
    283 /*
    284  * The pmap can create non-transparent large page mappings.
    285  */
    286 #define	PMAP_HAS_LARGEPAGES	1
    287 
    288 /*
    289  * Need a page dump array for minidump.
    290  */
    291 #define MINIDUMP_PAGE_TRACKING	1
    292 
    293 #endif /* !_MACHINE_VMPARAM_H_ */
    294 
    295 #endif /* !__arm__ */