summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2018-03-19 16:59:12 +1100
committerStewart Smith <stewart@linux.ibm.com>2018-04-11 17:59:57 -0500
commite7a2da8d5e654467df63c03e2be91b435796df25 (patch)
tree789e07b7a962ec41b875b949fe07047613733943
parent217e5a4ecbfab8e88b6e250d5d8fdfe502cfe5da (diff)
downloadtalos-skiboot-e7a2da8d5e654467df63c03e2be91b435796df25.tar.gz
talos-skiboot-e7a2da8d5e654467df63c03e2be91b435796df25.zip
core: Correctly load initramfs in stb container
Skiboot does not calculate the actual size and start location of the initramfs if it is wrapped by an STB container (for example if loading an initramfs from the ROOTFS partition). Check if the initramfs is in an STB container and determine the size and location correctly in the same manner as the kernel. Since load_initramfs() is called after load_kernel() move the call to trustedboot_exit_boot_services() into load_and_boot_kernel() so it is called after both of these. Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
-rw-r--r--core/flash.c3
-rw-r--r--core/init.c26
2 files changed, 24 insertions, 5 deletions
diff --git a/core/flash.c b/core/flash.c
index 7140e943..4031e7b3 100644
--- a/core/flash.c
+++ b/core/flash.c
@@ -748,7 +748,8 @@ static int flash_load_resource(enum resource_id id, uint32_t subid,
* Back to the old way of doing things, no STB header.
*/
if (subid == RESOURCE_SUBID_NONE) {
- if (id == RESOURCE_ID_KERNEL) {
+ if (id == RESOURCE_ID_KERNEL ||
+ id == RESOURCE_ID_INITRAMFS) {
/*
* Because actualSize is a lie, we compute the
* size of the BOOTKERNEL based on what the ELF
diff --git a/core/init.c b/core/init.c
index 39c44607..b91e34b3 100644
--- a/core/init.c
+++ b/core/init.c
@@ -428,13 +428,13 @@ static bool load_kernel(void)
SECURE_BOOT_HEADERS_SIZE + kernel_size);
}
- trustedboot_exit_boot_services();
-
return true;
}
static void load_initramfs(void)
{
+ uint64_t *initramfs_start;
+ void *stb_container = NULL;
int loaded;
loaded = wait_for_resource_loaded(RESOURCE_ID_INITRAMFS,
@@ -443,15 +443,31 @@ static void load_initramfs(void)
if (loaded != OPAL_SUCCESS || !initramfs_size)
return;
+ if (stb_is_container(INITRAMFS_LOAD_BASE, initramfs_size)) {
+ stb_container = INITRAMFS_LOAD_BASE;
+ initramfs_start = INITRAMFS_LOAD_BASE + SECURE_BOOT_HEADERS_SIZE;
+ } else {
+ initramfs_start = INITRAMFS_LOAD_BASE;
+ }
+
dt_check_del_prop(dt_chosen, "linux,initrd-start");
dt_check_del_prop(dt_chosen, "linux,initrd-end");
printf("INIT: Initramfs loaded, size: %zu bytes\n", initramfs_size);
dt_add_property_u64(dt_chosen, "linux,initrd-start",
- (uint64_t)INITRAMFS_LOAD_BASE);
+ (uint64_t)initramfs_start);
dt_add_property_u64(dt_chosen, "linux,initrd-end",
- (uint64_t)INITRAMFS_LOAD_BASE + initramfs_size);
+ (uint64_t)initramfs_start + initramfs_size);
+
+ if (chip_quirk(QUIRK_MAMBO_CALLOUTS)) {
+ secureboot_verify(RESOURCE_ID_INITRAMFS,
+ stb_container,
+ SECURE_BOOT_HEADERS_SIZE + initramfs_size);
+ trustedboot_measure(RESOURCE_ID_INITRAMFS,
+ stb_container,
+ SECURE_BOOT_HEADERS_SIZE + initramfs_size);
+ }
}
void *fdt;
@@ -482,6 +498,8 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
load_initramfs();
+ trustedboot_exit_boot_services();
+
ipmi_set_fw_progress_sensor(IPMI_FW_OS_BOOT);
occ_pstates_init();
OpenPOWER on IntegriCloud