From 9764d4c690bbe4a54429e47a2094230da5fb88f5 Mon Sep 17 00:00:00 2001 From: "Ronald G. Minnich" Date: Tue, 12 Jun 2012 16:29:32 -0700 Subject: Implement stack overflow checking for the BSP Previous patches implemented stack overflow checking for the APs. This patch builds on the BSP stack poisoning patch to implement stack overflow checking for the BSP, and also prints out maximum stack usage. It reveals that our 32K stack is ridiculously oversized, especially now that the lzma decoder doesn't use a giant 16K on-stack array. Break the stack checking out into a separate function, which we will later use for the APs. CPU0: stack from 00180000 to 00188000:Lowest stack address 00187ad8 To test failure, change the DEADBEEF stack poison value in c_start.S to something else. Then we should get an error like this: Stack overrun on BSP.Increase stack from current 32768 bytes CPU0: stack from 00180000 to 00188000:Lowest stack address 00180000 Separate the act of loading from the act of starting the payload. This allows us better error management and reporting of stack use. Now we see: CPU0: stack from 00180000 to 00188000:Lowest stack address 00187ad8 Tested for both success and failure on Link. At the same time, feel free to carefully check my manipulation of _estack. Change-Id: Ibb09738b15ec6a5510ac81e45dd82756bfa5aac2 Signed-off-by: Ronald G. Minnich Reviewed-on: http://review.coreboot.org/1286 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich --- src/boot/hardwaremain.c | 17 +++++++++++++++-- src/boot/selfboot.c | 10 ++-------- 2 files changed, 17 insertions(+), 10 deletions(-) (limited to 'src/boot') diff --git a/src/boot/hardwaremain.c b/src/boot/hardwaremain.c index d78b859b62..bb7f264c08 100644 --- a/src/boot/hardwaremain.c +++ b/src/boot/hardwaremain.c @@ -35,6 +35,7 @@ it with the version available from LANL. #include #include #include +#include #if CONFIG_HAVE_ACPI_RESUME #include #endif @@ -143,7 +144,19 @@ void hardwaremain(int boot_complete) lb_mem = write_tables(); timestamp_add_now(TS_LOAD_PAYLOAD); - cbfs_load_payload(lb_mem, CONFIG_CBFS_PREFIX "/payload"); - printk(BIOS_ERR, "Boot failed.\n"); + + void *payload; + payload = cbfs_load_payload(lb_mem, CONFIG_CBFS_PREFIX "/payload"); + if (! payload) + die("Could not find a payload\n"); + + printk(BIOS_DEBUG, "Got a payload\n"); + /* Before we go off to run the payload, see if + * we stayed within our bounds. + */ + checkstack(&_estack, 0); + + selfboot(lb_mem, payload); + printk(BIOS_EMERG, "Boot failed"); } diff --git a/src/boot/selfboot.c b/src/boot/selfboot.c index 3c310234cb..fd5b382764 100644 --- a/src/boot/selfboot.c +++ b/src/boot/selfboot.c @@ -494,7 +494,7 @@ static int load_self_segments( return 1; } -static int selfboot(struct lb_memory *mem, struct cbfs_payload *payload) +int selfboot(struct lb_memory *mem, struct cbfs_payload *payload) { u32 entry=0; struct segment head; @@ -532,13 +532,7 @@ void *cbfs_load_payload(struct lb_memory *lb_mem, const char *name) struct cbfs_payload *payload; payload = (struct cbfs_payload *)cbfs_find_file(name, CBFS_TYPE_PAYLOAD); - if (payload == NULL) - return (void *) -1; - printk(BIOS_DEBUG, "Got a payload\n"); - selfboot(lb_mem, payload); - printk(BIOS_EMERG, "SELFBOOT RETURNED!\n"); - - return (void *) -1; + return payload; } -- cgit v1.2.3