diff options
Diffstat (limited to 'scripts/gdb/linux/symbols.py')
| -rw-r--r-- | scripts/gdb/linux/symbols.py | 44 | 
1 files changed, 39 insertions, 5 deletions
| diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py index f6c1b063775a..b255177301e9 100644 --- a/scripts/gdb/linux/symbols.py +++ b/scripts/gdb/linux/symbols.py @@ -14,7 +14,9 @@  import gdb  import os  import re +import struct +from itertools import count  from linux import modules, utils, constants @@ -53,6 +55,29 @@ if hasattr(gdb, 'Breakpoint'):              return False +def get_vmcore_s390(): +    with utils.qemu_phy_mem_mode(): +        vmcore_info = 0x0e0c +        paddr_vmcoreinfo_note = gdb.parse_and_eval("*(unsigned long long *)" + +                                                   hex(vmcore_info)) +        inferior = gdb.selected_inferior() +        elf_note = inferior.read_memory(paddr_vmcoreinfo_note, 12) +        n_namesz, n_descsz, n_type = struct.unpack(">III", elf_note) +        desc_paddr = paddr_vmcoreinfo_note + len(elf_note) + n_namesz + 1 +        return gdb.parse_and_eval("(char *)" + hex(desc_paddr)).string() + + +def get_kerneloffset(): +    if utils.is_target_arch('s390'): +        try: +            vmcore_str = get_vmcore_s390() +        except gdb.error as e: +            gdb.write("{}\n".format(e)) +            return None +        return utils.parse_vmcore(vmcore_str).kerneloffset +    return None + +  class LxSymbols(gdb.Command):      """(Re-)load symbols of Linux kernel and currently loaded modules. @@ -95,10 +120,14 @@ lx-symbols command."""          except gdb.error:              return str(module_addr) -        attrs = sect_attrs['attrs'] -        section_name_to_address = { -            attrs[n]['battr']['attr']['name'].string(): attrs[n]['address'] -            for n in range(int(sect_attrs['nsections']))} +        section_name_to_address = {} +        for i in count(): +            # this is a NULL terminated array +            if sect_attrs['grp']['bin_attrs'][i] == 0x0: +                break + +            attr = sect_attrs['grp']['bin_attrs'][i].dereference() +            section_name_to_address[attr['attr']['name'].string()] = attr['private']          textaddr = section_name_to_address.get(".text", module_addr)          args = [] @@ -155,7 +184,12 @@ lx-symbols command."""                  obj.filename.endswith('vmlinux.debug')):                  orig_vmlinux = obj.filename          gdb.execute("symbol-file", to_string=True) -        gdb.execute("symbol-file {0}".format(orig_vmlinux)) +        kerneloffset = get_kerneloffset() +        if kerneloffset is None: +            offset_arg = "" +        else: +            offset_arg = " -o " + hex(kerneloffset) +        gdb.execute("symbol-file {0}{1}".format(orig_vmlinux, offset_arg))          self.loaded_modules = []          module_list = modules.module_list() | 
