1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright (c) 2015 by Delphix. All rights reserved.
  24  * Copyright 2018 Joyent, Inc.
  25  */
  26 
  27 /*      Copyright (c) 1988 AT&T     */
  28 /*        All Rights Reserved   */
  29 
  30 
  31 #ifndef _SYS_MACHPARAM_H
  32 #define _SYS_MACHPARAM_H
  33 
  34 #if !defined(_ASM)
  35 #include <sys/types.h>
  36 
  37 #if defined(__xpv)
  38 #include <sys/xpv_impl.h>
  39 #endif
  40 
  41 #endif
  42 
  43 #ifdef  __cplusplus
  44 extern "C" {
  45 #endif
  46 
  47 #ifndef _ASM
  48 #define ADDRESS_C(c)    c ## ul
  49 #else   /* _ASM */
  50 #define ADDRESS_C(c)    (c)
  51 #endif  /* _ASM */
  52 
  53 /*
  54  * Machine dependent parameters and limits.
  55  */
  56 
  57 #if defined(__amd64)
  58 /*
  59  * If NCPU grows beyond 256, sizing for the x86 comm page will require
  60  * adjustment.
  61  */
  62 #define NCPU    256
  63 #define NCPU_LOG2       8
  64 #elif defined(__i386)
  65 #define NCPU    32
  66 #define NCPU_LOG2       5
  67 #endif
  68 
  69 /* NCPU_P2 is NCPU rounded to a power of 2 */
  70 #define NCPU_P2 (1 << NCPU_LOG2)
  71 
  72 /*
  73  * The value defined below could grow to 16. hat structure and
  74  * page_t have room for 16 nodes.
  75  */
  76 #define MAXNODES        4
  77 #define NUMA_NODEMASK   0x0f
  78 
  79 /*
  80  * Define the FPU symbol if we could run on a machine with an external
  81  * FPU (i.e. not integrated with the normal machine state like the vax).
  82  *
  83  * The fpu is defined in the architecture manual, and the kernel hides
  84  * its absence if it is not present, that's pretty integrated, no?
  85  */
  86 
  87 /* supported page sizes */
  88 #define MMU_PAGE_SIZES  3
  89 
  90 /*
  91  * MMU_PAGES* describes the physical page size used by the mapping hardware.
  92  * PAGES* describes the logical page size used by the system.
  93  */
  94 
  95 #define MMU_PAGESIZE    0x1000          /* 4096 bytes */
  96 #define MMU_PAGESHIFT   12              /* log2(MMU_PAGESIZE) */
  97 
  98 #if !defined(_ASM)
  99 #define MMU_PAGEOFFSET  (MMU_PAGESIZE-1) /* Mask of address bits in page */
 100 #else   /* _ASM */
 101 #define MMU_PAGEOFFSET  _CONST(MMU_PAGESIZE-1)  /* assembler lameness */
 102 #endif  /* _ASM */
 103 
 104 #define MMU_PAGEMASK    (~MMU_PAGEOFFSET)
 105 
 106 #define PAGESIZE        0x1000          /* All of the above, for logical */
 107 #define PAGESHIFT       12
 108 #define PAGEOFFSET      (PAGESIZE - 1)
 109 #define PAGEMASK        (~PAGEOFFSET)
 110 
 111 /*
 112  * DATA_ALIGN is used to define the alignment of the Unix data segment.
 113  */
 114 #define DATA_ALIGN      PAGESIZE
 115 
 116 /*
 117  * DEFAULT KERNEL THREAD stack size (in pages).
 118  */
 119 #if defined(__amd64)
 120 #define DEFAULTSTKSZ_NPGS       5
 121 #elif defined(__i386)
 122 #define DEFAULTSTKSZ_NPGS       3
 123 #endif
 124 
 125 #if !defined(_ASM)
 126 #define DEFAULTSTKSZ    (DEFAULTSTKSZ_NPGS * PAGESIZE)
 127 #else   /* !_ASM */
 128 #define DEFAULTSTKSZ    _MUL(DEFAULTSTKSZ_NPGS, PAGESIZE) /* as(1) lameness */
 129 #endif  /* !_ASM */
 130 
 131 /*
 132  * KERNELBASE is the virtual address at which the kernel segments start in
 133  * all contexts.
 134  *
 135  * KERNELBASE is not fixed.  The value of KERNELBASE can change with
 136  * installed memory or on 32 bit systems the eprom variable 'eprom_kernelbase'.
 137  *
 138  * common/conf/param.c requires a compile time defined value for KERNELBASE.
 139  * This value is save in the variable _kernelbase.  _kernelbase may then be
 140  * modified with to a different value in i86pc/os/startup.c.
 141  *
 142  * Most code should be using kernelbase, which resolves to a reference to
 143  * _kernelbase.
 144  */
 145 #define KERNEL_TEXT_amd64       UINT64_C(0xfffffffffb800000)
 146 
 147 #ifdef __i386
 148 
 149 #define KERNEL_TEXT_i386        ADDRESS_C(0xfe800000)
 150 
 151 /*
 152  * We don't use HYPERVISOR_VIRT_START, as we need both the PAE and non-PAE
 153  * versions in our code. We always compile based on the lower PAE address.
 154  */
 155 #define KERNEL_TEXT_i386_xpv    \
 156         (HYPERVISOR_VIRT_START_PAE - 3 * ADDRESS_C(0x400000))
 157 
 158 #endif /* __i386 */
 159 
 160 #if defined(__amd64)
 161 
 162 #define KERNELBASE      ADDRESS_C(0xfffffd8000000000)
 163 
 164 /*
 165  * Size of the unmapped "red zone" at the very bottom of the kernel's
 166  * address space.  Corresponds to 1 slot in the toplevel pagetable.
 167  */
 168 #define KERNEL_REDZONE_SIZE   ((uintptr_t)1 << 39)
 169 
 170 /*
 171  * Base of 'core' heap area, which is used for kernel and module text/data
 172  * that must be within a 2GB range to allow for rip-relative addressing.
 173  */
 174 #define COREHEAP_BASE   ADDRESS_C(0xffffffffc0000000)
 175 
 176 /*
 177  * Beginning of the segkpm window. A lower value than this is used if
 178  * physical addresses exceed 1TB. See i86pc/os/startup.c
 179  */
 180 #define SEGKPM_BASE     ADDRESS_C(0xfffffe0000000000)
 181 
 182 /*
 183  * This is valloc_base, above seg_kpm, but below everything else.
 184  * A lower value than this may be used if SEGKPM_BASE is adjusted.
 185  * See i86pc/os/startup.c
 186  */
 187 #define VALLOC_BASE     ADDRESS_C(0xffffff0000000000)
 188 
 189 /*
 190  * default and boundary sizes for segkp
 191  */
 192 #define SEGKPDEFSIZE    (2L * 1024L * 1024L * 1024L)            /*   2G */
 193 #define SEGKPMAXSIZE    (8L * 1024L * 1024L * 1024L)            /*   8G */
 194 #define SEGKPMINSIZE    (200L * 1024 * 1024L)                   /* 200M */
 195 
 196 /*
 197  * minimum size for segzio
 198  */
 199 #define SEGZIOMINSIZE   (400L * 1024 * 1024L)                   /* 400M */
 200 
 201 /*
 202  * During intial boot we limit heap to the top 4Gig.
 203  */
 204 #define BOOT_KERNELHEAP_BASE    ADDRESS_C(0xffffffff00000000)
 205 
 206 /*
 207  * VMWare works best if we don't use the top 64Meg of memory for amd64.
 208  * Set KERNEL_TEXT to top_o_memory - 64Meg - 8 Meg for 8Meg of nucleus pages.
 209  */
 210 #define PROMSTART       ADDRESS_C(0xffc00000)
 211 #define KERNEL_TEXT     KERNEL_TEXT_amd64
 212 
 213 /*
 214  * Virtual address range available to the debugger
 215  */
 216 #define SEGDEBUGBASE    ADDRESS_C(0xffffffffff800000)
 217 #define SEGDEBUGSIZE    ADDRESS_C(0x400000)
 218 
 219 /*
 220  * Define upper limit on user address space
 221  *
 222  * In amd64, the upper limit on a 64-bit user address space is 1 large page
 223  * (2MB) below kernelbase.  The upper limit for a 32-bit user address space
 224  * is 1 small page (4KB) below the top of the 32-bit range.  The 64-bit
 225  * limit give dtrace the red zone it needs below kernelbase.  The 32-bit
 226  * limit gives us a small red zone to detect address-space overruns in a
 227  * user program.
 228  *
 229  * On the hypervisor, we limit the user to memory below the VA hole.
 230  * Subtract 1 large page for a red zone.
 231  */
 232 #if defined(__xpv)
 233 #define USERLIMIT       ADDRESS_C(0x00007fffffe00000)
 234 #else
 235 #define USERLIMIT       ADDRESS_C(0xfffffd7fffe00000)
 236 #endif
 237 
 238 #ifdef bug_5074717_is_fixed
 239 #define USERLIMIT32     ADDRESS_C(0xfffff000)
 240 #else
 241 #define USERLIMIT32     ADDRESS_C(0xfefff000)
 242 #endif
 243 
 244 #elif defined(__i386)
 245 
 246 #ifdef DEBUG
 247 #define KERNELBASE      ADDRESS_C(0xc8000000)
 248 #else
 249 #define KERNELBASE      ADDRESS_C(0xd4000000)
 250 #endif
 251 
 252 #define KERNELBASE_MAX  ADDRESS_C(0xe0000000)
 253 
 254 /*
 255  * The i386 ABI requires that the user address space be at least 3Gb
 256  * in size.  KERNELBASE_ABI_MIN is used as the default KERNELBASE for
 257  * physical memory configurations > 4gb.
 258  */
 259 #define KERNELBASE_ABI_MIN      ADDRESS_C(0xc0000000)
 260 
 261 /*
 262  * Size of the unmapped "red zone" at the very bottom of the kernel's
 263  * address space.  Since segmap start immediately above the red zone, this
 264  * needs to be MAXBSIZE aligned.
 265  */
 266 #define KERNEL_REDZONE_SIZE   MAXBSIZE
 267 
 268 /*
 269  * This is the last 4MB of the 4G address space. Some psm modules
 270  * need this region of virtual address space mapped 1-1
 271  * The top 64MB of the address space is reserved for the hypervisor.
 272  */
 273 #define PROMSTART       ADDRESS_C(0xffc00000)
 274 #ifdef __xpv
 275 #define KERNEL_TEXT     KERNEL_TEXT_i386_xpv
 276 #else
 277 #define KERNEL_TEXT     KERNEL_TEXT_i386
 278 #endif
 279 
 280 /*
 281  * Virtual address range available to the debugger
 282  * We place it just above the kernel text (4M) and kernel data (4M).
 283  */
 284 #define SEGDEBUGBASE    (KERNEL_TEXT + ADDRESS_C(0x800000))
 285 #define SEGDEBUGSIZE    ADDRESS_C(0x400000)
 286 
 287 /*
 288  * Define upper limit on user address space
 289  */
 290 #define USERLIMIT       KERNELBASE
 291 #define USERLIMIT32     USERLIMIT
 292 
 293 #endif  /* __i386 */
 294 
 295 /*
 296  * Reserve pages just below KERNEL_TEXT for the GDT, IDT, LDT, TSS and debug
 297  * info.
 298  *
 299  * For now, DEBUG_INFO_VA must be first in this list for "xm" initiated dumps
 300  * of solaris domUs to be usable with mdb. Relying on a fixed VA is not viable
 301  * long term, but it's the best we've got for now.
 302  */
 303 #if !defined(_ASM)
 304 #define DEBUG_INFO_VA   (KERNEL_TEXT - MMU_PAGESIZE)
 305 #define GDT_VA          (DEBUG_INFO_VA - MMU_PAGESIZE)
 306 #define IDT_VA          (GDT_VA - MMU_PAGESIZE)
 307 #define LDT_VA          (IDT_VA - (16 * MMU_PAGESIZE))
 308 #define KTSS_VA         (LDT_VA - MMU_PAGESIZE)
 309 #define DFTSS_VA        (KTSS_VA - MMU_PAGESIZE)
 310 #define MISC_VA_BASE    (DFTSS_VA)
 311 #define MISC_VA_SIZE    (KERNEL_TEXT - MISC_VA_BASE)
 312 #endif /* !_ASM */
 313 
 314 #if !defined(_ASM) && !defined(_KMDB)
 315 extern uintptr_t kernelbase, segmap_start, segmapsize;
 316 #endif
 317 
 318 /*
 319  * ARGSBASE is the base virtual address of the range which
 320  * the kernel uses to map the arguments for exec.
 321  */
 322 #define ARGSBASE        PROMSTART
 323 
 324 /*
 325  * reserve space for modules
 326  */
 327 #define MODTEXT (1024 * 1024 * 2)
 328 #define MODDATA (1024 * 300)
 329 
 330 /*
 331  * The heap has a region allocated from it of HEAPTEXT_SIZE bytes specifically
 332  * for module text.
 333  */
 334 #define HEAPTEXT_SIZE           (64 * 1024 * 1024)      /* bytes */
 335 
 336 /*
 337  * Size of a kernel threads stack.  It must be a whole number of pages
 338  * since the segment it comes from will only allocate space in pages.
 339  */
 340 #define T_STACKSZ       2*PAGESIZE
 341 
 342 /*
 343  * Size of a cpu startup thread stack.  (It must be a whole number of pages
 344  * since the containing segment only allocates space in pages.)
 345  */
 346 
 347 #define STARTUP_STKSZ   3*PAGESIZE
 348 
 349 /*
 350  * Bus types
 351  */
 352 #define BTISA           1
 353 #define BTEISA          2
 354 #define BTMCA           3
 355 
 356 #ifdef  __cplusplus
 357 }
 358 #endif
 359 
 360 #endif  /* _SYS_MACHPARAM_H */