diff --git a/linux-ramdump-parser-v2/mm.py b/linux-ramdump-parser-v2/mm.py old mode 100755 new mode 100644 index c6790766e533d60db16cf499522e9ab815fc26fb..02fa7aa918566760d150651f7fc3148cf4f5b07d --- a/linux-ramdump-parser-v2/mm.py +++ b/linux-ramdump-parser-v2/mm.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +# Copyright (c) 2013-2016, 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 @@ -24,6 +24,7 @@ def get_debug_flags(ramdump, page): flagval = ramdump.read_word(page + debug_flag_offset) return flagval + def page_zonenum(page_flags): # save this in a variable somewhere... return (page_flags >> 26) & 3 @@ -134,7 +135,11 @@ def get_vmemmap(ramdump): # See: include/asm-generic/pgtable-nopud.h, # arch/arm64/include/asm/pgtable-hwdef.h, # arch/arm64/include/asm/pgtable.h - nlevels = int(ramdump.get_config_val("CONFIG_ARM64_PGTABLE_LEVELS")) + if (ramdump.kernel_version < (3, 18, 0)): + nlevels = int(ramdump.get_config_val("CONFIG_ARM64_PGTABLE_LEVELS")) + else: + nlevels = int(ramdump.get_config_val("CONFIG_PGTABLE_LEVELS")) + if ramdump.is_config_defined("CONFIG_ARM64_64K_PAGES"): page_shift = 16 else: @@ -146,7 +151,15 @@ def get_vmemmap(ramdump): spsize = ramdump.sizeof('struct page') vmemmap_size = bitops.align((1 << (va_bits - page_shift)) * spsize, pud_size) - vmalloc_end = ramdump.page_offset - pud_size - vmemmap_size + if (ramdump.kernel_version < (3, 18, 31)): + vmalloc_end = ramdump.page_offset - pud_size - vmemmap_size + # vmalloc_end = 0xFFFFFFBC00000000 + else: + # for version >= 3.18.31, + # vmemmap is shifted to base addr (0x80000000) pfn. + pfn_offset = (ramdump.phys_offset >> page_shift) + offset = pfn_offset * spsize + vmalloc_end = ramdump.page_offset - pud_size - vmemmap_size - offset return vmalloc_end