Skip to content
Snippets Groups Projects
Commit 19289961 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "linux-ramdump-parser-v2: Update vmalloc parsing for all cases"

parents 42763111 2e8bd2ad
No related branches found
No related tags found
No related merge requests found
...@@ -9,8 +9,10 @@ ...@@ -9,8 +9,10 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
import re
from print_out import print_out_str from print_out import print_out_str
from parser_util import register_parser, RamParser from parser_util import register_parser, RamParser
import linux_list as llist
VM_IOREMAP = 0x00000001 VM_IOREMAP = 0x00000001
VM_ALLOC = 0x00000002 VM_ALLOC = 0x00000002
...@@ -23,64 +25,98 @@ VM_UNLIST = 0x00000020 ...@@ -23,64 +25,98 @@ VM_UNLIST = 0x00000020
@register_parser('--print-vmalloc', 'print vmalloc information') @register_parser('--print-vmalloc', 'print vmalloc information')
class Vmalloc(RamParser): class Vmalloc(RamParser):
def print_vmalloc_info(self, ram_dump, out_path): def print_vm(self, vm):
vmlist_addr = ram_dump.addr_lookup('vmlist') if vm == 0 or vm is None:
vmlist = ram_dump.read_word(vmlist_addr) 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') if addr is None:
addr_offset = ram_dump.field_offset('struct vm_struct', 'addr') return
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')
while (vmlist is not None) and (vmlist != 0): vmalloc_str = '{0:x}-{1:x} {2:x}'.format(addr, addr + size, size)
addr = ram_dump.read_word(vmlist + addr_offset)
caller = ram_dump.read_word(vmlist + caller_offset) if (caller != 0):
nr_pages = ram_dump.read_word(vmlist + nr_pages_offset) a = self.ramdump.unwind_lookup(caller)
phys_addr = ram_dump.read_word(vmlist + phys_addr_offset) if a is not None:
flags = ram_dump.read_word(vmlist + flags_offset) symname, offset = a
size = ram_dump.read_word(vmlist + size_offset) 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): if (flags & VM_USERMAP) != 0:
a = ram_dump.unwind_lookup(caller) vmalloc_str = vmalloc_str + ' user'
if a is not None:
symname, offset = a
vmalloc_str = vmalloc_str + \
' {0}+0x{1:x}'.format(symname, offset)
if (nr_pages != 0): if (flags & VM_VPAGES) != 0:
vmalloc_str = vmalloc_str + ' pages={0}'.format(nr_pages) vmalloc_str = vmalloc_str + ' vpages'
if (phys_addr != 0): vmalloc_str = vmalloc_str + '\n'
vmalloc_str = vmalloc_str + ' phys={0:x}'.format(phys_addr) self.vmalloc_out.write(vmalloc_str)
if (flags & VM_IOREMAP) != 0: def list_func(self, vmlist):
vmalloc_str = vmalloc_str + ' ioremap' vm_offset = self.ramdump.field_offset('struct vmap_area', 'vm')
if (flags & VM_ALLOC) != 0: vm = self.ramdump.read_word(vmlist + vm_offset)
vmalloc_str = vmalloc_str + ' vmalloc' self.print_vm(vm)
if (flags & VM_MAP) != 0:
vmalloc_str = vmalloc_str + ' vmap'
if (flags & VM_USERMAP) != 0: def print_vmalloc_info_3_10(self, out_path):
vmalloc_str = vmalloc_str + ' user' vmalloc_out = self.ramdump.open_file('vmalloc.txt')
if (flags & VM_VPAGES) != 0: next_offset = self.ramdump.field_offset('struct vmap_area', 'list')
vmalloc_str = vmalloc_str + ' vpages' vmlist = self.ramdump.read_word('vmap_area_list')
orig_vmlist = vmlist
vmalloc_str = vmalloc_str + '\n' list_next_offset, list_prev_offset = llist.get_list_offsets(
vmalloc_out.write(vmalloc_str) 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') print_out_str('---wrote vmalloc to vmalloc.txt')
vmalloc_out.close() vmalloc_out.close()
...@@ -88,4 +124,7 @@ class Vmalloc(RamParser): ...@@ -88,4 +124,7 @@ class Vmalloc(RamParser):
def parse(self): def parse(self):
out_path = self.ramdump.outdir out_path = self.ramdump.outdir
ver = self.ramdump.version 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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment