Skip to content
Snippets Groups Projects
Commit 5b2c241b authored by Shashank Mittal's avatar Shashank Mittal Committed by Sarangdhar Joshi
Browse files

lrdpv2: Fix irq parsing support for 3.18 kernel

In 3.18 kernel there is a slight change in radix_tree_node structure.
Fix irq parser to read radix_tree_node according to kernel version.

Change-Id: Ib9e67d137994f4b7424acd2b44676dcdcdb2d0a4
parent 27537436
No related branches found
No related tags found
No related merge requests found
......@@ -74,14 +74,19 @@ class IrqParse(RamParser):
def radix_tree_lookup_element(self, ram_dump, root_addr, index):
rnode_offset = ram_dump.field_offset('struct radix_tree_root', 'rnode')
rnode_height_offset = ram_dump.field_offset(
'struct radix_tree_node', 'height')
if (ram_dump.major[0], ram_dump.major[1]) >= (3, 18):
rnode_height_offset = ram_dump.field_offset(
'struct radix_tree_node', 'path')
else:
rnode_height_offset = ram_dump.field_offset(
'struct radix_tree_node', 'height')
slots_offset = ram_dump.field_offset('struct radix_tree_node', 'slots')
pointer_size = ram_dump.sizeof('struct radix_tree_node *')
# if CONFIG_BASE_SMALL=0: radix_tree_map_shift = 6
radix_tree_map_shift = 6
radix_tree_map_mask = 0x3f
radix_tree_height_mask = 0xfff
height_to_maxindex = [0x0, 0x3F, 0x0FFF,
0x0003FFFF, 0x00FFFFFF, 0x3FFFFFFF, 0xFFFFFFFF]
......@@ -93,6 +98,9 @@ class IrqParse(RamParser):
node_addr = ram_dump.read_word(root_addr + rnode_offset) & 0xfffffffffffffffe
height = ram_dump.read_int(node_addr + rnode_height_offset)
if (ram_dump.major[0], ram_dump.major[1]) >= (3, 18):
height = height & radix_tree_height_mask
if height > len(height_to_maxindex):
return None
......
......@@ -466,6 +466,7 @@ class RamDump():
self.ipc_log_debug = options.ipc_debug
self.ipc_log_help = options.ipc_help
self.use_stdout = options.stdout
self.major = [0, 0, 0]
if options.ram_addr is not None:
# TODO sanity check to make sure the memory regions don't overlap
for file_path, start, end in options.ram_addr:
......@@ -631,6 +632,12 @@ class RamDump():
print_out_str('!!! Could not match version! {0}'.format(b))
return False
self.version = v.group(1)
match = re.search('(\d+)\.(\d+)\.(\d+)', self.version)
if match is not None:
self.major[0], self.major[1], self.major[2] = map(int, match.groups())
else:
print_out_str('!!! Could not extract version info! {0}'.format(self.version))
print_out_str('Linux Banner: ' + b.rstrip())
print_out_str('version = {0}'.format(self.version))
return True
......
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