From 1f8e2acece85705d7e2505e8e10dd392609d08b6 Mon Sep 17 00:00:00 2001 From: Alex Iacobucci Date: Mon, 8 May 2023 20:15:59 +0000 Subject: aoc: handle when crash string is empty Bug: 281075359 Test: tested on device Change-Id: I017085b59837d885525106bccb97f0687c4df473 Signed-off-by: Alex Iacobucci --- aoc.c | 35 ++++++++++++++++++++++------------- 1 file 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; -- cgit v1.2.3