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