diff --git a/linux-ramdump-parser-v2/debug_image_v2.py b/linux-ramdump-parser-v2/debug_image_v2.py index 32e78e52ac98b434160f6c7504031b1ce4e9c9b2..c49d4ea588015af68fdaf427eba49554477922f5 100644 --- a/linux-ramdump-parser-v2/debug_image_v2.py +++ b/linux-ramdump-parser-v2/debug_image_v2.py @@ -51,8 +51,10 @@ class client(object): MSM_DUMP_DATA_MISC = 0xE8 MSM_DUMP_DATA_VSENSE = 0xE9 MSM_DUMP_DATA_TMC_ETF = 0xF0 + MSM_DUMP_DATA_TMC_ETF_SWAO = 0xF1 MSM_DUMP_DATA_TMC_ETR_REG = 0x100 MSM_DUMP_DATA_TMC_ETF_REG = 0x101 + MSM_DUMP_DATA_TMC_ETF_SWAO_REG = 0x102 MSM_DUMP_DATA_LOG_BUF = 0x110 MSM_DUMP_DATA_LOG_BUF_FIRST_IDX = 0x111 MSM_DUMP_DATA_L2_TLB = 0x120 @@ -81,7 +83,9 @@ client_types = [ ('MSM_DUMP_DATA_DCC_REG', 'parse_dcc_reg'), ('MSM_DUMP_DATA_DCC_SRAM', 'parse_dcc_sram'), ('MSM_DUMP_DATA_TMC_ETF', 'parse_qdss_common'), + ('MSM_DUMP_DATA_TMC_ETF_SWAO', 'parse_qdss_common'), ('MSM_DUMP_DATA_TMC_ETR_REG', 'parse_qdss_common'), + ('MSM_DUMP_DATA_TMC_ETF_SWAO_REG', 'parse_qdss_common'), ('MSM_DUMP_DATA_TMC_REG', 'parse_qdss_common'), ('MSM_DUMP_DATA_L2_TLB', 'parse_tlb_common'), ('MSM_DUMP_DATA_LLC_CACHE', 'parse_system_cache_common'), @@ -92,6 +96,8 @@ qdss_tag_to_field_name = { 'MSM_DUMP_DATA_TMC_ETR_REG': 'tmc_etr_start', 'MSM_DUMP_DATA_TMC_REG': 'tmc_etr_start', 'MSM_DUMP_DATA_TMC_ETF': 'etf_start', + 'MSM_DUMP_DATA_TMC_ETF_SWAO': 'tmc_etf_swao_start', + 'MSM_DUMP_DATA_TMC_ETF_SWAO_REG': 'tmc_etf_swao_reg_start', 'MSM_DUMP_DATA_DBGUI_REG': 'dbgui_start', } @@ -877,6 +883,7 @@ class DebugImage_v2(): self.qdss.dump_standard(ram_dump) if not ram_dump.skip_qdss_bin: self.qdss.save_etf_bin(ram_dump) + self.qdss.save_etf_swao_bin(ram_dump) self.qdss.save_etr_bin(ram_dump) if ram_dump.qtf: self.parse_qtf(ram_dump) diff --git a/linux-ramdump-parser-v2/qdss.py b/linux-ramdump-parser-v2/qdss.py index a4c1e647580caf511a6d4106fc18aaf1755ec3fc..8ac637a5d3fa0adfa0947deaeba30a4f5654fb14 100644 --- a/linux-ramdump-parser-v2/qdss.py +++ b/linux-ramdump-parser-v2/qdss.py @@ -217,6 +217,8 @@ class QDSSDump(): self.etm_regs2 = None self.etm_regs3 = None self.dbgui_start = None + self.tmc_etf_swao_start = None + self.tmc_etf_swao_reg_start = None # Assumptions: Any address given here has been checked for correct magic def print_tmc_etf(self, ram_dump): @@ -306,6 +308,32 @@ class QDSSDump(): tmc_etf.close() + def save_etf_swao_bin(self, ram_dump): + tmc_etf_swao = ram_dump.open_file('tmc-etf-swao.bin') + if self.tmc_etf_swao_reg_start is None or self.tmc_etf_swao_start is None: + print_out_str('!!! ETF SWAO was not the current sink!') + tmc_etf_swao.close() + return + + ctl_offset, ctl_desc = tmc_registers['CTL'] + mode_offset, mode_desc = tmc_registers['MODE'] + rsz_offset, rsz_desc = tmc_registers['RSZ'] + + ctl = ram_dump.read_u32(self.tmc_etf_swao_reg_start + ctl_offset, False) + mode = ram_dump.read_u32(self.tmc_etf_swao_reg_start + mode_offset, False) + rsz = ram_dump.read_u32(self.tmc_etf_swao_reg_start + rsz_offset, False) + # rsz is given in words so convert to bytes + rsz = 4 * rsz + + if (ctl & 0x1) == 1 and (mode == 0): + for i in range(0, rsz): + val = ram_dump.read_byte(self.tmc_etf_swao_start + i, False) + tmc_etf_swao.write(struct.pack('<B', val)) + else: + print_out_str('!!! ETF SWAO was not the current sink!') + + tmc_etf_swao.close() + def read_sg_data(self, dbaddr, sts, rwpval, ram_dump, tmc_etr): start = dbaddr continue_looping = True