summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/include/vboot_api.h8
-rw-r--r--firmware/lib/vboot_api_kernel.c40
-rw-r--r--firmware/linktest/main.c1
-rw-r--r--tests/vboot_api_kernel4_tests.c7
-rw-r--r--tests/vboot_api_kernel5_tests.c31
5 files changed, 33 insertions, 54 deletions
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index 38c5cbda..84b9d11c 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -31,6 +31,7 @@ extern "C" {
#endif /* __cplusplus */
struct vb2_context;
+typedef struct VbSharedDataHeader VbSharedDataHeader;
/*****************************************************************************/
/* Error codes */
@@ -321,7 +322,7 @@ typedef struct VbSelectAndLoadKernelParams {
* Returns VBERROR_SUCCESS if success, non-zero if error; on error, caller
* should reboot. */
VbError_t VbSelectAndLoadKernel(struct vb2_context *ctx,
- VbCommonParams *cparams,
+ VbSharedDataHeader *shared,
VbSelectAndLoadKernelParams *kparams);
/**
@@ -334,15 +335,14 @@ VbError_t VbSelectAndLoadKernel(struct vb2_context *ctx,
* does not check the image signature.
*
* @param ctx Vboot context
- * @param cparams Common parameters, e.g. use member caller_context
- * to point to useful context data
+ * @param shared Vboot1 VBSD struct
* @param kparams kernel params
* @param boot_image Image in memory that needs to be verified
* @param image_size Size of the image in memory
* @return VBERROR_... error, VBERROR_SUCCESS on success.
*/
VbError_t VbVerifyMemoryBootImage(struct vb2_context *ctx,
- VbCommonParams *cparams,
+ VbSharedDataHeader *shared,
VbSelectAndLoadKernelParams *kparams,
void *boot_image,
size_t image_size);
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 5d4c7c09..d5dda055 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -220,7 +220,7 @@ VbError_t VbBootNormal(struct vb2_context *ctx)
}
static VbError_t vb2_kernel_setup(struct vb2_context *ctx,
- VbCommonParams *cparams,
+ VbSharedDataHeader *shared,
VbSelectAndLoadKernelParams *kparams)
{
if (VB2_SUCCESS != vb2_init_context(ctx)) {
@@ -229,9 +229,6 @@ static VbError_t vb2_kernel_setup(struct vb2_context *ctx,
return VBERROR_INIT_SHARED_DATA;
}
- VbSharedDataHeader *shared =
- (VbSharedDataHeader *)cparams->shared_data_blob;
-
/* Start timer */
shared->timer_vb_select_and_load_kernel_enter = VbExGetTimer();
@@ -347,31 +344,24 @@ static VbError_t vb2_kernel_phase4(struct vb2_context *ctx,
return VBERROR_SUCCESS;
}
-static void vb2_kernel_cleanup(struct vb2_context *ctx, VbCommonParams *cparams)
+static void vb2_kernel_cleanup(struct vb2_context *ctx)
{
- /*
- * This must directly access cparams for now because we could have had
- * an error setting up the vboot2 context. In that case
- * vb2_shared_data is not available.
- */
- VbSharedDataHeader *shared =
- (VbSharedDataHeader *)cparams->shared_data_blob;
-
vb2_nv_commit(ctx);
- /* Stop timer */
- shared->timer_vb_select_and_load_kernel_exit = VbExGetTimer();
-
- /* Store how much shared data we used, if any */
- cparams->shared_data_size = shared->data_used;
+ /* vb2_shared_data may not have been initialized, and we may not have a
+ proper vbsd value. */
+ struct vb2_shared_data *sd = vb2_get_sd(ctx);
+ if (sd->vbsd)
+ /* Stop timer */
+ sd->vbsd->timer_vb_select_and_load_kernel_exit = VbExGetTimer();
}
VbError_t VbSelectAndLoadKernel(
struct vb2_context *ctx,
- VbCommonParams *cparams,
+ VbSharedDataHeader *shared,
VbSelectAndLoadKernelParams *kparams)
{
- VbError_t retval = vb2_kernel_setup(ctx, cparams, kparams);
+ VbError_t retval = vb2_kernel_setup(ctx, shared, kparams);
if (retval)
goto VbSelectAndLoadKernel_exit;
@@ -442,7 +432,7 @@ VbError_t VbSelectAndLoadKernel(
if (VBERROR_SUCCESS == retval)
retval = vb2_kernel_phase4(ctx, kparams);
- vb2_kernel_cleanup(ctx, cparams);
+ vb2_kernel_cleanup(ctx);
/* Pass through return value from boot path */
VB2_DEBUG("Returning %d\n", (int)retval);
@@ -450,7 +440,7 @@ VbError_t VbSelectAndLoadKernel(
}
VbError_t VbVerifyMemoryBootImage(
- struct vb2_context *ctx, VbCommonParams *cparams,
+ struct vb2_context *ctx, VbSharedDataHeader *shared,
VbSelectAndLoadKernelParams *kparams, void *boot_image,
size_t image_size)
{
@@ -464,13 +454,11 @@ VbError_t VbVerifyMemoryBootImage(
uint32_t allow_fastboot_full_cap = 0;
struct vb2_workbuf wb;
- VbError_t retval = vb2_kernel_setup(ctx, cparams, kparams);
+ VbError_t retval = vb2_kernel_setup(ctx, shared, kparams);
if (retval)
goto fail;
- struct vb2_shared_data *sd = vb2_get_sd(ctx);
struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
- VbSharedDataHeader *shared = sd->vbsd;
if ((boot_image == NULL) || (image_size == 0)) {
retval = VBERROR_INVALID_PARAMETER;
@@ -601,7 +589,7 @@ VbError_t VbVerifyMemoryBootImage(
retval = VBERROR_SUCCESS;
fail:
- vb2_kernel_cleanup(ctx, cparams);
+ vb2_kernel_cleanup(ctx);
if (NULL != kernel_subkey)
free(kernel_subkey);
return retval;
diff --git a/firmware/linktest/main.c b/firmware/linktest/main.c
index 29bd9702..95a5d0fc 100644
--- a/firmware/linktest/main.c
+++ b/firmware/linktest/main.c
@@ -55,6 +55,7 @@ int main(void)
/* vboot_api.h - entry points INTO vboot_reference */
VbSelectAndLoadKernel(0, 0, 0);
+ VbVerifyMemoryBootImage(0, 0, 0, 0, 0);
/* vboot_common.h */
OffsetOf(0, 0);
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index 9ac71de4..b3b34022 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -28,7 +28,6 @@ static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
static struct vb2_context ctx;
static struct vb2_context ctx_nvram_backend;
static struct vb2_shared_data *sd;
-static VbCommonParams cparams;
static VbSelectAndLoadKernelParams kparams;
static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
@@ -47,10 +46,6 @@ static int mock_switches_are_stuck;
/* Reset mock data (for use before each test) */
static void ResetMocks(void)
{
- memset(&cparams, 0, sizeof(cparams));
- cparams.shared_data_size = sizeof(shared_data);
- cparams.shared_data_blob = shared_data;
-
memset(&kparams, 0, sizeof(kparams));
memset(&gbb, 0, sizeof(gbb));
@@ -171,7 +166,7 @@ VbError_t VbBootDiagnostic(struct vb2_context *c)
static void test_slk(VbError_t retval, int recovery_reason, const char *desc)
{
- TEST_EQ(VbSelectAndLoadKernel(&ctx, &cparams, &kparams), retval, desc);
+ TEST_EQ(VbSelectAndLoadKernel(&ctx, shared, &kparams), retval, desc);
TEST_EQ(vb2_nv_get(&ctx_nvram_backend, VB2_NV_RECOVERY_REQUEST),
recovery_reason, " recovery reason");
}
diff --git a/tests/vboot_api_kernel5_tests.c b/tests/vboot_api_kernel5_tests.c
index 8fd432e3..42cc8e36 100644
--- a/tests/vboot_api_kernel5_tests.c
+++ b/tests/vboot_api_kernel5_tests.c
@@ -30,7 +30,6 @@
static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
static struct vb2_context ctx;
static struct vb2_context ctx_nvram_backend;
-static VbCommonParams cparams;
static VbSelectAndLoadKernelParams kparams;
static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
@@ -52,10 +51,6 @@ static int hash_only_check;
*/
static void ResetMocks(void)
{
- memset(&cparams, 0, sizeof(cparams));
- cparams.shared_data_size = sizeof(shared_data);
- cparams.shared_data_blob = shared_data;
-
memset(&kparams, 0, sizeof(kparams));
memset(&gbb, 0, sizeof(gbb));
@@ -212,7 +207,7 @@ static void VerifyMemoryBootImageTest(void)
kernel_body_size = sizeof(kernel_buffer) - kernel_body_offset;
kernel_body_start = (uintptr_t)kernel_buffer + kernel_body_offset;
- u = VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ u = VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size);
TEST_EQ(u, 0, "Image good");
TEST_EQ(kparams.partition_number, 0, " part num");
@@ -225,20 +220,20 @@ static void VerifyMemoryBootImageTest(void)
/* Empty image buffer. */
ResetMocks();
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, NULL,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, NULL,
kernel_buffer_size),
VBERROR_INVALID_PARAMETER, "Empty image");
/* Illegal image size. */
ResetMocks();
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
0),
VBERROR_INVALID_PARAMETER, "Illegal image size");
/* Key Block Verification Failure */
ResetMocks();
key_block_verify_fail = 1;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");
TEST_EQ(hash_only_check, 0, " hash check");
@@ -248,7 +243,7 @@ static void VerifyMemoryBootImageTest(void)
shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
gbb.flags = VB2_GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
key_block_verify_fail = 1;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");
TEST_EQ(hash_only_check, 1, " hash check");
@@ -258,7 +253,7 @@ static void VerifyMemoryBootImageTest(void)
shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
key_block_verify_fail = 1;
vb2_nv_set(&ctx_nvram_backend, VB2_NV_DEV_BOOT_FASTBOOT_FULL_CAP, 1);
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");
TEST_EQ(hash_only_check, 1, " hash check -- VBNV flag");
@@ -269,7 +264,7 @@ static void VerifyMemoryBootImageTest(void)
KEY_BLOCK_FLAG_RECOVERY_1;
copy_kbh();
shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND,
"Developer flag mismatch - dev switch on");
@@ -281,7 +276,7 @@ static void VerifyMemoryBootImageTest(void)
copy_kbh();
gbb.flags = VB2_GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_SUCCESS,
"Developer flag mismatch - dev switch on(gbb override)");
@@ -293,7 +288,7 @@ static void VerifyMemoryBootImageTest(void)
copy_kbh();
shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
gbb.flags = VB2_GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_SUCCESS,
"Recovery flag mismatch - dev switch on(gbb override)");
@@ -303,7 +298,7 @@ static void VerifyMemoryBootImageTest(void)
kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_1 |
KEY_BLOCK_FLAG_RECOVERY_1;
copy_kbh();
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND,
"Developer flag mismatch - dev switch off");
@@ -314,21 +309,21 @@ static void VerifyMemoryBootImageTest(void)
KEY_BLOCK_FLAG_RECOVERY_0;
shared->flags = 0;
copy_kbh();
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Recovery flag mismatch");
/* Preamble verification */
ResetMocks();
preamble_verify_fail = 1;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Preamble verification");
/* Data verification */
ResetMocks();
verify_data_fail = 1;
- TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
+ TEST_EQ(VbVerifyMemoryBootImage(&ctx, shared, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Data verification");
}