diff options
author | Eric Yilun Lin <yllin@chromium.org> | 2021-02-25 16:36:32 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-03-04 08:49:37 +0000 |
commit | 08f41a6903241491d9e00e45d638454342fee10b (patch) | |
tree | 5c6aa58ff0427d0be6a4894f3684681a744e5b03 | |
parent | 1f841a5d48bd07277e6639f86c7cbc66cf9bb2c0 (diff) | |
download | chrome-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.c | 14 | ||||
-rw-r--r-- | chip/stm32/bkpdata.h | 7 | ||||
-rw-r--r-- | chip/stm32/system.c | 9 |
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 |