diff options
author | Jack Rosenthal <jrosenth@chromium.org> | 2019-05-02 09:58:48 -0600 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-04 03:17:25 -0700 |
commit | c1b08cd1b240332abfac339823a7468f52ff843d (patch) | |
tree | 36dab0e83d126a10a34e046a1a017eced5d19ce4 | |
parent | acb893a320f0398d25083a9ea102329c619845ab (diff) | |
download | chrome-ec-c1b08cd1b240332abfac339823a7468f52ff843d.tar.gz |
ish: preserve panic data across reset
This commit stores panic data across reset by storing panic data in
the last 256 bytes of AON memory (before AON ROM).
> crash divzero
========== PANIC ==========
Reason: Divide By Zero
Error Code = 0xFF00B60C
EIP = 0xFF010008
CS = 0x00010202
EFLAGS = 0x00103085
EAX = 0x00000001
EBX = 0xFF01B118
ECX = 0x00000000
EDX = 0x00000000
ESI = 0x00000000
EDI = 0xFF017E0E
Resetting system...
===========================
... ISH reset ...
> panicinfo
Saved panic data: (NEW)
Reason: Divide By Zero
Error Code = 0xFF00B60C
EIP = 0xFF010008
CS = 0x00010202
EFLAGS = 0x00103085
EAX = 0x00000001
EBX = 0xFF01B118
ECX = 0x00000000
EDX = 0x00000000
ESI = 0x00000000
EDI = 0xFF017E0E
BUG=b:129425206
BRANCH=none
TEST=see console output above (on arcada_ish)
Change-Id: I5c9e458b53076eafe7fa50ba851f2c6e863f2247
Signed-off-by: Jack Rosenthal <jrosenth@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1593418
Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r-- | chip/ish/config_chip.h | 5 | ||||
-rw-r--r-- | common/panic_output.c | 1 | ||||
-rw-r--r-- | core/minute-ia/panic.c | 23 | ||||
-rw-r--r-- | include/config.h | 24 | ||||
-rw-r--r-- | include/panic.h | 9 |
5 files changed, 43 insertions, 19 deletions
diff --git a/chip/ish/config_chip.h b/chip/ish/config_chip.h index 24cd558f6c..e82aad8ed3 100644 --- a/chip/ish/config_chip.h +++ b/chip/ish/config_chip.h @@ -54,6 +54,11 @@ + CONFIG_AON_RAM_SIZE \ - CONFIG_AON_ROM_SIZE) +/* Store persistent panic data in AON memory */ +#define CONFIG_PANIC_DATA_SIZE 0xFF +#define CONFIG_PANIC_DATA_BASE (CONFIG_AON_ROM_BASE \ + - CONFIG_PANIC_DATA_SIZE) + /* System stack size */ #define CONFIG_STACK_SIZE 1024 diff --git a/common/panic_output.c b/common/panic_output.c index e6b48a375d..8d34adaa38 100644 --- a/common/panic_output.c +++ b/common/panic_output.c @@ -114,6 +114,7 @@ void panic(const char *msg) struct panic_data *panic_get_data(void) { + BUILD_ASSERT(sizeof(struct panic_data) <= CONFIG_PANIC_DATA_SIZE); return pdata_ptr->magic == PANIC_DATA_MAGIC ? pdata_ptr : NULL; } diff --git a/core/minute-ia/panic.c b/core/minute-ia/panic.c index 06c903be0c..40e8ee1cf0 100644 --- a/core/minute-ia/panic.c +++ b/core/minute-ia/panic.c @@ -13,14 +13,13 @@ #include "task.h" #include "timer.h" #include "util.h" -#include "watchdog.h" /* * This array maps an interrupt vector number to the corresponding * exception name. See see "Intel 64 and IA-32 Architectures Software * Developer's Manual", Volume 3A, Section 6.15. */ -const static char *PANIC_REASON[] = { +const static char *panic_reason[] = { "Divide By Zero", "Debug Exception", "NMI Interrupt", @@ -45,13 +44,14 @@ const static char *PANIC_REASON[] = { }; /* - * Print panic data + * Print panic data. This may be called either from the report_panic + * procedure (below) while handling a panic, or from the panicinfo + * console command. */ void panic_data_print(const struct panic_data *pdata) { - panic_printf("\n========== PANIC ==========\n"); if (pdata->x86.vector <= 20) - panic_printf("%s\n", PANIC_REASON[pdata->x86.vector]); + panic_printf("Reason: %s\n", panic_reason[pdata->x86.vector]); else panic_printf("Interrupt vector number: 0x%08X (unknown)\n", pdata->x86.vector); @@ -66,13 +66,6 @@ void panic_data_print(const struct panic_data *pdata) panic_printf("EDX = 0x%08X\n", pdata->x86.edx); panic_printf("ESI = 0x%08X\n", pdata->x86.esi); panic_printf("EDI = 0x%08X\n", pdata->x86.edi); - panic_printf("\n"); - panic_printf("Resetting system...\n"); - panic_printf("===========================\n"); -} - -void __keep report_panic(void) -{ } /** @@ -132,7 +125,13 @@ __attribute__ ((noreturn)) void __keep exception_panic( if (panic_once) panic_printf("\nWhile resetting from a panic, another panic" " occurred!"); + + panic_printf("\n========== PANIC ==========\n"); panic_data_print(PANIC_DATA_PTR); + panic_printf("\n"); + panic_printf("Resetting system...\n"); + panic_printf("===========================\n"); + if (panic_once) { system_reset(SYSTEM_RESET_HARD); } else { diff --git a/include/config.h b/include/config.h index 2a62f4f665..86f6447157 100644 --- a/include/config.h +++ b/include/config.h @@ -2609,6 +2609,13 @@ /* Support One Time Protection structure */ #undef CONFIG_OTP +/* + * Address to store persistent panic data at. By default, this will be + * at the end of RAM, and have a size of sizeof(struct panic_data) + */ +#undef CONFIG_PANIC_DATA_BASE +#undef CONFIG_PANIC_DATA_SIZE + /* Support PECI interface to x86 processor */ #undef CONFIG_PECI @@ -4073,6 +4080,23 @@ /******************************************************************************/ /* + * Store panic data at end of memory by default, unless otherwise + * configured. This is safe because we don't context switch away from + * the panic handler before rebooting, and stacks and data start at + * the beginning of RAM. + */ +#ifndef CONFIG_PANIC_DATA_SIZE +#define CONFIG_PANIC_DATA_SIZE sizeof(struct panic_data) +#endif + +#ifndef CONFIG_PANIC_DATA_BASE +#define CONFIG_PANIC_DATA_BASE (CONFIG_RAM_BASE \ + + CONFIG_RAM_SIZE \ + - CONFIG_PANIC_DATA_SIZE) +#endif + +/******************************************************************************/ +/* * Set minimum shared memory size, unless it is defined in board file. */ #ifndef CONFIG_SHAREDMEM_MINIMUM_SIZE diff --git a/include/panic.h b/include/panic.h index 45fc31583d..f3bccd18a0 100644 --- a/include/panic.h +++ b/include/panic.h @@ -89,13 +89,8 @@ enum panic_arch { PANIC_ARCH_X86 = 3, /* Intel x86 */ }; -/* - * Panic data goes at the end of RAM. This is safe because we don't context - * switch away from the panic handler before rebooting, and stacks and data - * start at the beginning of RAM. - */ -#define PANIC_DATA_PTR ((struct panic_data *)\ - (CONFIG_RAM_BASE + CONFIG_RAM_SIZE - sizeof(struct panic_data))) +/* Use PANIC_DATA_PTR to refer to the persistent storage location */ +#define PANIC_DATA_PTR ((struct panic_data *)CONFIG_PANIC_DATA_BASE) /* Flags for panic_data.flags */ /* panic_data.frame is valid */ |