summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Yilun Lin <yllin@chromium.org>2021-02-25 16:36:32 +0800
committerCommit Bot <commit-bot@chromium.org>2021-03-04 08:49:37 +0000
commit08f41a6903241491d9e00e45d638454342fee10b (patch)
tree5c6aa58ff0427d0be6a4894f3684681a744e5b03
parent1f841a5d48bd07277e6639f86c7cbc66cf9bb2c0 (diff)
downloadchrome-ec-08f41a6903241491d9e00e45d638454342fee10b.tar.gz
panicinfo: fix panicinfo double report
Panicinfo is double report due to the panic flags is reset whenever a hard-reset triggered. This makes AP thinks there is a new panic happened, and reports it to the crashmon. We've seen a lot of crash reports due to the false alarms. The solution is recording the panic flags across hard-reset so we won't keep alarming the old panicinfo. BUG=b:181108236 TEST=1)test that on juniper with new EC RO/RW, and AP reboot won't cause the EC alarming a new panicinfo. 2)test that on juniper with soft-sync RW, and old RO, and AP reboot won't cause the EC alarm a new panicinfo BRANCH=kukui Change-Id: I6e0c33a1fcf210d9aa03ebd1cd79b84a7744c386 Signed-off-by: Eric Yilun Lin <yllin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2721327 Reviewed-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--chip/lm4/system.c14
-rw-r--r--chip/stm32/bkpdata.h7
-rw-r--r--chip/stm32/system.c9
3 files changed, 25 insertions, 5 deletions
diff --git a/chip/lm4/system.c b/chip/lm4/system.c
index 75e7d556ec..bdb15d3861 100644
--- a/chip/lm4/system.c
+++ b/chip/lm4/system.c
@@ -25,7 +25,8 @@ enum hibdata_index {
#ifdef CONFIG_SOFTWARE_PANIC
HIBDATA_INDEX_SAVED_PANIC_REASON, /* Saved panic reason */
HIBDATA_INDEX_SAVED_PANIC_INFO, /* Saved panic data */
- HIBDATA_INDEX_SAVED_PANIC_EXCEPTION /* Saved panic exception code */
+ HIBDATA_INDEX_SAVED_PANIC_EXCEPTION,/* Saved panic exception code */
+ HIBDATA_INDEX_SAVED_PANIC_FLAGS, /* Saved panic flags */
#endif
};
@@ -439,7 +440,7 @@ void system_pre_init(void)
uint32_t hibctl;
#ifdef CONFIG_SOFTWARE_PANIC
uint32_t reason, info;
- uint8_t exception;
+ uint8_t exception, panic_flags;
#endif
/*
@@ -502,11 +503,15 @@ void system_pre_init(void)
reason = hibdata_read(HIBDATA_INDEX_SAVED_PANIC_REASON);
info = hibdata_read(HIBDATA_INDEX_SAVED_PANIC_INFO);
exception = hibdata_read(HIBDATA_INDEX_SAVED_PANIC_EXCEPTION);
+ panic_flags = hibdata_read(HIBDATA_INDEX_SAVED_PANIC_FLAGS);
+
if (reason || info || exception) {
panic_set_reason(reason, info, exception);
+ panic_get_data()->flags = panic_flags;
hibdata_write(HIBDATA_INDEX_SAVED_PANIC_REASON, 0);
hibdata_write(HIBDATA_INDEX_SAVED_PANIC_INFO, 0);
hibdata_write(HIBDATA_INDEX_SAVED_PANIC_EXCEPTION, 0);
+ hibdata_write(HIBDATA_INDEX_SAVED_PANIC_FLAGS, 0);
}
#endif
@@ -544,13 +549,16 @@ void system_reset(int flags)
if (flags & SYSTEM_RESET_HARD) {
#ifdef CONFIG_SOFTWARE_PANIC
uint32_t reason, info;
- uint8_t exception;
+ uint8_t exception, panic_flags;
+
+ panic_flags = panic_get_data()->flags;
/* Panic data will be wiped by hard reset, so save it */
panic_get_reason(&reason, &info, &exception);
hibdata_write(HIBDATA_INDEX_SAVED_PANIC_REASON, reason);
hibdata_write(HIBDATA_INDEX_SAVED_PANIC_INFO, info);
hibdata_write(HIBDATA_INDEX_SAVED_PANIC_EXCEPTION, exception);
+ hibdata_write(HIBDATA_INDEX_SAVED_PANIC_FLAGS, panic_flags);
#endif
/*
diff --git a/chip/stm32/bkpdata.h b/chip/stm32/bkpdata.h
index 27715f8219..14bd3517cc 100644
--- a/chip/stm32/bkpdata.h
+++ b/chip/stm32/bkpdata.h
@@ -29,6 +29,13 @@ enum bkpdata_index {
BKPDATA_INDEX_PD1, /* USB-PD saved port1 state */
BKPDATA_INDEX_PD2, /* USB-PD saved port2 state */
#endif
+#ifdef CONFIG_SOFTWARE_PANIC
+ /**
+ * Saving the panic flags in case that AP thinks the panic is new
+ * after a hard reset.
+ */
+ BKPDATA_INDEX_SAVED_PANIC_FLAGS, /* Saved panic flags */
+#endif
BKPDATA_COUNT
};
BUILD_ASSERT(STM32_BKP_ENTRIES >= BKPDATA_COUNT);
diff --git a/chip/stm32/system.c b/chip/stm32/system.c
index bba2f72fcc..0304c7b3be 100644
--- a/chip/stm32/system.c
+++ b/chip/stm32/system.c
@@ -249,7 +249,7 @@ void system_pre_init(void)
{
#ifdef CONFIG_SOFTWARE_PANIC
uint16_t reason, info;
- uint8_t exception;
+ uint8_t exception, panic_flags;
#endif
/* enable clock on Power module */
@@ -316,11 +316,14 @@ void system_pre_init(void)
reason = bkpdata_read(BKPDATA_INDEX_SAVED_PANIC_REASON);
info = bkpdata_read(BKPDATA_INDEX_SAVED_PANIC_INFO);
exception = bkpdata_read(BKPDATA_INDEX_SAVED_PANIC_EXCEPTION);
- if (reason || info || exception) {
+ panic_flags = bkpdata_read(BKPDATA_INDEX_SAVED_PANIC_FLAGS);
+ if (reason || info || exception || panic_flags) {
panic_set_reason(reason, info, exception);
+ panic_get_data()->flags = panic_flags;
bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_REASON, 0);
bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_INFO, 0);
bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_EXCEPTION, 0);
+ bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_FLAGS, 0);
}
#endif
@@ -367,6 +370,7 @@ void system_reset(int flags)
#ifdef CONFIG_SOFTWARE_PANIC
uint32_t reason, info;
uint8_t exception;
+ uint8_t panic_flags = panic_get_data()->flags;
/* Panic data will be wiped by hard reset, so save it */
panic_get_reason(&reason, &info, &exception);
@@ -374,6 +378,7 @@ void system_reset(int flags)
bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_REASON, reason);
bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_INFO, info);
bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_EXCEPTION, exception);
+ bkpdata_write(BKPDATA_INDEX_SAVED_PANIC_FLAGS, panic_flags);
#endif
#ifdef CHIP_FAMILY_STM32L