summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Iacobucci <alexiacobucci@google.com>2023-11-02 21:11:06 +0000
committerTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2023-11-13 23:08:40 +0000
commitd16319dd4b25e5a9f01c823da63c7165ba4c0c0f (patch)
tree310ee3b2710998d31ca875680a29e32b2bbc0853
parent544a4a3a2d71321f1f5ca422272a3e737afb11e8 (diff)
downloadaoc-d16319dd4b25e5a9f01c823da63c7165ba4c0c0f.tar.gz
Test: on device Bug: 307383094 Change-Id: Id474c099fa8392e3379b7a2a8861bf508951352a Signed-off-by: Alex Iacobucci <alexiacobucci@google.com>
-rw-r--r--aoc.c90
1 files changed, 24 insertions, 66 deletions
diff --git a/aoc.c b/aoc.c
index e9481b7..21e0cf7 100644
--- a/aoc.c
+++ b/aoc.c
@@ -1658,21 +1658,6 @@ void aoc_remove_map_handler(struct aoc_service_dev *dev)
}
EXPORT_SYMBOL_GPL(aoc_remove_map_handler);
-static struct aoc_section_header *find_ramdump_section(struct aoc_ramdump_header
- *ramdump_header, int section_type)
-{
- int i;
-
- if (ramdump_header->num_sections != RAMDUMP_NUM_SECTIONS)
- return NULL;
-
- for (i = 0; i < ramdump_header->num_sections; i++)
- if (ramdump_header->sections[i].type == section_type)
- return &ramdump_header->sections[i];
-
- return NULL;
-}
-
static void aoc_watchdog(struct work_struct *work)
{
struct aoc_prvdata *prvdata =
@@ -1696,9 +1681,8 @@ static void aoc_watchdog(struct work_struct *work)
int sscd_rc;
char crash_info[RAMDUMP_SECTION_CRASH_INFO_SIZE];
int restart_rc;
- bool ap_reset = false, invalid_magic;
- struct aoc_section_header *crash_info_section =
- find_ramdump_section(ramdump_header, SECTION_TYPE_CRASH_INFO);
+ bool ap_reset = false, valid_magic;
+ struct aoc_section_header *crash_info_section;
prvdata->total_restarts++;
@@ -1747,18 +1731,27 @@ static void aoc_watchdog(struct work_struct *work)
ramdump_timeout = jiffies + (5 * HZ);
while (time_before(jiffies, ramdump_timeout)) {
- if (ramdump_header->valid)
+ valid_magic = memcmp(ramdump_header, RAMDUMP_MAGIC, sizeof(RAMDUMP_MAGIC)) == 0;
+ if (ramdump_header->valid == 1 && valid_magic)
break;
msleep(100);
}
- if (!ramdump_header->valid) {
- dev_err(prvdata->dev, "aoc coredump timed out, coredump only contains DRAM\n");
+ crash_info_section = &ramdump_header->sections[RAMDUMP_SECTION_CRASH_INFO_INDEX];
+ if (crash_info_section->type != SECTION_TYPE_CRASH_INFO)
+ crash_info_section = NULL;
+
+ if (!(ramdump_header->valid == 1) || !valid_magic) {
+ if (!(ramdump_header->valid == 1))
+ dev_info(prvdata->dev, "aoc coredump timed out, coredump only contains DRAM\n");
+ if (!valid_magic)
+ dev_info(prvdata->dev, "aoc coredump has invalid magic\n");
+
if (crash_info_section) {
const char *crash_reason = (const char *)ramdump_header +
crash_info_section->offset;
- bool crash_reason_valid = (strnlen(crash_reason,
- sizeof(crash_info)) != 0);
+ bool crash_reason_valid = crash_reason < (char *)prvdata->dram_virt +
+ prvdata->dram_size && crash_reason[0] != 0;
snprintf(crash_info, sizeof(crash_info),
"AoC watchdog : %s (incomplete %u:%u)",
@@ -1772,31 +1765,17 @@ 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 possibly failed: invalid magic\n");
- if (crash_info_section) {
+ if (ramdump_header->valid == 1 && valid_magic) {
+ if (crash_info_section && crash_info_section->flags & RAMDUMP_FLAG_VALID) {
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]);
- }
+ 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_err(prvdata->dev,
- "could not find crash info section in aoc coredump header");
- strscpy(crash_info, "AoC Watchdog : coredump corrupt",
+ dev_info(prvdata->dev,
+ "aoc coredump has valid coredump header, but invalid crash reason");
+ strscpy(crash_info, "AoC Watchdog : invalid crash info",
sizeof(crash_info));
}
}
@@ -1824,27 +1803,6 @@ static void aoc_watchdog(struct work_struct *work)
sscd_info.segs[0].addr = prvdata->dram_virt;
}
- 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;
- 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 {
- dev_info(prvdata->dev, "aoc coredump has valid coredump header, but invalid crash reason");
- strscpy(crash_info, "AoC Watchdog : invalid crash info",
- sizeof(crash_info));
- }
- }
if (ap_reset) {
/* Prefer the user specified reason */