From d36bfa48cb8e986bc4b5c180c21529af7022ae2f Mon Sep 17 00:00:00 2001
From: Laura Abbott <lauraa@codeaurora.org>
Date: Tue, 11 Mar 2014 16:53:44 -0700
Subject: [PATCH] linux-ramdump-parser-v2: Update IRQ parsing

The IRQ parsing makes some non-generic assumptions about the sizes
of various fields in the structures. Update the parsing to use better
types.

Change-Id: I914f6104e7f914aa941b301a71c38182806e11cc
---
 linux-ramdump-parser-v2/parsers/irqstate.py | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/linux-ramdump-parser-v2/parsers/irqstate.py b/linux-ramdump-parser-v2/parsers/irqstate.py
index c0357d3..3e1d696 100644
--- a/linux-ramdump-parser-v2/parsers/irqstate.py
+++ b/linux-ramdump-parser-v2/parsers/irqstate.py
@@ -77,6 +77,7 @@ class IrqParse(RamParser):
         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
@@ -87,10 +88,10 @@ class IrqParse(RamParser):
         if ram_dump.read_word(root_addr + rnode_offset) & 1 == 0:
             if index > 0:
                 return None
-            return (ram_dump.read_word(root_addr + rnode_offset) & 0xfffffffe)
+            return (ram_dump.read_word(root_addr + rnode_offset) & 0xfffffffffffffffe)
 
-        node_addr = ram_dump.read_word(root_addr + rnode_offset) & 0xfffffffe
-        height = ram_dump.read_word(node_addr + rnode_height_offset)
+        node_addr = ram_dump.read_word(root_addr + rnode_offset) & 0xfffffffffffffffe
+        height = ram_dump.read_int(node_addr + rnode_height_offset)
 
         if height > len(height_to_maxindex):
             return None
@@ -101,11 +102,11 @@ class IrqParse(RamParser):
         shift = (height - 1) * radix_tree_map_shift
         for h in range(height, 0, -1):
             node_addr = ram_dump.read_word(
-                node_addr + slots_offset + ((index >> shift) & radix_tree_map_mask) * 4)
+                node_addr + slots_offset + ((index >> shift) & radix_tree_map_mask) * pointer_size)
             if node_addr == 0:
                 return None
             shift -= radix_tree_map_shift
-        return (node_addr & 0xfffffffe)
+        return (node_addr & 0xfffffffffffffffe)
 
     def print_irq_state_sparse_irq(self, ram_dump):
         h_irq_offset = ram_dump.field_offset('struct irq_desc', 'handle_irq')
@@ -122,7 +123,7 @@ class IrqParse(RamParser):
         cpu_str = ''
 
         irq_desc_tree = ram_dump.addr_lookup('irq_desc_tree')
-        nr_irqs = ram_dump.read_word(ram_dump.addr_lookup('nr_irqs'))
+        nr_irqs = ram_dump.read_int(ram_dump.addr_lookup('nr_irqs'))
 
         for i in ram_dump.iter_cpus():
             cpu_str = cpu_str + '{0:10} '.format('CPU{0}'.format(i))
-- 
GitLab