summaryrefslogtreecommitdiff
path: root/usr/src/uts/i86pc/os/ddi_impl.c
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2018-10-26 12:47:12 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2018-10-26 12:47:12 +0000
commitd6f83baef622cfdb6461be5de1fa09b839ad330c (patch)
treebadfb543a3cd13e49f53ba572a366e3334837016 /usr/src/uts/i86pc/os/ddi_impl.c
parent1e5525cf6b00bbfe060cc5ddbb47cd59171ae49b (diff)
parentdd891561fb3e50f856d7d730f22a12cc1db51788 (diff)
downloadillumos-joyent-release-20181025.tar.gz
[illumos-gate merge]release-20181025
commit dd891561fb3e50f856d7d730f22a12cc1db51788 9854 uts: add type for early boot properties commit cbae61951b3562e1b0233a21ac0b7d871a31e4f8 9773 loader.efi: parity and stop bits switches are missing default case
Diffstat (limited to 'usr/src/uts/i86pc/os/ddi_impl.c')
-rw-r--r--usr/src/uts/i86pc/os/ddi_impl.c96
1 files changed, 55 insertions, 41 deletions
diff --git a/usr/src/uts/i86pc/os/ddi_impl.c b/usr/src/uts/i86pc/os/ddi_impl.c
index b8d7ec952f..3bae2af280 100644
--- a/usr/src/uts/i86pc/os/ddi_impl.c
+++ b/usr/src/uts/i86pc/os/ddi_impl.c
@@ -1842,7 +1842,7 @@ get_boot_properties(void)
extern char hw_provider[];
dev_info_t *devi;
char *name;
- int length;
+ int length, flags;
char property_name[50], property_val[50];
void *bop_staging_area;
@@ -1873,7 +1873,7 @@ get_boot_properties(void)
}
length = BOP_GETPROPLEN(bootops, property_name);
- if (length == 0)
+ if (length < 0)
continue;
if (length > MMU_PAGESIZE) {
cmn_err(CE_NOTE,
@@ -1882,6 +1882,7 @@ get_boot_properties(void)
continue;
}
BOP_GETPROP(bootops, property_name, bop_staging_area);
+ flags = do_bsys_getproptype(bootops, property_name);
/*
* special properties:
@@ -1896,54 +1897,67 @@ get_boot_properties(void)
if (strcmp(name, "si-machine") == 0) {
(void) strncpy(utsname.machine, bop_staging_area,
SYS_NMLN);
- utsname.machine[SYS_NMLN - 1] = (char)NULL;
- } else if (strcmp(name, "si-hw-provider") == 0) {
+ utsname.machine[SYS_NMLN - 1] = '\0';
+ continue;
+ }
+ if (strcmp(name, "si-hw-provider") == 0) {
(void) strncpy(hw_provider, bop_staging_area, SYS_NMLN);
- hw_provider[SYS_NMLN - 1] = (char)NULL;
- } else if (strcmp(name, "bios-boot-device") == 0) {
- copy_boot_str(bop_staging_area, property_val, 50);
- (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
- property_name, property_val);
- } else if (strcmp(name, "acpi-root-tab") == 0) {
- (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else if (strcmp(name, "smbios-address") == 0) {
- (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else if (strcmp(name, "efi-systab") == 0) {
- (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else if (strcmp(name, "efi-systype") == 0) {
+ hw_provider[SYS_NMLN - 1] = '\0';
+ continue;
+ }
+ if (strcmp(name, "bios-boot-device") == 0) {
copy_boot_str(bop_staging_area, property_val, 50);
(void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
property_name, property_val);
- } else if (strcmp(name, "stdout") == 0) {
+ continue;
+ }
+ if (strcmp(name, "stdout") == 0) {
(void) ndi_prop_update_int(DDI_DEV_T_NONE, devi,
property_name, *((int *)bop_staging_area));
- } else if (strcmp(name, "boot-args") == 0) {
- copy_boot_str(bop_staging_area, property_val, 50);
- (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
- property_name, property_val);
- } else if (strcmp(name, "bootargs") == 0) {
- copy_boot_str(bop_staging_area, property_val, 50);
+ continue;
+ }
+
+ /* Boolean property */
+ if (length == 0) {
+ (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
+ DDI_PROP_CANSLEEP, property_name, NULL, 0);
+ continue;
+ }
+
+ /* Now anything else based on type. */
+ switch (flags) {
+ case DDI_PROP_TYPE_INT:
+ if (length == sizeof (int)) {
+ (void) e_ddi_prop_update_int(DDI_DEV_T_NONE,
+ devi, property_name,
+ *((int *)bop_staging_area));
+ } else {
+ (void) e_ddi_prop_update_int_array(
+ DDI_DEV_T_NONE, devi, property_name,
+ bop_staging_area, length / sizeof (int));
+ }
+ break;
+ case DDI_PROP_TYPE_STRING:
(void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
- property_name, property_val);
- } else if (strcmp(name, "bootp-response") == 0) {
+ property_name, bop_staging_area);
+ break;
+ case DDI_PROP_TYPE_BYTE:
(void) e_ddi_prop_update_byte_array(DDI_DEV_T_NONE,
devi, property_name, bop_staging_area, length);
- } else if (strcmp(name, "ramdisk_start") == 0) {
- (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else if (strcmp(name, "ramdisk_end") == 0) {
- (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else if (strncmp(name, "module-addr-", 12) == 0) {
- (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else if (strncmp(name, "module-size-", 12) == 0) {
- (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
- property_name, *((int64_t *)bop_staging_area));
- } else {
+ break;
+ case DDI_PROP_TYPE_INT64:
+ if (length == sizeof (int64_t)) {
+ (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE,
+ devi, property_name,
+ *((int64_t *)bop_staging_area));
+ } else {
+ (void) e_ddi_prop_update_int64_array(
+ DDI_DEV_T_NONE, devi, property_name,
+ bop_staging_area,
+ length / sizeof (int64_t));
+ }
+ break;
+ default:
/* Property type unknown, use old prop interface */
(void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
DDI_PROP_CANSLEEP, property_name, bop_staging_area,