diff options
author | Randall Spangler <rspangler@chromium.org> | 2016-10-11 15:28:16 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-13 17:27:07 -0700 |
commit | fb267154d29356937eb304234793ab2e28ad0bab (patch) | |
tree | 609b8d39adab9b4cf8c7dac8859d76541e50e75f /host/lib/crossystem.c | |
parent | a1001da56512fdcd3bd648a5a04da03ffea3e91b (diff) | |
download | vboot-fb267154d29356937eb304234793ab2e28ad0bab.tar.gz |
Fix indentation in firmware and host libs
vboot_reference originally used 2-space indentation, rather than
kernel-style tabs. This makes it painful to maintain given that newer
source files are kernel-style.
Re-indent the files that need it, and reflow comments.
No functionality changes.
BUG=none
BRANCH=none
TEST=make runtests
Change-Id: I7dabed41f69434b1988a52600c0cb1eac8c8d7e6
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/396488
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
Diffstat (limited to 'host/lib/crossystem.c')
-rw-r--r-- | host/lib/crossystem.c | 1439 |
1 files changed, 729 insertions, 710 deletions
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c index 6d70d6aa..05126214 100644 --- a/host/lib/crossystem.c +++ b/host/lib/crossystem.c @@ -34,39 +34,39 @@ /* Fields that GetVdatString() can get */ typedef enum VdatStringField { - VDAT_STRING_TIMERS = 0, /* Timer values */ - VDAT_STRING_LOAD_FIRMWARE_DEBUG, /* LoadFirmware() debug information */ - VDAT_STRING_LOAD_KERNEL_DEBUG, /* LoadKernel() debug information */ - VDAT_STRING_MAINFW_ACT /* Active main firmware */ + VDAT_STRING_TIMERS = 0, /* Timer values */ + VDAT_STRING_LOAD_FIRMWARE_DEBUG, /* LoadFirmware() debug information */ + VDAT_STRING_LOAD_KERNEL_DEBUG, /* LoadKernel() debug information */ + VDAT_STRING_MAINFW_ACT /* Active main firmware */ } VdatStringField; /* Fields that GetVdatInt() can get */ typedef enum VdatIntField { - VDAT_INT_FLAGS = 0, /* Flags */ - VDAT_INT_HEADER_VERSION, /* Header version for VbSharedData */ - VDAT_INT_DEVSW_BOOT, /* Dev switch position at boot */ - VDAT_INT_DEVSW_VIRTUAL, /* Dev switch is virtual */ - VDAT_INT_RECSW_BOOT, /* Recovery switch position at boot */ - VDAT_INT_HW_WPSW_BOOT, /* Hardware WP switch position at boot */ - VDAT_INT_SW_WPSW_BOOT, /* Flash chip's WP setting at boot */ - - VDAT_INT_FW_VERSION_TPM, /* Current firmware version in TPM */ - VDAT_INT_KERNEL_VERSION_TPM, /* Current kernel version in TPM */ - VDAT_INT_TRIED_FIRMWARE_B, /* Tried firmware B due to fwb_tries */ - VDAT_INT_KERNEL_KEY_VERIFIED, /* Kernel key verified using - * signature, not just hash */ - VDAT_INT_RECOVERY_REASON, /* Recovery reason for current boot */ - VDAT_INT_FW_BOOT2 /* Firmware selection by vboot2 */ + VDAT_INT_FLAGS = 0, /* Flags */ + VDAT_INT_HEADER_VERSION, /* Header version for VbSharedData */ + VDAT_INT_DEVSW_BOOT, /* Dev switch position at boot */ + VDAT_INT_DEVSW_VIRTUAL, /* Dev switch is virtual */ + VDAT_INT_RECSW_BOOT, /* Recovery switch position at boot */ + VDAT_INT_HW_WPSW_BOOT, /* Hardware WP switch position at boot */ + VDAT_INT_SW_WPSW_BOOT, /* Flash chip's WP setting at boot */ + + VDAT_INT_FW_VERSION_TPM, /* Current firmware version in TPM */ + VDAT_INT_KERNEL_VERSION_TPM, /* Current kernel version in TPM */ + VDAT_INT_TRIED_FIRMWARE_B, /* Tried firmware B due to fwb_tries */ + VDAT_INT_KERNEL_KEY_VERIFIED, /* Kernel key verified using + * signature, not just hash */ + VDAT_INT_RECOVERY_REASON, /* Recovery reason for current boot */ + VDAT_INT_FW_BOOT2 /* Firmware selection by vboot2 */ } VdatIntField; /* Description of build options that may be specified on the * kernel command line. */ typedef enum VbBuildOption { - VB_BUILD_OPTION_UNKNOWN, - VB_BUILD_OPTION_DEBUG, - VB_BUILD_OPTION_NODEBUG + VB_BUILD_OPTION_UNKNOWN, + VB_BUILD_OPTION_DEBUG, + VB_BUILD_OPTION_NODEBUG } VbBuildOption; static const char *fw_results[] = {"unknown", "trying", "success", "failure"}; @@ -83,72 +83,74 @@ static const char *default_boot[] = {"disk", "usb", "legacy"}; #define KERN_NV_CURRENTLY_UNUSED 0xFFFFFFC0 /* Return true if the FWID starts with the specified string. */ -int FwidStartsWith(const char *start) { - char fwid[VB_MAX_STRING_PROPERTY]; - if (!VbGetSystemPropertyString("fwid", fwid, sizeof(fwid))) - return 0; +int FwidStartsWith(const char *start) +{ + char fwid[VB_MAX_STRING_PROPERTY]; + if (!VbGetSystemPropertyString("fwid", fwid, sizeof(fwid))) + return 0; - return 0 == strncmp(fwid, start, strlen(start)); + return 0 == strncmp(fwid, start, strlen(start)); } static int vnc_read; -int VbGetNvStorage(VbNvParam param) { - uint32_t value; - int retval; - static VbNvContext cached_vnc; - - /* TODO: locking around NV access */ - if (!vnc_read) { - if (0 != VbReadNvStorage(&cached_vnc)) - return -1; - vnc_read = 1; - } - - if (0 != VbNvSetup(&cached_vnc)) - return -1; - retval = VbNvGet(&cached_vnc, param, &value); - if (0 != VbNvTeardown(&cached_vnc)) - return -1; - if (0 != retval) - return -1; - - /* TODO: If vnc.raw_changed, attempt to reopen NVRAM for write and - * save the new defaults. If we're able to, log. */ - /* TODO: release lock */ - - return (int)value; -} - +int VbGetNvStorage(VbNvParam param) +{ + uint32_t value; + int retval; + static VbNvContext cached_vnc; + + /* TODO: locking around NV access */ + if (!vnc_read) { + if (0 != VbReadNvStorage(&cached_vnc)) + return -1; + vnc_read = 1; + } -int VbSetNvStorage(VbNvParam param, int value) { - VbNvContext vnc; - int retval = -1; - int i; + if (0 != VbNvSetup(&cached_vnc)) + return -1; + retval = VbNvGet(&cached_vnc, param, &value); + if (0 != VbNvTeardown(&cached_vnc)) + return -1; + if (0 != retval) + return -1; - if (0 != VbReadNvStorage(&vnc)) - return -1; + /* TODO: If vnc.raw_changed, attempt to reopen NVRAM for write and + * save the new defaults. If we're able to, log. */ + /* TODO: release lock */ - if (0 != VbNvSetup(&vnc)) - goto VbSetNvCleanup; - i = VbNvSet(&vnc, param, (uint32_t)value); - if (0 != VbNvTeardown(&vnc)) - goto VbSetNvCleanup; - if (0 != i) - goto VbSetNvCleanup; + return (int)value; +} - if (vnc.raw_changed) { - vnc_read = 0; - if (0 != VbWriteNvStorage(&vnc)) - goto VbSetNvCleanup; - } +int VbSetNvStorage(VbNvParam param, int value) +{ + VbNvContext vnc; + int retval = -1; + int i; + + if (0 != VbReadNvStorage(&vnc)) + return -1; + + if (0 != VbNvSetup(&vnc)) + goto VbSetNvCleanup; + i = VbNvSet(&vnc, param, (uint32_t)value); + if (0 != VbNvTeardown(&vnc)) + goto VbSetNvCleanup; + if (0 != i) + goto VbSetNvCleanup; + + if (vnc.raw_changed) { + vnc_read = 0; + if (0 != VbWriteNvStorage(&vnc)) + goto VbSetNvCleanup; + } - /* Success */ - retval = 0; + /* Success */ + retval = 0; VbSetNvCleanup: - /* TODO: release lock */ - return retval; + /* TODO: release lock */ + return retval; } /* @@ -157,596 +159,611 @@ VbSetNvCleanup: */ static int VbSetNvStorage_WithBackup(VbNvParam param, int value) { - int retval; - retval = VbSetNvStorage(param, value); - if (!retval) - VbSetNvStorage(VBNV_BACKUP_NVRAM_REQUEST, 1); - return retval; + int retval; + retval = VbSetNvStorage(param, value); + if (!retval) + VbSetNvStorage(VBNV_BACKUP_NVRAM_REQUEST, 1); + return retval; } /* Find what build/debug status is specified on the kernel command * line, if any. */ -static VbBuildOption VbScanBuildOption(void) { - FILE* f = NULL; - char buf[4096] = ""; - char *t, *saveptr; - const char *delimiters = " \r\n"; - - f = fopen(KERNEL_CMDLINE_PATH, "r"); - if (NULL != f) { - if (NULL == fgets(buf, sizeof(buf), f)) - buf[0] = 0; - fclose(f); - } - for (t = strtok_r(buf, delimiters, &saveptr); t; - t = strtok_r(NULL, delimiters, &saveptr)) { - if (0 == strcmp(t, "cros_debug")) - return VB_BUILD_OPTION_DEBUG; - else if (0 == strcmp(t, "cros_nodebug")) - return VB_BUILD_OPTION_NODEBUG; - } - - return VB_BUILD_OPTION_UNKNOWN; -} +static VbBuildOption VbScanBuildOption(void) +{ + FILE* f = NULL; + char buf[4096] = ""; + char *t, *saveptr; + const char *delimiters = " \r\n"; + + f = fopen(KERNEL_CMDLINE_PATH, "r"); + if (NULL != f) { + if (NULL == fgets(buf, sizeof(buf), f)) + buf[0] = 0; + fclose(f); + } + for (t = strtok_r(buf, delimiters, &saveptr); t; + t = strtok_r(NULL, delimiters, &saveptr)) { + if (0 == strcmp(t, "cros_debug")) + return VB_BUILD_OPTION_DEBUG; + else if (0 == strcmp(t, "cros_nodebug")) + return VB_BUILD_OPTION_NODEBUG; + } + return VB_BUILD_OPTION_UNKNOWN; +} /* Determine whether the running OS image was built for debugging. * Returns 1 if yes, 0 if no or indeterminate. */ -int VbGetDebugBuild(void) { - return VB_BUILD_OPTION_DEBUG == VbScanBuildOption(); +int VbGetDebugBuild(void) +{ + return VB_BUILD_OPTION_DEBUG == VbScanBuildOption(); } - /* Determine whether OS-level debugging should be allowed. * Returns 1 if yes, 0 if no or indeterminate. */ -int VbGetCrosDebug(void) { - /* If the currently running system specifies its debug status, use - * that in preference to other indicators. */ - VbBuildOption option = VbScanBuildOption(); - if (VB_BUILD_OPTION_DEBUG == option) { - return 1; - } else if (VB_BUILD_OPTION_NODEBUG == option) { - return 0; - } - - /* Command line is silent; allow debug if the dev switch is on. */ - if (1 == VbGetSystemPropertyInt("devsw_boot")) - return 1; - - /* All other cases disallow debug. */ - return 0; -} +int VbGetCrosDebug(void) +{ + /* If the currently running system specifies its debug status, use + * that in preference to other indicators. */ + VbBuildOption option = VbScanBuildOption(); + if (VB_BUILD_OPTION_DEBUG == option) { + return 1; + } else if (VB_BUILD_OPTION_NODEBUG == option) { + return 0; + } + /* Command line is silent; allow debug if the dev switch is on. */ + if (1 == VbGetSystemPropertyInt("devsw_boot")) + return 1; -char* GetVdatLoadFirmwareDebug(char* dest, int size, - const VbSharedDataHeader* sh) { - snprintf(dest, size, - "Check A result=%d\n" - "Check B result=%d\n" - "Firmware index booted=0x%02x\n" - "TPM combined version at start=0x%08x\n" - "Lowest combined version from firmware=0x%08x\n", - sh->check_fw_a_result, - sh->check_fw_b_result, - sh->firmware_index, - sh->fw_version_tpm_start, - sh->fw_version_lowest); - return dest; + /* All other cases disallow debug. */ + return 0; } +char *GetVdatLoadFirmwareDebug(char *dest, int size, + const VbSharedDataHeader *sh) +{ + snprintf(dest, size, + "Check A result=%d\n" + "Check B result=%d\n" + "Firmware index booted=0x%02x\n" + "TPM combined version at start=0x%08x\n" + "Lowest combined version from firmware=0x%08x\n", + sh->check_fw_a_result, + sh->check_fw_b_result, + sh->firmware_index, + sh->fw_version_tpm_start, + sh->fw_version_lowest); + return dest; +} #define TRUNCATED "\n(truncated)\n" -char* GetVdatLoadKernelDebug(char* dest, int size, - const VbSharedDataHeader* sh) { - int used = 0; - int first_call_tracked = 0; - int call; - - /* Make sure we have space for truncation warning */ - if (size < strlen(TRUNCATED) + 1) - return NULL; - size -= strlen(TRUNCATED) + 1; - - used += snprintf( - dest + used, size - used, - "Calls to LoadKernel()=%d\n", - sh->lk_call_count); - if (used > size) - goto LoadKernelDebugExit; - - /* Report on the last calls */ - if (sh->lk_call_count > VBSD_MAX_KERNEL_CALLS) - first_call_tracked = sh->lk_call_count - VBSD_MAX_KERNEL_CALLS; - for (call = first_call_tracked; call < sh->lk_call_count; call++) { - const VbSharedDataKernelCall* shc = - sh->lk_calls + (call & (VBSD_MAX_KERNEL_CALLS - 1)); - int first_part_tracked = 0; - int part; - - used += snprintf( - dest + used, size - used, - "Call %d:\n" - " Boot flags=0x%02x\n" - " Boot mode=%d\n" - " Test error=%d\n" - " Return code=%d\n" - " Debug flags=0x%02x\n" - " Drive sectors=%" PRIu64 "\n" - " Sector size=%d\n" - " Check result=%d\n" - " Kernel partitions found=%d\n", - call + 1, - shc->boot_flags, - shc->boot_mode, - shc->test_error_num, - shc->return_code, - shc->flags, - shc->sector_count, - shc->sector_size, - shc->check_result, - shc->kernel_parts_found); - if (used > size) - goto LoadKernelDebugExit; - - /* If we found too many partitions, only prints ones where the - * structure has info. */ - if (shc->kernel_parts_found > VBSD_MAX_KERNEL_PARTS) - first_part_tracked = shc->kernel_parts_found - VBSD_MAX_KERNEL_PARTS; - - /* Report on the partitions checked */ - for (part = first_part_tracked; part < shc->kernel_parts_found; part++) { - const VbSharedDataKernelPart* shp = - shc->parts + (part & (VBSD_MAX_KERNEL_PARTS - 1)); - - used += snprintf( - dest + used, size - used, - " Kernel %d:\n" - " GPT index=%d\n" - " Start sector=%" PRIu64 "\n" - " Sector count=%" PRIu64 "\n" - " Combined version=0x%08x\n" - " Check result=%d\n" - " Debug flags=0x%02x\n", - part + 1, - shp->gpt_index, - shp->sector_start, - shp->sector_count, - shp->combined_version, - shp->check_result, - shp->flags); - if (used > size) - goto LoadKernelDebugExit; - } - } +char *GetVdatLoadKernelDebug(char *dest, int size, + const VbSharedDataHeader *sh) +{ + int used = 0; + int first_call_tracked = 0; + int call; + + /* Make sure we have space for truncation warning */ + if (size < strlen(TRUNCATED) + 1) + return NULL; + size -= strlen(TRUNCATED) + 1; + + used += snprintf( + dest + used, size - used, + "Calls to LoadKernel()=%d\n", + sh->lk_call_count); + if (used > size) + goto LoadKernelDebugExit; + + /* Report on the last calls */ + if (sh->lk_call_count > VBSD_MAX_KERNEL_CALLS) + first_call_tracked = sh->lk_call_count - VBSD_MAX_KERNEL_CALLS; + for (call = first_call_tracked; call < sh->lk_call_count; call++) { + const VbSharedDataKernelCall* shc = sh->lk_calls + + (call & (VBSD_MAX_KERNEL_CALLS - 1)); + int first_part_tracked = 0; + int part; + + used += snprintf(dest + used, size - used, + "Call %d:\n" + " Boot flags=0x%02x\n" + " Boot mode=%d\n" + " Test error=%d\n" + " Return code=%d\n" + " Debug flags=0x%02x\n" + " Drive sectors=%" PRIu64 "\n" + " Sector size=%d\n" + " Check result=%d\n" + " Kernel partitions found=%d\n", + call + 1, + shc->boot_flags, + shc->boot_mode, + shc->test_error_num, + shc->return_code, + shc->flags, + shc->sector_count, + shc->sector_size, + shc->check_result, + shc->kernel_parts_found); + if (used > size) + goto LoadKernelDebugExit; + + /* If we found too many partitions, only prints ones where the + * structure has info. */ + if (shc->kernel_parts_found > VBSD_MAX_KERNEL_PARTS) + first_part_tracked = shc->kernel_parts_found - + VBSD_MAX_KERNEL_PARTS; + + /* Report on the partitions checked */ + for (part = first_part_tracked; part < shc->kernel_parts_found; + part++) { + const VbSharedDataKernelPart* shp = shc->parts + + (part & (VBSD_MAX_KERNEL_PARTS - 1)); + + used += snprintf(dest + used, size - used, + " Kernel %d:\n" + " GPT index=%d\n" + " Start sector=%" PRIu64 "\n" + " Sector count=%" PRIu64 "\n" + " Combined version=0x%08x\n" + " Check result=%d\n" + " Debug flags=0x%02x\n", + part + 1, + shp->gpt_index, + shp->sector_start, + shp->sector_count, + shp->combined_version, + shp->check_result, + shp->flags); + if (used > size) + goto LoadKernelDebugExit; + } + } LoadKernelDebugExit: - /* Warn if data was truncated; we left space for this above. */ - if (used > size) - strcat(dest, TRUNCATED); + /* Warn if data was truncated; we left space for this above. */ + if (used > size) + strcat(dest, TRUNCATED); - return dest; + return dest; } - -char* GetVdatString(char* dest, int size, VdatStringField field) +char *GetVdatString(char *dest, int size, VdatStringField field) { - VbSharedDataHeader* sh = VbSharedDataRead(); - char* value = dest; - - if (!sh) - return NULL; - - switch (field) { - case VDAT_STRING_TIMERS: - snprintf(dest, size, - "LFS=%" PRIu64 ",%" PRIu64 - " LF=%" PRIu64 ",%" PRIu64 - " LK=%" PRIu64 ",%" PRIu64, - sh->timer_vb_init_enter, - sh->timer_vb_init_exit, - sh->timer_vb_select_firmware_enter, - sh->timer_vb_select_firmware_exit, - sh->timer_vb_select_and_load_kernel_enter, - sh->timer_vb_select_and_load_kernel_exit); - break; - - case VDAT_STRING_LOAD_FIRMWARE_DEBUG: - value = GetVdatLoadFirmwareDebug(dest, size, sh); - break; - - case VDAT_STRING_LOAD_KERNEL_DEBUG: - value = GetVdatLoadKernelDebug(dest, size, sh); - break; - - case VDAT_STRING_MAINFW_ACT: - switch(sh->firmware_index) { - case 0: - StrCopy(dest, "A", size); - break; - case 1: - StrCopy(dest, "B", size); - break; - case 0xFF: - StrCopy(dest, "recovery", size); - break; - default: - value = NULL; - } - break; - - default: - value = NULL; - break; - } - - free(sh); - return value; + VbSharedDataHeader *sh = VbSharedDataRead(); + char *value = dest; + + if (!sh) + return NULL; + + switch (field) { + case VDAT_STRING_TIMERS: + snprintf(dest, size, + "LFS=%" PRIu64 ",%" PRIu64 + " LF=%" PRIu64 ",%" PRIu64 + " LK=%" PRIu64 ",%" PRIu64, + sh->timer_vb_init_enter, + sh->timer_vb_init_exit, + sh->timer_vb_select_firmware_enter, + sh->timer_vb_select_firmware_exit, + sh->timer_vb_select_and_load_kernel_enter, + sh->timer_vb_select_and_load_kernel_exit); + break; + + case VDAT_STRING_LOAD_FIRMWARE_DEBUG: + value = GetVdatLoadFirmwareDebug(dest, size, sh); + break; + + case VDAT_STRING_LOAD_KERNEL_DEBUG: + value = GetVdatLoadKernelDebug(dest, size, sh); + break; + + case VDAT_STRING_MAINFW_ACT: + switch(sh->firmware_index) { + case 0: + StrCopy(dest, "A", size); + break; + case 1: + StrCopy(dest, "B", size); + break; + case 0xFF: + StrCopy(dest, "recovery", size); + break; + default: + value = NULL; + } + break; + + default: + value = NULL; + break; + } + + free(sh); + return value; } +int GetVdatInt(VdatIntField field) +{ + VbSharedDataHeader* sh = VbSharedDataRead(); + int value = -1; + + if (!sh) + return -1; + + /* Fields supported in version 1 */ + switch (field) { + case VDAT_INT_FLAGS: + value = (int)sh->flags; + break; + case VDAT_INT_HEADER_VERSION: + value = sh->struct_version; + break; + case VDAT_INT_TRIED_FIRMWARE_B: + value = (sh->flags & VBSD_FWB_TRIED ? 1 : 0); + break; + case VDAT_INT_KERNEL_KEY_VERIFIED: + value = (sh->flags & VBSD_KERNEL_KEY_VERIFIED ? 1 : 0); + break; + case VDAT_INT_FW_VERSION_TPM: + value = (int)sh->fw_version_tpm; + break; + case VDAT_INT_KERNEL_VERSION_TPM: + value = (int)sh->kernel_version_tpm; + break; + case VDAT_INT_FW_BOOT2: + value = (sh->flags & VBSD_BOOT_FIRMWARE_VBOOT2 ? 1 : 0); + default: + break; + } + + /* Fields added in struct version 2 */ + if (sh->struct_version >= 2) { + switch(field) { + case VDAT_INT_DEVSW_BOOT: + value = (sh->flags & + VBSD_BOOT_DEV_SWITCH_ON ? 1 : 0); + break; + case VDAT_INT_DEVSW_VIRTUAL: + value = (sh->flags & + VBSD_HONOR_VIRT_DEV_SWITCH ? 1 : 0); + break; + case VDAT_INT_RECSW_BOOT: + value = (sh->flags & + VBSD_BOOT_REC_SWITCH_ON ? 1 : 0); + break; + case VDAT_INT_HW_WPSW_BOOT: + value = (sh->flags & + VBSD_BOOT_FIRMWARE_WP_ENABLED ? 1 : 0); + break; + case VDAT_INT_SW_WPSW_BOOT: + value = (sh->flags & + VBSD_BOOT_FIRMWARE_SW_WP_ENABLED ? + 1 : 0); + break; + case VDAT_INT_RECOVERY_REASON: + value = sh->recovery_reason; + break; + default: + break; + } + } -int GetVdatInt(VdatIntField field) { - VbSharedDataHeader* sh = VbSharedDataRead(); - int value = -1; - - if (!sh) - return -1; - - /* Fields supported in version 1 */ - switch (field) { - case VDAT_INT_FLAGS: - value = (int)sh->flags; - break; - case VDAT_INT_HEADER_VERSION: - value = sh->struct_version; - break; - case VDAT_INT_TRIED_FIRMWARE_B: - value = (sh->flags & VBSD_FWB_TRIED ? 1 : 0); - break; - case VDAT_INT_KERNEL_KEY_VERIFIED: - value = (sh->flags & VBSD_KERNEL_KEY_VERIFIED ? 1 : 0); - break; - case VDAT_INT_FW_VERSION_TPM: - value = (int)sh->fw_version_tpm; - break; - case VDAT_INT_KERNEL_VERSION_TPM: - value = (int)sh->kernel_version_tpm; - break; - case VDAT_INT_FW_BOOT2: - value = (sh->flags & VBSD_BOOT_FIRMWARE_VBOOT2 ? 1 : 0); - default: - break; - } - - /* Fields added in struct version 2 */ - if (sh->struct_version >= 2) { - switch(field) { - case VDAT_INT_DEVSW_BOOT: - value = (sh->flags & VBSD_BOOT_DEV_SWITCH_ON ? 1 : 0); - break; - case VDAT_INT_DEVSW_VIRTUAL: - value = (sh->flags & VBSD_HONOR_VIRT_DEV_SWITCH ? 1 : 0); - break; - case VDAT_INT_RECSW_BOOT: - value = (sh->flags & VBSD_BOOT_REC_SWITCH_ON ? 1 : 0); - break; - case VDAT_INT_HW_WPSW_BOOT: - value = (sh->flags & VBSD_BOOT_FIRMWARE_WP_ENABLED ? 1 : 0); - break; - case VDAT_INT_SW_WPSW_BOOT: - value = (sh->flags & VBSD_BOOT_FIRMWARE_SW_WP_ENABLED ? 1 : 0); - break; - case VDAT_INT_RECOVERY_REASON: - value = sh->recovery_reason; - break; - default: - break; - } - } - - free(sh); - return value; + free(sh); + return value; } /* Return version of VbSharedData struct or -1 if not found. */ -int VbSharedDataVersion(void) { - return GetVdatInt(VDAT_INT_HEADER_VERSION); +int VbSharedDataVersion(void) +{ + return GetVdatInt(VDAT_INT_HEADER_VERSION); } -int VbGetSystemPropertyInt(const char* name) { - int value = -1; - - /* Check architecture-dependent properties first */ - value = VbGetArchPropertyInt(name); - if (-1 != value) - return value; - - /* NV storage values */ - else if (!strcasecmp(name,"kern_nv")) { - value = VbGetNvStorage(VBNV_KERNEL_FIELD); - } else if (!strcasecmp(name,"nvram_cleared")) { - value = VbGetNvStorage(VBNV_KERNEL_SETTINGS_RESET); - } else if (!strcasecmp(name,"recovery_request")) { - value = VbGetNvStorage(VBNV_RECOVERY_REQUEST); - } else if (!strcasecmp(name,"dbg_reset")) { - value = VbGetNvStorage(VBNV_DEBUG_RESET_MODE); - } else if (!strcasecmp(name,"disable_dev_request")) { - value = VbGetNvStorage(VBNV_DISABLE_DEV_REQUEST); - } else if (!strcasecmp(name,"clear_tpm_owner_request")) { - value = VbGetNvStorage(VBNV_CLEAR_TPM_OWNER_REQUEST); - } else if (!strcasecmp(name,"clear_tpm_owner_done")) { - value = VbGetNvStorage(VBNV_CLEAR_TPM_OWNER_DONE); - } else if (!strcasecmp(name,"tpm_rebooted")) { - value = VbGetNvStorage(VBNV_TPM_REQUESTED_REBOOT); - } else if (!strcasecmp(name,"fwb_tries")) { - value = VbGetNvStorage(VBNV_TRY_B_COUNT); - } else if (!strcasecmp(name,"fw_vboot2")) { - value = GetVdatInt(VDAT_INT_FW_BOOT2); - } else if (!strcasecmp(name,"fw_try_count")) { - value = VbGetNvStorage(VBNV_FW_TRY_COUNT); - } else if (!strcasecmp(name,"fwupdate_tries")) { - value = VbGetNvStorage(VBNV_KERNEL_FIELD); - if (value != -1) - value &= KERN_NV_FWUPDATE_TRIES_MASK; - } else if (!strcasecmp(name,"block_devmode")) { - value = VbGetNvStorage(VBNV_KERNEL_FIELD); - if (value != -1) { - value &= KERN_NV_BLOCK_DEVMODE_FLAG; - value = !!value; - } - } else if (!strcasecmp(name,"tpm_attack")) { - value = VbGetNvStorage(VBNV_KERNEL_FIELD); - if (value != -1) { - value &= KERN_NV_TPM_ATTACK_FLAG; - value = !!value; - } - } else if (!strcasecmp(name,"loc_idx")) { - value = VbGetNvStorage(VBNV_LOCALIZATION_INDEX); - } else if (!strcasecmp(name,"backup_nvram_request")) { - value = VbGetNvStorage(VBNV_BACKUP_NVRAM_REQUEST); - } else if (!strcasecmp(name,"dev_boot_usb")) { - value = VbGetNvStorage(VBNV_DEV_BOOT_USB); - } else if (!strcasecmp(name,"dev_boot_legacy")) { - value = VbGetNvStorage(VBNV_DEV_BOOT_LEGACY); - } else if (!strcasecmp(name,"dev_boot_signed_only")) { - value = VbGetNvStorage(VBNV_DEV_BOOT_SIGNED_ONLY); - } else if (!strcasecmp(name,"dev_boot_fastboot_full_cap")) { - value = VbGetNvStorage(VBNV_DEV_BOOT_FASTBOOT_FULL_CAP); - } else if (!strcasecmp(name,"oprom_needed")) { - value = VbGetNvStorage(VBNV_OPROM_NEEDED); - } else if (!strcasecmp(name,"recovery_subcode")) { - value = VbGetNvStorage(VBNV_RECOVERY_SUBCODE); - } else if (!strcasecmp(name,"wipeout_request")) { - value = VbGetNvStorage(VBNV_FW_REQ_WIPEOUT); - } - /* Other parameters */ - else if (!strcasecmp(name,"cros_debug")) { - value = VbGetCrosDebug(); - } else if (!strcasecmp(name,"debug_build")) { - value = VbGetDebugBuild(); - } else if (!strcasecmp(name,"devsw_boot")) { - value = GetVdatInt(VDAT_INT_DEVSW_BOOT); - } else if (!strcasecmp(name,"devsw_virtual")) { - value = GetVdatInt(VDAT_INT_DEVSW_VIRTUAL); - } else if (!strcasecmp(name, "recoverysw_boot")) { - value = GetVdatInt(VDAT_INT_RECSW_BOOT); - } else if (!strcasecmp(name, "wpsw_boot")) { - value = GetVdatInt(VDAT_INT_HW_WPSW_BOOT); - } else if (!strcasecmp(name, "sw_wpsw_boot")) { - value = GetVdatInt(VDAT_INT_SW_WPSW_BOOT); - } else if (!strcasecmp(name,"vdat_flags")) { - value = GetVdatInt(VDAT_INT_FLAGS); - } else if (!strcasecmp(name,"tpm_fwver")) { - value = GetVdatInt(VDAT_INT_FW_VERSION_TPM); - } else if (!strcasecmp(name,"tpm_kernver")) { - value = GetVdatInt(VDAT_INT_KERNEL_VERSION_TPM); - } else if (!strcasecmp(name,"tried_fwb")) { - value = GetVdatInt(VDAT_INT_TRIED_FIRMWARE_B); - } else if (!strcasecmp(name,"recovery_reason")) { - value = GetVdatInt(VDAT_INT_RECOVERY_REASON); - } else if (!strcasecmp(name, "fastboot_unlock_in_fw")) { - value = VbGetNvStorage(VBNV_FASTBOOT_UNLOCK_IN_FW); - } else if (!strcasecmp(name, "boot_on_ac_detect")) { - value = VbGetNvStorage(VBNV_BOOT_ON_AC_DETECT); - } else if (!strcasecmp(name, "try_ro_sync")) { - value = VbGetNvStorage(VBNV_TRY_RO_SYNC); - } else if (!strcasecmp(name, "battery_cutoff_request")) { - value = VbGetNvStorage(VBNV_BATTERY_CUTOFF_REQUEST); - } else if (!strcasecmp(name, "inside_vm")) { - /* Detect if the host is a VM. If there is no HWID and the firmware type - * is "nonchrome", then assume it is a VM. If HWID is present, it is a - * baremetal Chrome OS machine. Other cases are errors. */ - char hwid[VB_MAX_STRING_PROPERTY]; - if (!VbGetSystemPropertyString("hwid", hwid, sizeof(hwid))) { - char fwtype_buf[VB_MAX_STRING_PROPERTY]; - const char *fwtype = VbGetSystemPropertyString("mainfw_type", fwtype_buf, - sizeof(fwtype_buf)); - if (fwtype && !strcasecmp(fwtype, "nonchrome")) { - value = 1; - } - } else { - value = 0; - } - } - - return value; +int VbGetSystemPropertyInt(const char *name) +{ + int value = -1; + + /* Check architecture-dependent properties first */ + value = VbGetArchPropertyInt(name); + if (-1 != value) + return value; + + /* NV storage values */ + else if (!strcasecmp(name,"kern_nv")) { + value = VbGetNvStorage(VBNV_KERNEL_FIELD); + } else if (!strcasecmp(name,"nvram_cleared")) { + value = VbGetNvStorage(VBNV_KERNEL_SETTINGS_RESET); + } else if (!strcasecmp(name,"recovery_request")) { + value = VbGetNvStorage(VBNV_RECOVERY_REQUEST); + } else if (!strcasecmp(name,"dbg_reset")) { + value = VbGetNvStorage(VBNV_DEBUG_RESET_MODE); + } else if (!strcasecmp(name,"disable_dev_request")) { + value = VbGetNvStorage(VBNV_DISABLE_DEV_REQUEST); + } else if (!strcasecmp(name,"clear_tpm_owner_request")) { + value = VbGetNvStorage(VBNV_CLEAR_TPM_OWNER_REQUEST); + } else if (!strcasecmp(name,"clear_tpm_owner_done")) { + value = VbGetNvStorage(VBNV_CLEAR_TPM_OWNER_DONE); + } else if (!strcasecmp(name,"tpm_rebooted")) { + value = VbGetNvStorage(VBNV_TPM_REQUESTED_REBOOT); + } else if (!strcasecmp(name,"fwb_tries")) { + value = VbGetNvStorage(VBNV_TRY_B_COUNT); + } else if (!strcasecmp(name,"fw_vboot2")) { + value = GetVdatInt(VDAT_INT_FW_BOOT2); + } else if (!strcasecmp(name,"fw_try_count")) { + value = VbGetNvStorage(VBNV_FW_TRY_COUNT); + } else if (!strcasecmp(name,"fwupdate_tries")) { + value = VbGetNvStorage(VBNV_KERNEL_FIELD); + if (value != -1) + value &= KERN_NV_FWUPDATE_TRIES_MASK; + } else if (!strcasecmp(name,"block_devmode")) { + value = VbGetNvStorage(VBNV_KERNEL_FIELD); + if (value != -1) { + value &= KERN_NV_BLOCK_DEVMODE_FLAG; + value = !!value; + } + } else if (!strcasecmp(name,"tpm_attack")) { + value = VbGetNvStorage(VBNV_KERNEL_FIELD); + if (value != -1) { + value &= KERN_NV_TPM_ATTACK_FLAG; + value = !!value; + } + } else if (!strcasecmp(name,"loc_idx")) { + value = VbGetNvStorage(VBNV_LOCALIZATION_INDEX); + } else if (!strcasecmp(name,"backup_nvram_request")) { + value = VbGetNvStorage(VBNV_BACKUP_NVRAM_REQUEST); + } else if (!strcasecmp(name,"dev_boot_usb")) { + value = VbGetNvStorage(VBNV_DEV_BOOT_USB); + } else if (!strcasecmp(name,"dev_boot_legacy")) { + value = VbGetNvStorage(VBNV_DEV_BOOT_LEGACY); + } else if (!strcasecmp(name,"dev_boot_signed_only")) { + value = VbGetNvStorage(VBNV_DEV_BOOT_SIGNED_ONLY); + } else if (!strcasecmp(name,"dev_boot_fastboot_full_cap")) { + value = VbGetNvStorage(VBNV_DEV_BOOT_FASTBOOT_FULL_CAP); + } else if (!strcasecmp(name,"oprom_needed")) { + value = VbGetNvStorage(VBNV_OPROM_NEEDED); + } else if (!strcasecmp(name,"recovery_subcode")) { + value = VbGetNvStorage(VBNV_RECOVERY_SUBCODE); + } else if (!strcasecmp(name,"wipeout_request")) { + value = VbGetNvStorage(VBNV_FW_REQ_WIPEOUT); + } + /* Other parameters */ + else if (!strcasecmp(name,"cros_debug")) { + value = VbGetCrosDebug(); + } else if (!strcasecmp(name,"debug_build")) { + value = VbGetDebugBuild(); + } else if (!strcasecmp(name,"devsw_boot")) { + value = GetVdatInt(VDAT_INT_DEVSW_BOOT); + } else if (!strcasecmp(name,"devsw_virtual")) { + value = GetVdatInt(VDAT_INT_DEVSW_VIRTUAL); + } else if (!strcasecmp(name, "recoverysw_boot")) { + value = GetVdatInt(VDAT_INT_RECSW_BOOT); + } else if (!strcasecmp(name, "wpsw_boot")) { + value = GetVdatInt(VDAT_INT_HW_WPSW_BOOT); + } else if (!strcasecmp(name, "sw_wpsw_boot")) { + value = GetVdatInt(VDAT_INT_SW_WPSW_BOOT); + } else if (!strcasecmp(name,"vdat_flags")) { + value = GetVdatInt(VDAT_INT_FLAGS); + } else if (!strcasecmp(name,"tpm_fwver")) { + value = GetVdatInt(VDAT_INT_FW_VERSION_TPM); + } else if (!strcasecmp(name,"tpm_kernver")) { + value = GetVdatInt(VDAT_INT_KERNEL_VERSION_TPM); + } else if (!strcasecmp(name,"tried_fwb")) { + value = GetVdatInt(VDAT_INT_TRIED_FIRMWARE_B); + } else if (!strcasecmp(name,"recovery_reason")) { + value = GetVdatInt(VDAT_INT_RECOVERY_REASON); + } else if (!strcasecmp(name, "fastboot_unlock_in_fw")) { + value = VbGetNvStorage(VBNV_FASTBOOT_UNLOCK_IN_FW); + } else if (!strcasecmp(name, "boot_on_ac_detect")) { + value = VbGetNvStorage(VBNV_BOOT_ON_AC_DETECT); + } else if (!strcasecmp(name, "try_ro_sync")) { + value = VbGetNvStorage(VBNV_TRY_RO_SYNC); + } else if (!strcasecmp(name, "battery_cutoff_request")) { + value = VbGetNvStorage(VBNV_BATTERY_CUTOFF_REQUEST); + } else if (!strcasecmp(name, "inside_vm")) { + /* Detect if the host is a VM. If there is no HWID and the + * firmware type is "nonchrome", then assume it is a VM. If + * HWID is present, it is a baremetal Chrome OS machine. Other + * cases are errors. */ + char hwid[VB_MAX_STRING_PROPERTY]; + if (!VbGetSystemPropertyString("hwid", hwid, sizeof(hwid))) { + char fwtype_buf[VB_MAX_STRING_PROPERTY]; + const char *fwtype = VbGetSystemPropertyString( + "mainfw_type", fwtype_buf, sizeof(fwtype_buf)); + if (fwtype && !strcasecmp(fwtype, "nonchrome")) { + value = 1; + } + } else { + value = 0; + } + } + + return value; } +const char *VbGetSystemPropertyString(const char *name, char *dest, + size_t size) +{ + /* Check architecture-dependent properties first */ + if (VbGetArchPropertyString(name, dest, size)) + return dest; + + if (!strcasecmp(name,"kernkey_vfy")) { + switch(GetVdatInt(VDAT_INT_KERNEL_KEY_VERIFIED)) { + case 0: + return "hash"; + case 1: + return "sig"; + default: + return NULL; + } + } else if (!strcasecmp(name, "mainfw_act")) { + return GetVdatString(dest, size, VDAT_STRING_MAINFW_ACT); + } else if (!strcasecmp(name, "vdat_timers")) { + return GetVdatString(dest, size, VDAT_STRING_TIMERS); + } else if (!strcasecmp(name, "vdat_lfdebug")) { + return GetVdatString(dest, size, + VDAT_STRING_LOAD_FIRMWARE_DEBUG); + } else if (!strcasecmp(name, "vdat_lkdebug")) { + return GetVdatString(dest, size, VDAT_STRING_LOAD_KERNEL_DEBUG); + } else if (!strcasecmp(name, "fw_try_next")) { + return VbGetNvStorage(VBNV_FW_TRY_NEXT) ? "B" : "A"; + } else if (!strcasecmp(name, "fw_tried")) { + return VbGetNvStorage(VBNV_FW_TRIED) ? "B" : "A"; + } else if (!strcasecmp(name, "fw_result")) { + int v = VbGetNvStorage(VBNV_FW_RESULT); + if (v < ARRAY_SIZE(fw_results)) + return fw_results[v]; + else + return "unknown"; + } else if (!strcasecmp(name, "fw_prev_tried")) { + return VbGetNvStorage(VBNV_FW_PREV_TRIED) ? "B" : "A"; + } else if (!strcasecmp(name, "fw_prev_result")) { + int v = VbGetNvStorage(VBNV_FW_PREV_RESULT); + if (v < ARRAY_SIZE(fw_results)) + return fw_results[v]; + else + return "unknown"; + } else if (!strcasecmp(name,"dev_default_boot")) { + int v = VbGetNvStorage(VBNV_DEV_DEFAULT_BOOT); + if (v < ARRAY_SIZE(default_boot)) + return default_boot[v]; + else + return "unknown"; + } -const char* VbGetSystemPropertyString(const char* name, char* dest, - size_t size) { - /* Check architecture-dependent properties first */ - if (VbGetArchPropertyString(name, dest, size)) - return dest; - - if (!strcasecmp(name,"kernkey_vfy")) { - switch(GetVdatInt(VDAT_INT_KERNEL_KEY_VERIFIED)) { - case 0: - return "hash"; - case 1: - return "sig"; - default: - return NULL; - } - } else if (!strcasecmp(name, "mainfw_act")) { - return GetVdatString(dest, size, VDAT_STRING_MAINFW_ACT); - } else if (!strcasecmp(name, "vdat_timers")) { - return GetVdatString(dest, size, VDAT_STRING_TIMERS); - } else if (!strcasecmp(name, "vdat_lfdebug")) { - return GetVdatString(dest, size, VDAT_STRING_LOAD_FIRMWARE_DEBUG); - } else if (!strcasecmp(name, "vdat_lkdebug")) { - return GetVdatString(dest, size, VDAT_STRING_LOAD_KERNEL_DEBUG); - } else if (!strcasecmp(name, "fw_try_next")) { - return VbGetNvStorage(VBNV_FW_TRY_NEXT) ? "B" : "A"; - } else if (!strcasecmp(name, "fw_tried")) { - return VbGetNvStorage(VBNV_FW_TRIED) ? "B" : "A"; - } else if (!strcasecmp(name, "fw_result")) { - int v = VbGetNvStorage(VBNV_FW_RESULT); - if (v < ARRAY_SIZE(fw_results)) - return fw_results[v]; - else - return "unknown"; - } else if (!strcasecmp(name, "fw_prev_tried")) { - return VbGetNvStorage(VBNV_FW_PREV_TRIED) ? "B" : "A"; - } else if (!strcasecmp(name, "fw_prev_result")) { - int v = VbGetNvStorage(VBNV_FW_PREV_RESULT); - if (v < ARRAY_SIZE(fw_results)) - return fw_results[v]; - else - return "unknown"; - } else if (!strcasecmp(name,"dev_default_boot")) { - int v = VbGetNvStorage(VBNV_DEV_DEFAULT_BOOT); - if (v < ARRAY_SIZE(default_boot)) - return default_boot[v]; - else - return "unknown"; - } - - return NULL; + return NULL; } -int VbSetSystemPropertyInt(const char* name, int value) { - /* Check architecture-dependent properties first */ - - if (0 == VbSetArchPropertyInt(name, value)) - return 0; - - /* NV storage values */ - if (!strcasecmp(name,"nvram_cleared")) { - /* Can only clear this flag; it's set inside the NV storage library. */ - return VbSetNvStorage(VBNV_KERNEL_SETTINGS_RESET, 0); - } else if (!strcasecmp(name,"recovery_request")) { - return VbSetNvStorage(VBNV_RECOVERY_REQUEST, value); - } else if (!strcasecmp(name,"recovery_subcode")) { - return VbSetNvStorage(VBNV_RECOVERY_SUBCODE, value); - } else if (!strcasecmp(name,"dbg_reset")) { - return VbSetNvStorage(VBNV_DEBUG_RESET_MODE, value); - } else if (!strcasecmp(name,"disable_dev_request")) { - return VbSetNvStorage(VBNV_DISABLE_DEV_REQUEST, value); - } else if (!strcasecmp(name,"clear_tpm_owner_request")) { - return VbSetNvStorage(VBNV_CLEAR_TPM_OWNER_REQUEST, value); - } else if (!strcasecmp(name,"clear_tpm_owner_done")) { - /* Can only clear this flag; it's set by firmware. */ - return VbSetNvStorage(VBNV_CLEAR_TPM_OWNER_DONE, 0); - } else if (!strcasecmp(name,"fwb_tries")) { - return VbSetNvStorage(VBNV_TRY_B_COUNT, value); - } else if (!strcasecmp(name,"fw_try_count")) { - return VbSetNvStorage(VBNV_FW_TRY_COUNT, value); - } else if (!strcasecmp(name,"oprom_needed")) { - return VbSetNvStorage(VBNV_OPROM_NEEDED, value); - } else if (!strcasecmp(name,"wipeout_request")) { - /* Can only clear this flag, set only by firmware. */ - return VbSetNvStorage(VBNV_FW_REQ_WIPEOUT, 0); - } else if (!strcasecmp(name,"backup_nvram_request")) { - /* Best-effort only, since it requires firmware and TPM support. */ - return VbSetNvStorage(VBNV_BACKUP_NVRAM_REQUEST, value); - } else if (!strcasecmp(name,"fwupdate_tries")) { - int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD); - if (kern_nv == -1) - return -1; - kern_nv &= ~KERN_NV_FWUPDATE_TRIES_MASK; - kern_nv |= (value & KERN_NV_FWUPDATE_TRIES_MASK); - return VbSetNvStorage_WithBackup(VBNV_KERNEL_FIELD, kern_nv); - } else if (!strcasecmp(name,"block_devmode")) { - int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD); - if (kern_nv == -1) - return -1; - kern_nv &= ~KERN_NV_BLOCK_DEVMODE_FLAG; - if (value) - kern_nv |= KERN_NV_BLOCK_DEVMODE_FLAG; - return VbSetNvStorage_WithBackup(VBNV_KERNEL_FIELD, kern_nv); - } else if (!strcasecmp(name,"tpm_attack")) { - /* This value should only be read and cleared, but we allow setting it to 1 - * for testing. - */ - int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD); - if (kern_nv == -1) - return -1; - kern_nv &= ~KERN_NV_TPM_ATTACK_FLAG; - if (value) - kern_nv |= KERN_NV_TPM_ATTACK_FLAG; - return VbSetNvStorage_WithBackup(VBNV_KERNEL_FIELD, kern_nv); - } else if (!strcasecmp(name,"loc_idx")) { - return VbSetNvStorage_WithBackup(VBNV_LOCALIZATION_INDEX, value); - } else if (!strcasecmp(name,"dev_boot_usb")) { - return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_USB, value); - } else if (!strcasecmp(name,"dev_boot_legacy")) { - return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_LEGACY, value); - } else if (!strcasecmp(name,"dev_boot_signed_only")) { - return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_SIGNED_ONLY, value); - } else if (!strcasecmp(name,"dev_boot_fastboot_full_cap")) { - return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, value); - } else if (!strcasecmp(name, "fastboot_unlock_in_fw")) { - return VbSetNvStorage_WithBackup(VBNV_FASTBOOT_UNLOCK_IN_FW, value); - } else if (!strcasecmp(name, "boot_on_ac_detect")) { - return VbSetNvStorage_WithBackup(VBNV_BOOT_ON_AC_DETECT, value); - } else if (!strcasecmp(name, "try_ro_sync")) { - return VbSetNvStorage_WithBackup(VBNV_TRY_RO_SYNC, value); - } else if (!strcasecmp(name, "battery_cutoff_request")) { - return VbSetNvStorage(VBNV_BATTERY_CUTOFF_REQUEST, value); - } - - return -1; +int VbSetSystemPropertyInt(const char *name, int value) +{ + /* Check architecture-dependent properties first */ + + if (0 == VbSetArchPropertyInt(name, value)) + return 0; + + /* NV storage values */ + if (!strcasecmp(name,"nvram_cleared")) { + /* Can only clear this flag; it's set inside the NV storage + * library. */ + return VbSetNvStorage(VBNV_KERNEL_SETTINGS_RESET, 0); + } else if (!strcasecmp(name,"recovery_request")) { + return VbSetNvStorage(VBNV_RECOVERY_REQUEST, value); + } else if (!strcasecmp(name,"recovery_subcode")) { + return VbSetNvStorage(VBNV_RECOVERY_SUBCODE, value); + } else if (!strcasecmp(name,"dbg_reset")) { + return VbSetNvStorage(VBNV_DEBUG_RESET_MODE, value); + } else if (!strcasecmp(name,"disable_dev_request")) { + return VbSetNvStorage(VBNV_DISABLE_DEV_REQUEST, value); + } else if (!strcasecmp(name,"clear_tpm_owner_request")) { + return VbSetNvStorage(VBNV_CLEAR_TPM_OWNER_REQUEST, value); + } else if (!strcasecmp(name,"clear_tpm_owner_done")) { + /* Can only clear this flag; it's set by firmware. */ + return VbSetNvStorage(VBNV_CLEAR_TPM_OWNER_DONE, 0); + } else if (!strcasecmp(name,"fwb_tries")) { + return VbSetNvStorage(VBNV_TRY_B_COUNT, value); + } else if (!strcasecmp(name,"fw_try_count")) { + return VbSetNvStorage(VBNV_FW_TRY_COUNT, value); + } else if (!strcasecmp(name,"oprom_needed")) { + return VbSetNvStorage(VBNV_OPROM_NEEDED, value); + } else if (!strcasecmp(name,"wipeout_request")) { + /* Can only clear this flag, set only by firmware. */ + return VbSetNvStorage(VBNV_FW_REQ_WIPEOUT, 0); + } else if (!strcasecmp(name,"backup_nvram_request")) { + /* Best-effort only, since it requires firmware and TPM + * support. */ + return VbSetNvStorage(VBNV_BACKUP_NVRAM_REQUEST, value); + } else if (!strcasecmp(name,"fwupdate_tries")) { + int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD); + if (kern_nv == -1) + return -1; + kern_nv &= ~KERN_NV_FWUPDATE_TRIES_MASK; + kern_nv |= (value & KERN_NV_FWUPDATE_TRIES_MASK); + return VbSetNvStorage_WithBackup(VBNV_KERNEL_FIELD, kern_nv); + } else if (!strcasecmp(name,"block_devmode")) { + int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD); + if (kern_nv == -1) + return -1; + kern_nv &= ~KERN_NV_BLOCK_DEVMODE_FLAG; + if (value) + kern_nv |= KERN_NV_BLOCK_DEVMODE_FLAG; + return VbSetNvStorage_WithBackup(VBNV_KERNEL_FIELD, kern_nv); + } else if (!strcasecmp(name,"tpm_attack")) { + /* This value should only be read and cleared, but we allow + * setting it to 1 for testing. */ + int kern_nv = VbGetNvStorage(VBNV_KERNEL_FIELD); + if (kern_nv == -1) + return -1; + kern_nv &= ~KERN_NV_TPM_ATTACK_FLAG; + if (value) + kern_nv |= KERN_NV_TPM_ATTACK_FLAG; + return VbSetNvStorage_WithBackup(VBNV_KERNEL_FIELD, kern_nv); + } else if (!strcasecmp(name,"loc_idx")) { + return VbSetNvStorage_WithBackup(VBNV_LOCALIZATION_INDEX, + value); + } else if (!strcasecmp(name,"dev_boot_usb")) { + return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_USB, value); + } else if (!strcasecmp(name,"dev_boot_legacy")) { + return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_LEGACY, value); + } else if (!strcasecmp(name,"dev_boot_signed_only")) { + return VbSetNvStorage_WithBackup(VBNV_DEV_BOOT_SIGNED_ONLY, + value); + } else if (!strcasecmp(name,"dev_boot_fastboot_full_cap")) { + return VbSetNvStorage_WithBackup( + VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, value); + } else if (!strcasecmp(name, "fastboot_unlock_in_fw")) { + return VbSetNvStorage_WithBackup(VBNV_FASTBOOT_UNLOCK_IN_FW, + value); + } else if (!strcasecmp(name, "boot_on_ac_detect")) { + return VbSetNvStorage_WithBackup(VBNV_BOOT_ON_AC_DETECT, value); + } else if (!strcasecmp(name, "try_ro_sync")) { + return VbSetNvStorage_WithBackup(VBNV_TRY_RO_SYNC, value); + } else if (!strcasecmp(name, "battery_cutoff_request")) { + return VbSetNvStorage(VBNV_BATTERY_CUTOFF_REQUEST, value); + } + + return -1; } +int VbSetSystemPropertyString(const char* name, const char* value) +{ + /* Chain to architecture-dependent properties */ + if (0 == VbSetArchPropertyString(name, value)) + return 0; + + if (!strcasecmp(name, "fw_try_next")) { + if (!strcasecmp(value, "A")) + return VbSetNvStorage(VBNV_FW_TRY_NEXT, 0); + else if (!strcasecmp(value, "B")) + return VbSetNvStorage(VBNV_FW_TRY_NEXT, 1); + else + return -1; + + } else if (!strcasecmp(name, "fw_result")) { + int i; + + for (i = 0; i < ARRAY_SIZE(fw_results); i++) { + if (!strcasecmp(value, fw_results[i])) + return VbSetNvStorage(VBNV_FW_RESULT, i); + } + return -1; + } else if (!strcasecmp(name, "dev_default_boot")) { + int i; + + for (i = 0; i < ARRAY_SIZE(default_boot); i++) { + if (!strcasecmp(value, default_boot[i])) + return VbSetNvStorage(VBNV_DEV_DEFAULT_BOOT, i); + } + return -1; + } -int VbSetSystemPropertyString(const char* name, const char* value) { - /* Chain to architecture-dependent properties */ - if (0 == VbSetArchPropertyString(name, value)) - return 0; - - if (!strcasecmp(name, "fw_try_next")) { - if (!strcasecmp(value, "A")) - return VbSetNvStorage(VBNV_FW_TRY_NEXT, 0); - else if (!strcasecmp(value, "B")) - return VbSetNvStorage(VBNV_FW_TRY_NEXT, 1); - else - return -1; - - } else if (!strcasecmp(name, "fw_result")) { - int i; - - for (i = 0; i < ARRAY_SIZE(fw_results); i++) { - if (!strcasecmp(value, fw_results[i])) - return VbSetNvStorage(VBNV_FW_RESULT, i); - } - return -1; - } else if (!strcasecmp(name, "dev_default_boot")) { - int i; - - for (i = 0; i < ARRAY_SIZE(default_boot); i++) { - if (!strcasecmp(value, default_boot[i])) - return VbSetNvStorage(VBNV_DEV_DEFAULT_BOOT, i); - } - return -1; - } - - return -1; + return -1; } - static int InAndroid(void) { int fd; @@ -767,98 +784,100 @@ static int InAndroid(void) return retval; } +static int ExecuteMosys(char * const argv[], char *buf, size_t bufsize) +{ + int status, mosys_to_crossystem[2]; + pid_t pid; + ssize_t n; -static int ExecuteMosys(char * const argv[], char *buf, size_t bufsize) { - int status, mosys_to_crossystem[2]; - pid_t pid; - ssize_t n; - - if (pipe(mosys_to_crossystem) < 0) { - VBDEBUG(("pipe() error\n")); - return -1; - } - - if ((pid = fork()) < 0) { - VBDEBUG(("fork() error\n")); - close(mosys_to_crossystem[0]); - close(mosys_to_crossystem[1]); - return -1; - } else if (!pid) { /* Child */ - close(mosys_to_crossystem[0]); - /* Redirect pipe's write-end to mosys' stdout */ - if (STDOUT_FILENO != mosys_to_crossystem[1]) { - if (dup2(mosys_to_crossystem[1], STDOUT_FILENO) != STDOUT_FILENO) { - VBDEBUG(("stdout dup2() failed (mosys)\n")); - close(mosys_to_crossystem[1]); - exit(1); - } - } - /* Execute mosys */ - execv(InAndroid() ? MOSYS_ANDROID_PATH : MOSYS_CROS_PATH, argv); - /* We shouldn't be here; exit now! */ - VBDEBUG(("execv() of mosys failed\n")); - close(mosys_to_crossystem[1]); - exit(1); - } else { /* Parent */ - close(mosys_to_crossystem[1]); - if (bufsize) { - bufsize--; /* Reserve 1 byte for '\0' */ - while ((n = read(mosys_to_crossystem[0], buf, bufsize)) > 0) { - buf += n; - bufsize -= n; - } - *buf = '\0'; - } else { - n = 0; - } - close(mosys_to_crossystem[0]); - if (n < 0) - VBDEBUG(("read() error while reading output from mosys\n")); - if (waitpid(pid, &status, 0) < 0 || status) { - VBDEBUG(("waitpid() or mosys error\n")); - fprintf(stderr, "waitpid() or mosys error\n"); - return -1; - } - if (n < 0) - return -1; - } - return 0; -} - + if (pipe(mosys_to_crossystem) < 0) { + VBDEBUG(("pipe() error\n")); + return -1; + } -int VbReadNvStorage_mosys(VbNvContext* vnc) { - char hexstring[VBNV_BLOCK_SIZE * 2 + 32]; /* Reserve extra 32 bytes */ - char * const argv[] = { - InAndroid() ? MOSYS_ANDROID_PATH : MOSYS_CROS_PATH, - "nvram", "vboot", "read", NULL - }; - char hexdigit[3]; - int i; - - if (ExecuteMosys(argv, hexstring, sizeof(hexstring))) - return -1; - hexdigit[2] = '\0'; - for (i = 0; i < VBNV_BLOCK_SIZE; i++) { - hexdigit[0] = hexstring[i * 2]; - hexdigit[1] = hexstring[i * 2 + 1]; - vnc->raw[i] = strtol(hexdigit, NULL, 16); - } - return 0; + if ((pid = fork()) < 0) { + VBDEBUG(("fork() error\n")); + close(mosys_to_crossystem[0]); + close(mosys_to_crossystem[1]); + return -1; + } else if (!pid) { /* Child */ + close(mosys_to_crossystem[0]); + /* Redirect pipe's write-end to mosys' stdout */ + if (STDOUT_FILENO != mosys_to_crossystem[1]) { + if (dup2(mosys_to_crossystem[1], STDOUT_FILENO) + != STDOUT_FILENO) { + VBDEBUG(("stdout dup2() failed (mosys)\n")); + close(mosys_to_crossystem[1]); + exit(1); + } + } + /* Execute mosys */ + execv(InAndroid() ? MOSYS_ANDROID_PATH : MOSYS_CROS_PATH, argv); + /* We shouldn't be here; exit now! */ + VBDEBUG(("execv() of mosys failed\n")); + close(mosys_to_crossystem[1]); + exit(1); + } else { /* Parent */ + close(mosys_to_crossystem[1]); + if (bufsize) { + bufsize--; /* Reserve 1 byte for '\0' */ + while ((n = read(mosys_to_crossystem[0], + buf, bufsize)) > 0) { + buf += n; + bufsize -= n; + } + *buf = '\0'; + } else { + n = 0; + } + close(mosys_to_crossystem[0]); + if (n < 0) + VBDEBUG(("read() error reading output from mosys\n")); + if (waitpid(pid, &status, 0) < 0 || status) { + VBDEBUG(("waitpid() or mosys error\n")); + fprintf(stderr, "waitpid() or mosys error\n"); + return -1; + } + if (n < 0) + return -1; + } + return 0; } +int VbReadNvStorage_mosys(VbNvContext *vnc) +{ + char hexstring[VBNV_BLOCK_SIZE * 2 + 32]; /* Reserve extra 32 bytes */ + char * const argv[] = { + InAndroid() ? MOSYS_ANDROID_PATH : MOSYS_CROS_PATH, + "nvram", "vboot", "read", NULL + }; + char hexdigit[3]; + int i; + + if (ExecuteMosys(argv, hexstring, sizeof(hexstring))) + return -1; + hexdigit[2] = '\0'; + for (i = 0; i < VBNV_BLOCK_SIZE; i++) { + hexdigit[0] = hexstring[i * 2]; + hexdigit[1] = hexstring[i * 2 + 1]; + vnc->raw[i] = strtol(hexdigit, NULL, 16); + } + return 0; +} -int VbWriteNvStorage_mosys(VbNvContext* vnc) { - char hexstring[VBNV_BLOCK_SIZE * 2 + 1]; - char * const argv[] = { - InAndroid() ? MOSYS_ANDROID_PATH : MOSYS_CROS_PATH, - "nvram", "vboot", "write", hexstring, NULL - }; - int i; - - for (i = 0; i < VBNV_BLOCK_SIZE; i++) - snprintf(hexstring + i * 2, 3, "%02x", vnc->raw[i]); - hexstring[sizeof(hexstring) - 1] = '\0'; - if (ExecuteMosys(argv, NULL, 0)) - return -1; - return 0; +int VbWriteNvStorage_mosys(VbNvContext* vnc) +{ + char hexstring[VBNV_BLOCK_SIZE * 2 + 1]; + char * const argv[] = { + InAndroid() ? MOSYS_ANDROID_PATH : MOSYS_CROS_PATH, + "nvram", "vboot", "write", hexstring, NULL + }; + int i; + + for (i = 0; i < VBNV_BLOCK_SIZE; i++) + snprintf(hexstring + i * 2, 3, "%02x", vnc->raw[i]); + hexstring[sizeof(hexstring) - 1] = '\0'; + if (ExecuteMosys(argv, NULL, 0)) + return -1; + return 0; } |