diff options
author | Simon Glass <sjg@chromium.org> | 2011-06-21 23:32:07 -0700 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:39:34 -0700 |
commit | 633319235e8f177d0b0aae3f9307b737a6a4122e (patch) | |
tree | 7e71a515fb7a87e41dc266d368b644777a6f1ea6 | |
parent | 7e48cdcfdb1b9a76b56219283d9cadf718e7e011 (diff) |
onestop: Bring all mallocs together at the start
One malloc() is used further on in the code. This change brings this
to the initialization also, and changes its type to reduce type
casting required.
BUG=chromium-os:16508
TEST=build and verify onestop boots into dev, recovery and normal
Change-Id: Icbb293b0f33485a8eba82f0d10338666dcf1d180
Reviewed-on: http://gerrit.chromium.org/gerrit/3026
Reviewed-by: Che-Liang Chiou <clchiou@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | common/cmd_cros_onestop_firmware.c | 39 |
1 files changed, 10 insertions, 29 deletions
diff --git a/common/cmd_cros_onestop_firmware.c b/common/cmd_cros_onestop_firmware.c index 75ecdb7b1f1..61dc1070a30 100644 --- a/common/cmd_cros_onestop_firmware.c +++ b/common/cmd_cros_onestop_firmware.c @@ -51,6 +51,9 @@ static struct internal_state_t { uint64_t boot_flags; uint32_t recovery_request; ScreenIndex current_screen; + + /* Can we make this a non-pointer, and avoid a malloc? */ + VbKeyBlockHeader *key_block; } _state; /** @@ -165,15 +168,10 @@ static uint32_t init_internal_state(void *ksd, int *dev_mode) /* malloc spaces for buffers */ _state.gbb_data = malloc(CONFIG_LENGTH_GBB); - if (!_state.gbb_data) { - VBDEBUG(PREFIX "malloc gbb_data == NULL\n"); - return VBNV_RECOVERY_RO_UNSPECIFIED; - } _state.shared = malloc(VB_SHARED_DATA_REC_SIZE); - if (!_state.shared) { - VBDEBUG(PREFIX "malloc shared == NULL\n"); + _state.key_block = (VbKeyBlockHeader *)malloc(CONFIG_LENGTH_VBLOCK_A); + if (!_state.gbb_data || !_state.shared || !_state.key_block) return VBNV_RECOVERY_RO_UNSPECIFIED; - } /* open firmware storage device and load gbb */ if (firmware_storage_open_spi(&_state.file)) { @@ -229,28 +227,26 @@ struct RSAPublicKey *PublicKeyToRSA(const VbPublicKey *key); * @return VBNV_RECOVERY_NOT_REQUESTED if it succeeds; recovery reason if it * fails */ -static uint32_t load_kernel_subkey_a(void *vblock) +static uint32_t load_kernel_subkey_a(VbKeyBlockHeader *key_block) { - VbKeyBlockHeader *key_block; VbFirmwarePreambleHeader *preamble; struct RSAPublicKey *data_key; + VBDEBUG(PREFIX "reading kernel subkey A\n"); if (firmware_storage_read(&_state.file, CONFIG_OFFSET_VBLOCK_A, CONFIG_LENGTH_VBLOCK_A, - vblock)) { + key_block)) { VBDEBUG(PREFIX "read verification block fail\n"); return VBNV_RECOVERY_RO_SHARED_DATA; } - key_block = (VbKeyBlockHeader *)vblock; - data_key = PublicKeyToRSA(&key_block->data_key); if (!data_key) { VBDEBUG(PREFIX "parse data key fail\n"); return VBNV_RECOVERY_RO_SHARED_DATA; } - preamble = (VbFirmwarePreambleHeader *)(vblock + + preamble = (VbFirmwarePreambleHeader *)((char *)key_block + key_block->key_block_size); if (VerifyFirmwarePreamble(preamble, CONFIG_LENGTH_VBLOCK_A - key_block->key_block_size, data_key)) { @@ -290,16 +286,11 @@ static uint32_t init_vbshared_data(int dev_mode) * We do not call VbGetTimer() because we have conflicting symbols * when include utility.h. */ - - uint32_t reason; - uint8_t *vblock; - if (VbSharedDataInit(_state.shared, VB_SHARED_DATA_REC_SIZE)) { VBDEBUG(PREFIX "VbSharedDataInit fail\n"); return VBNV_RECOVERY_RO_SHARED_DATA; } - reason = VBNV_RECOVERY_RO_UNSPECIFIED; if (dev_mode) _state.shared->flags |= VBSD_LF_DEV_SWITCH_ON; @@ -307,17 +298,7 @@ static uint32_t init_vbshared_data(int dev_mode) _state.shared->check_fw_a_result = VBSD_LF_CHECK_VALID; _state.shared->firmware_index = 0; - vblock = malloc(CONFIG_LENGTH_VBLOCK_A); - if (vblock) { - reason = load_kernel_subkey_a(vblock); - if (reason != VBNV_RECOVERY_NOT_REQUESTED) - VBDEBUG(PREFIX "fail to load kernel subkey A\n"); - free(vblock); - } else { - VBDEBUG(PREFIX "vblock == NULL\n"); - } - - return reason; + return load_kernel_subkey_a(_state.key_block); } static void beep(void) |