diff options
Diffstat (limited to 'src/drivers/intel/fsp2_0/util.c')
-rw-r--r-- | src/drivers/intel/fsp2_0/util.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/src/drivers/intel/fsp2_0/util.c b/src/drivers/intel/fsp2_0/util.c index b47b898ab8..942ea09e1b 100644 --- a/src/drivers/intel/fsp2_0/util.c +++ b/src/drivers/intel/fsp2_0/util.c @@ -104,47 +104,57 @@ void fsp_print_header_info(const struct fsp_header *hdr) } -/* TODO: this won't work for SoC's that need to XIP certain modules. */ -enum cb_err fsp_load_binary(struct fsp_header *hdr, - const char *name, - struct range_entry *range) +enum cb_err fsp_validate_component(struct fsp_header *hdr, + const struct region_device *rdev) { - struct cbfsf file_desc; - struct region_device file_data; void *membase; - if (cbfs_boot_locate(&file_desc, name, NULL)) { - printk(BIOS_ERR, "Could not locate %s in CBFS\n", name); - return CB_ERR; - } - - cbfs_file_data(&file_data, &file_desc); - /* Map just enough of the file to be able to parse the header. */ - membase = rdev_mmap(&file_data, FSP_HDR_OFFSET, FSP_HDR_LEN); + membase = rdev_mmap(rdev, FSP_HDR_OFFSET, FSP_HDR_LEN); if (membase == NULL) { - printk(BIOS_ERR, "Could not mmap() '%s' FSP header.\n", name); + printk(BIOS_ERR, "Could not mmap() FSP header.\n"); return CB_ERR; } if (fsp_identify(hdr, membase) != CB_SUCCESS) { - rdev_munmap(&file_data, membase); - printk(BIOS_ERR, "%s did not have a valid FSP header\n", name); + rdev_munmap(rdev, membase); + printk(BIOS_ERR, "No valid FSP header\n"); return CB_ERR; } - rdev_munmap(&file_data, membase); + rdev_munmap(rdev, membase); fsp_print_header_info(hdr); /* Check if size specified in the header matches the cbfs file size */ - if (region_device_sz(&file_data) < hdr->image_size) { - printk(BIOS_ERR, "%s size bigger than cbfs file.\n", name); + if (region_device_sz(rdev) < hdr->image_size) { + printk(BIOS_ERR, "Component size bigger than cbfs file.\n"); return CB_ERR; } - /* Check if the binary load address is within expected range */ + return CB_SUCCESS; +} + +/* TODO: this won't work for SoC's that need to XIP certain modules. */ +enum cb_err fsp_load_binary(struct fsp_header *hdr, + const char *name, + struct range_entry *range) +{ + struct cbfsf file_desc; + struct region_device file_data; + + if (cbfs_boot_locate(&file_desc, name, NULL)) { + printk(BIOS_ERR, "Could not locate %s in CBFS\n", name); + return CB_ERR; + } + + cbfs_file_data(&file_data, &file_desc); + + if (fsp_validate_component(hdr, &file_data) != CB_SUCCESS) + return CB_ERR; + + /* Check if the component load address is within expected range */ /* TODO: this doesn't check the current running program footprint. */ if (range_entry_base(range) > hdr->image_base || range_entry_end(range) <= hdr->image_base + hdr->image_size) { |