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 * $FreeBSD$
37 */
38
39 #ifndef _MACHINE_VMPARAM_H_
40 #define _MACHINE_VMPARAM_H_
41
42 /*
43 * Virtual memory related constants, all in bytes
44 */
45 #ifndef MAXTSIZ
46 #define MAXTSIZ (1*1024*1024*1024) /* max text size */
47 #endif
48 #ifndef DFLDSIZ
49 #define DFLDSIZ (128*1024*1024) /* initial data size limit */
50 #endif
51 #ifndef MAXDSIZ
52 #define MAXDSIZ (1*1024*1024*1024) /* max data size */
53 #endif
54 #ifndef DFLSSIZ
55 #define DFLSSIZ (128*1024*1024) /* initial stack size limit */
56 #endif
57 #ifndef MAXSSIZ
58 #define MAXSSIZ (1*1024*1024*1024) /* max stack size */
59 #endif
60 #ifndef SGROWSIZ
61 #define SGROWSIZ (128*1024) /* amount to grow stack */
62 #endif
63
64 /*
65 * The physical address space is sparsely populated.
66 */
67 #define VM_PHYSSEG_SPARSE
68
69 /*
70 * The number of PHYSSEG entries.
71 */
72 #define VM_PHYSSEG_MAX 64
73
74 /*
75 * Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool
76 * from which physical pages are allocated and VM_FREEPOOL_DIRECT is
77 * the pool from which physical pages for small UMA objects are
78 * allocated.
79 */
80 #define VM_NFREEPOOL 2
81 #define VM_FREEPOOL_DEFAULT 0
82 #define VM_FREEPOOL_DIRECT 1
83
84 /*
85 * Create one free page list: VM_FREELIST_DEFAULT is for all physical
86 * pages.
87 */
88 #define VM_NFREELIST 1
89 #define VM_FREELIST_DEFAULT 0
90
91 /*
92 * An allocation size of 16MB is supported in order to optimize the
93 * use of the direct map by UMA. Specifically, a cache line contains
94 * at most four TTEs, collectively mapping 16MB of physical memory.
95 * By reducing the number of distinct 16MB "pages" that are used by UMA,
96 * the physical memory allocator reduces the likelihood of both 4MB
97 * page TLB misses and cache misses caused by 4MB page TLB misses.
98 */
99 #define VM_NFREEORDER 12
100
101 /*
102 * Enable superpage reservations: 1 level.
103 */
104 #ifndef VM_NRESERVLEVEL
105 #define VM_NRESERVLEVEL 1
106 #endif
107
108 /*
109 * Level 0 reservations consist of 512 pages.
110 */
111 #ifndef VM_LEVEL_0_ORDER
112 #define VM_LEVEL_0_ORDER 9
113 #endif
114
115 /**
116 * Address space layout.
117 *
118 * RISC-V implements multiple paging modes with different virtual address space
119 * sizes: SV32, SV39, SV48 and SV57. Only SV39 and SV48 are supported by
120 * FreeBSD. SV39 provides a 512GB virtual address space and uses three-level
121 * page tables, while SV48 provides a 256TB virtual address space and uses
122 * four-level page tables. 64-bit RISC-V implementations are required to provide
123 * at least SV39 mode; locore initially enables SV39 mode while bootstrapping
124 * page tables, and pmap_bootstrap() optionally switches to SV48 mode.
125 *
126 * The address space is split into two regions at each end of the 64-bit address
127 * space; the lower region is for use by user mode software, while the upper
128 * region is used for various kernel maps. The kernel map layout in SV48 mode
129 * is currently identical to that used in SV39 mode.
130 *
131 * SV39 memory map:
132 * 0x0000000000000000 - 0x0000003fffffffff 256GB user map
133 * 0x0000004000000000 - 0xffffffbfffffffff unmappable
134 * 0xffffffc000000000 - 0xffffffc7ffffffff 32GB kernel map
135 * 0xffffffc800000000 - 0xffffffcfffffffff 32GB unused
136 * 0xffffffd000000000 - 0xffffffefffffffff 128GB direct map
137 * 0xfffffff000000000 - 0xffffffffffffffff 64GB unused
138 *
139 * SV48 memory map:
140 * 0x0000000000000000 - 0x00007fffffffffff 128TB user map
141 * 0x0000800000000000 - 0xffff7fffffffffff unmappable
142 * 0xffff800000000000 - 0xffffffc7ffffffff 127.75TB hole
143 * 0xffffffc000000000 - 0xffffffc7ffffffff 32GB kernel map
144 * 0xffffffc800000000 - 0xffffffcfffffffff 32GB unused
145 * 0xffffffd000000000 - 0xffffffefffffffff 128GB direct map
146 * 0xfffffff000000000 - 0xffffffffffffffff 64GB unused
147 *
148 * The kernel is loaded at the beginning of the kernel map.
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 #define VM_MIN_KERNEL_ADDRESS (0xffffffc000000000UL)
165 #define VM_MAX_KERNEL_ADDRESS (0xffffffc800000000UL)
166
167 #define DMAP_MIN_ADDRESS (0xffffffd000000000UL)
168 #define DMAP_MAX_ADDRESS (0xfffffff000000000UL)
169
170 #define DMAP_MIN_PHYSADDR (dmap_phys_base)
171 #define DMAP_MAX_PHYSADDR (dmap_phys_max)
172
173 /* True if pa is in the dmap range */
174 #define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \
175 (pa) < DMAP_MAX_PHYSADDR)
176 /* True if va is in the dmap range */
177 #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \
178 (va) < (dmap_max_addr))
179
180 #define PMAP_HAS_DMAP 1
181 #define PHYS_TO_DMAP(pa) \
182 ({ \
183 KASSERT(PHYS_IN_DMAP(pa), \
184 ("%s: PA out of range, PA: 0x%lx", __func__, \
185 (vm_paddr_t)(pa))); \
186 ((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS; \
187 })
188
189 #define DMAP_TO_PHYS(va) \
190 ({ \
191 KASSERT(VIRT_IN_DMAP(va), \
192 ("%s: VA out of range, VA: 0x%lx", __func__, \
193 (vm_offset_t)(va))); \
194 ((va) - DMAP_MIN_ADDRESS) + dmap_phys_base; \
195 })
196
197 #define VM_MIN_USER_ADDRESS (0x0000000000000000UL)
198 #define VM_MAX_USER_ADDRESS_SV39 (0x0000004000000000UL)
199 #define VM_MAX_USER_ADDRESS_SV48 (0x0000800000000000UL)
200 #define VM_MAX_USER_ADDRESS VM_MAX_USER_ADDRESS_SV48
201
202 #define VM_MINUSER_ADDRESS (VM_MIN_USER_ADDRESS)
203 #define VM_MAXUSER_ADDRESS (VM_MAX_USER_ADDRESS)
204
205 #define KERNBASE (VM_MIN_KERNEL_ADDRESS)
206 #define SHAREDPAGE_SV39 (VM_MAX_USER_ADDRESS_SV39 - PAGE_SIZE)
207 #define SHAREDPAGE_SV48 (VM_MAX_USER_ADDRESS_SV48 - PAGE_SIZE)
208 #define SHAREDPAGE SHAREDPAGE_SV48
209 #define USRSTACK_SV39 SHAREDPAGE_SV39
210 #define USRSTACK_SV48 SHAREDPAGE_SV48
211 #define USRSTACK USRSTACK_SV48
212 #define PS_STRINGS_SV39 (USRSTACK_SV39 - sizeof(struct ps_strings))
213 #define PS_STRINGS_SV48 (USRSTACK_SV48 - sizeof(struct ps_strings))
214
215 #define VM_EARLY_DTB_ADDRESS (VM_MAX_KERNEL_ADDRESS - (2 * L2_SIZE))
216
217 /*
218 * How many physical pages per kmem arena virtual page.
219 */
220 #ifndef VM_KMEM_SIZE_SCALE
221 #define VM_KMEM_SIZE_SCALE (1)
222 #endif
223
224 /*
225 * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the
226 * kernel map.
227 */
228 #ifndef VM_KMEM_SIZE_MAX
229 #define VM_KMEM_SIZE_MAX ((VM_MAX_KERNEL_ADDRESS - \
230 VM_MIN_KERNEL_ADDRESS + 1) * 3 / 5)
231 #endif
232
233 /*
234 * Initial pagein size of beginning of executable file.
235 */
236 #ifndef VM_INITIAL_PAGEIN
237 #define VM_INITIAL_PAGEIN 16
238 #endif
239
240 #define UMA_MD_SMALL_ALLOC
241
242 #ifndef LOCORE
243 extern vm_paddr_t dmap_phys_base;
244 extern vm_paddr_t dmap_phys_max;
245 extern vm_offset_t dmap_max_addr;
246 extern vm_offset_t vm_max_kernel_address;
247 extern vm_offset_t init_pt_va;
248 #endif
249
250 #define ZERO_REGION_SIZE (64 * 1024) /* 64KB */
251
252 #define DEVMAP_MAX_VADDR VM_MAX_KERNEL_ADDRESS
253 #define PMAP_MAPDEV_EARLY_SIZE (L2_SIZE * 2)
254
255 /*
256 * No non-transparent large page support in the pmap.
257 */
258 #define PMAP_HAS_LARGEPAGES 0
259
260 /*
261 * Need a page dump array for minidump.
262 */
263 #define MINIDUMP_PAGE_TRACKING 1
264
265 #endif /* !_MACHINE_VMPARAM_H_ */
Cache object: 654bdbadc45419e0a377b5c9f125a8c2
|