summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Iacobucci <alexiacobucci@google.com>2023-10-30 16:50:25 +0000
committerAlex Iacobucci <alexiacobucci@google.com>2023-10-30 19:35:18 +0000
commit10bcd0e5a07ac79fc725174aaeb8ec4150d74162 (patch)
tree0d1cbb10da0f34b2049eff66556529f6eef37c4a
parent99149e030fd89ed64f6c610a951a0ded2fd7798e (diff)
downloadaoc-10bcd0e5a07ac79fc725174aaeb8ec4150d74162.tar.gz
aoc: get crash info string on coredump corrupt
Test: on device Bug: 307383094 Change-Id: I9a1949810a1cf8352d6708a1759053e36e1fb921 Signed-off-by: Alex Iacobucci <alexiacobucci@google.com>
-rw-r--r--aoc.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/aoc.c b/aoc.c
index 149419e..f6b6aaa 100644
--- a/aoc.c
+++ b/aoc.c
@@ -1775,9 +1775,30 @@ static void aoc_watchdog(struct work_struct *work)
invalid_magic = memcmp(ramdump_header, RAMDUMP_MAGIC, sizeof(RAMDUMP_MAGIC));
if (ramdump_header->valid && invalid_magic) {
dev_err(prvdata->dev,
- "aoc coredump failed: invalid magic (corruption or incompatible firmware?)\n");
- strscpy(crash_info, "AoC Watchdog : coredump corrupt",
- sizeof(crash_info));
+ "aoc coredump possibly failed: invalid magic\n");
+ if (crash_info_section) {
+ const char *crash_reason = (const char *)ramdump_header +
+ crash_info_section->offset;
+ /* Check that offset was not corrupted and that we are not reading
+ random bytes */
+ bool crash_reason_valid = crash_reason < (char *)prvdata->dram_virt +
+ prvdata->dram_size && crash_reason[0] != 0;
+
+ if (crash_reason_valid) {
+ snprintf(crash_info, sizeof(crash_info),
+ "AoC watchdog : coredump corrupt [%s]", crash_reason);
+ } else {
+ snprintf(crash_info, sizeof(crash_info),
+ "AoC watchdog : coredump corrupt (incomplete %u:%u)",
+ ramdump_header->breadcrumbs[0],
+ ramdump_header->breadcrumbs[1]);
+ }
+ } else {
+ dev_err(prvdata->dev,
+ "could not find crash info section in aoc coredump header");
+ strscpy(crash_info, "AoC Watchdog : coredump corrupt",
+ sizeof(crash_info));
+ }
}
if (!skip_carveout_map) {
@@ -1804,10 +1825,18 @@ static void aoc_watchdog(struct work_struct *work)
}
if (ramdump_header->valid && !invalid_magic) {
+
if (crash_info_section && crash_info_section->flags & RAMDUMP_FLAG_VALID) {
const char *crash_reason = (const char *)ramdump_header +
crash_info_section->offset;
- dev_info(prvdata->dev, "aoc coredump has valid coredump header, crash reason [%s]",
+ bool crash_reason_valid = crash_reason < (char *)prvdata->dram_virt +
+ prvdata->dram_size && crash_reason[0] != 0;
+
+ if (crash_reason_valid)
+ pr_err(">>> valid!!");
+ else
+ pr_err(">>> invalid!!!");
+ dev_info(prvdata->dev, "aoc coredump has valid coredump header, crash reason [%s]",
crash_reason);
strscpy(crash_info, crash_reason, sizeof(crash_info));
} else {