From db867b0935e1162f91a15dab4dcb52818100b9e7 Mon Sep 17 00:00:00 2001 From: Mitchel Humpherys <mitchelh@codeaurora.org> Date: Thu, 3 Sep 2015 14:15:37 -0700 Subject: [PATCH] lrdp-v2: Make sure address is a number before offset'ing A few reader functions currently assume that a virtual address (a number) was passed in, but those functions also support reading variable names. Resolve the address or name to a virtual address before doing arithmetic on it. Change-Id: I55aa649ff203926565f8eaf3cb234677ef6b6104 --- linux-ramdump-parser-v2/ramdump.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index 86cf807..80f0ad4 100644 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -959,14 +959,18 @@ class RamDump(): self.imem_fname = board.imem_file_name return True + def resolve_virt(self, virt_or_name): + """Takes a virtual address or variable name, returns a virtual + address + """ + if not isinstance(virt_or_name, basestring): + return virt_or_name + return self.addr_lookup(virt_or_name) + def virt_to_phys(self, virt_or_name): """Does a virtual-to-physical address lookup of the virtual address or variable name.""" - if isinstance(virt_or_name, basestring): - virt_or_name = self.addr_lookup(virt_or_name) - if virt_or_name is None: - return - return self.mmu.virt_to_phys(virt_or_name) + return self.mmu.virt_to_phys(self.resolve_virt(virt_or_name)) def setup_symbol_tables(self): stream = os.popen(self.nm_path + ' -n ' + self.vmlinux) @@ -1141,11 +1145,12 @@ class RamDump(): def read_structure_field(self, addr_or_name, struct_name, field): """reads a 4 or 8 byte field from a structure""" size = self.sizeof("(({0} *)0)->{1}".format(struct_name, field)) + virt = self.resolve_virt(addr_or_name) if size == 4: - return self.read_u32(addr_or_name + self.field_offset(struct_name, + return self.read_u32(virt + self.field_offset(struct_name, field)) if size == 8: - return self.read_u64(addr_or_name + self.field_offset(struct_name, + return self.read_u64(virt + self.field_offset(struct_name, field)) return None @@ -1154,6 +1159,7 @@ class RamDump(): if virtual: if cpu is not None: pcpu_offset = self.per_cpu_offset(cpu) + addr_or_name = self.resolve_virt(addr_or_name) addr_or_name += pcpu_offset + self.per_cpu_offset(cpu) addr = self.virt_to_phys(addr_or_name) s = self.read_physical(addr, max_length) @@ -1176,6 +1182,7 @@ class RamDump(): if virtual: if cpu is not None: pcpu_offset = self.per_cpu_offset(cpu) + addr_or_name = self.resolve_virt(addr_or_name) addr_or_name += pcpu_offset per_cpu_string = ' with per-cpu offset of ' + hex(pcpu_offset) addr = self.virt_to_phys(addr_or_name) -- GitLab