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 302d46da03c12fabe67c143c609d42781c1a4220..d4174dde027829467f28af2ef5827768720aa3f7 --- 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)