summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/panic_output.c36
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;