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