diff options
-rw-r--r-- | common/panic_output.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/common/panic_output.c b/common/panic_output.c index 2482da09c3..75c94223ce 100644 --- a/common/panic_output.c +++ b/common/panic_output.c @@ -172,6 +172,14 @@ uintptr_t get_panic_data_start(void) - pdata_ptr->struct_size); } +static uint32_t get_panic_data_size(void) +{ + if (pdata_ptr->magic != PANIC_DATA_MAGIC) + return 0; + + return pdata_ptr->struct_size; +} + /* * Returns pointer to panic_data structure that can be safely written. * Please note that this function can move jump data and jump tags. @@ -350,7 +358,9 @@ DECLARE_CONSOLE_COMMAND(crash, command_crash, static int command_panicinfo(int argc, char **argv) { - if (pdata_ptr->magic == PANIC_DATA_MAGIC) { + struct panic_data * const pdata_ptr = panic_get_data(); + + if (pdata_ptr) { ccprintf("Saved panic data:%s\n", (pdata_ptr->flags & PANIC_DATA_FLAG_OLD_CONSOLE ? "" : " (NEW)")); @@ -360,7 +370,8 @@ static int command_panicinfo(int argc, char **argv) /* Data has now been printed */ pdata_ptr->flags |= PANIC_DATA_FLAG_OLD_CONSOLE; } else { - ccprintf("No saved panic data available.\n"); + ccprintf("No saved panic data available " + "or panic data can't be safely interpreted.\n"); } return EC_SUCCESS; } @@ -373,13 +384,20 @@ DECLARE_CONSOLE_COMMAND(panicinfo, command_panicinfo, enum ec_status host_command_panic_info(struct host_cmd_handler_args *args) { - if (pdata_ptr->magic == PANIC_DATA_MAGIC) { - ASSERT(pdata_ptr->struct_size <= args->response_max); - memcpy(args->response, pdata_ptr, pdata_ptr->struct_size); - args->response_size = pdata_ptr->struct_size; - - /* Data has now been returned */ - pdata_ptr->flags |= PANIC_DATA_FLAG_OLD_HOSTCMD; + uint32_t pdata_size = get_panic_data_size(); + uintptr_t pdata_start = get_panic_data_start(); + struct panic_data * pdata; + + if (pdata_start && pdata_size > 0) { + ASSERT(pdata_size <= args->response_max); + memcpy(args->response, (void *)pdata_start, pdata_size); + args->response_size = pdata_size; + + pdata = panic_get_data(); + if (pdata) { + /* Data has now been returned */ + pdata->flags |= PANIC_DATA_FLAG_OLD_HOSTCMD; + } } return EC_RES_SUCCESS; |