diff --git a/components/espcoredump/espcoredump.py b/components/espcoredump/espcoredump.py index 9e417a1b1..ce1f54770 100755 --- a/components/espcoredump/espcoredump.py +++ b/components/espcoredump/espcoredump.py @@ -557,42 +557,77 @@ class ESPCoreDumpLoaderError(ESPCoreDumpError): super(ESPCoreDumpLoaderError, self).__init__(message) -def esp_core_dump_ver(chip, maj, min): - return (((chip & 0xFFFF) << 16) | ((maj & 0xFF) << 8) | ((min & 0xFF) << 0)) +class ESPCoreDumpVersion(object): + """Core dump version class + """ + # This class contains all version-dependent params + ESP_CORE_DUMP_CHIP_ESP32 = 0 + ESP_CORE_DUMP_CHIP_ESP32S2 = 2 + + def __init__(self, version=None): + """Constructor for core dump version + """ + super(ESPCoreDumpVersion, self).__init__() + if version is None: + self.version = 0 + else: + self.set_version(version) + + @staticmethod + def make_dump_ver(maj, min): + return (((maj & 0xFF) << 8) | ((min & 0xFF) << 0)) + + def set_version(self, version): + self.version = version + + @property + def chip_ver(self): + return ((self.version & 0xFFFF0000) >> 16) + + @property + def dump_ver(self): + return (self.version & 0x0000FFFF) + + @property + def major(self): + return ((self.version & 0x0000FF00) >> 8) + + @property + def minor(self): + return (self.version & 0x000000FF) -class ESPCoreDumpLoader(object): +class ESPCoreDumpLoader(ESPCoreDumpVersion): """Core dump loader base class """ - # TODO: add class for core dump version and move all version-dependent params to it - ESP_CORE_DUMP_CHIP_ESP32 = 0 # "legacy" stands for core dumps v0.1 (before IDF v4.1) - ESP32_COREDUMP_VERSION_BIN_V1 = esp_core_dump_ver(ESP_CORE_DUMP_CHIP_ESP32, 0, 1) - ESP32_COREDUMP_VERSION_BIN_V2 = esp_core_dump_ver(ESP_CORE_DUMP_CHIP_ESP32, 0, 2) - ESP32_COREDUMP_VERSION_ELF_CRC32 = esp_core_dump_ver(ESP_CORE_DUMP_CHIP_ESP32, 1, 0) - ESP32_COREDUMP_VERSION_ELF_SHA256 = esp_core_dump_ver(ESP_CORE_DUMP_CHIP_ESP32, 1, 1) + ESP_COREDUMP_VERSION_BIN_V1 = ESPCoreDumpVersion.make_dump_ver(0, 1) + ESP_COREDUMP_VERSION_BIN_V2 = ESPCoreDumpVersion.make_dump_ver(0, 2) + ESP_COREDUMP_VERSION_ELF_CRC32 = ESPCoreDumpVersion.make_dump_ver(1, 0) + ESP_COREDUMP_VERSION_ELF_SHA256 = ESPCoreDumpVersion.make_dump_ver(1, 1) ESP_CORE_DUMP_INFO_TYPE = 8266 ESP_CORE_DUMP_TASK_INFO_TYPE = 678 ESP_CORE_DUMP_EXTRA_INFO_TYPE = 677 ESP_COREDUMP_CURR_TASK_MARKER = 0xdeadbeef - ESP32_COREDUMP_BIN_V1_HDR_FMT = '<4L' - ESP32_COREDUMP_BIN_V1_HDR_SZ = struct.calcsize(ESP32_COREDUMP_BIN_V1_HDR_FMT) - ESP32_COREDUMP_HDR_FMT = '<5L' - ESP32_COREDUMP_HDR_SZ = struct.calcsize(ESP32_COREDUMP_HDR_FMT) - ESP32_COREDUMP_TSK_HDR_FMT = '<3L' - ESP32_COREDUMP_TSK_HDR_SZ = struct.calcsize(ESP32_COREDUMP_TSK_HDR_FMT) - ESP32_COREDUMP_MEM_SEG_HDR_FMT = '<2L' - ESP32_COREDUMP_MEM_SEG_HDR_SZ = struct.calcsize(ESP32_COREDUMP_MEM_SEG_HDR_FMT) - ESP32_COREDUMP_NOTE_HDR_FMT = '<3L' - ESP32_COREDUMP_NOTE_HDR_SZ = struct.calcsize(ESP32_COREDUMP_NOTE_HDR_FMT) - ESP32_COREDUMP_CRC_FMT = ' stack_top: stack_len = stack_end - stack_top stack_base = stack_top @@ -793,7 +829,7 @@ class ESPCoreDumpLoader(object): if stack_len_aligned % 4: stack_len_aligned = 4 * (old_div(stack_len_aligned,4) + 1) - core_off += self.ESP32_COREDUMP_TSK_HDR_SZ + core_off += self.ESP_COREDUMP_TSK_HDR_SZ logging.debug("Read TCB %d bytes @ 0x%x" % (tcbsz_aligned, tcb_addr)) data = self.read_data(core_off, tcbsz_aligned) task_status.task_tcb_addr = tcb_addr @@ -846,11 +882,12 @@ class ESPCoreDumpLoader(object): exc_regs.extend([reg_id, extra_regs[reg_id]]) core_dump_info_notes += Elf32NoteDesc("EXTRA_INFO", self.ESP_CORE_DUMP_EXTRA_INFO_TYPE, struct.pack("<%dL" % (1 + len(exc_regs)), tcb_addr, *exc_regs)).dump() - if self.hdr['ver'] == self.ESP32_COREDUMP_VERSION_BIN_V2: + self.set_version(self.hdr['ver']) + if self.dump_ver == self.ESP_COREDUMP_VERSION_BIN_V2: for i in range(self.hdr['segs_num']): - data = self.read_data(core_off, self.ESP32_COREDUMP_MEM_SEG_HDR_SZ) - core_off += self.ESP32_COREDUMP_MEM_SEG_HDR_SZ - mem_start,mem_sz = struct.unpack_from(self.ESP32_COREDUMP_MEM_SEG_HDR_FMT, data) + data = self.read_data(core_off, self.ESP_COREDUMP_MEM_SEG_HDR_SZ) + core_off += self.ESP_COREDUMP_MEM_SEG_HDR_SZ + mem_start,mem_sz = struct.unpack_from(self.ESP_COREDUMP_MEM_SEG_HDR_FMT, data) logging.debug("Read memory segment %d bytes @ 0x%x" % (mem_sz, mem_start)) data = self.read_data(core_off, stack_len_aligned) core_elf.add_program_segment(mem_start, data, ESPCoreDumpElfFile.PT_LOAD, ESPCoreDumpSegment.PF_R | ESPCoreDumpSegment.PF_W) @@ -887,19 +924,23 @@ class ESPCoreDumpLoader(object): def create_corefile(self, core_fname=None, exe_name=None, rom_elf=None, off=0): """Creates core dump ELF file """ - data = self.read_data(off, self.ESP32_COREDUMP_HDR_SZ) - vals = struct.unpack_from(self.ESP32_COREDUMP_HDR_FMT, data) + data = self.read_data(off, self.ESP_COREDUMP_HDR_SZ) + vals = struct.unpack_from(self.ESP_COREDUMP_HDR_FMT, data) self.hdr = dict(zip(('tot_len', 'ver', 'task_num', 'tcbsz', 'segs_num'), vals)) if not core_fname: fce = tempfile.NamedTemporaryFile(mode='w+b', delete=False) core_fname = fce.name - if self.hdr['ver'] == self.ESP32_COREDUMP_VERSION_ELF_CRC32 or self.hdr['ver'] == self.ESP32_COREDUMP_VERSION_ELF_SHA256: - return self._extract_elf_corefile(core_fname, off + self.ESP32_COREDUMP_HDR_SZ, exe_name) - elif self.hdr['ver'] == self.ESP32_COREDUMP_VERSION_BIN_V2: - return self._extract_bin_corefile(core_fname, rom_elf, off + self.ESP32_COREDUMP_HDR_SZ) - elif self.hdr['ver'] == self.ESP32_COREDUMP_VERSION_BIN_V1: - return self._extract_bin_corefile(core_fname, rom_elf, off + self.ESP32_COREDUMP_BIN_V1_HDR_SZ) - raise ESPCoreDumpLoaderError("Core dump version '0x%x' is not supported!" % (self.hdr['ver'])) + self.set_version(self.hdr['ver']) + if self.chip_ver == ESPCoreDumpVersion.ESP_CORE_DUMP_CHIP_ESP32S2 or self.chip_ver == ESPCoreDumpVersion.ESP_CORE_DUMP_CHIP_ESP32: + if self.dump_ver == self.ESP_COREDUMP_VERSION_ELF_CRC32 or self.dump_ver == self.ESP_COREDUMP_VERSION_ELF_SHA256: + return self._extract_elf_corefile(core_fname, off + self.ESP_COREDUMP_HDR_SZ, exe_name) + elif self.dump_ver == self.ESP_COREDUMP_VERSION_BIN_V2: + return self._extract_bin_corefile(core_fname, rom_elf, off + self.ESP_COREDUMP_HDR_SZ) + elif self.dump_ver == self.ESP_COREDUMP_VERSION_BIN_V1: + return self._extract_bin_corefile(core_fname, rom_elf, off + self.ESP_COREDUMP_BIN_V1_HDR_SZ) + raise ESPCoreDumpLoaderError("Core dump version '0x%x' is not supported!" % (self.dump_ver)) + else: + raise ESPCoreDumpLoaderError("Core dump chip '0x%x' is not supported!" % (self.chip_ver)) def read_data(self, off, sz): """Reads data from raw core dump got from flash or UART @@ -950,9 +991,9 @@ class ESPCoreDumpFileLoader(ESPCoreDumpLoader): class ESPCoreDumpFlashLoader(ESPCoreDumpLoader): """Core dump flash loader class """ - ESP32_COREDUMP_FLASH_LEN_FMT = '