summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Iacobucci <alexiacobucci@google.com>2023-05-08 20:15:59 +0000
committerAlex Iacobucci <alexiacobucci@google.com>2023-05-09 20:13:36 +0000
commit1f8e2acece85705d7e2505e8e10dd392609d08b6 (patch)
tree4f2308b2f55bc39c86958e9bb1473d0e9d71ebbd
parent8237d4626d01ec2f0ed6d98f69543472371eeb9c (diff)
downloadaoc-1f8e2acece85705d7e2505e8e10dd392609d08b6.tar.gz
aoc: handle when crash string is empty
Bug: 281075359 Test: tested on device Change-Id: I017085b59837d885525106bccb97f0687c4df473 Signed-off-by: Alex Iacobucci <alexiacobucci@google.com>
-rw-r--r--aoc.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/aoc.c b/aoc.c
index 9c6507c..3ff4973 100644
--- a/aoc.c
+++ b/aoc.c
@@ -2572,13 +2572,15 @@ static void aoc_watchdog(struct work_struct *work)
const int sscd_retry_ms = 1000;
int sscd_rc;
char crash_info[RAMDUMP_SECTION_CRASH_INFO_SIZE];
- char ap_reset_reason[RAMDUMP_SECTION_CRASH_INFO_SIZE];
int restart_rc;
u32 section_flags;
bool ap_reset = false;
prvdata->total_restarts++;
+ /* Initialize crash_info[0] to identify if it has changed later in the function. */
+ crash_info[0] = 0;
+
if (prvdata->ap_triggered_reset) {
if ((ktime_get_real_ns() - prvdata->last_reset_time_ns) / 1000000
<= prvdata->reset_hysteresis_trigger_ms) {
@@ -2612,12 +2614,10 @@ static void aoc_watchdog(struct work_struct *work)
}
if (prvdata->ap_triggered_reset) {
+ dev_info(prvdata->dev, "AP triggered reset, reason: [%s]",
+ prvdata->ap_reset_reason);
prvdata->ap_triggered_reset = false;
ap_reset = true;
-
- snprintf(ap_reset_reason, RAMDUMP_SECTION_CRASH_INFO_SIZE - 1,
- "AP Reset: %s", prvdata->ap_reset_reason);
-
trigger_aoc_ramdump(prvdata);
}
@@ -2632,10 +2632,10 @@ static void aoc_watchdog(struct work_struct *work)
const char *crash_reason = (const char *)ramdump_header +
RAMDUMP_SECTION_CRASH_INFO_OFFSET;
bool crash_reason_valid = (strnlen(crash_reason,
- RAMDUMP_SECTION_CRASH_INFO_SIZE) != 0);
+ sizeof(crash_info)) != 0);
dev_err(prvdata->dev, "aoc coredump timed out, coredump only contains DRAM\n");
- snprintf(crash_info, RAMDUMP_SECTION_CRASH_INFO_SIZE,
+ snprintf(crash_info, sizeof(crash_info),
"AoC watchdog : %s (incomplete %u:%u)",
crash_reason_valid ? crash_reason : "unknown reason",
ramdump_header->breadcrumbs[0], ramdump_header->breadcrumbs[1]);
@@ -2645,7 +2645,7 @@ static void aoc_watchdog(struct work_struct *work)
dev_err(prvdata->dev,
"aoc coredump failed: invalid magic (corruption or incompatible firmware?)\n");
strscpy(crash_info, "AoC Watchdog : coredump corrupt",
- RAMDUMP_SECTION_CRASH_INFO_SIZE);
+ sizeof(crash_info));
}
num_pages = DIV_ROUND_UP(prvdata->dram_size, PAGE_SIZE);
@@ -2670,18 +2670,27 @@ static void aoc_watchdog(struct work_struct *work)
RAMDUMP_SECTION_CRASH_INFO_OFFSET;
section_flags = ramdump_header->sections[RAMDUMP_SECTION_CRASH_INFO_INDEX].flags;
- if (section_flags & RAMDUMP_FLAG_VALID)
- strscpy(crash_info, crash_reason, RAMDUMP_SECTION_CRASH_INFO_SIZE);
- else
+ if (section_flags & RAMDUMP_FLAG_VALID) {
+ dev_info(prvdata->dev, "aoc coredump has valid coredump header, crash reason [%s]",
+ crash_reason);
+ strscpy(crash_info, crash_reason, sizeof(crash_info));
+ } else {
+ dev_info(prvdata->dev, "aoc coredump has valid coredump header, but invalid crash reason");
strscpy(crash_info, "AoC Watchdog : invalid crash info",
- RAMDUMP_SECTION_CRASH_INFO_SIZE);
+ sizeof(crash_info));
+ }
}
if (ap_reset) {
/* Prefer the user specified reason */
- snprintf(crash_info, RAMDUMP_SECTION_CRASH_INFO_SIZE - 1, "%s", ap_reset_reason);
+ scnprintf(crash_info, sizeof(crash_info), "AP Reset: %s", prvdata->ap_reset_reason);
}
+ if (crash_info[0] == 0)
+ strscpy(crash_info, "AoC Watchdog: empty crash info string", sizeof(crash_info));
+
+ dev_info(prvdata->dev, "aoc crash info: [%s]", crash_info);
+
/* TODO(siqilin): Get paddr and vaddr base from firmware instead */
carveout_paddr_from_aoc = 0x98000000;
carveout_vaddr_from_aoc = 0x78000000;