From 97bb3a74373e66905fa90c9dc85772f31a301591 Mon Sep 17 00:00:00 2001
From: Shiraz Hashim <shashim@codeaurora.org>
Date: Wed, 11 Oct 2017 19:19:32 +0530
Subject: [PATCH] lrdp_v2: Fix page_owner parsing on 32bit

ARM 32bit targets donot support SPARSE_MEM but FLAT_MEM
for managing page objects. Fix it to parse page owner
information for arm 32bit based dumps.

Change-Id: I3cda98836362256c643c4ca0fb494ed55bb61488
---
 .../parsers/pagetracking.py                   | 36 +++++++++++++++----
 1 file changed, 29 insertions(+), 7 deletions(-)

diff --git a/linux-ramdump-parser-v2/parsers/pagetracking.py b/linux-ramdump-parser-v2/parsers/pagetracking.py
index 71d9049..89d51ef 100644
--- a/linux-ramdump-parser-v2/parsers/pagetracking.py
+++ b/linux-ramdump-parser-v2/parsers/pagetracking.py
@@ -23,7 +23,10 @@ class PageTracking(RamParser):
             return
 
         if (self.ramdump.kernel_version >= (3, 19, 0)):
-            mem_section = self.ramdump.read_word('mem_section')
+            if self.ramdump.is_config_defined('CONFIG_SPARSEMEM'):
+                mem_section = self.ramdump.read_word('mem_section')
+            else:
+                mem_section = self.ramdump.address_of('contig_page_data')
 
         trace_offset = 0
         nr_entries_offset = 0
@@ -39,8 +42,13 @@ class PageTracking(RamParser):
             trace_entries_offset = self.ramdump.field_offset(
                 'struct page', 'trace_entries')
         else:
-            page_ext_offset = self.ramdump.field_offset(
+            if self.ramdump.is_config_defined('CONFIG_SPARSEMEM'):
+                page_ext_offset = self.ramdump.field_offset(
                                     'struct mem_section', 'page_ext')
+            else:
+                page_ext_offset = self.ramdump.field_offset(
+                                    'struct pglist_data', 'node_page_ext')
+
             trace_offset = self.ramdump.field_offset(
                                     'struct page_ext', 'trace')
             if self.ramdump.is_config_defined('CONFIG_STACKDEPOT'):
@@ -53,7 +61,10 @@ class PageTracking(RamParser):
 
             nr_entries_offset = self.ramdump.field_offset(
                                 'struct page_ext', 'nr_entries')
-            mem_section_size = self.ramdump.sizeof("struct mem_section")
+            if self.ramdump.is_config_defined('CONFIG_SPARSEMEM'):
+                mem_section_size = self.ramdump.sizeof("struct mem_section")
+            else:
+                mem_section_size = 0;
             page_ext_size = self.ramdump.sizeof("struct page_ext")
             if self.ramdump.kernel_version >= (4,9,0):
                 page_owner_size = self.ramdump.sizeof("struct page_owner")
@@ -86,11 +97,22 @@ class PageTracking(RamParser):
                     continue
                 offset = phys >> 30
 
-                mem_section_0_offset = (
+                if self.ramdump.is_config_defined('CONFIG_SPARSEMEM'):
+                    mem_section_0_offset = (
                                 mem_section + (offset * mem_section_size))
-                page_ext = self.ramdump.read_word(
-                            mem_section_0_offset + page_ext_offset)
-                temp_page_ext = page_ext + (pfn * page_ext_size)
+                    page_ext = self.ramdump.read_word(
+                                mem_section_0_offset + page_ext_offset)
+                else:
+                    page_ext = self.ramdump.read_word(
+                                    mem_section + page_ext_offset)
+
+
+                if self.ramdump.arm64:
+                    temp_page_ext = page_ext + (pfn * page_ext_size)
+                else:
+                    pfn_index = pfn - (self.ramdump.phys_offset >> 12)
+                    temp_page_ext = page_ext + (pfn_index * page_ext_size)
+
                 if self.ramdump.kernel_version >= (4,9,0):
                     temp_page_ext = temp_page_ext + page_owner_ops_offset
                     order = self.ramdump.read_structure_field(
-- 
GitLab