Print this page
NEX-16819 loader UEFI support
Includes work by Toomas Soome <tsoome@me.com>
Upstream commits:
    loader: pxe receive cleanup
    9475 libefi: Do not return only if ReceiveFilter
    installboot: should support efi system partition
    8931 boot1.efi: scan all display modes rather than
    loader: spinconsole updates
    loader: gfx experiment to try GOP Blt() function.
    sha1 build test
    loader: add sha1 hash calculation
    common/sha1: update for loader build
    loader: biosdisk rework
    uts: 32-bit kernel FB needs mapping in low memory
    uts: add diag-device
    uts: boot console mirror with diag-device
    uts: enable very early console on ttya
    kmdb: add diag-device as input/output device
    uts: test VGA memory exclusion from mapping
    uts: clear boot mapping and protect boot pages test
    uts: add dboot map debug printf
    uts: need to release FB pages in release_bootstrap()
    uts: add screenmap ioctl
    uts: update sys/queue.h
    loader: add illumos uts/common to include path
    loader: tem/gfx font cleanup
    loader: vbe checks
    uts: gfx_private set KD_TEXT when KD_RESETTEXT is
    uts: gfx 8-bit update
    loader: gfx 8-bit fix
    loader: always set media size from partition.
    uts: MB2 support for 32-bit kernel
    loader: x86 should have tem 80x25
    uts: x86 should have tem 80x25
    uts: font update
    loader: font update
    uts: tem attributes
    loader: tem.c comment added
    uts: use font module
    loader: add font module
    loader: build rules for new font setup
    uts: gfx_private update for new font structure
    uts: early boot update for new font structure
    uts: font update
    uts: font build rules update for new fonts
    uts: tem update to new font structure
    loader: module.c needs to include tem_impl.h
    uts: gfx_private 8x16 font rework
    uts: make font_lookup public
    loader: font rework
    uts: font rework
    9259 libefi: efi_alloc_and_read should check for PMBR
    uts: tem utf-8 support
    loader: implement tem utf-8 support
    loader: tem should be able to display UTF-8
    7784 uts: console input should support utf-8
    7796 uts: ldterm default to utf-8
    uts: do not reset serial console
    uts: set up colors even if tem is not console
    uts: add type for early boot properties
    uts: gfx_private experiment with drm and vga
    uts: gfx_private should use setmode drm callback.
    uts: identify FB types and set up gfx_private based
    loader: replace gop and vesa with framebuffer
    uts: boot needs simple tem to support mdb
    uts: boot_keyboard should emit esc sequences for
    uts: gfx_private FB showuld be written by line
    kmdb: set terminal window size
    uts: gfx_private needs to keep track of early boot FB
    pnglite: move pnglite to usr/src/common
    loader: gfx_fb
    ficl-sys: add gfx primitives
    loader: add illumos.png logo
    ficl: add fb-putimage
    loader: add png support
    loader: add alpha blending for gfx_fb
    loader: use term-drawrect for menu frame
    ficl: add simple gfx words
    uts: provide fb_info via fbgattr dev_specific array.
    uts: gfx_private add alpha blending
    uts: update sys/ascii.h
    uts: tem OSC support (incomplete)
    uts: implement env module support and use data from
    uts: tem get colors from early boot data
    loader: use crc32 from libstand (libz)
    loader: optimize for size
    loader: pass tem info to the environment
    loader: import tem for loader console
    loader: UEFI loader needs to set ISADIR based on
    loader: need UEFI32 support
    8918 loader.efi: add vesa edid support
    uts: tem_safe_pix_clear_prom_output() should only
    uts: tem_safe_pix_clear_entire_screen() should use
    uts: tem_safe_check_first_time() should query cursor
    uts: tem implement cls callback & visual_io v4
    uts: gfx_vgatext use block cursor for vgatext
    uts: gfx_private implement cls callback & visual_io
    uts: gfx_private bitmap framebuffer implementation
    uts: early start frame buffer console support
    uts: font functions should check the input char
    uts: font rendering should support 16/24/32bit depths
    uts: use smallest font as fallback default.
    uts: update terminal dimensions based on selected
    7834 uts: vgatext should use gfx_private
    uts: add spacing property to 8859-1.bdf
    terminfo: add underline for sun-color
    terminfo: sun-color has 16 colors
    uts: add font load callback type
    loader: do not repeat int13 calls with error 0x20 and
    8905 loader: add skein/edonr support
    8904 common/crypto: make skein and edonr loader
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Revert "NEX-16819 loader UEFI support"
This reverts commit ec06b9fc617b99234e538bf2e7e4d02a24993e0c.
Reverting due to failures in the zfs-tests and the sharefs-tests
NEX-16819 loader UEFI support
Includes work by Toomas Soome <tsoome@me.com>
Upstream commits:
    loader: pxe receive cleanup
    9475 libefi: Do not return only if ReceiveFilter
    installboot: should support efi system partition
    8931 boot1.efi: scan all display modes rather than
    loader: spinconsole updates
    loader: gfx experiment to try GOP Blt() function.
    sha1 build test
    loader: add sha1 hash calculation
    common/sha1: update for loader build
    loader: biosdisk rework
    uts: 32-bit kernel FB needs mapping in low memory
    uts: add diag-device
    uts: boot console mirror with diag-device
    uts: enable very early console on ttya
    kmdb: add diag-device as input/output device
    uts: test VGA memory exclusion from mapping
    uts: clear boot mapping and protect boot pages test
    uts: add dboot map debug printf
    uts: need to release FB pages in release_bootstrap()
    uts: add screenmap ioctl
    uts: update sys/queue.h
    loader: add illumos uts/common to include path
    loader: tem/gfx font cleanup
    loader: vbe checks
    uts: gfx_private set KD_TEXT when KD_RESETTEXT is
    uts: gfx 8-bit update
    loader: gfx 8-bit fix
    loader: always set media size from partition.
    uts: MB2 support for 32-bit kernel
    loader: x86 should have tem 80x25
    uts: x86 should have tem 80x25
    uts: font update
    loader: font update
    uts: tem attributes
    loader: tem.c comment added
    uts: use font module
    loader: add font module
    loader: build rules for new font setup
    uts: gfx_private update for new font structure
    uts: early boot update for new font structure
    uts: font update
    uts: font build rules update for new fonts
    uts: tem update to new font structure
    loader: module.c needs to include tem_impl.h
    uts: gfx_private 8x16 font rework
    uts: make font_lookup public
    loader: font rework
    uts: font rework
    libefi: efi_alloc_and_read should check for PMBR
    uts: tem utf-8 support
    loader: implement tem utf-8 support
    loader: tem should be able to display UTF-8
    7784 uts: console input should support utf-8
    7796 uts: ldterm default to utf-8
    uts: do not reset serial console
    uts: set up colors even if tem is not console
    uts: add type for early boot properties
    uts: gfx_private experiment with drm and vga
    uts: gfx_private should use setmode drm callback.
    uts: identify FB types and set up gfx_private based
    loader: replace gop and vesa with framebuffer
    uts: boot needs simple tem to support mdb
    uts: boot_keyboard should emit esc sequences for
    uts: gfx_private FB showuld be written by line
    kmdb: set terminal window size
    uts: gfx_private needs to keep track of early boot FB
    pnglite: move pnglite to usr/src/common
    loader: gfx_fb
    ficl-sys: add gfx primitives
    loader: add illumos.png logo
    ficl: add fb-putimage
    loader: add png support
    loader: add alpha blending for gfx_fb
    loader: use term-drawrect for menu frame
    ficl: add simple gfx words
    uts: provide fb_info via fbgattr dev_specific array.
    uts: gfx_private add alpha blending
    uts: update sys/ascii.h
    uts: tem OSC support (incomplete)
    uts: implement env module support and use data from
    uts: tem get colors from early boot data
    loader: use crc32 from libstand (libz)
    loader: optimize for size
    loader: pass tem info to the environment
    loader: import tem for loader console
    loader: UEFI loader needs to set ISADIR based on
    loader: need UEFI32 support
    8918 loader.efi: add vesa edid support
    uts: tem_safe_pix_clear_prom_output() should only
    uts: tem_safe_pix_clear_entire_screen() should use
    uts: tem_safe_check_first_time() should query cursor
    uts: tem implement cls callback & visual_io v4
    uts: gfx_vgatext use block cursor for vgatext
    uts: gfx_private implement cls callback & visual_io
    uts: gfx_private bitmap framebuffer implementation
    uts: early start frame buffer console support
    uts: font functions should check the input char
    uts: font rendering should support 16/24/32bit depths
    uts: use smallest font as fallback default.
    uts: update terminal dimensions based on selected
    7834 uts: vgatext should use gfx_private
    uts: add spacing property to 8859-1.bdf
    terminfo: add underline for sun-color
    terminfo: sun-color has 16 colors
    uts: add font load callback type
    loader: do not repeat int13 calls with error 0x20 and
    8905 loader: add skein/edonr support
    8904 common/crypto: make skein and edonr loader
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-14317 HVM with more than 2 VCPUs hangs on Xen 4.7
Reviewed by: Alex Deiter <alex.deiter@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
re #13613 rb4516 Tunables needs volatile keyword
re #13140 rb4270 hvm_sd module missing dependencies on scsi and cmlb
re #13166 rb4270 Check for Xen HVM even if CPUID signature returns Microsoft Hv
re #13187 rb4270 Fix Xen HVM related warnings
re #11780 rb3700 Improve hypervisor environment detection


   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 /*
  23  * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  25  * Copyright 2017 Nexenta Systems, Inc.
  26  * Copyright 2015 Joyent, Inc.
  27  * Copyright (c) 2015 by Delphix. All rights reserved.
  28  */

  29 /*
  30  * Copyright (c) 2010, Intel Corporation.
  31  * All rights reserved.
  32  */
  33 
  34 #include <sys/types.h>
  35 #include <sys/t_lock.h>
  36 #include <sys/param.h>
  37 #include <sys/sysmacros.h>
  38 #include <sys/signal.h>
  39 #include <sys/systm.h>
  40 #include <sys/user.h>
  41 #include <sys/mman.h>
  42 #include <sys/vm.h>
  43 #include <sys/conf.h>
  44 #include <sys/avintr.h>
  45 #include <sys/autoconf.h>
  46 #include <sys/disp.h>
  47 #include <sys/class.h>
  48 #include <sys/bitmap.h>


 108 #include <sys/machsystm.h>
 109 #include <vm/hat.h>
 110 #include <vm/hat_i86.h>
 111 #include <sys/pmem.h>
 112 #include <sys/smp_impldefs.h>
 113 #include <sys/x86_archext.h>
 114 #include <sys/cpuvar.h>
 115 #include <sys/segments.h>
 116 #include <sys/clconf.h>
 117 #include <sys/kobj.h>
 118 #include <sys/kobj_lex.h>
 119 #include <sys/cpc_impl.h>
 120 #include <sys/cpu_module.h>
 121 #include <sys/smbios.h>
 122 #include <sys/debug_info.h>
 123 #include <sys/bootinfo.h>
 124 #include <sys/ddi_periodic.h>
 125 #include <sys/systeminfo.h>
 126 #include <sys/multiboot.h>
 127 #include <sys/ramdisk.h>

 128 
 129 #ifdef  __xpv
 130 
 131 #include <sys/hypervisor.h>
 132 #include <sys/xen_mmu.h>
 133 #include <sys/evtchn_impl.h>
 134 #include <sys/gnttab.h>
 135 #include <sys/xpv_panic.h>
 136 #include <xen/sys/xenbus_comms.h>
 137 #include <xen/public/physdev.h>
 138 
 139 extern void xen_late_startup(void);
 140 
 141 struct xen_evt_data cpu0_evt_data;
 142 
 143 #else   /* __xpv */
 144 #include <sys/memlist_impl.h>
 145 
 146 extern void mem_config_init(void);
 147 #endif /* __xpv */


 213  * kernelbase being set too high.
 214  */
 215 #define PHYSMEM 0x400000
 216 
 217 #else /* __amd64 */
 218 
 219 /*
 220  * For now we can handle memory with physical addresses up to about
 221  * 64 Terabytes. This keeps the kernel above the VA hole, leaving roughly
 222  * half the VA space for seg_kpm. When systems get bigger than 64TB this
 223  * code will need revisiting. There is an implicit assumption that there
 224  * are no *huge* holes in the physical address space too.
 225  */
 226 #define TERABYTE                (1ul << 40)
 227 #define PHYSMEM_MAX64           mmu_btop(64 * TERABYTE)
 228 #define PHYSMEM                 PHYSMEM_MAX64
 229 #define AMD64_VA_HOLE_END       0xFFFF800000000000ul
 230 
 231 #endif /* __amd64 */
 232 
 233 pgcnt_t physmem = PHYSMEM;
 234 pgcnt_t obp_pages;      /* Memory used by PROM for its text and data */
 235 
 236 char *kobj_file_buf;
 237 int kobj_file_bufsize;  /* set in /etc/system */
 238 
 239 /* Global variables for MP support. Used in mp_startup */
 240 caddr_t rm_platter_va = 0;
 241 uint32_t rm_platter_pa;
 242 
 243 int     auto_lpg_disable = 1;
 244 
 245 /*
 246  * Some CPUs have holes in the middle of the 64-bit virtual address range.
 247  */
 248 uintptr_t hole_start, hole_end;
 249 
 250 /*
 251  * kpm mapping window
 252  */
 253 caddr_t kpm_vbase;


 313 struct seg kpseg;               /* Segment used for pageable kernel virt mem */
 314 struct seg kmapseg;             /* Segment used for generic kernel mappings */
 315 struct seg kdebugseg;           /* Segment used for the kernel debugger */
 316 
 317 struct seg *segkmap = &kmapseg;     /* Kernel generic mapping segment */
 318 static struct seg *segmap = &kmapseg;       /* easier to use name for in here */
 319 
 320 struct seg *segkp = &kpseg; /* Pageable kernel virtual memory segment */
 321 
 322 #if defined(__amd64)
 323 struct seg kvseg_core;          /* Segment used for the core heap */
 324 struct seg kpmseg;              /* Segment used for physical mapping */
 325 struct seg *segkpm = &kpmseg;       /* 64bit kernel physical mapping segment */
 326 #else
 327 struct seg *segkpm = NULL;      /* Unused on IA32 */
 328 #endif
 329 
 330 caddr_t segkp_base;             /* Base address of segkp */
 331 caddr_t segzio_base;            /* Base address of segzio */
 332 #if defined(__amd64)
 333 pgcnt_t segkpsize = btop(SEGKPDEFSIZE); /* size of segkp segment in pages */

 334 #else
 335 pgcnt_t segkpsize = 0;
 336 #endif
 337 pgcnt_t segziosize = 0;         /* size of zio segment in pages */
 338 
 339 /*
 340  * A static DR page_t VA map is reserved that can map the page structures
 341  * for a domain's entire RA space. The pages that back this space are
 342  * dynamically allocated and need not be physically contiguous.  The DR
 343  * map size is derived from KPM size.
 344  * This mechanism isn't used by x86 yet, so just stubs here.
 345  */
 346 int ppvm_enable = 0;            /* Static virtual map for page structs */
 347 page_t *ppvm_base = NULL;       /* Base of page struct map */
 348 pgcnt_t ppvm_size = 0;          /* Size of page struct map */
 349 
 350 /*
 351  * VA range available to the debugger
 352  */
 353 const caddr_t kdi_segdebugbase = (const caddr_t)SEGDEBUGBASE;
 354 const size_t kdi_segdebugsize = SEGDEBUGSIZE;
 355 


2027          * KERNEL_TEXT and below kernelbase) is dealt with correctly.
2028          * Note this may never happen, but it might someday.
2029          */
2030         bootpages = NULL;
2031         PRM_POINT("Protecting boot pages");
2032 
2033         /*
2034          * Protect any pages mapped above KERNEL_TEXT that somehow have
2035          * page_t's. This can only happen if something weird allocated
2036          * in this range (like kadb/kmdb).
2037          */
2038         protect_boot_range(KERNEL_TEXT, (uintptr_t)-1, 0);
2039 
2040         /*
2041          * Before we can take over memory allocation/mapping from the boot
2042          * loader we must remove from our free page lists any boot allocated
2043          * pages that stay mapped until release_bootstrap().
2044          */
2045         protect_boot_range(0, kernelbase, 1);
2046 
2047 
2048         /*
2049          * Switch to running on regular HAT (not boot_mmu)
2050          */
2051         PRM_POINT("Calling hat_kern_setup()...");
2052         hat_kern_setup();
2053 
2054         /*
2055          * It is no longer safe to call BOP_ALLOC(), so make sure we don't.
2056          */
2057         bop_no_more_mem();
2058 
2059         PRM_POINT("hat_kern_setup() done");
2060 
2061         hat_cpu_online(CPU);
2062 
2063         /*
2064          * Initialize VM system
2065          */
2066         PRM_POINT("Calling kvm_init()...");
2067         kvm_init();


2504                 (void) snprintf(propname, sizeof (propname),
2505                     "module-size-%u", i);
2506                 if (do_bsys_getproplen(NULL, propname) <= 0)
2507                         break;
2508                 (void) do_bsys_getprop(NULL, propname, &size);
2509 
2510                 modranges[i].phys = start;
2511                 modranges[i].size = size;
2512         }
2513 
2514         /* unmount boot ramdisk and release kmem usage */
2515         kobj_boot_unmountroot();
2516 
2517         /*
2518          * We're finished using the boot loader so free its pages.
2519          */
2520         PRM_POINT("Unmapping lower boot pages");
2521 
2522         clear_boot_mappings(0, _userlimit);
2523 










2524         postbootkernelbase = kernelbase;
2525 
2526         /*
2527          * If root isn't on ramdisk, destroy the hardcoded
2528          * ramdisk node now and release the memory. Else,
2529          * ramdisk memory is kept in rd_pages.
2530          */
2531         root_is_ramdisk = (getmajor(rootdev) == ddi_name_to_major("ramdisk"));
2532         if (!root_is_ramdisk) {
2533                 dev_info_t *dip = ddi_find_devinfo("ramdisk", -1, 0);
2534                 ASSERT(dip && ddi_get_parent(dip) == ddi_root_node());
2535                 ndi_rele_devi(dip);     /* held from ddi_find_devinfo */
2536                 (void) ddi_remove_child(dip, 0);
2537         }
2538 
2539         PRM_POINT("Releasing boot pages");
2540         while (bootpages) {
2541                 extern uint64_t ramdisk_start, ramdisk_end;
2542                 pp = bootpages;
2543                 bootpages = pp->p_next;




   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 /*
  23  * Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  25  * Copyright 2017 Nexenta Systems, Inc.
  26  * Copyright 2015 Joyent, Inc.
  27  * Copyright (c) 2015 by Delphix. All rights reserved.
  28  */
  29 
  30 /*
  31  * Copyright (c) 2010, Intel Corporation.
  32  * All rights reserved.
  33  */
  34 
  35 #include <sys/types.h>
  36 #include <sys/t_lock.h>
  37 #include <sys/param.h>
  38 #include <sys/sysmacros.h>
  39 #include <sys/signal.h>
  40 #include <sys/systm.h>
  41 #include <sys/user.h>
  42 #include <sys/mman.h>
  43 #include <sys/vm.h>
  44 #include <sys/conf.h>
  45 #include <sys/avintr.h>
  46 #include <sys/autoconf.h>
  47 #include <sys/disp.h>
  48 #include <sys/class.h>
  49 #include <sys/bitmap.h>


 109 #include <sys/machsystm.h>
 110 #include <vm/hat.h>
 111 #include <vm/hat_i86.h>
 112 #include <sys/pmem.h>
 113 #include <sys/smp_impldefs.h>
 114 #include <sys/x86_archext.h>
 115 #include <sys/cpuvar.h>
 116 #include <sys/segments.h>
 117 #include <sys/clconf.h>
 118 #include <sys/kobj.h>
 119 #include <sys/kobj_lex.h>
 120 #include <sys/cpc_impl.h>
 121 #include <sys/cpu_module.h>
 122 #include <sys/smbios.h>
 123 #include <sys/debug_info.h>
 124 #include <sys/bootinfo.h>
 125 #include <sys/ddi_periodic.h>
 126 #include <sys/systeminfo.h>
 127 #include <sys/multiboot.h>
 128 #include <sys/ramdisk.h>
 129 #include <sys/framebuffer.h>
 130 
 131 #ifdef  __xpv
 132 
 133 #include <sys/hypervisor.h>
 134 #include <sys/xen_mmu.h>
 135 #include <sys/evtchn_impl.h>
 136 #include <sys/gnttab.h>
 137 #include <sys/xpv_panic.h>
 138 #include <xen/sys/xenbus_comms.h>
 139 #include <xen/public/physdev.h>
 140 
 141 extern void xen_late_startup(void);
 142 
 143 struct xen_evt_data cpu0_evt_data;
 144 
 145 #else   /* __xpv */
 146 #include <sys/memlist_impl.h>
 147 
 148 extern void mem_config_init(void);
 149 #endif /* __xpv */


 215  * kernelbase being set too high.
 216  */
 217 #define PHYSMEM 0x400000
 218 
 219 #else /* __amd64 */
 220 
 221 /*
 222  * For now we can handle memory with physical addresses up to about
 223  * 64 Terabytes. This keeps the kernel above the VA hole, leaving roughly
 224  * half the VA space for seg_kpm. When systems get bigger than 64TB this
 225  * code will need revisiting. There is an implicit assumption that there
 226  * are no *huge* holes in the physical address space too.
 227  */
 228 #define TERABYTE                (1ul << 40)
 229 #define PHYSMEM_MAX64           mmu_btop(64 * TERABYTE)
 230 #define PHYSMEM                 PHYSMEM_MAX64
 231 #define AMD64_VA_HOLE_END       0xFFFF800000000000ul
 232 
 233 #endif /* __amd64 */
 234 
 235 volatile pgcnt_t physmem = PHYSMEM;
 236 pgcnt_t obp_pages;      /* Memory used by PROM for its text and data */
 237 
 238 char *kobj_file_buf;
 239 int kobj_file_bufsize;  /* set in /etc/system */
 240 
 241 /* Global variables for MP support. Used in mp_startup */
 242 caddr_t rm_platter_va = 0;
 243 uint32_t rm_platter_pa;
 244 
 245 int     auto_lpg_disable = 1;
 246 
 247 /*
 248  * Some CPUs have holes in the middle of the 64-bit virtual address range.
 249  */
 250 uintptr_t hole_start, hole_end;
 251 
 252 /*
 253  * kpm mapping window
 254  */
 255 caddr_t kpm_vbase;


 315 struct seg kpseg;               /* Segment used for pageable kernel virt mem */
 316 struct seg kmapseg;             /* Segment used for generic kernel mappings */
 317 struct seg kdebugseg;           /* Segment used for the kernel debugger */
 318 
 319 struct seg *segkmap = &kmapseg;     /* Kernel generic mapping segment */
 320 static struct seg *segmap = &kmapseg;       /* easier to use name for in here */
 321 
 322 struct seg *segkp = &kpseg; /* Pageable kernel virtual memory segment */
 323 
 324 #if defined(__amd64)
 325 struct seg kvseg_core;          /* Segment used for the core heap */
 326 struct seg kpmseg;              /* Segment used for physical mapping */
 327 struct seg *segkpm = &kpmseg;       /* 64bit kernel physical mapping segment */
 328 #else
 329 struct seg *segkpm = NULL;      /* Unused on IA32 */
 330 #endif
 331 
 332 caddr_t segkp_base;             /* Base address of segkp */
 333 caddr_t segzio_base;            /* Base address of segzio */
 334 #if defined(__amd64)
 335 volatile pgcnt_t segkpsize = btop(SEGKPDEFSIZE); /* size of segkp segment in */
 336                                                 /* pages */
 337 #else
 338 volatile pgcnt_t segkpsize = 0;
 339 #endif
 340 pgcnt_t segziosize = 0;         /* size of zio segment in pages */
 341 
 342 /*
 343  * A static DR page_t VA map is reserved that can map the page structures
 344  * for a domain's entire RA space. The pages that back this space are
 345  * dynamically allocated and need not be physically contiguous.  The DR
 346  * map size is derived from KPM size.
 347  * This mechanism isn't used by x86 yet, so just stubs here.
 348  */
 349 int ppvm_enable = 0;            /* Static virtual map for page structs */
 350 page_t *ppvm_base = NULL;       /* Base of page struct map */
 351 pgcnt_t ppvm_size = 0;          /* Size of page struct map */
 352 
 353 /*
 354  * VA range available to the debugger
 355  */
 356 const caddr_t kdi_segdebugbase = (const caddr_t)SEGDEBUGBASE;
 357 const size_t kdi_segdebugsize = SEGDEBUGSIZE;
 358 


2030          * KERNEL_TEXT and below kernelbase) is dealt with correctly.
2031          * Note this may never happen, but it might someday.
2032          */
2033         bootpages = NULL;
2034         PRM_POINT("Protecting boot pages");
2035 
2036         /*
2037          * Protect any pages mapped above KERNEL_TEXT that somehow have
2038          * page_t's. This can only happen if something weird allocated
2039          * in this range (like kadb/kmdb).
2040          */
2041         protect_boot_range(KERNEL_TEXT, (uintptr_t)-1, 0);
2042 
2043         /*
2044          * Before we can take over memory allocation/mapping from the boot
2045          * loader we must remove from our free page lists any boot allocated
2046          * pages that stay mapped until release_bootstrap().
2047          */
2048         protect_boot_range(0, kernelbase, 1);
2049 

2050         /*
2051          * Switch to running on regular HAT (not boot_mmu)
2052          */
2053         PRM_POINT("Calling hat_kern_setup()...");
2054         hat_kern_setup();
2055 
2056         /*
2057          * It is no longer safe to call BOP_ALLOC(), so make sure we don't.
2058          */
2059         bop_no_more_mem();
2060 
2061         PRM_POINT("hat_kern_setup() done");
2062 
2063         hat_cpu_online(CPU);
2064 
2065         /*
2066          * Initialize VM system
2067          */
2068         PRM_POINT("Calling kvm_init()...");
2069         kvm_init();


2506                 (void) snprintf(propname, sizeof (propname),
2507                     "module-size-%u", i);
2508                 if (do_bsys_getproplen(NULL, propname) <= 0)
2509                         break;
2510                 (void) do_bsys_getprop(NULL, propname, &size);
2511 
2512                 modranges[i].phys = start;
2513                 modranges[i].size = size;
2514         }
2515 
2516         /* unmount boot ramdisk and release kmem usage */
2517         kobj_boot_unmountroot();
2518 
2519         /*
2520          * We're finished using the boot loader so free its pages.
2521          */
2522         PRM_POINT("Unmapping lower boot pages");
2523 
2524         clear_boot_mappings(0, _userlimit);
2525 
2526 #if 0
2527         if (fb_info.paddr != 0 && fb_info.fb_type != FB_TYPE_EGA_TEXT) {
2528                 clear_boot_mappings(fb_info.paddr,
2529                     P2ROUNDUP(fb_info.paddr + fb_info.fb_size, MMU_PAGESIZE));
2530                 clear_boot_mappings((uintptr_t)fb_info.fb,
2531                     P2ROUNDUP((uintptr_t)fb_info.fb + fb_info.fb_size,
2532                     MMU_PAGESIZE));
2533         }
2534 #endif
2535 
2536         postbootkernelbase = kernelbase;
2537 
2538         /*
2539          * If root isn't on ramdisk, destroy the hardcoded
2540          * ramdisk node now and release the memory. Else,
2541          * ramdisk memory is kept in rd_pages.
2542          */
2543         root_is_ramdisk = (getmajor(rootdev) == ddi_name_to_major("ramdisk"));
2544         if (!root_is_ramdisk) {
2545                 dev_info_t *dip = ddi_find_devinfo("ramdisk", -1, 0);
2546                 ASSERT(dip && ddi_get_parent(dip) == ddi_root_node());
2547                 ndi_rele_devi(dip);     /* held from ddi_find_devinfo */
2548                 (void) ddi_remove_child(dip, 0);
2549         }
2550 
2551         PRM_POINT("Releasing boot pages");
2552         while (bootpages) {
2553                 extern uint64_t ramdisk_start, ramdisk_end;
2554                 pp = bootpages;
2555                 bootpages = pp->p_next;