xref: /netbsd-src/sys/arch/aarch64/include/vmparam.h (revision 96392823c8a2dae81efdb12af598d9ca0e50fa6a)
1*96392823Sjmcneill /* $NetBSD: vmparam.h,v 1.21 2024/06/30 09:36:43 jmcneill Exp $ */
2beb9c6d1Smatt 
3beb9c6d1Smatt /*-
4beb9c6d1Smatt  * Copyright (c) 2014 The NetBSD Foundation, Inc.
5beb9c6d1Smatt  * All rights reserved.
6beb9c6d1Smatt  *
7beb9c6d1Smatt  * This code is derived from software contributed to The NetBSD Foundation
8beb9c6d1Smatt  * by Matt Thomas of 3am Software Foundry.
9beb9c6d1Smatt  *
10beb9c6d1Smatt  * Redistribution and use in source and binary forms, with or without
11beb9c6d1Smatt  * modification, are permitted provided that the following conditions
12beb9c6d1Smatt  * are met:
13beb9c6d1Smatt  * 1. Redistributions of source code must retain the above copyright
14beb9c6d1Smatt  *    notice, this list of conditions and the following disclaimer.
15beb9c6d1Smatt  * 2. Redistributions in binary form must reproduce the above copyright
16beb9c6d1Smatt  *    notice, this list of conditions and the following disclaimer in the
17beb9c6d1Smatt  *    documentation and/or other materials provided with the distribution.
18beb9c6d1Smatt  *
19beb9c6d1Smatt  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20beb9c6d1Smatt  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21beb9c6d1Smatt  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22beb9c6d1Smatt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23beb9c6d1Smatt  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24beb9c6d1Smatt  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25beb9c6d1Smatt  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26beb9c6d1Smatt  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27beb9c6d1Smatt  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28beb9c6d1Smatt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29beb9c6d1Smatt  * POSSIBILITY OF SUCH DAMAGE.
30beb9c6d1Smatt  */
31beb9c6d1Smatt 
32beb9c6d1Smatt #ifndef _AARCH64_VMPARAM_H_
33beb9c6d1Smatt #define _AARCH64_VMPARAM_H_
34beb9c6d1Smatt 
35beb9c6d1Smatt #ifdef __aarch64__
36beb9c6d1Smatt 
37fe33aa27Sryo #define	__USE_TOPDOWN_VM
38fe33aa27Sryo 
39beb9c6d1Smatt /*
407c280e5bSjmcneill  * Default pager_map of 16MB is small and we have plenty of VA to burn.
417c280e5bSjmcneill  */
427c280e5bSjmcneill #define	PAGER_MAP_DEFAULT_SIZE	(512 * 1024 * 1024)
437c280e5bSjmcneill 
447c280e5bSjmcneill /*
45d19a1214Sad  * Defaults for Unified Buffer Cache parameters.
46d19a1214Sad  */
47d19a1214Sad 
48d19a1214Sad #ifndef UBC_WINSHIFT
49d19a1214Sad #define	UBC_WINSHIFT	16	/* 64kB */
50d19a1214Sad #endif
51d19a1214Sad #ifndef UBC_NWINS
52d19a1214Sad #define	UBC_NWINS	4096	/* 256MB */
53d19a1214Sad #endif
54d19a1214Sad 
55d19a1214Sad /*
56beb9c6d1Smatt  * AARCH64 supports 3 page sizes: 4KB, 16KB, 64KB.  Each page table can
57beb9c6d1Smatt  * even have its own page size.
58beb9c6d1Smatt  */
59beb9c6d1Smatt 
60beb9c6d1Smatt #ifdef AARCH64_PAGE_SHIFT
61beb9c6d1Smatt #if (1 << AARCH64_PAGE_SHIFT) & ~0x141000
62beb9c6d1Smatt #error AARCH64_PAGE_SHIFT contains an unsupported value.
63beb9c6d1Smatt #endif
64beb9c6d1Smatt #define PAGE_SHIFT	AARCH64_PAGE_SHIFT
65beb9c6d1Smatt #else
66beb9c6d1Smatt #define PAGE_SHIFT	12
67beb9c6d1Smatt #endif
68beb9c6d1Smatt #define PAGE_SIZE	(1 << PAGE_SHIFT)
69beb9c6d1Smatt #define PAGE_MASK	(PAGE_SIZE - 1)
70beb9c6d1Smatt 
71beb9c6d1Smatt #if PAGE_SHIFT <= 14
72fe33aa27Sryo #define USPACE		32768
73beb9c6d1Smatt #else
74beb9c6d1Smatt #define USPACE		65536
75beb9c6d1Smatt #endif
76beb9c6d1Smatt #define	UPAGES		(USPACE >> PAGE_SHIFT)
77beb9c6d1Smatt 
78beb9c6d1Smatt /*
79beb9c6d1Smatt  * USRSTACK is the top (end) of the user stack.  The user VA space is a
80beb9c6d1Smatt  * 48-bit address space starting at 0.  Place the stack at its top end.
81beb9c6d1Smatt  */
82fe33aa27Sryo #define USRSTACK	VM_MAXUSER_ADDRESS
83beb9c6d1Smatt 
84beb9c6d1Smatt #ifndef MAXTSIZ
85beb9c6d1Smatt #define	MAXTSIZ		(1L << 30)	/* max text size (1GB) */
86beb9c6d1Smatt #endif
87beb9c6d1Smatt 
88beb9c6d1Smatt #ifndef MAXDSIZ
89beb9c6d1Smatt #define	MAXDSIZ		(1L << 36)	/* max data size (64GB) */
90beb9c6d1Smatt #endif
91beb9c6d1Smatt 
92beb9c6d1Smatt #ifndef MAXSSIZ
93beb9c6d1Smatt #define	MAXSSIZ		(1L << 26)	/* max stack size (64MB) */
94beb9c6d1Smatt #endif
95beb9c6d1Smatt 
96beb9c6d1Smatt #ifndef DFLDSIZ
97beb9c6d1Smatt #define	DFLDSIZ		(1L << 32)	/* default data size (4GB) */
98beb9c6d1Smatt #endif
99beb9c6d1Smatt 
100beb9c6d1Smatt #ifndef DFLSSIZ
101beb9c6d1Smatt #define	DFLSSIZ		(1L << 23)	/* default stack size (8MB) */
102beb9c6d1Smatt #endif
103beb9c6d1Smatt 
104fe33aa27Sryo #define USRSTACK32	VM_MAXUSER_ADDRESS32
105fe33aa27Sryo 
106fe33aa27Sryo #ifndef	MAXDSIZ32
1078e0b0e21Sryo #define	MAXDSIZ32	(3U*1024*1024*1024)	/* max data size */
108fe33aa27Sryo #endif
109fe33aa27Sryo 
110fe33aa27Sryo #ifndef	MAXSSIZ32
111fe33aa27Sryo #define	MAXSSIZ32	(64*1024*1024)		/* max stack size */
112fe33aa27Sryo #endif
113fe33aa27Sryo 
114fe33aa27Sryo #ifndef DFLDSIZ32
115fe33aa27Sryo #define	DFLDSIZ32	(1L << 27)	/* 32bit default data size (128MB) */
116fe33aa27Sryo #endif
117fe33aa27Sryo 
118beb9c6d1Smatt #ifndef DFLSSIZ32
119beb9c6d1Smatt #define	DFLSSIZ32	(1L << 21)	/* 32bit default stack size (2MB) */
120beb9c6d1Smatt #endif
121beb9c6d1Smatt 
122beb9c6d1Smatt #define	VM_MIN_ADDRESS		((vaddr_t) 0x0)
123beb9c6d1Smatt #define	VM_MAXUSER_ADDRESS	((vaddr_t) (1L << 48) - PAGE_SIZE)
124beb9c6d1Smatt #define	VM_MAX_ADDRESS		VM_MAXUSER_ADDRESS
125beb9c6d1Smatt 
1268e0b0e21Sryo #define VM_MAXUSER_ADDRESS32	((vaddr_t) 0xfffff000)
127beb9c6d1Smatt 
128beb9c6d1Smatt /*
1293c8ef59cSryo  * kernel virtual space layout:
1303b86f967Sskrll  *   0xffff_0000_0000_0000  -   64T  direct mapping
13158501cdbSskrll  *   0xffff_4000_0000_0000  -   32T  (KASAN SHADOW MAP)
13258501cdbSskrll  *   0xffff_6000_0000_0000  -   32T  (not used)
133e65a0eaaSskrll  *   0xffff_8000_0000_0000  -    1G  (EFI_RUNTIME - legacy)
13458501cdbSskrll  *   0xffff_8000_4000_0000  -   64T  (not used)
13558501cdbSskrll  *   0xffff_c000_0000_0000  -   64T  KERNEL VM Space (including text/data/bss)
13601099b44Sskrll  *  (0xffff_c000_4000_0000     -1GB) KERNEL VM start of KVM
13758501cdbSskrll  *   0xffff_ffff_f000_0000  -  254M  KERNEL_IO for pmap_devmap
13858501cdbSskrll  *   0xffff_ffff_ffe0_0000  -    2M  RESERVED
139beb9c6d1Smatt  */
1403c8ef59cSryo #define VM_MIN_KERNEL_ADDRESS	((vaddr_t) 0xffffc00000000000L)
141fe33aa27Sryo #define VM_MAX_KERNEL_ADDRESS	((vaddr_t) 0xffffffffffe00000L)
142fe33aa27Sryo 
143fe33aa27Sryo /*
144e65a0eaaSskrll  * Reserved space for EFI runtime services (legacy)
145e65a0eaaSskrll  */
146e65a0eaaSskrll #define	EFI_RUNTIME_VA		0xffff800000000000L
147e65a0eaaSskrll #define	EFI_RUNTIME_SIZE	0x0000000040000000L
148e65a0eaaSskrll 
149e65a0eaaSskrll 
150e65a0eaaSskrll /*
151fe33aa27Sryo  * last 254MB of kernel vm area (0xfffffffff0000000-0xffffffffffe00000)
152aa543fc8Sskrll  * may be used for devmap.  see aarch64/pmap.c:pmap_devmap_*
153fe33aa27Sryo  */
1544def9d8bSskrll #define VM_KERNEL_IO_BASE	0xfffffffff0000000L
1554def9d8bSskrll #define VM_KERNEL_IO_SIZE	(VM_MAX_KERNEL_ADDRESS - VM_KERNEL_IO_BASE)
156beb9c6d1Smatt 
15701099b44Sskrll #define VM_KERNEL_VM_BASE	(0xffffc00040000000L)
1584def9d8bSskrll #define VM_KERNEL_VM_SIZE	(VM_KERNEL_IO_BASE - VM_KERNEL_VM_BASE)
159c452ed84Sjmcneill 
160beb9c6d1Smatt /* virtual sizes (bytes) for various kernel submaps */
161beb9c6d1Smatt #define USRIOSIZE		(PAGE_SIZE / 8)
162beb9c6d1Smatt #define VM_PHYS_SIZE		(USRIOSIZE * PAGE_SIZE)
163beb9c6d1Smatt 
1648e0b0e21Sryo #define VM_DEFAULT_ADDRESS32_TOPDOWN(da, sz) \
1658e0b0e21Sryo 	trunc_page(USRSTACK32 - MAXSSIZ32 - (sz) - user_stack_guard_size)
1668e0b0e21Sryo #define VM_DEFAULT_ADDRESS32_BOTTOMUP(da, sz) \
1678e0b0e21Sryo 	round_page((vaddr_t)(da) + (vsize_t)MAXDSIZ32)
1688e0b0e21Sryo 
169beb9c6d1Smatt /*
170beb9c6d1Smatt  * Since we have the address space, we map all of physical memory (RAM)
171beb9c6d1Smatt  * using block page table entries.
172beb9c6d1Smatt  */
1733b86f967Sskrll #define AARCH64_DIRECTMAP_MASK	((vaddr_t) 0xffff000000000000L)
1743b86f967Sskrll #define AARCH64_DIRECTMAP_SIZE	(1UL << 46)	/* 64TB */
1753b86f967Sskrll #define AARCH64_DIRECTMAP_START	AARCH64_DIRECTMAP_MASK
1763b86f967Sskrll #define AARCH64_DIRECTMAP_END	(AARCH64_DIRECTMAP_START + AARCH64_DIRECTMAP_SIZE)
1773b86f967Sskrll #define AARCH64_KVA_P(va)	(((vaddr_t) (va) & AARCH64_DIRECTMAP_MASK) != 0)
1783b86f967Sskrll #define AARCH64_PA_TO_KVA(pa)	((vaddr_t) ((pa) | AARCH64_DIRECTMAP_START))
1793b86f967Sskrll #define AARCH64_KVA_TO_PA(va)	((paddr_t) ((va) & ~AARCH64_DIRECTMAP_MASK))
180beb9c6d1Smatt 
181beb9c6d1Smatt /* */
182*96392823Sjmcneill #define VM_PHYSSEG_MAX		256              /* XXX */
183beb9c6d1Smatt #define VM_PHYSSEG_STRAT	VM_PSTRAT_BSEARCH
184beb9c6d1Smatt 
1855e83bb18Sjmcneill #define VM_NFREELIST		1
186beb9c6d1Smatt #define VM_FREELIST_DEFAULT	0
187beb9c6d1Smatt 
188beb9c6d1Smatt #elif defined(__arm__)
189beb9c6d1Smatt 
190beb9c6d1Smatt #include <arm/vmparam.h>
191beb9c6d1Smatt 
192beb9c6d1Smatt #endif /* __aarch64__/__arm__ */
193beb9c6d1Smatt 
194beb9c6d1Smatt #endif /* _AARCH64_VMPARAM_H_ */
195