master
  1/*	$NetBSD: vmparam.h,v 1.88 2022/08/21 13:15:15 riastradh Exp $	*/
  2
  3/*-
  4 * Copyright (c) 1990 The Regents of the University of California.
  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 *	@(#)vmparam.h	5.9 (Berkeley) 5/12/91
 35 */
 36
 37#ifndef _I386_VMPARAM_H_
 38#define _I386_VMPARAM_H_
 39
 40#include <sys/mutex.h>
 41
 42#include <machine/pte.h>
 43
 44/*
 45 * Machine dependent constants for 386.
 46 */
 47
 48/*
 49 * Page size on the IA-32 is not variable in the traditional sense.
 50 * We override the PAGE_* definitions to compile-time constants.
 51 */
 52#define	PAGE_SHIFT	12
 53#define	PAGE_SIZE	(1 << PAGE_SHIFT)
 54#define	PAGE_MASK	(PAGE_SIZE - 1)
 55
 56/*
 57 * Virtual address space arrangement. On 386, both user and kernel
 58 * share the address space, not unlike the vax.
 59 * USRSTACK is the top (end) of the user stack. Immediately above the
 60 * user stack is the page table map, and then kernel address space.
 61 */
 62#define	USRSTACK	VM_MAXUSER_ADDRESS
 63
 64/*
 65 * Virtual memory related constants, all in bytes
 66 */
 67#define	MAXTSIZ		(256*1024*1024)		/* max text size */
 68#ifndef DFLDSIZ
 69#define	DFLDSIZ		(256*1024*1024)		/* initial data size limit */
 70#endif
 71#ifndef MAXDSIZ
 72#define	MAXDSIZ		(3U*1024*1024*1024)	/* 3G max data size */
 73#endif
 74#ifndef MAXDSIZ_BU
 75#define	MAXDSIZ_BU	(2U*1024*1024*1024 +	/* 2.5G max data size for */ \
 76			 1U* 512*1024*1024)	/* bottom-up allocation */ \
 77						/* could be a bit more */
 78#endif
 79#ifndef	DFLSSIZ
 80#define	DFLSSIZ		(2*1024*1024)		/* initial stack size limit */
 81#endif
 82#ifndef	MAXSSIZ
 83#define	MAXSSIZ		(64*1024*1024)		/* max stack size */
 84#endif
 85
 86/*
 87 * IA-32 can't do per-page execute permission, so instead we implement
 88 * two executable segments for %cs, one that covers everything and one
 89 * that excludes some of the address space (currently just the stack).
 90 * I386_MAX_EXE_ADDR is the upper boundary for the smaller segment.
 91 */
 92#define I386_MAX_EXE_ADDR	(USRSTACK - MAXSSIZ)
 93
 94/*
 95 * Size of User Raw I/O map
 96 */
 97#define	USRIOSIZE 	300
 98
 99/*
100 * See pmap_private.h for details.
101 */
102#ifdef PAE
103#define L2_SLOT_PTE	(KERNBASE/NBPD_L2-4) /* 1532: for recursive PDP map */
104#define L2_SLOT_KERN	(KERNBASE/NBPD_L2)   /* 1536: start of kernel space */
105#else /* PAE */
106#define L2_SLOT_PTE	(KERNBASE/NBPD_L2-1) /* 767: for recursive PDP map */
107#define L2_SLOT_KERN	(KERNBASE/NBPD_L2)   /* 768: start of kernel space */
108#endif /* PAE */
109
110#define L2_SLOT_KERNBASE L2_SLOT_KERN
111
112#define PDIR_SLOT_KERN	L2_SLOT_KERN
113#define PDIR_SLOT_PTE	L2_SLOT_PTE
114
115/* size of a PDP: usually one page, except for PAE */
116#ifdef PAE
117#define PDP_SIZE 4
118#else
119#define PDP_SIZE 1
120#endif
121
122/* largest value (-1 for APTP space) */
123#define NKL2_MAX_ENTRIES	(NTOPLEVEL_PDES - (KERNBASE/NBPD_L2) - 1)
124#define NKL1_MAX_ENTRIES	(unsigned long)(NKL2_MAX_ENTRIES * NPDPG)
125
126#define NKL2_KIMG_ENTRIES	0	/* XXX unused */
127
128#define NKL2_START_ENTRIES	0	/* XXX computed on runtime */
129#define NKL1_START_ENTRIES	0	/* XXX unused */
130
131#ifndef XENPV
132#define NTOPLEVEL_PDES		(PAGE_SIZE * PDP_SIZE / (sizeof (pd_entry_t)))
133#else	/* !XENPV */
134#ifdef  PAE
135#define NTOPLEVEL_PDES		1964	/* 1964-2047 reserved by Xen */
136#else	/* PAE */
137#define NTOPLEVEL_PDES		1008	/* 1008-1023 reserved by Xen */
138#endif	/* PAE */
139#endif  /* !XENPV */
140
141/*
142 * Mach derived constants
143 */
144
145/* user/kernel map constants */
146#define VM_MIN_ADDRESS		((vaddr_t)0)
147#define	VM_MAXUSER_ADDRESS	((vaddr_t)(PDIR_SLOT_PTE << L2_SHIFT) - PAGE_SIZE)
148#define	VM_MAX_ADDRESS		\
149	((vaddr_t)((PDIR_SLOT_PTE << L2_SHIFT) + (PDIR_SLOT_PTE << L1_SHIFT)))
150#define	VM_MIN_KERNEL_ADDRESS	((vaddr_t)(PDIR_SLOT_KERN << L2_SHIFT))
151#define	VM_MAX_KERNEL_ADDRESS	((vaddr_t)((PDIR_SLOT_KERN + NKL2_MAX_ENTRIES) << L2_SHIFT))
152
153/*
154 * The address to which unspecified mapping requests default
155 */
156#ifdef _KERNEL_OPT
157#include "opt_uvm.h"
158#include "opt_xen.h"
159#endif
160#define __USE_TOPDOWN_VM
161#define VM_DEFAULT_ADDRESS_BOTTOMUP(da, sz) \
162    round_page((vaddr_t)(da) + (vsize_t)MIN(maxdmap, MAXDSIZ_BU))
163
164/* virtual sizes (bytes) for various kernel submaps */
165#define VM_PHYS_SIZE		(USRIOSIZE*PAGE_SIZE)
166
167#define VM_PHYSSEG_STRAT	VM_PSTRAT_BIGFIRST
168
169#ifdef XENPV
170#define	VM_PHYSSEG_MAX		1
171#define	VM_NFREELIST		1
172#else
173#define	VM_PHYSSEG_MAX		32	/* 1 "hole" + 31 free lists */
174#define	VM_NFREELIST		4
175#define	VM_FREELIST_FIRST16	3
176#define	VM_FREELIST_FIRST1G	2
177#define	VM_FREELIST_FIRST4G	1
178#endif /* XENPV */
179#define	VM_FREELIST_DEFAULT	0
180
181#endif /* _I386_VMPARAM_H_ */