diff options
author | Randall Spangler <rspangler@chromium.org> | 2018-01-03 15:34:03 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-01-05 21:14:12 -0800 |
commit | 1a5e02c7a9ca66fb20f6752225903aa7a4dd0f70 (patch) | |
tree | 00f79930ba040eb8e660b04a88553cd68108fc75 /tests/vb20_misc_tests.c | |
parent | de818cc08fab92ad389dc92f31687f3314a1a03a (diff) | |
download | vboot-1a5e02c7a9ca66fb20f6752225903aa7a4dd0f70.tar.gz |
firmware: Align workbuf used size
Previously, workbuf used was not rounded up to a multiple of
VB2_WORKBUF_ALIGN. The next allocation would be aligned, but not
until it was made.
Change this to round up used size when more workbuf is used. This
provides better predictability of where the next allocation will be
placed.
Uncovered this problem when I added a new member to vb2_shared_data
which changed its size so it wasn't a multiple of VB2_WORKBUF_ALIGN,
and the vb20 and vb21 unit tests which tried to simulate not enough
buffer broke in strange ways.
BUG=chromium:611535
BRANCH=none
TEST=make -j runtests; build bob firmware and boot it
Change-Id: I0157a1c96326f7fce6be6efbd74d90c3d2942268
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/852488
Reviewed-by: Shelley Chen <shchen@chromium.org>
Diffstat (limited to 'tests/vb20_misc_tests.c')
-rw-r--r-- | tests/vb20_misc_tests.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/tests/vb20_misc_tests.c b/tests/vb20_misc_tests.c index 2156e919..9442aa0a 100644 --- a/tests/vb20_misc_tests.c +++ b/tests/vb20_misc_tests.c @@ -185,12 +185,11 @@ static void verify_keyblock_tests(void) TEST_EQ(sd->fw_version, 0x20000, "keyblock version"); TEST_EQ(sd->vblock_preamble_offset, sizeof(mock_vblock.k), "preamble offset"); - TEST_EQ(sd->workbuf_data_key_offset, - (wb_used_before + (VB2_WORKBUF_ALIGN - 1)) & - ~(VB2_WORKBUF_ALIGN - 1), + TEST_EQ(sd->workbuf_data_key_offset, wb_used_before, "keyblock data key offset"); TEST_EQ(cc.workbuf_used, - sd->workbuf_data_key_offset + sd->workbuf_data_key_size, + vb2_wb_round_up(sd->workbuf_data_key_offset + + sd->workbuf_data_key_size), "workbuf used"); /* Make sure data key was properly saved */ @@ -204,12 +203,14 @@ static void verify_keyblock_tests(void) sizeof(mock_vblock.k.data_key_data)), 0, "data key data"); TEST_EQ(cc.workbuf_used, - sd->workbuf_data_key_offset + sd->workbuf_data_key_size, + vb2_wb_round_up(sd->workbuf_data_key_offset + + sd->workbuf_data_key_size), "workbuf used after"); /* Test failures */ reset_common_data(FOR_KEYBLOCK); - cc.workbuf_used = cc.workbuf_size - sd->gbb_rootkey_size + 8; + cc.workbuf_used = cc.workbuf_size + VB2_WORKBUF_ALIGN - + vb2_wb_round_up(sd->gbb_rootkey_size); TEST_EQ(vb2_load_fw_keyblock(&cc), VB2_ERROR_FW_KEYBLOCK_WORKBUF_ROOT_KEY, "keyblock not enough workbuf for root key"); @@ -227,7 +228,8 @@ static void verify_keyblock_tests(void) "keyblock unpack root key"); reset_common_data(FOR_KEYBLOCK); - cc.workbuf_used = cc.workbuf_size - sd->gbb_rootkey_size - 8; + cc.workbuf_used = cc.workbuf_size - + vb2_wb_round_up(sd->gbb_rootkey_size); TEST_EQ(vb2_load_fw_keyblock(&cc), VB2_ERROR_FW_KEYBLOCK_WORKBUF_HEADER, "keyblock not enough workbuf for header"); @@ -239,8 +241,9 @@ static void verify_keyblock_tests(void) "keyblock read keyblock header"); reset_common_data(FOR_KEYBLOCK); - cc.workbuf_used = cc.workbuf_size - sd->gbb_rootkey_size - - sizeof(struct vb2_keyblock); + cc.workbuf_used = cc.workbuf_size - + vb2_wb_round_up(sd->gbb_rootkey_size) - + vb2_wb_round_up(sizeof(struct vb2_keyblock)); TEST_EQ(vb2_load_fw_keyblock(&cc), VB2_ERROR_FW_KEYBLOCK_WORKBUF, "keyblock not enough workbuf for entire keyblock"); @@ -286,13 +289,12 @@ static void verify_preamble_tests(void) wb_used_before = cc.workbuf_used; TEST_SUCC(vb2_load_fw_preamble(&cc), "preamble good"); TEST_EQ(sd->fw_version, 0x20002, "combined version"); - TEST_EQ(sd->workbuf_preamble_offset, - (wb_used_before + (VB2_WORKBUF_ALIGN - 1)) & - ~(VB2_WORKBUF_ALIGN - 1), + TEST_EQ(sd->workbuf_preamble_offset, wb_used_before, "preamble offset"); TEST_EQ(sd->workbuf_preamble_size, pre->preamble_size, "preamble size"); TEST_EQ(cc.workbuf_used, - sd->workbuf_preamble_offset + sd->workbuf_preamble_size, + vb2_wb_round_up(sd->workbuf_preamble_offset + + sd->workbuf_preamble_size), "workbuf used"); /* Expected failures */ @@ -309,7 +311,8 @@ static void verify_preamble_tests(void) "preamble unpack data key"); reset_common_data(FOR_PREAMBLE); - cc.workbuf_used = cc.workbuf_size - sizeof(struct vb2_fw_preamble) + 8; + cc.workbuf_used = cc.workbuf_size + VB2_WORKBUF_ALIGN - + vb2_wb_round_up(sizeof(struct vb2_fw_preamble)); TEST_EQ(vb2_load_fw_preamble(&cc), VB2_ERROR_FW_PREAMBLE2_WORKBUF_HEADER, "preamble not enough workbuf for header"); @@ -321,7 +324,8 @@ static void verify_preamble_tests(void) "preamble read header"); reset_common_data(FOR_PREAMBLE); - cc.workbuf_used = cc.workbuf_size - sizeof(mock_vblock.p) + 8; + cc.workbuf_used = cc.workbuf_size + VB2_WORKBUF_ALIGN - + vb2_wb_round_up(sizeof(mock_vblock.p)); TEST_EQ(vb2_load_fw_preamble(&cc), VB2_ERROR_FW_PREAMBLE2_WORKBUF, "preamble not enough workbuf"); |