summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2019-05-02 09:58:48 -0600
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2019-05-07 21:32:45 +0000
commitf276141e3078954361b55436aee50f1b87ffa7f0 (patch)
treed25a9e1bfddd1c7d4e766fe22e6dc2b69d55fdda
parent50ca30ba9950251cd262c6d7002dee6bebf9cef5 (diff)
downloadchrome-ec-f276141e3078954361b55436aee50f1b87ffa7f0.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> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1598527 Commit-Queue: Jett Rink <jettrink@chromium.org> Tested-by: Jett Rink <jettrink@chromium.org>
-rw-r--r--chip/ish/config_chip.h5
-rw-r--r--common/panic_output.c1
-rw-r--r--core/minute-ia/panic.c23
-rw-r--r--include/config.h24
-rw-r--r--include/panic.h9
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 afe67b4b19..e6d5f9fb82 100644
--- a/include/config.h
+++ b/include/config.h
@@ -2598,6 +2598,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
@@ -4031,6 +4038,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 */