diff options
Diffstat (limited to 'aoc.c')
-rw-r--r-- | aoc.c | 90 |
1 files changed, 24 insertions, 66 deletions
@@ -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 */ |