aboutsummaryrefslogtreecommitdiff
path: root/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2015-05-15 15:57:51 -0500
committerAaron Durbin <adurbin@chromium.org>2015-05-26 22:33:35 +0200
commitb6981c0f9c4ce89c4209c14fb326a414096f2ff1 (patch)
tree604e3df8ef60b2a962f19be791bba4398ab868a9 /src/vendorcode/google/chromeos/vboot2/vboot_loader.c
parentb59eaf6ca88267baf28cb318117696df1fb03fee (diff)
vboot: use only offsets for tracking firmware components
Because of the fmap API returning pointers to represent regions within the boot device a vboot_region structure was used to track the case where offsets could be pointers on x86 but not on !x86. Normalize this tracking to use offsets only as it provides consistency in the code. Change-Id: I63c08b31ace3bd0e66ebc17e308f87eb5f857c86 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/10221 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src/vendorcode/google/chromeos/vboot2/vboot_loader.c')
-rw-r--r--src/vendorcode/google/chromeos/vboot2/vboot_loader.c73
1 files changed, 41 insertions, 32 deletions
diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_loader.c b/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
index fd6479890c..1129cd13c3 100644
--- a/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
+++ b/src/vendorcode/google/chromeos/vboot2/vboot_loader.c
@@ -121,10 +121,10 @@ static int vboot_loader_active(struct prog *prog)
if (IS_ENABLED(CONFIG_MULTIPLE_CBFS_INSTANCES) &&
run_verification) {
/* RW A or B */
- struct vboot_region fw_main;
+ struct region fw_main;
vb2_get_selected_region(wd, &fw_main);
- cbfs_set_header_offset(fw_main.offset_addr);
+ cbfs_set_header_offset(region_offset(&fw_main));
}
return 1;
}
@@ -132,27 +132,30 @@ static int vboot_loader_active(struct prog *prog)
return 0;
}
-static uintptr_t vboot_fw_region(int fw_index, struct vboot_region *fw_main,
- struct vboot_components *fw_info, size_t *size)
+static int vboot_fw_region(int fw_index, struct region *fw_main,
+ struct vboot_components *fw_info,
+ struct region *fc)
{
- uintptr_t fc_addr;
- uint32_t fc_size;
+ size_t fw_main_end;
+ size_t fc_end;
if (fw_index >= fw_info->num_components) {
printk(BIOS_INFO, "invalid stage index: %d\n", fw_index);
- return 0;
+ return -1;
}
- fc_addr = fw_main->offset_addr + fw_info->entries[fw_index].offset;
- fc_size = fw_info->entries[fw_index].size;
- if (fc_size == 0 ||
- fc_addr + fc_size > fw_main->offset_addr + fw_main->size) {
+ fc->offset = region_offset(fw_main) + fw_info->entries[fw_index].offset;
+ fc->size = fw_info->entries[fw_index].size;
+
+ fw_main_end = region_offset(fw_main) + region_sz(fw_main);
+ fc_end = region_offset(fc) + region_sz(fc);
+
+ if (region_sz(fc) == 0 || fc_end > fw_main_end) {
printk(BIOS_INFO, "invalid stage address or size\n");
- return 0;
+ return -1;
}
- *size = fc_size;
- return fc_addr;
+ return 0;
}
/* This function is only called when vboot_loader_active() returns 1. That
@@ -160,7 +163,7 @@ static uintptr_t vboot_fw_region(int fw_index, struct vboot_region *fw_main,
static int vboot_prepare(struct prog *prog)
{
struct vb2_working_data *wd;
- struct vboot_region fw_main;
+ struct region fw_main;
struct vboot_components *fw_info;
/* Code size optimization. We'd never actually get called under the
@@ -202,25 +205,22 @@ static int vboot_prepare(struct prog *prog)
/* Load payload in ramstage. */
if (ENV_RAMSTAGE) {
- uintptr_t payload;
+ struct region payload;
void *payload_ptr;
- size_t size;
-
- payload = vboot_fw_region(CONFIG_VBOOT_BOOT_LOADER_INDEX,
- &fw_main, fw_info, &size);
- if (payload == 0)
+ if (vboot_fw_region(CONFIG_VBOOT_BOOT_LOADER_INDEX,
+ &fw_main, fw_info, &payload))
die("Couldn't load payload.");
- payload_ptr = vboot_get_region(payload, size, NULL);
+ payload_ptr = vboot_get_region(region_offset(&payload),
+ region_sz(&payload), NULL);
if (payload_ptr == NULL)
die("Couldn't load payload.");
- prog_set_area(prog, payload_ptr, size);
+ prog_set_area(prog, payload_ptr, region_sz(&payload));
} else {
- uintptr_t stage;
- size_t size;
+ struct region stage;
int stage_index = 0;
if (prog->type == PROG_ROMSTAGE)
@@ -230,22 +230,31 @@ static int vboot_prepare(struct prog *prog)
else
die("Invalid program type for vboot.");
- stage = vboot_fw_region(stage_index, &fw_main, fw_info, &size);
-
- if (stage == 0)
+ if (vboot_fw_region(stage_index, &fw_main, fw_info, &stage))
die("Vboot stage load failed.");
if (ENV_ROMSTAGE && IS_ENABLED(CONFIG_RELOCATABLE_RAMSTAGE)) {
+ void *stage_ptr;
struct rmod_stage_load rmod_ram = {
.cbmem_id = CBMEM_ID_RAMSTAGE,
.prog = prog,
};
- if (rmodule_stage_load(&rmod_ram, (void *)stage))
+ stage_ptr = vboot_get_region(region_offset(&stage),
+ region_sz(&stage), NULL);
+
+ if (stage_ptr == NULL)
+ die("Vboot couldn't load stage.");
+
+ if (rmodule_stage_load(&rmod_ram, stage_ptr))
die("Vboot couldn't load stage");
- } else if (cbfs_load_prog_stage_by_offset(CBFS_DEFAULT_MEDIA,
- prog, stage) < 0)
- die("Vboot couldn't load stage");
+ } else {
+ size_t offset = region_offset(&stage);
+
+ if (cbfs_load_prog_stage_by_offset(CBFS_DEFAULT_MEDIA,
+ prog, offset))
+ die("Vboot couldn't load stage");
+ }
}
return 0;