summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2021-04-22 21:03:35 +0800
committerCommit Bot <commit-bot@chromium.org>2021-06-15 19:35:54 +0000
commit43fa783cbf6014d23d8b23b5eb7b4e63b17864ec (patch)
tree31102ed2b9c528accadbc35358eb6031ff3c1fbf
parent39ea3ade28b733521b480da161c61848764a3096 (diff)
downloadvboot-43fa783cbf6014d23d8b23b5eb7b4e63b17864ec.tar.gz
vboot/vboot_kernel: pass VbDiskInfo into LoadKernel
Pass VbDiskInfo struct into LoadKernel, rather than copying all of its members into LoadKernelParams. Remove the unused members from LoadKernelParams. This CL is part of a series to merge vboot1 and vboot2.0 kernel verification code; see b/181739551. BUG=b:181739551 TEST=make clean && make runtests BRANCH=none Signed-off-by: Joel Kitching <kitching@google.com> Change-Id: I60957426388c88b16e570b717addb5eaf65b5e4f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2846281 Reviewed-by: Joel Kitching <kitching@chromium.org> Tested-by: Joel Kitching <kitching@chromium.org> Commit-Queue: Joel Kitching <kitching@chromium.org>
-rw-r--r--firmware/lib/include/load_kernel_fw.h15
-rw-r--r--firmware/lib/vboot_api_kernel.c12
-rw-r--r--firmware/lib/vboot_kernel.c18
-rw-r--r--tests/vboot_api_kernel_tests.c5
-rw-r--r--tests/vboot_kernel_tests.c15
-rw-r--r--tests/verify_kernel.c20
-rw-r--r--utility/load_kernel_test.c36
7 files changed, 59 insertions, 62 deletions
diff --git a/firmware/lib/include/load_kernel_fw.h b/firmware/lib/include/load_kernel_fw.h
index 9e4db8e6..b4661c3a 100644
--- a/firmware/lib/include/load_kernel_fw.h
+++ b/firmware/lib/include/load_kernel_fw.h
@@ -15,26 +15,14 @@ struct vb2_context;
/* Interface provided by verified boot library to BDS */
-/* Boot flags for LoadKernel().boot_flags */
-/* GPT is external */
-#define BOOT_FLAG_EXTERNAL_GPT (0x04ULL)
-
typedef struct LoadKernelParams {
/* Inputs to LoadKernel() */
/* Disk handle for current device */
VbExDiskHandle_t disk_handle;
- /* Bytes per lba sector on current device */
- uint64_t bytes_per_lba;
- /* Number of LBA-addressable sectors on the main device */
- uint64_t streaming_lba_count;
- /* Random-access GPT size */
- uint64_t gpt_lba_count;
/* Destination buffer for kernel (normally at 0x100000) */
void *kernel_buffer;
/* Size of kernel buffer in bytes */
uint64_t kernel_buffer_size;
- /* Boot flags */
- uint64_t boot_flags;
/*
* Outputs from LoadKernel(); valid only if LoadKernel() returns
@@ -60,6 +48,7 @@ typedef struct LoadKernelParams {
*
* Returns VB2_SUCCESS if successful. If unsuccessful, returns an error code.
*/
-vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params);
+vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params,
+ VbDiskInfo *disk_info);
#endif /* VBOOT_REFERENCE_LOAD_KERNEL_FW_H_ */
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index 5451033a..f1e191a1 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -91,20 +91,14 @@ vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t get_info_flags)
disk_info[i].flags);
continue;
}
+
lkp.disk_handle = disk_info[i].handle;
- lkp.bytes_per_lba = disk_info[i].bytes_per_lba;
- lkp.gpt_lba_count = disk_info[i].lba_count;
- lkp.streaming_lba_count = disk_info[i].streaming_lba_count
- ?: lkp.gpt_lba_count;
- lkp.boot_flags |= disk_info[i].flags & VB_DISK_FLAG_EXTERNAL_GPT
- ? BOOT_FLAG_EXTERNAL_GPT : 0;
-
- vb2_error_t new_rv = LoadKernel(ctx, &lkp);
+ vb2_error_t new_rv = LoadKernel(ctx, &lkp, &disk_info[i]);
VB2_DEBUG("LoadKernel() = %#x\n", new_rv);
/* Stop now if we found a kernel. */
if (VB2_SUCCESS == new_rv) {
- VbExDiskFreeInfo(disk_info, lkp.disk_handle);
+ VbExDiskFreeInfo(disk_info, disk_info[i].handle);
return VB2_SUCCESS;
}
diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c
index 53e8b129..75b40c4e 100644
--- a/firmware/lib/vboot_kernel.c
+++ b/firmware/lib/vboot_kernel.c
@@ -456,7 +456,8 @@ static vb2_error_t vb2_load_partition(
return VB2_SUCCESS;
}
-vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params)
+vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params,
+ VbDiskInfo *disk_info)
{
struct vb2_shared_data *sd = vb2_get_sd(ctx);
int found_partitions = 0;
@@ -471,12 +472,13 @@ vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params)
/* Read GPT data */
GptData gpt;
- gpt.sector_bytes = (uint32_t)params->bytes_per_lba;
- gpt.streaming_drive_sectors = params->streaming_lba_count;
- gpt.gpt_drive_sectors = params->gpt_lba_count;
- gpt.flags = params->boot_flags & BOOT_FLAG_EXTERNAL_GPT
+ gpt.sector_bytes = (uint32_t)disk_info->bytes_per_lba;
+ gpt.streaming_drive_sectors = disk_info->streaming_lba_count
+ ?: disk_info->lba_count;
+ gpt.gpt_drive_sectors = disk_info->lba_count;
+ gpt.flags = disk_info->flags & VB_DISK_FLAG_EXTERNAL_GPT
? GPT_FLAG_EXTERNAL : 0;
- if (AllocAndReadGptData(params->disk_handle, &gpt)) {
+ if (AllocAndReadGptData(disk_info->handle, &gpt)) {
VB2_DEBUG("Unable to read GPT data\n");
goto gpt_done;
}
@@ -501,7 +503,7 @@ vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params)
/* Set up the stream */
VbExStream_t stream = NULL;
- if (VbExStreamOpen(params->disk_handle,
+ if (VbExStreamOpen(disk_info->handle,
part_start, part_size, &stream)) {
VB2_DEBUG("Partition error getting stream.\n");
VB2_DEBUG("Marking kernel as invalid.\n");
@@ -590,7 +592,7 @@ vb2_error_t LoadKernel(struct vb2_context *ctx, LoadKernelParams *params)
gpt_done:
/* Write and free GPT data */
- WriteAndFreeGptData(params->disk_handle, &gpt);
+ WriteAndFreeGptData(disk_info->handle, &gpt);
/* Handle finding a good partition */
if (params->partition_number > 0) {
diff --git a/tests/vboot_api_kernel_tests.c b/tests/vboot_api_kernel_tests.c
index bcb5d046..b5e1e7c3 100644
--- a/tests/vboot_api_kernel_tests.c
+++ b/tests/vboot_api_kernel_tests.c
@@ -395,14 +395,15 @@ vb2_error_t VbExDiskFreeInfo(VbDiskInfo *infos,
return VB2_SUCCESS;
}
-vb2_error_t LoadKernel(struct vb2_context *c, LoadKernelParams *params)
+vb2_error_t LoadKernel(struct vb2_context *c, LoadKernelParams *params,
+ VbDiskInfo *disk_info)
{
got_find_disk = (const char *)params->disk_handle;
VB2_DEBUG("%s(%d): got_find_disk = %s\n", __FUNCTION__,
load_kernel_calls,
got_find_disk ? got_find_disk : "0");
if (t->external_expected[load_kernel_calls] !=
- !!(params->boot_flags & BOOT_FLAG_EXTERNAL_GPT))
+ !!(disk_info->flags & VB_DISK_FLAG_EXTERNAL_GPT))
got_external_mismatch++;
return t->loadkernel_return_val[load_kernel_calls++];
}
diff --git a/tests/vboot_kernel_tests.c b/tests/vboot_kernel_tests.c
index 7d088ae6..6bfb3ae8 100644
--- a/tests/vboot_kernel_tests.c
+++ b/tests/vboot_kernel_tests.c
@@ -55,6 +55,7 @@ static int gpt_flag_external;
static struct vb2_gbb_header gbb;
static VbExDiskHandle_t handle;
static LoadKernelParams lkp;
+static VbDiskInfo disk_info;
static struct vb2_keyblock kbh;
static struct vb2_kernel_preamble kph;
static struct vb2_secdata_fwmp *fwmp;
@@ -136,13 +137,16 @@ static void ResetMocks(void)
gbb.flags = 0;
memset(&lkp, 0, sizeof(lkp));
- lkp.bytes_per_lba = 512;
- lkp.streaming_lba_count = 1024;
- lkp.gpt_lba_count = 1024;
lkp.kernel_buffer = kernel_buffer;
lkp.kernel_buffer_size = sizeof(kernel_buffer);
lkp.disk_handle = (VbExDiskHandle_t)1;
+ memset(&disk_info, 0, sizeof(disk_info));
+ disk_info.bytes_per_lba = 512;
+ disk_info.streaming_lba_count = 1024;
+ disk_info.lba_count = 1024;
+ disk_info.handle = lkp.disk_handle;
+
memset(&kbh, 0, sizeof(kbh));
kbh.data_key.key_version = 2;
kbh.keyblock_flags = -1;
@@ -592,7 +596,7 @@ static void ReadWriteGptTest(void)
static void TestLoadKernel(int expect_retval, const char *test_name)
{
- TEST_EQ(LoadKernel(ctx, &lkp), expect_retval, test_name);
+ TEST_EQ(LoadKernel(ctx, &lkp, &disk_info), expect_retval, test_name);
}
/**
@@ -607,6 +611,7 @@ static void InvalidParamsTest(void)
/* This causes the stream open call to fail */
ResetMocks();
lkp.disk_handle = NULL;
+ disk_info.handle = NULL;
TestLoadKernel(VB2_ERROR_LK_INVALID_KERNEL_FOUND, "Bad disk handle");
}
@@ -861,7 +866,7 @@ static void LoadKernelTest(void)
/* Check that EXTERNAL_GPT flag makes it down */
ResetMocks();
- lkp.boot_flags |= BOOT_FLAG_EXTERNAL_GPT;
+ disk_info.flags |= VB_DISK_FLAG_EXTERNAL_GPT;
TestLoadKernel(0, "Succeed external GPT");
TEST_EQ(gpt_flag_external, 1, "GPT was external");
diff --git a/tests/verify_kernel.c b/tests/verify_kernel.c
index fe68a1b4..7c2ce917 100644
--- a/tests/verify_kernel.c
+++ b/tests/verify_kernel.c
@@ -24,15 +24,16 @@ static struct vb2_shared_data *sd;
static uint8_t *diskbuf;
static LoadKernelParams params;
+static VbDiskInfo disk_info;
vb2_error_t VbExDiskRead(VbExDiskHandle_t handle, uint64_t lba_start,
uint64_t lba_count, void *buffer)
{
if (handle != (VbExDiskHandle_t)1)
return VB2_ERROR_UNKNOWN;
- if (lba_start >= params.streaming_lba_count)
+ if (lba_start >= disk_info.streaming_lba_count)
return VB2_ERROR_UNKNOWN;
- if (lba_start + lba_count > params.streaming_lba_count)
+ if (lba_start + lba_count > disk_info.streaming_lba_count)
return VB2_ERROR_UNKNOWN;
memcpy(buffer, diskbuf + lba_start * 512, lba_count * 512);
@@ -44,9 +45,9 @@ vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
{
if (handle != (VbExDiskHandle_t)1)
return VB2_ERROR_UNKNOWN;
- if (lba_start >= params.streaming_lba_count)
+ if (lba_start >= disk_info.streaming_lba_count)
return VB2_ERROR_UNKNOWN;
- if (lba_start + lba_count > params.streaming_lba_count)
+ if (lba_start + lba_count > disk_info.streaming_lba_count)
return VB2_ERROR_UNKNOWN;
memcpy(diskbuf + lba_start * 512, buffer, lba_count * 512);
@@ -87,9 +88,10 @@ int main(int argc, char *argv[])
/* Set up params */
params.disk_handle = (VbExDiskHandle_t)1;
- params.bytes_per_lba = 512;
- params.streaming_lba_count = disk_bytes / 512;
- params.gpt_lba_count = params.streaming_lba_count;
+ disk_info.handle = (VbExDiskHandle_t)1;
+ disk_info.bytes_per_lba = 512;
+ disk_info.streaming_lba_count = disk_bytes / 512;
+ disk_info.lba_count = disk_info.streaming_lba_count;
params.kernel_buffer_size = 16 * 1024 * 1024;
params.kernel_buffer = malloc(params.kernel_buffer_size);
@@ -99,7 +101,7 @@ int main(int argc, char *argv[])
}
/* TODO(chromium:441893): support dev-mode flag and external gpt flag */
- params.boot_flags = 0;
+ disk_info.flags = 0;
if (vb2api_init(&workbuf, sizeof(workbuf), &ctx)) {
fprintf(stderr, "Can't initialize workbuf\n");
@@ -132,7 +134,7 @@ int main(int argc, char *argv[])
vb2_secdata_kernel_init(ctx);
/* Try loading kernel */
- rv = LoadKernel(ctx, &params);
+ rv = LoadKernel(ctx, &params, &disk_info);
if (rv != VB2_SUCCESS) {
fprintf(stderr, "LoadKernel() failed with code %d\n", rv);
return 1;
diff --git a/utility/load_kernel_test.c b/utility/load_kernel_test.c
index c5dc7cb6..c8f38f5b 100644
--- a/utility/load_kernel_test.c
+++ b/utility/load_kernel_test.c
@@ -27,6 +27,7 @@ static struct vb2_shared_data *sd;
/* Global variables for stub functions */
static LoadKernelParams lkp;
+static VbDiskInfo disk_info;
static FILE *image_file = NULL;
@@ -36,17 +37,19 @@ vb2_error_t VbExDiskRead(VbExDiskHandle_t handle, uint64_t lba_start,
{
printf("Read(%" PRIu64 ", %" PRIu64 ")\n", lba_start, lba_count);
- if (lba_start >= lkp.streaming_lba_count ||
- lba_start + lba_count > lkp.streaming_lba_count) {
+ if (lba_start >= disk_info.streaming_lba_count ||
+ lba_start + lba_count > disk_info.streaming_lba_count) {
fprintf(stderr,
"Read overrun: %" PRIu64 " + %" PRIu64
" > %" PRIu64 "\n", lba_start,
- lba_count, lkp.streaming_lba_count);
+ lba_count, disk_info.streaming_lba_count);
return 1;
}
- if (0 != fseek(image_file, lba_start * lkp.bytes_per_lba, SEEK_SET) ||
- 1 != fread(buffer, lba_count * lkp.bytes_per_lba, 1, image_file)) {
+ if (0 != fseek(image_file, lba_start * disk_info.bytes_per_lba,
+ SEEK_SET) ||
+ 1 != fread(buffer, lba_count * disk_info.bytes_per_lba, 1,
+ image_file)) {
fprintf(stderr, "Read error.");
return 1;
}
@@ -59,12 +62,12 @@ vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
{
printf("Write(%" PRIu64 ", %" PRIu64 ")\n", lba_start, lba_count);
- if (lba_start >= lkp.streaming_lba_count ||
- lba_start + lba_count > lkp.streaming_lba_count) {
+ if (lba_start >= disk_info.streaming_lba_count ||
+ lba_start + lba_count > disk_info.streaming_lba_count) {
fprintf(stderr,
"Read overrun: %" PRIu64 " + %" PRIu64
" > %" PRIu64 "\n", lba_start, lba_count,
- lkp.streaming_lba_count);
+ disk_info.streaming_lba_count);
return 1;
}
@@ -72,8 +75,9 @@ vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
our example file */
return VB2_SUCCESS;
- fseek(image_file, lba_start * lkp.bytes_per_lba, SEEK_SET);
- if (1 != fwrite(buffer, lba_count * lkp.bytes_per_lba, 1, image_file)) {
+ fseek(image_file, lba_start * disk_info.bytes_per_lba, SEEK_SET);
+ if (1 != fwrite(buffer, lba_count * disk_info.bytes_per_lba, 1,
+ image_file)) {
fprintf(stderr, "Read error.");
return 1;
}
@@ -97,7 +101,7 @@ int main(int argc, char* argv[])
char *e = 0;
memset(&lkp, 0, sizeof(LoadKernelParams));
- lkp.bytes_per_lba = LBA_BYTES;
+ disk_info.bytes_per_lba = LBA_BYTES;
int boot_flags = BOOT_FLAG_RECOVERY;
/* Parse options */
@@ -186,7 +190,6 @@ int main(int argc, char* argv[])
}
printf("bootflags = %d\n", boot_flags);
- lkp.boot_flags = boot_flags;
/* Get image size */
printf("Reading from image: %s\n", image_name);
@@ -196,10 +199,11 @@ int main(int argc, char* argv[])
return 1;
}
fseek(image_file, 0, SEEK_END);
- lkp.streaming_lba_count = (ftell(image_file) / LBA_BYTES);
- lkp.gpt_lba_count = lkp.streaming_lba_count;
+ disk_info.streaming_lba_count = (ftell(image_file) / LBA_BYTES);
+ disk_info.lba_count = disk_info.streaming_lba_count;
rewind(image_file);
- printf("Streaming LBA count: %" PRIu64 "\n", lkp.streaming_lba_count);
+ printf("Streaming LBA count: %" PRIu64 "\n",
+ disk_info.streaming_lba_count);
/* Allocate a buffer for the kernel */
lkp.kernel_buffer = malloc(KERNEL_BUFFER_SIZE);
@@ -241,7 +245,7 @@ int main(int argc, char* argv[])
ctx->flags |= VB2_CONTEXT_DEVELOPER_MODE;
/* Call LoadKernel() */
- rv = LoadKernel(ctx, &lkp);
+ rv = LoadKernel(ctx, &lkp, &disk_info);
printf("LoadKernel() returned %d\n", rv);
if (VB2_SUCCESS == rv) {