diff --git a/linux-ramdump-parser-v2/parsers/rtb.py b/linux-ramdump-parser-v2/parsers/rtb.py index 40067637ae7efde0f56fd28ad7f039d31476b8c7..e1b07943bf06c6257ebb03a1bfe5f2b2aa4a1d1f 100644 --- a/linux-ramdump-parser-v2/parsers/rtb.py +++ b/linux-ramdump-parser-v2/parsers/rtb.py @@ -51,44 +51,44 @@ class RTB(RamParser): symname = 'Unknown function' return symname - def print_none(self, rtbout, rtb_ptr, logtype, data_offset, caller_offset): + def print_none(self, rtbout, rtb_ptr, logtype): rtbout.write('{0} No data\n'.format(logtype).encode('ascii', 'ignore')) - def print_readlwritel(self, rtbout, rtb_ptr, logtype, data_offset, caller_offset): - data = self.ramdump.read_u64(rtb_ptr + data_offset) - caller = self.ramdump.read_u64(rtb_ptr + caller_offset) + def print_readlwritel(self, rtbout, rtb_ptr, logtype): + data = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'data') + caller = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'caller') func = self.get_fun_name(caller) line = self.get_caller(caller) rtbout.write('{0} from address {1:x} called from addr {2:x} {3} {4}\n'.format( logtype, data, caller, func, line).encode('ascii', 'ignore')) - def print_logbuf(self, rtbout, rtb_ptr, logtype, data_offset, caller_offset): - data = self.ramdump.read_u64(rtb_ptr + data_offset) - caller = self.ramdump.read_u64(rtb_ptr + caller_offset) + def print_logbuf(self, rtbout, rtb_ptr, logtype): + data = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'data') + caller = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'caller') func = self.get_fun_name(caller) line = self.get_caller(caller) rtbout.write('{0} log end {1:x} called from addr {2:x} {3} {4}\n'.format( logtype, data, caller, func, line).encode('ascii', 'ignore')) - def print_hotplug(self, rtbout, rtb_ptr, logtype, data_offset, caller_offset): - data = self.ramdump.read_u64(rtb_ptr + data_offset) - caller = self.ramdump.read_u64(rtb_ptr + caller_offset) + def print_hotplug(self, rtbout, rtb_ptr, logtype): + data = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'data') + caller = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'caller') func = self.get_fun_name(caller) line = self.get_caller(caller) rtbout.write('{0} cpu data {1:x} called from addr {2:x} {3} {4}\n'.format( logtype, data, caller, func, line).encode('ascii', 'ignore')) - def print_ctxid(self, rtbout, rtb_ptr, logtype, data_offset, caller_offset): - data = self.ramdump.read_u64(rtb_ptr + data_offset) - caller = self.ramdump.read_u64(rtb_ptr + caller_offset) + def print_ctxid(self, rtbout, rtb_ptr, logtype): + data = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'data') + caller = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'caller') func = self.get_fun_name(caller) line = self.get_caller(caller) rtbout.write('{0} context id {1:x} called from addr {2:x} {3} {4}\n'.format( logtype, data, caller, func, line).encode('ascii', 'ignore')) - def print_timestamp(self, rtbout, rtb_ptr, logtype, data_offset, caller_offset): - data = self.ramdump.read_u64(rtb_ptr + data_offset) - caller = self.ramdump.read_u64(rtb_ptr + caller_offset) + def print_timestamp(self, rtbout, rtb_ptr, logtype): + data = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'data') + caller = self.ramdump.read_structure_field(rtb_ptr, 'struct msm_rtb_layout', 'caller') rtbout.write('{0} Timestamp: {1:x}{2:x}\n'.format( logtype, data, caller).encode('ascii', 'ignore')) @@ -107,12 +107,6 @@ class RTB(RamParser): rtb_entry_offset = self.ramdump.field_offset( 'struct msm_rtb_state', 'rtb') idx_offset = self.ramdump.field_offset('struct msm_rtb_layout', 'idx') - caller_offset = self.ramdump.field_offset( - 'struct msm_rtb_layout', 'caller') - log_type_offset = self.ramdump.field_offset( - 'struct msm_rtb_layout', 'log_type') - data_offset = self.ramdump.field_offset( - 'struct msm_rtb_layout', 'data') rtb_entry_size = self.ramdump.sizeof('struct msm_rtb_layout') step_size = self.ramdump.read_u32(rtb + step_size_offset) total_entries = self.ramdump.read_int(rtb + nentries_offset) @@ -152,10 +146,6 @@ class RTB(RamParser): 'struct msm_rtb_layout', 'log_type') rtb_idx_offset = self.ramdump.field_offset( 'struct msm_rtb_layout', 'idx') - rtb_data_offset = self.ramdump.field_offset( - 'struct msm_rtb_layout', 'data') - rtb_caller_offset = self.ramdump.field_offset( - 'struct msm_rtb_layout', 'caller') while True: ptr = rtb_read_ptr + next_entry * rtb_entry_size stamp = self.ramdump.read_int(ptr + rtb_idx_offset) @@ -175,8 +165,7 @@ class RTB(RamParser): rtb_data_offset, rtb_caller_offset) else: func = print_table[name_str] - getattr(RTB, func)(self, rtb_out, ptr, name_str, - rtb_data_offset, rtb_caller_offset) + getattr(RTB, func)(self, rtb_out, ptr, name_str) if next_entry == last: stop = 1 next_entry = (next_entry + step_size) & mask diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index b9c376f93775d9650ca1ccd5034526de1394bef5..28938ae8b3ada9e37be0ead65bf42d16b714413d 100644 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -1090,6 +1090,15 @@ class RamDump(): else: return s[0] + # reads a 4 or 8 byte field from a structure + def read_structure_field(self, address, struct_name, field): + size = self.sizeof("(({0} *)0)->{1}".format(struct_name, field)) + if size == 4: + return self.read_u32(address + self.field_offset(struct_name, field)) + if size == 8: + return self.read_u64(address + self.field_offset(struct_name, field)) + return None + def read_cstring(self, address, max_length, virtual=True, cpu=None, trace=False): addr = address if virtual: