From cb8a25bab3d17ceba62824f6fc98985a2c43071b Mon Sep 17 00:00:00 2001
From: Sarangdhar Joshi <spjoshi@codeaurora.org>
Date: Tue, 23 Jun 2015 20:59:35 -0700
Subject: [PATCH] lrdpv2: Fix format.txt dumping support for 3.18 kernel

ftrace_event_call structure is changed on 3.18 kernel. This
structure is used to dump formats.txt so that ftrace logs can be
parsed. Fix the parser to honor new structure format.

Change-Id: I26354a7048fe6d6180c24b95f840291d02ab2329
---
 linux-ramdump-parser-v2/debug_image_v2.py | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/linux-ramdump-parser-v2/debug_image_v2.py b/linux-ramdump-parser-v2/debug_image_v2.py
index 87638fc..778b4f6 100755
--- a/linux-ramdump-parser-v2/debug_image_v2.py
+++ b/linux-ramdump-parser-v2/debug_image_v2.py
@@ -28,6 +28,7 @@ from cachedumplib import lookup_cache_type
 
 MEMDUMPV2_MAGIC = 0x42445953
 MAX_NUM_ENTRIES = 0x130
+TRACE_EVENT_FL_TRACEPOINT = 0x40
 
 class client(object):
     MSM_DUMP_DATA_CPU_CTX = 0x00
@@ -181,16 +182,26 @@ class DebugImage_v2():
             self.formats_out.write("\tfield:{0} {1};\toffset:{2};\tsize:{3};\tsigned:{4};\n".format(type_str, field_name, offset, size, signed))
 
     def ftrace_events_func(self, ftrace_list, ram_dump):
-        name_offset = ram_dump.field_offset('struct ftrace_event_call', 'name')
         event_offset = ram_dump.field_offset('struct ftrace_event_call', 'event')
         fmt_offset = ram_dump.field_offset('struct ftrace_event_call', 'print_fmt')
         class_offset = ram_dump.field_offset('struct ftrace_event_call', 'class')
+        flags_offset = ram_dump.field_offset('struct ftrace_event_call', 'flags')
+        flags = ram_dump.read_word(ftrace_list + flags_offset)
+
+        if (ram_dump.kernel_version >= (3, 18) and (flags & TRACE_EVENT_FL_TRACEPOINT)):
+            tp_offset = ram_dump.field_offset('struct ftrace_event_call', 'tp')
+            tp_name_offset = ram_dump.field_offset('struct tracepoint', 'name')
+            tp = ram_dump.read_word(ftrace_list + tp_offset)
+            name = ram_dump.read_word(tp + tp_name_offset)
+        else:
+            name_offset = ram_dump.field_offset('struct ftrace_event_call', 'name')
+            name = ram_dump.read_word(ftrace_list + name_offset)
+
         type_offset = ram_dump.field_offset('struct trace_event', 'type')
         fields_offset = ram_dump.field_offset('struct ftrace_event_class', 'fields')
         common_field_list = ram_dump.addr_lookup('ftrace_common_fields')
         field_next_offset = ram_dump.field_offset('struct ftrace_event_field', 'link')
 
-        name = ram_dump.read_word(ftrace_list + name_offset)
         name_str = ram_dump.read_cstring(name, 512)
         event_id = ram_dump.read_word(ftrace_list + event_offset + type_offset)
         fmt = ram_dump.read_word(ftrace_list + fmt_offset)
-- 
GitLab