| Index: vboot_firmware/stub/load_firmware_stub.c
|
| diff --git a/vboot_firmware/stub/load_firmware_stub.c b/vboot_firmware/stub/load_firmware_stub.c
|
| index dea7f304f852ce9ec9fbb528c8865e1b2740eba6..5bca57dac2fe661fd1738a6b5b131b66e49165af 100644
|
| --- a/vboot_firmware/stub/load_firmware_stub.c
|
| +++ b/vboot_firmware/stub/load_firmware_stub.c
|
| @@ -12,42 +12,43 @@
|
| #include "firmware_image_fw.h"
|
| #include "utility.h"
|
|
|
| +typedef struct CallerInternal {
|
| + uint8_t *firmwareA;
|
| + uint64_t firmwareA_size;
|
| + uint8_t *firmwareB;
|
| + uint64_t firmwareB_size;
|
| +} CallerInternal;
|
|
|
| -static uint8_t *g_firmwareA;
|
| -static uint64_t g_firmwareA_size;
|
| -static uint8_t *g_firmwareB;
|
| -static uint64_t g_firmwareB_size;
|
| -
|
| -
|
| -void *GetFirmwareBody(uint64_t firmware_index, uint64_t* size) {
|
| +int GetFirmwareBody(LoadFirmwareParams* params, uint64_t index) {
|
|
|
| + CallerInternal* ci = (CallerInternal*)params->caller_internal;
|
| uint8_t *fw;
|
| + uint64_t size;
|
|
|
| /* In a real implementation, GetFirmwareBody() should be what reads
|
| * and decompresses the firmware volume. In this temporary hack, we
|
| * just pass the pointer which we got from
|
| * VerifyFirmwareDriver_Stub(). */
|
| - switch(firmware_index) {
|
| + switch(index) {
|
| case 0:
|
| - *size = g_firmwareA_size;
|
| - fw = g_firmwareA;
|
| + size = ci->firmwareA_size;
|
| + fw = ci->firmwareA;
|
| case 1:
|
| - *size = g_firmwareB_size;
|
| - fw = g_firmwareB;
|
| + size = ci->firmwareB_size;
|
| + fw = ci->firmwareB;
|
| default:
|
| /* Anything else is invalid */
|
| - *size = 0;
|
| - return NULL;
|
| + return 1;
|
| }
|
|
|
| /* Need to call UpdateFirmwareBodyHash() with the firmware volume
|
| * data. In this temporary hack, the FV is already decompressed, so
|
| * we pass in the entire volume at once. In a real implementation,
|
| * you should call this as the FV is being decompressed. */
|
| - UpdateFirmwareBodyHash(fw, *size);
|
| + UpdateFirmwareBodyHash(params, fw, size);
|
|
|
| - /* Return the firmware body pointer */
|
| - return fw;
|
| + /* Success */
|
| + return 0;
|
| }
|
|
|
|
|
| @@ -64,20 +65,27 @@ int VerifyFirmwareDriver_stub(uint8_t* root_key_blob,
|
|
|
| int rv;
|
|
|
| + CallerInternal ci;
|
| +
|
| /* Copy the firmware volume pointers to our global variables. */
|
| - g_firmwareA = firmwareA;
|
| - g_firmwareB = firmwareB;
|
| + ci.firmwareA = firmwareA;
|
| + ci.firmwareB = firmwareB;
|
|
|
| /* TODO: YOU NEED TO PASS IN THE FIRMWARE VOLUME SIZES SOMEHOW */
|
| - g_firmwareA_size = 0;
|
| - g_firmwareB_size = 0;
|
| + ci.firmwareA_size = 0;
|
| + ci.firmwareB_size = 0;
|
|
|
| /* Set up the params for LoadFirmware() */
|
| LoadFirmwareParams p;
|
| + p.caller_internal = &ci;
|
| p.firmware_root_key_blob = root_key_blob;
|
| p.verification_block_0 = verification_headerA;
|
| p.verification_block_1 = verification_headerB;
|
|
|
| + /* Allocate a key blob buffer */
|
| + p.kernel_sign_key_blob = Malloc(LOAD_FIRMWARE_KEY_BLOB_MAX);
|
| + p.kernel_sign_key_size = LOAD_FIRMWARE_KEY_BLOB_MAX;
|
| +
|
| /* Call LoadFirmware() */
|
| rv = LoadFirmware(&p);
|
| if (LOAD_FIRMWARE_SUCCESS == rv) {
|
|
|