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>


  51 #include <sys/sysmacros.h>
  52 #include <sys/systeminfo.h>
  53 #include <sys/utsname.h>
  54 #include <sys/atomic.h>
  55 #include <sys/spl.h>
  56 #include <sys/archsystm.h>
  57 #include <vm/seg_kmem.h>
  58 #include <sys/ontrap.h>
  59 #include <sys/fm/protocol.h>
  60 #include <sys/ramdisk.h>
  61 #include <sys/sunndi.h>
  62 #include <sys/vmem.h>
  63 #include <sys/pci_impl.h>
  64 #if defined(__xpv)
  65 #include <sys/hypervisor.h>
  66 #endif
  67 #include <sys/mach_intr.h>
  68 #include <vm/hat_i86.h>
  69 #include <sys/x86_archext.h>
  70 #include <sys/avl.h>

  71 
  72 /*
  73  * DDI Boot Configuration
  74  */
  75 
  76 /*
  77  * Platform drivers on this platform
  78  */
  79 char *platform_module_list[] = {
  80         "acpippm",
  81         "ppm",
  82         (char *)0
  83 };
  84 
  85 /* pci bus resource maps */
  86 struct pci_bus_resource *pci_bus_res;
  87 
  88 size_t dma_max_copybuf_size = 0x101000;         /* 1M + 4K */
  89 
  90 uint64_t ramdisk_start, ramdisk_end;


1824 {
1825         int i = 0;
1826 
1827         while (i < len - 1 && boot_str[i] != '\0') {
1828                 kern_str[i] = boot_str[i];
1829                 i++;
1830         }
1831 
1832         kern_str[i] = 0;        /* null terminate */
1833         if (boot_str[i] != '\0')
1834                 cmn_err(CE_WARN,
1835                     "boot property string is truncated to %s", kern_str);
1836 }
1837 
1838 static void
1839 get_boot_properties(void)
1840 {
1841         extern char hw_provider[];
1842         dev_info_t *devi;
1843         char *name;
1844         int length;
1845         char property_name[50], property_val[50];
1846         void *bop_staging_area;
1847 
1848         bop_staging_area = kmem_zalloc(MMU_PAGESIZE, KM_NOSLEEP);
1849 
1850         /*
1851          * Import "root" properties from the boot.
1852          *
1853          * We do this by invoking BOP_NEXTPROP until the list
1854          * is completely copied in.
1855          */
1856 
1857         devi = ddi_root_node();
1858         for (name = BOP_NEXTPROP(bootops, "");          /* get first */
1859             name;                                       /* NULL => DONE */
1860             name = BOP_NEXTPROP(bootops, name)) {       /* get next */
1861 
1862                 /* copy string to memory above kernelbase */
1863                 copy_boot_str(name, property_name, 50);
1864 
1865                 /*
1866                  * Skip vga properties. They will be picked up later
1867                  * by get_vga_properties.
1868                  */
1869                 if (strcmp(property_name, "display-edif-block") == 0 ||
1870                     strcmp(property_name, "display-edif-id") == 0) {
1871                         continue;
1872                 }
1873 
1874                 length = BOP_GETPROPLEN(bootops, property_name);
1875                 if (length == 0)
1876                         continue;
1877                 if (length > MMU_PAGESIZE) {
1878                         cmn_err(CE_NOTE,
1879                             "boot property %s longer than 0x%x, ignored\n",
1880                             property_name, MMU_PAGESIZE);
1881                         continue;
1882                 }
1883                 BOP_GETPROP(bootops, property_name, bop_staging_area);

1884 
1885                 /*
1886                  * special properties:
1887                  * si-machine, si-hw-provider
1888                  *      goes to kernel data structures.
1889                  * bios-boot-device and stdout
1890                  *      goes to hardware property list so it may show up
1891                  *      in the prtconf -vp output. This is needed by
1892                  *      Install/Upgrade. Once we fix install upgrade,
1893                  *      this can be taken out.
1894                  */
1895                 if (strcmp(name, "si-machine") == 0) {
1896                         (void) strncpy(utsname.machine, bop_staging_area,
1897                             SYS_NMLN);
1898                         utsname.machine[SYS_NMLN - 1] = (char)NULL;
1899                 } else if (strcmp(name, "si-hw-provider") == 0) {


1900                         (void) strncpy(hw_provider, bop_staging_area, SYS_NMLN);
1901                         hw_provider[SYS_NMLN - 1] = (char)NULL;
1902                 } else if (strcmp(name, "bios-boot-device") == 0) {


1903                         copy_boot_str(bop_staging_area, property_val, 50);
1904                         (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
1905                             property_name, property_val);
1906                 } else if (strcmp(name, "acpi-root-tab") == 0) {
1907                         (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
1908                             property_name, *((int64_t *)bop_staging_area));
1909                 } else if (strcmp(name, "smbios-address") == 0) {
1910                         (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
1911                             property_name, *((int64_t *)bop_staging_area));
1912                 } else if (strcmp(name, "efi-systab") == 0) {
1913                         (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
1914                             property_name, *((int64_t *)bop_staging_area));
1915                 } else if (strcmp(name, "efi-systype") == 0) {
1916                         copy_boot_str(bop_staging_area, property_val, 50);
1917                         (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
1918                             property_name, property_val);
1919                 } else if (strcmp(name, "stdout") == 0) {
1920                         (void) ndi_prop_update_int(DDI_DEV_T_NONE, devi,
1921                             property_name, *((int *)bop_staging_area));
1922                 } else if (strcmp(name, "boot-args") == 0) {
1923                         copy_boot_str(bop_staging_area, property_val, 50);






















1924                         (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
1925                             property_name, property_val);
1926                 } else if (strcmp(name, "bootargs") == 0) {
1927                         copy_boot_str(bop_staging_area, property_val, 50);
1928                         (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
1929                             property_name, property_val);
1930                 } else if (strcmp(name, "bootp-response") == 0) {
1931                         (void) e_ddi_prop_update_byte_array(DDI_DEV_T_NONE,
1932                             devi, property_name, bop_staging_area, length);
1933                 } else if (strcmp(name, "ramdisk_start") == 0) {
1934                         (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1935                             property_name, *((int64_t *)bop_staging_area));
1936                 } else if (strcmp(name, "ramdisk_end") == 0) {
1937                         (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1938                             property_name, *((int64_t *)bop_staging_area));
1939                 } else if (strncmp(name, "module-addr-", 12) == 0) {
1940                         (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1941                             property_name, *((int64_t *)bop_staging_area));
1942                 } else if (strncmp(name, "module-size-", 12) == 0) {
1943                         (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1944                             property_name, *((int64_t *)bop_staging_area));
1945                 } else {







1946                         /* Property type unknown, use old prop interface */
1947                         (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
1948                             DDI_PROP_CANSLEEP, property_name, bop_staging_area,
1949                             length);
1950                 }
1951         }
1952 
1953         kmem_free(bop_staging_area, MMU_PAGESIZE);
1954 }
1955 
1956 static void
1957 get_vga_properties(void)
1958 {
1959         dev_info_t *devi;
1960         major_t major;
1961         char *name;
1962         int length;
1963         char property_val[50];
1964         void *bop_staging_area;
1965 


2001          * And you can set monitor type manually in kdmconfig
2002          * if you are really an old junky.
2003          */
2004         (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2005             devi, "display-type", "color");
2006         (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2007             devi, "video-adapter-type", "svga");
2008 
2009         name = "display-edif-id";
2010         length = BOP_GETPROPLEN(bootops, name);
2011         if (length > 0 && length < MMU_PAGESIZE) {
2012                 BOP_GETPROP(bootops, name, bop_staging_area);
2013                 copy_boot_str(bop_staging_area, property_val, length);
2014                 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2015                     devi, name, property_val);
2016         }
2017 
2018         kmem_free(bop_staging_area, MMU_PAGESIZE);
2019 }
2020 














2021 



































2022 /*
2023  * This is temporary, but absolutely necessary.  If we are being
2024  * booted with a device tree created by the DevConf project's bootconf
2025  * program, then we have device information nodes that reflect
2026  * reality.  At this point in time in the Solaris release schedule, the
2027  * kernel drivers aren't prepared for reality.  They still depend on their
2028  * own ad-hoc interpretations of the properties created when their .conf
2029  * files were interpreted. These drivers use an "ignore-hardware-nodes"
2030  * property to prevent them from using the nodes passed up from the bootconf
2031  * device tree.
2032  *
2033  * Trying to assemble root file system drivers as we are booting from
2034  * devconf will fail if the kernel driver is basing its name_addr's on the
2035  * psuedo-node device info while the bootpath passed up from bootconf is using
2036  * reality-based name_addrs.  We help the boot along in this case by
2037  * looking at the pre-bootconf bootpath and determining if we would have
2038  * successfully matched if that had been the bootpath we had chosen.
2039  *
2040  * Note that we only even perform this extra check if we've booted
2041  * using bootconf's 1275 compliant bootpath, this is the boot device, and


2553 
2554         /* isa node */
2555         if (pseudo_isa) {
2556                 ndi_devi_alloc_sleep(ddi_root_node(), "isa",
2557                     (pnode_t)DEVI_SID_NODEID, &isa_dip);
2558                 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2559                     "device_type", "isa");
2560                 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2561                     "bus-type", "isa");
2562                 (void) ndi_devi_bind_driver(isa_dip, 0);
2563         }
2564 
2565         /*
2566          * Read in the properties from the boot.
2567          */
2568         get_boot_properties();
2569 
2570         /* not framebuffer should be enumerated, if present */
2571         get_vga_properties();
2572 



2573         /*
2574          * Check for administratively disabled drivers.
2575          */
2576         check_driver_disable();
2577 
2578 #if !defined(__xpv)
2579         if (!post_fastreboot && BOP_GETPROPLEN(bootops, "efi-systab") < 0)
2580                 startup_bios_disk();
2581 #endif
2582         /* do bus dependent probes. */
2583         impl_bus_initialprobe();
2584 }
2585 
2586 dev_t
2587 getrootdev(void)
2588 {
2589         /*
2590          * Usually rootfs.bo_name is initialized by the
2591          * the bootpath property from bootenv.rc, but
2592          * defaults to "/ramdisk:a" otherwise.




  51 #include <sys/sysmacros.h>
  52 #include <sys/systeminfo.h>
  53 #include <sys/utsname.h>
  54 #include <sys/atomic.h>
  55 #include <sys/spl.h>
  56 #include <sys/archsystm.h>
  57 #include <vm/seg_kmem.h>
  58 #include <sys/ontrap.h>
  59 #include <sys/fm/protocol.h>
  60 #include <sys/ramdisk.h>
  61 #include <sys/sunndi.h>
  62 #include <sys/vmem.h>
  63 #include <sys/pci_impl.h>
  64 #if defined(__xpv)
  65 #include <sys/hypervisor.h>
  66 #endif
  67 #include <sys/mach_intr.h>
  68 #include <vm/hat_i86.h>
  69 #include <sys/x86_archext.h>
  70 #include <sys/avl.h>
  71 #include <sys/font.h>
  72 
  73 /*
  74  * DDI Boot Configuration
  75  */
  76 
  77 /*
  78  * Platform drivers on this platform
  79  */
  80 char *platform_module_list[] = {
  81         "acpippm",
  82         "ppm",
  83         (char *)0
  84 };
  85 
  86 /* pci bus resource maps */
  87 struct pci_bus_resource *pci_bus_res;
  88 
  89 size_t dma_max_copybuf_size = 0x101000;         /* 1M + 4K */
  90 
  91 uint64_t ramdisk_start, ramdisk_end;


1825 {
1826         int i = 0;
1827 
1828         while (i < len - 1 && boot_str[i] != '\0') {
1829                 kern_str[i] = boot_str[i];
1830                 i++;
1831         }
1832 
1833         kern_str[i] = 0;        /* null terminate */
1834         if (boot_str[i] != '\0')
1835                 cmn_err(CE_WARN,
1836                     "boot property string is truncated to %s", kern_str);
1837 }
1838 
1839 static void
1840 get_boot_properties(void)
1841 {
1842         extern char hw_provider[];
1843         dev_info_t *devi;
1844         char *name;
1845         int length, flags;
1846         char property_name[50], property_val[50];
1847         void *bop_staging_area;
1848 
1849         bop_staging_area = kmem_zalloc(MMU_PAGESIZE, KM_NOSLEEP);
1850 
1851         /*
1852          * Import "root" properties from the boot.
1853          *
1854          * We do this by invoking BOP_NEXTPROP until the list
1855          * is completely copied in.
1856          */
1857 
1858         devi = ddi_root_node();
1859         for (name = BOP_NEXTPROP(bootops, "");          /* get first */
1860             name;                                       /* NULL => DONE */
1861             name = BOP_NEXTPROP(bootops, name)) {       /* get next */
1862 
1863                 /* copy string to memory above kernelbase */
1864                 copy_boot_str(name, property_name, 50);
1865 
1866                 /*
1867                  * Skip vga properties. They will be picked up later
1868                  * by get_vga_properties.
1869                  */
1870                 if (strcmp(property_name, "display-edif-block") == 0 ||
1871                     strcmp(property_name, "display-edif-id") == 0) {
1872                         continue;
1873                 }
1874 
1875                 length = BOP_GETPROPLEN(bootops, property_name);
1876                 if (length < 0)
1877                         continue;
1878                 if (length > MMU_PAGESIZE) {
1879                         cmn_err(CE_NOTE,
1880                             "boot property %s longer than 0x%x, ignored\n",
1881                             property_name, MMU_PAGESIZE);
1882                         continue;
1883                 }
1884                 BOP_GETPROP(bootops, property_name, bop_staging_area);
1885                 flags = do_bsys_getproptype(bootops, property_name);
1886 
1887                 /*
1888                  * special properties:
1889                  * si-machine, si-hw-provider
1890                  *      goes to kernel data structures.
1891                  * bios-boot-device and stdout
1892                  *      goes to hardware property list so it may show up
1893                  *      in the prtconf -vp output. This is needed by
1894                  *      Install/Upgrade. Once we fix install upgrade,
1895                  *      this can be taken out.
1896                  */
1897                 if (strcmp(name, "si-machine") == 0) {
1898                         (void) strncpy(utsname.machine, bop_staging_area,
1899                             SYS_NMLN);
1900                         utsname.machine[SYS_NMLN - 1] = '\0';
1901                         continue;
1902                 }
1903                 if (strcmp(name, "si-hw-provider") == 0) {
1904                         (void) strncpy(hw_provider, bop_staging_area, SYS_NMLN);
1905                         hw_provider[SYS_NMLN - 1] = '\0';
1906                         continue;
1907                 }
1908                 if (strcmp(name, "bios-boot-device") == 0) {
1909                         copy_boot_str(bop_staging_area, property_val, 50);
1910                         (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
1911                             property_name, property_val);
1912                         continue;
1913                 }
1914                 if (strcmp(name, "stdout") == 0) {











1915                         (void) ndi_prop_update_int(DDI_DEV_T_NONE, devi,
1916                             property_name, *((int *)bop_staging_area));
1917                         continue;
1918                 }
1919 
1920                 /* Boolean property */
1921                 if (length == 0) {
1922                         (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
1923                             DDI_PROP_CANSLEEP, property_name, NULL, 0);
1924                         continue;
1925                 }
1926 
1927                 /* Now anything else based on type. */
1928                 switch (flags) {
1929                 case DDI_PROP_TYPE_INT:
1930                         if (length == sizeof (int)) {
1931                                 (void) e_ddi_prop_update_int(DDI_DEV_T_NONE,
1932                                     devi, property_name,
1933                                     *((int *)bop_staging_area));
1934                         } else {
1935                                 (void) e_ddi_prop_update_int_array(
1936                                     DDI_DEV_T_NONE, devi, property_name,
1937                                     bop_staging_area, length / sizeof (int));
1938                         }
1939                         break;
1940                 case DDI_PROP_TYPE_STRING:
1941                         (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
1942                             property_name, bop_staging_area);
1943                         break;
1944                 case DDI_PROP_TYPE_BYTE:



1945                         (void) e_ddi_prop_update_byte_array(DDI_DEV_T_NONE,
1946                             devi, property_name, bop_staging_area, length);
1947                         break;
1948                 case DDI_PROP_TYPE_INT64:
1949                         if (length == sizeof (uint64_t)) {
1950                                 (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE,
1951                                     devi, property_name,
1952                                     *((uint64_t *)bop_staging_area));






1953                         } else {
1954                                 (void) e_ddi_prop_update_int64_array(
1955                                     DDI_DEV_T_NONE, devi, property_name,
1956                                     bop_staging_area,
1957                                     length / sizeof (uint64_t));
1958                         }
1959                         break;
1960                 default:
1961                         /* Property type unknown, use old prop interface */
1962                         (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
1963                             DDI_PROP_CANSLEEP, property_name, bop_staging_area,
1964                             length);
1965                 }
1966         }
1967 
1968         kmem_free(bop_staging_area, MMU_PAGESIZE);
1969 }
1970 
1971 static void
1972 get_vga_properties(void)
1973 {
1974         dev_info_t *devi;
1975         major_t major;
1976         char *name;
1977         int length;
1978         char property_val[50];
1979         void *bop_staging_area;
1980 


2016          * And you can set monitor type manually in kdmconfig
2017          * if you are really an old junky.
2018          */
2019         (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2020             devi, "display-type", "color");
2021         (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2022             devi, "video-adapter-type", "svga");
2023 
2024         name = "display-edif-id";
2025         length = BOP_GETPROPLEN(bootops, name);
2026         if (length > 0 && length < MMU_PAGESIZE) {
2027                 BOP_GETPROP(bootops, name, bop_staging_area);
2028                 copy_boot_str(bop_staging_area, property_val, length);
2029                 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2030                     devi, name, property_val);
2031         }
2032 
2033         kmem_free(bop_staging_area, MMU_PAGESIZE);
2034 }
2035 
2036 /*
2037  * Copy console font to kernel memory. The temporary font setup
2038  * to use font module was done in early console setup, using low
2039  * memory and data from font module. Now we need to allocate
2040  * kernel memory and copy data over, so the low memory can be freed.
2041  * We can have at most one entry in font list from early boot.
2042  */
2043 static void
2044 get_console_font(void)
2045 {
2046         struct fontlist *fp, *fl;
2047         bitmap_data_t *bd;
2048         struct font *fd, *tmp;
2049         int i;
2050 
2051         if (STAILQ_EMPTY(&fonts))
2052                 return;
2053 
2054         fl = STAILQ_FIRST(&fonts);
2055         STAILQ_REMOVE_HEAD(&fonts, font_next);
2056         fp = kmem_zalloc(sizeof (*fp), KM_SLEEP);
2057         bd = kmem_zalloc(sizeof (*bd), KM_SLEEP);
2058         fd = kmem_zalloc(sizeof (*fd), KM_SLEEP);
2059 
2060         fp->font_name = NULL;
2061         fp->font_flags = FONT_BOOT;
2062         fp->font_data = bd;
2063 
2064         bd->width = fl->font_data->width;
2065         bd->height = fl->font_data->height;
2066         bd->uncompressed_size = fl->font_data->uncompressed_size;
2067         bd->font = fd;
2068 
2069         tmp = fl->font_data->font;
2070         fd->vf_width = tmp->vf_width;
2071         fd->vf_height = tmp->vf_height;
2072         for (i = 0; i < VFNT_MAPS; i++) {
2073                 if (tmp->vf_map_count[i] == 0)
2074                         continue;
2075                 fd->vf_map_count[i] = tmp->vf_map_count[i];
2076                 fd->vf_map[i] = kmem_alloc(fd->vf_map_count[i] *
2077                     sizeof (*fd->vf_map[i]), KM_SLEEP);
2078                 bcopy(tmp->vf_map[i], fd->vf_map[i], fd->vf_map_count[i] *
2079                     sizeof (*fd->vf_map[i]));
2080         }
2081         fd->vf_bytes = kmem_alloc(bd->uncompressed_size, KM_SLEEP);
2082         bcopy(tmp->vf_bytes, fd->vf_bytes, bd->uncompressed_size);
2083         STAILQ_INSERT_HEAD(&fonts, fp, font_next);
2084 }
2085 
2086 /*
2087  * This is temporary, but absolutely necessary.  If we are being
2088  * booted with a device tree created by the DevConf project's bootconf
2089  * program, then we have device information nodes that reflect
2090  * reality.  At this point in time in the Solaris release schedule, the
2091  * kernel drivers aren't prepared for reality.  They still depend on their
2092  * own ad-hoc interpretations of the properties created when their .conf
2093  * files were interpreted. These drivers use an "ignore-hardware-nodes"
2094  * property to prevent them from using the nodes passed up from the bootconf
2095  * device tree.
2096  *
2097  * Trying to assemble root file system drivers as we are booting from
2098  * devconf will fail if the kernel driver is basing its name_addr's on the
2099  * psuedo-node device info while the bootpath passed up from bootconf is using
2100  * reality-based name_addrs.  We help the boot along in this case by
2101  * looking at the pre-bootconf bootpath and determining if we would have
2102  * successfully matched if that had been the bootpath we had chosen.
2103  *
2104  * Note that we only even perform this extra check if we've booted
2105  * using bootconf's 1275 compliant bootpath, this is the boot device, and


2617 
2618         /* isa node */
2619         if (pseudo_isa) {
2620                 ndi_devi_alloc_sleep(ddi_root_node(), "isa",
2621                     (pnode_t)DEVI_SID_NODEID, &isa_dip);
2622                 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2623                     "device_type", "isa");
2624                 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2625                     "bus-type", "isa");
2626                 (void) ndi_devi_bind_driver(isa_dip, 0);
2627         }
2628 
2629         /*
2630          * Read in the properties from the boot.
2631          */
2632         get_boot_properties();
2633 
2634         /* not framebuffer should be enumerated, if present */
2635         get_vga_properties();
2636 
2637         /* Copy console font if provided by boot. */
2638         get_console_font();
2639 
2640         /*
2641          * Check for administratively disabled drivers.
2642          */
2643         check_driver_disable();
2644 
2645 #if !defined(__xpv)
2646         if (!post_fastreboot && BOP_GETPROPLEN(bootops, "efi-systab") < 0)
2647                 startup_bios_disk();
2648 #endif
2649         /* do bus dependent probes. */
2650         impl_bus_initialprobe();
2651 }
2652 
2653 dev_t
2654 getrootdev(void)
2655 {
2656         /*
2657          * Usually rootfs.bo_name is initialized by the
2658          * the bootpath property from bootenv.rc, but
2659          * defaults to "/ramdisk:a" otherwise.