From 5a98443f87e304a1347762b95436c26ed39582f1 Mon Sep 17 00:00:00 2001 From: Avinash Jain <jainavinash@codeaurora.org> Date: Mon, 6 Feb 2017 18:45:44 +0530 Subject: [PATCH] lrdp_v2: kernel 4.4 support for pagealloccorruptio page structure is changed in kernel 4.4, changes made in this file to support kernel 4.4. Change-Id: I3235f32e632468c1dd629cad707c66eb7d9a75af --- .../parsers/pagealloccorruption.py | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) mode change 100755 => 100644 linux-ramdump-parser-v2/parsers/pagealloccorruption.py diff --git a/linux-ramdump-parser-v2/parsers/pagealloccorruption.py b/linux-ramdump-parser-v2/parsers/pagealloccorruption.py old mode 100755 new mode 100644 index 302d46d..d4174dd --- a/linux-ramdump-parser-v2/parsers/pagealloccorruption.py +++ b/linux-ramdump-parser-v2/parsers/pagealloccorruption.py @@ -1,4 +1,4 @@ -# Copyright (c) 2012,2014-2015 The Linux Foundation. All rights reserved. +# Copyright (c) 2012,2014-2017 The Linux Foundation. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 and @@ -27,6 +27,14 @@ class PageallocCorruption(RamParser): cnt = self.ramdump.read_word(memblock_addr + memblock_memory_offset + memblock_memory_cnt_offset) region_offset = self.ramdump.field_offset('struct memblock_type', 'regions') regions_baseaddr = self.ramdump.read_word(memblock_addr + memblock_memory_offset + region_offset) + page_ext_offset = self.ramdump.field_offset( + 'struct mem_section', 'page_ext') + page_flags_offset = self.ramdump.field_offset( + 'struct page_ext', 'flags') + mem_section_size = self.ramdump.sizeof("struct mem_section") + mem_section = self.ramdump.read_word('mem_section') + page_ext_size = self.ramdump.sizeof("struct page_ext") + for r in range(0,cnt) : region_addr = regions_baseaddr + r * self.ramdump.sizeof('struct memblock_region') start_addr_offset = self.ramdump.field_offset('struct memblock_region', 'base') @@ -41,11 +49,23 @@ class PageallocCorruption(RamParser): for pfn in range(min_pfn, max_pfn): page = pfn_to_page(self.ramdump, pfn) page_pa = (pfn << 12) - # debug_flags value should be 1 for pages having poisoned value 0xaa - free = get_debug_flags(self.ramdump, page) + if (self.ramdump.kernel_version > (3, 18, 0)): + free = 0 + offset = page_pa >> 30 + 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_flags = self.ramdump.read_word( + temp_page_ext + page_flags_offset) + # enum PAGE_EXT_DEBUG_POISON ( == 0th bit is set ) for page poisioning + free = page_ext_flags & 1 + else: + # debug_flags value should be 1 for pages having poisoned value 0xaa + free = get_debug_flags(self.ramdump, page) if free == 1: - page_pa = (pfn << 12) flag = 0; for i in range(0,1024): readval = self.ramdump.read_u32(page_pa+i*4, False) -- GitLab