Skip to content
Snippets Groups Projects
Commit db867b09 authored by Mitchel Humpherys's avatar Mitchel Humpherys
Browse files

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
parent b73c27a3
No related branches found
No related tags found
No related merge requests found
...@@ -959,14 +959,18 @@ class RamDump(): ...@@ -959,14 +959,18 @@ class RamDump():
self.imem_fname = board.imem_file_name self.imem_fname = board.imem_file_name
return True 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): def virt_to_phys(self, virt_or_name):
"""Does a virtual-to-physical address lookup of the virtual address or """Does a virtual-to-physical address lookup of the virtual address or
variable name.""" variable name."""
if isinstance(virt_or_name, basestring): return self.mmu.virt_to_phys(self.resolve_virt(virt_or_name))
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)
def setup_symbol_tables(self): def setup_symbol_tables(self):
stream = os.popen(self.nm_path + ' -n ' + self.vmlinux) stream = os.popen(self.nm_path + ' -n ' + self.vmlinux)
...@@ -1141,11 +1145,12 @@ class RamDump(): ...@@ -1141,11 +1145,12 @@ class RamDump():
def read_structure_field(self, addr_or_name, struct_name, field): def read_structure_field(self, addr_or_name, struct_name, field):
"""reads a 4 or 8 byte field from a structure""" """reads a 4 or 8 byte field from a structure"""
size = self.sizeof("(({0} *)0)->{1}".format(struct_name, field)) size = self.sizeof("(({0} *)0)->{1}".format(struct_name, field))
virt = self.resolve_virt(addr_or_name)
if size == 4: 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)) field))
if size == 8: 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)) field))
return None return None
...@@ -1154,6 +1159,7 @@ class RamDump(): ...@@ -1154,6 +1159,7 @@ class RamDump():
if virtual: if virtual:
if cpu is not None: if cpu is not None:
pcpu_offset = self.per_cpu_offset(cpu) 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_or_name += pcpu_offset + self.per_cpu_offset(cpu)
addr = self.virt_to_phys(addr_or_name) addr = self.virt_to_phys(addr_or_name)
s = self.read_physical(addr, max_length) s = self.read_physical(addr, max_length)
...@@ -1176,6 +1182,7 @@ class RamDump(): ...@@ -1176,6 +1182,7 @@ class RamDump():
if virtual: if virtual:
if cpu is not None: if cpu is not None:
pcpu_offset = self.per_cpu_offset(cpu) pcpu_offset = self.per_cpu_offset(cpu)
addr_or_name = self.resolve_virt(addr_or_name)
addr_or_name += pcpu_offset addr_or_name += pcpu_offset
per_cpu_string = ' with per-cpu offset of ' + hex(pcpu_offset) per_cpu_string = ' with per-cpu offset of ' + hex(pcpu_offset)
addr = self.virt_to_phys(addr_or_name) addr = self.virt_to_phys(addr_or_name)
......
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