Skip to content
Snippets Groups Projects
Commit f6f6e02d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ldrp_V2 : Format event log data"

parents e6a4dcf6 3f3ce9a4
No related branches found
No related tags found
No related merge requests found
...@@ -12,31 +12,82 @@ ...@@ -12,31 +12,82 @@
from parser_util import cleanupString from parser_util import cleanupString
from parser_util import register_parser, RamParser from parser_util import register_parser, RamParser
from print_out import print_out_str from print_out import print_out_str
import re
import collections
@register_parser('--pstore', 'Extract event logs from pstore') @register_parser('--pstore', 'Extract event logs from pstore')
class PStore(RamParser): class PStore(RamParser):
def calculate_percpu_eventbuf_size(self, base_addr): def calculate_percpu_eventbuf_size(self, base_addr):
event_zone_addr = self.ramdump.read_u64(base_addr + try:
(self.ramdump.field_offset('struct ramoops_context', 'eprzs'))) event_zone_addr = self.ramdump.read_u64(base_addr +
event_zone_addr = self.ramdump.read_u64(event_zone_addr) self.ramdump.field_offset('struct ramoops_context', 'eprzs'))
start_addr = self.ramdump.read_u32(event_zone_addr + event_zone_addr = self.ramdump.read_u64(event_zone_addr)
(self.ramdump.field_offset('struct persistent_ram_zone', 'paddr'))) start_addr = self.ramdump.read_u32(event_zone_addr +
percpu_size = self.ramdump.read_u32(event_zone_addr + self.ramdump.field_offset('struct persistent_ram_zone', 'paddr'))
(self.ramdump.field_offset('struct persistent_ram_zone', 'size'))) percpu_size = self.ramdump.read_u32(event_zone_addr +
self.ramdump.field_offset('struct persistent_ram_zone', 'size'))
except:
return None, None
return start_addr, percpu_size return start_addr, percpu_size
def print_pstore(self, pstore_out, addr, size): def print_console_logs(self, pstore_out, addr, size):
pstore = self.ramdump.read_physical(addr, size) pstore = self.ramdump.read_physical(addr, size)
pstore_out.write(cleanupString(pstore.decode('ascii', 'ignore')) + '\n') pstore_out.write(cleanupString(pstore.decode('ascii', 'ignore')) + '\n')
def sort_event_data(self, event_data, pstore_out):
'''
Event log buffer is circular, so this function
sorts the logs in ascending timestamp manner
'''
ordered_event_data = collections.OrderedDict(sorted(event_data.items()))
for ts, log in ordered_event_data.iteritems():
pstore_out.write(log)
def print_event_logs(self, pstore_out, addr, size):
'''
This function tries to format the event logs before logging them to
the core specific rtb file. Raw Data will be in the format given below
io_read: type=readl cpu=1 ts:58270610802 data=0xffffff8009de8614
caller=qcom_geni_serial_start_tx+0x114/0x150
io_write: type=writel cpu=1 ts:58270618875 data=0xffffff8009de880c
caller=qcom_geni_serial_start_tx+0x130/0x150
Timestamp is extracted from raw data and converted to secs format and cpu
field is removed since it is redundant.
Final Formatting will be as shown below
[644.279442] io_write : writel from address 0xffffff8009673120(None) called
from qcom_cpufreq_hw_target_index+0x60/0x64
'''
pstore = self.ramdump.read_physical(addr, size)
event_log_data = cleanupString(pstore.decode('ascii', 'ignore'))
event_data = event_log_data.split('\n')
formatted_event_data = {}
for line in event_data:
expr = r'.*(io_.*):.*type=(.*)cpu=(.*)ts:(.*)data=(.*)caller=(.*).*'
regEx = re.search(expr, line)
if regEx:
event_type = regEx.group(2).strip()
timestamp = regEx.group(4).strip()
timestamp = round(float(timestamp)/10**9,9)
timestamp = format(timestamp,'.9f')
data = regEx.group(5).strip()
caller = regEx.group(6).strip()
log_string = "[{0}] {1} : {2} from address {3} called from {4}\n".format(timestamp,
regEx.group(1), event_type, data, caller)
formatted_event_data[timestamp] = log_string
else:
continue
self.sort_event_data(formatted_event_data, pstore_out)
def calculate_console_size(self, base_addr): def calculate_console_size(self, base_addr):
console_zone_addr = self.ramdump.read_u64(base_addr + console_zone_addr = self.ramdump.read_u64(base_addr +
(self.ramdump.field_offset('struct ramoops_context', 'cprz'))) self.ramdump.field_offset('struct ramoops_context', 'cprz'))
start_addr = self.ramdump.read_u32(console_zone_addr + start_addr = self.ramdump.read_u32(console_zone_addr +
(self.ramdump.field_offset('struct persistent_ram_zone', 'paddr'))) self.ramdump.field_offset('struct persistent_ram_zone', 'paddr'))
console_size = self.ramdump.read_u32(console_zone_addr + console_size = self.ramdump.read_u32(console_zone_addr +
(self.ramdump.field_offset('struct persistent_ram_zone', 'size'))) self.ramdump.field_offset('struct persistent_ram_zone', 'size'))
return start_addr, console_size return start_addr, console_size
def extract_console_logs(self, base_addr): def extract_console_logs(self, base_addr):
...@@ -45,7 +96,7 @@ class PStore(RamParser): ...@@ -45,7 +96,7 @@ class PStore(RamParser):
''' '''
start_addr, console_size = self.calculate_console_size(base_addr) start_addr, console_size = self.calculate_console_size(base_addr)
pstore_out = self.ramdump.open_file('console_logs.txt') pstore_out = self.ramdump.open_file('console_logs.txt')
self.print_pstore(pstore_out, start_addr, console_size) self.print_console_logs(pstore_out, start_addr, console_size)
pstore_out.close() pstore_out.close()
def extract_io_event_logs(self, base_addr): def extract_io_event_logs(self, base_addr):
...@@ -55,11 +106,13 @@ class PStore(RamParser): ...@@ -55,11 +106,13 @@ class PStore(RamParser):
files. files.
''' '''
start_addr, percpu_size = self.calculate_percpu_eventbuf_size(base_addr) start_addr, percpu_size = self.calculate_percpu_eventbuf_size(base_addr)
if start_addr is None:
return
nr_cpus = self.ramdump.get_num_cpus() nr_cpus = self.ramdump.get_num_cpus()
for cpu in range(0,nr_cpus): for cpu in range(0,nr_cpus):
pstore_out = self.ramdump.open_file('rtb_core_{}.txt'.format(cpu)) pstore_out = self.ramdump.open_file('msm_rtb{0}.txt'.format(cpu))
cpu_offset = percpu_size*cpu cpu_offset = percpu_size*cpu
self.print_pstore(pstore_out, start_addr+cpu_offset, percpu_size) self.print_event_logs(pstore_out, start_addr+cpu_offset, percpu_size)
pstore_out.close() pstore_out.close()
def parse(self): def parse(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment