diff --git a/linux-ramdump-parser-v2/parsers/vmalloc.py b/linux-ramdump-parser-v2/parsers/vmalloc.py index 832c6e6f114bfd9337ea8debb0fee621b6d531f8..a56ceb4b22562c13101591e1b796bf61ebcc4258 100644 --- a/linux-ramdump-parser-v2/parsers/vmalloc.py +++ b/linux-ramdump-parser-v2/parsers/vmalloc.py @@ -9,8 +9,10 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. +import re from print_out import print_out_str from parser_util import register_parser, RamParser +import linux_list as llist VM_IOREMAP = 0x00000001 VM_ALLOC = 0x00000002 @@ -23,64 +25,98 @@ VM_UNLIST = 0x00000020 @register_parser('--print-vmalloc', 'print vmalloc information') class Vmalloc(RamParser): - def print_vmalloc_info(self, ram_dump, out_path): - vmlist_addr = ram_dump.addr_lookup('vmlist') - vmlist = ram_dump.read_word(vmlist_addr) + def print_vm(self, vm): + if vm == 0 or vm is None: + return + + next_offset = self.ramdump.field_offset('struct vm_struct', 'next') + addr_offset = self.ramdump.field_offset('struct vm_struct', 'addr') + size_offset = self.ramdump.field_offset('struct vm_struct', 'size') + flags_offset = self.ramdump.field_offset('struct vm_struct', 'flags') + pages_offset = self.ramdump.field_offset('struct vm_struct', 'pages') + nr_pages_offset = self.ramdump.field_offset('struct vm_struct', 'nr_pages') + phys_addr_offset = self.ramdump.field_offset( + 'struct vm_struct', 'phys_addr') + caller_offset = self.ramdump.field_offset('struct vm_struct', 'caller') - vmalloc_out = ram_dump.open_file('vmalloc.txt') + addr = self.ramdump.read_word(vm + addr_offset) + caller = self.ramdump.read_word(vm + caller_offset) + nr_pages = self.ramdump.read_word(vm + nr_pages_offset) + phys_addr = self.ramdump.read_word(vm + phys_addr_offset) + flags = self.ramdump.read_word(vm + flags_offset) + size = self.ramdump.read_word(vm + size_offset) - next_offset = ram_dump.field_offset('struct vm_struct', 'next') - addr_offset = ram_dump.field_offset('struct vm_struct', 'addr') - size_offset = ram_dump.field_offset('struct vm_struct', 'size') - flags_offset = ram_dump.field_offset('struct vm_struct', 'flags') - pages_offset = ram_dump.field_offset('struct vm_struct', 'pages') - nr_pages_offset = ram_dump.field_offset('struct vm_struct', 'nr_pages') - phys_addr_offset = ram_dump.field_offset( - 'struct vm_struct', 'phys_addr') - caller_offset = ram_dump.field_offset('struct vm_struct', 'caller') + if addr is None: + return - while (vmlist is not None) and (vmlist != 0): - addr = ram_dump.read_word(vmlist + addr_offset) - caller = ram_dump.read_word(vmlist + caller_offset) - nr_pages = ram_dump.read_word(vmlist + nr_pages_offset) - phys_addr = ram_dump.read_word(vmlist + phys_addr_offset) - flags = ram_dump.read_word(vmlist + flags_offset) - size = ram_dump.read_word(vmlist + size_offset) + vmalloc_str = '{0:x}-{1:x} {2:x}'.format(addr, addr + size, size) + + if (caller != 0): + a = self.ramdump.unwind_lookup(caller) + if a is not None: + symname, offset = a + vmalloc_str = vmalloc_str + \ + ' {0}+0x{1:x}'.format(symname, offset) + + if (nr_pages != 0): + vmalloc_str = vmalloc_str + ' pages={0}'.format(nr_pages) + + if (phys_addr != 0): + vmalloc_str = vmalloc_str + ' phys={0:x}'.format(phys_addr) + + if (flags & VM_IOREMAP) != 0: + vmalloc_str = vmalloc_str + ' ioremap' + + if (flags & VM_ALLOC) != 0: + vmalloc_str = vmalloc_str + ' vmalloc' - vmalloc_str = '{0:x}-{1:x} {2:x}'.format(addr, addr + size, size) + if (flags & VM_MAP) != 0: + vmalloc_str = vmalloc_str + ' vmap' - if (caller != 0): - a = ram_dump.unwind_lookup(caller) - if a is not None: - symname, offset = a - vmalloc_str = vmalloc_str + \ - ' {0}+0x{1:x}'.format(symname, offset) + if (flags & VM_USERMAP) != 0: + vmalloc_str = vmalloc_str + ' user' - if (nr_pages != 0): - vmalloc_str = vmalloc_str + ' pages={0}'.format(nr_pages) + if (flags & VM_VPAGES) != 0: + vmalloc_str = vmalloc_str + ' vpages' - if (phys_addr != 0): - vmalloc_str = vmalloc_str + ' phys={0:x}'.format(phys_addr) + vmalloc_str = vmalloc_str + '\n' + self.vmalloc_out.write(vmalloc_str) - if (flags & VM_IOREMAP) != 0: - vmalloc_str = vmalloc_str + ' ioremap' + def list_func(self, vmlist): + vm_offset = self.ramdump.field_offset('struct vmap_area', 'vm') - if (flags & VM_ALLOC) != 0: - vmalloc_str = vmalloc_str + ' vmalloc' + vm = self.ramdump.read_word(vmlist + vm_offset) + self.print_vm(vm) - if (flags & VM_MAP) != 0: - vmalloc_str = vmalloc_str + ' vmap' - if (flags & VM_USERMAP) != 0: - vmalloc_str = vmalloc_str + ' user' + def print_vmalloc_info_3_10(self, out_path): + vmalloc_out = self.ramdump.open_file('vmalloc.txt') - if (flags & VM_VPAGES) != 0: - vmalloc_str = vmalloc_str + ' vpages' + next_offset = self.ramdump.field_offset('struct vmap_area', 'list') + vmlist = self.ramdump.read_word('vmap_area_list') + orig_vmlist = vmlist - vmalloc_str = vmalloc_str + '\n' - vmalloc_out.write(vmalloc_str) + list_next_offset, list_prev_offset = llist.get_list_offsets( + self.ramdump) + + list_walker = llist.ListWalker(self.ramdump, vmlist, next_offset, list_next_offset, list_prev_offset) + self.vmalloc_out = vmalloc_out + list_walker.walk(vmlist, self.list_func) + print_out_str('---wrote vmalloc to vmalloc.txt') + vmalloc_out.close() + + + def print_vmalloc_info(self, out_path): + vmlist = self.ramdump.read_word('vmlist') + next_offset = self.ramdump.field_offset('struct vm_struct', 'next') + + vmalloc_out = self.ramdump.open_file('vmalloc.txt') + self.vmalloc_out = vmalloc_out + + while (vmlist is not None) and (vmlist != 0): + self.print_vm(vmlist) - vmlist = ram_dump.read_word(vmlist + next_offset) + vmlist = self.ramdump.read_word(vmlist + next_offset) print_out_str('---wrote vmalloc to vmalloc.txt') vmalloc_out.close() @@ -88,4 +124,7 @@ class Vmalloc(RamParser): def parse(self): out_path = self.ramdump.outdir ver = self.ramdump.version - self.print_vmalloc_info(self.ramdump, out_path) + if re.search('3\.10\.\d', ver) is not None: + self.print_vmalloc_info_3_10(out_path) + else: + self.print_vmalloc_info(out_path)