1/*-
  2 * SPDX-License-Identifier: BSD-3-Clause
  3 *
  4 * Copyright (c) 1990 The Regents of the University of California.
  5 * All rights reserved.
  6 * Copyright (c) 1994 John S. Dyson
  7 * All rights reserved.
  8 *
  9 * This code is derived from software contributed to Berkeley by
 10 * William Jolitz.
 11 *
 12 * Redistribution and use in source and binary forms, with or without
 13 * modification, are permitted provided that the following conditions
 14 * are met:
 15 * 1. Redistributions of source code must retain the above copyright
 16 *    notice, this list of conditions and the following disclaimer.
 17 * 2. Redistributions in binary form must reproduce the above copyright
 18 *    notice, this list of conditions and the following disclaimer in the
 19 *    documentation and/or other materials provided with the distribution.
 20 * 3. Neither the name of the University nor the names of its contributors
 21 *    may be used to endorse or promote products derived from this software
 22 *    without specific prior written permission.
 23 *
 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 34 * SUCH DAMAGE.
 35 *
 36 *	from: @(#)vmparam.h	5.9 (Berkeley) 5/12/91
 37 */
 38
 39#ifndef _MACHINE_VMPARAM_H_
 40#define _MACHINE_VMPARAM_H_ 1
 41
 42/*
 43 * Machine dependent constants for 386.
 44 */
 45
 46/*
 47 * Virtual memory related constants, all in bytes
 48 */
 49#define	MAXTSIZ		(128UL*1024*1024)	/* max text size */
 50#ifndef DFLDSIZ
 51#define	DFLDSIZ		(128UL*1024*1024)	/* initial data size limit */
 52#endif
 53#ifndef MAXDSIZ
 54#define	MAXDSIZ		(512UL*1024*1024)	/* max data size */
 55#endif
 56#ifndef	DFLSSIZ
 57#define	DFLSSIZ		(8UL*1024*1024)		/* initial stack size limit */
 58#endif
 59#ifndef	MAXSSIZ
 60#define	MAXSSIZ		(64UL*1024*1024)	/* max stack size */
 61#endif
 62#ifndef SGROWSIZ
 63#define SGROWSIZ	(128UL*1024)		/* amount to grow stack */
 64#endif
 65
 66/*
 67 * Choose between DENSE and SPARSE based on whether lower execution time or
 68 * lower kernel address space consumption is desired.  Under PAE, kernel
 69 * address space is often in short supply.
 70 */
 71#ifdef PAE
 72#define	VM_PHYSSEG_SPARSE
 73#else
 74#define	VM_PHYSSEG_DENSE
 75#endif
 76
 77/*
 78 * The number of PHYSSEG entries must be one greater than the number
 79 * of phys_avail entries because the phys_avail entry that spans the
 80 * largest physical address that is accessible by ISA DMA is split
 81 * into two PHYSSEG entries. 
 82 */
 83#define	VM_PHYSSEG_MAX		17
 84
 85/*
 86 * Create one free page pool.  Since the i386 kernel virtual address
 87 * space does not include a mapping onto the machine's entire physical
 88 * memory, VM_FREEPOOL_DIRECT is defined as an alias for the default
 89 * pool, VM_FREEPOOL_DEFAULT.
 90 */
 91#define	VM_NFREEPOOL		1
 92#define	VM_FREEPOOL_DEFAULT	0
 93#define	VM_FREEPOOL_DIRECT	0
 94
 95/*
 96 * Create up to three free page lists: VM_FREELIST_DMA32 is for physical pages
 97 * that have physical addresses below 4G but are not accessible by ISA DMA,
 98 * and VM_FREELIST_ISADMA is for physical pages that are accessible by ISA
 99 * DMA.
100 */
101#define	VM_NFREELIST		3
102#define	VM_FREELIST_DEFAULT	0
103#define	VM_FREELIST_DMA32	1
104#define	VM_FREELIST_LOWMEM	2
105
106#define VM_LOWMEM_BOUNDARY	(16 << 20)	/* 16MB ISA DMA limit */
107
108/*
109 * Always create DMA32 freelist if there is any memory above 4G.
110 * Bounce dma is extremely fragile and simultaneously intensively
111 * used.
112 */
113#define	VM_DMA32_NPAGES_THRESHOLD	1
114
115/*
116 * The largest allocation size is 2MB under PAE and 4MB otherwise.
117 */
118#define	VM_NFREEORDER_PAE		10
119#define	VM_NFREEORDER_NOPAE		11
120#define	VM_NFREEORDER_MAX		VM_NFREEORDER_NOPAE
121#define	VM_NFREEORDER			i386_pmap_VM_NFREEORDER
122
123/*
124 * Enable superpage reservations: 1 level.
125 */
126#ifndef	VM_NRESERVLEVEL
127#define	VM_NRESERVLEVEL		1
128#endif
129
130/*
131 * Level 0 reservations consist of 512 pages when PAE pagetables are
132 * used, and 1024 pages otherwise.
133 */
134#ifndef	VM_LEVEL_0_ORDER
135#define	VM_LEVEL_0_ORDER_PAE	9
136#define	VM_LEVEL_0_ORDER_NOPAE	10
137#define	VM_LEVEL_0_ORDER_MAX	VM_LEVEL_0_ORDER_NOPAE
138#define	VM_LEVEL_0_ORDER	i386_pmap_VM_LEVEL_0_ORDER
139#else
140#define	VM_LEVEL_0_ORDER_MAX	VM_LEVEL_0_ORDER
141#endif
142
143/*
144 * Kernel physical load address.
145 */
146#ifndef KERNLOAD
147#define	KERNLOAD		(8 * 1024 * 1024)
148#endif /* !defined(KERNLOAD) */
149
150/*
151 * Virtual addresses of things.  Derived from the page directory and
152 * page table indexes from pmap.h for precision.
153 * Because of the page that is both a PD and PT, it looks a little
154 * messy at times, but hey, we'll do anything to save a page :-)
155 */
156
157#define VM_MAX_KERNEL_ADDRESS	(0xffffffffU - 16 * 1024 * 1024 + 1)
158
159#define VM_MIN_KERNEL_ADDRESS	0
160
161#define	KERNBASE		KERNLOAD
162
163#define UPT_MAX_ADDRESS		VADDR(PTDPTDI, PTDPTDI)
164#define UPT_MIN_ADDRESS		VADDR(PTDPTDI, 0)
165
166#define VM_MAXUSER_ADDRESS	(0xffffffff - 4 * 1024 * 1024 + 1)
167
168#define	SHAREDPAGE		(VM_MAXUSER_ADDRESS - PAGE_SIZE)
169#define	USRSTACK		SHAREDPAGE
170
171#define VM_MAX_ADDRESS		VADDR(PTDPTDI, 0)
172#define VM_MIN_ADDRESS		((vm_offset_t)0)
173
174#define	PMAP_TRM_MIN_ADDRESS	VM_MAXUSER_ADDRESS
175#define	PMAP_TRM_MAX_ADDRESS	0xffffffff
176
177#define	PMAP_MAP_LOW		(4 * 1024 * 1024)
178
179/*
180 * KVA layout.  The unit of the system allocation is single PDE, which
181 * represents NBPDR bytes, aligned to NBPDR.  NBPDR is 4M for non-PAE
182 * page tables, and 2M for PAE, so PAE mode requires twice as many PTDs
183 * to create the same memory map as non-PAE.
184 *
185 * 0x00000000 - 0x003fffff	Transient identity map of low memory (0-4M),
186 *				normally disabled to catch NULL derefs.
187 * 0x00400000 - 0x007fffff	Fixed mapping of the low memory (4-8M).
188 * 0x00800000 - 0xffbfffff	KERNBASE (VA) == KERNLOAD (PA), kernel
189 *				text + data and all kernel maps.  Managed
190 *				by MI VM.
191 * 0xffc00000 - 0xffdfffff	Recursive kernel page table mapping, pointed
192 *				to by PTmap.  PTD[] recursively points
193 *				into PTmap.
194 * 0xffe00000 - 0xffffffff	Kernel/User mode shared PDE, contains GDT,
195 *				IDT, TSS, LDT, trampoline code and stacks.
196 *				Managed by pmap_trm_alloc().
197 */
198
199/*
200 * How many physical pages per kmem arena virtual page.
201 */
202#ifndef VM_KMEM_SIZE_SCALE
203#define	VM_KMEM_SIZE_SCALE	(1)
204#endif
205
206/*
207 * Optional floor (in bytes) on the size of the kmem arena.
208 */
209#ifndef VM_KMEM_SIZE_MIN
210#define	VM_KMEM_SIZE_MIN	(12 * 1024 * 1024)
211#endif
212
213/*
214 * Optional ceiling (in bytes) on the size of the kmem arena: 40% of the
215 * kernel map rounded to the nearest multiple of the superpage size.
216 */
217#ifndef VM_KMEM_SIZE_MAX
218#define	VM_KMEM_SIZE_MAX	(((((VM_MAX_KERNEL_ADDRESS - \
219    VM_MIN_KERNEL_ADDRESS) >> (PDRSHIFT - 2)) + 5) / 10) << PDRSHIFT)
220#endif
221
222/* initial pagein size of beginning of executable file */
223#ifndef VM_INITIAL_PAGEIN
224#define	VM_INITIAL_PAGEIN	16
225#endif
226
227#define	ZERO_REGION_SIZE	(64 * 1024)	/* 64KB */
228
229#ifndef VM_MAX_AUTOTUNE_MAXUSERS
230#define VM_MAX_AUTOTUNE_MAXUSERS 384
231#endif
232
233#define	SFBUF
234#define	SFBUF_MAP
235#define	SFBUF_CPUSET
236#define	SFBUF_PROCESS_PAGE
237
238#define	PMAP_HAS_DMAP	0
239#define	PHYS_TO_DMAP(x)	({ panic("No direct map exists"); 0; })
240#define	DMAP_TO_PHYS(x)	({ panic("No direct map exists"); 0; })
241
242/*
243 * No non-transparent large page support in the pmap.
244 */
245#define	PMAP_HAS_LARGEPAGES	0
246
247/*
248 * Need a page dump array for minidump.
249 */
250#define MINIDUMP_PAGE_TRACKING	1
251
252#endif /* _MACHINE_VMPARAM_H_ */