diff options
Diffstat (limited to 'scripts/gdb/linux/modules.py')
| -rw-r--r-- | scripts/gdb/linux/modules.py | 44 | 
1 files changed, 40 insertions, 4 deletions
| diff --git a/scripts/gdb/linux/modules.py b/scripts/gdb/linux/modules.py index 261f28640f4c..298dfcc25eae 100644 --- a/scripts/gdb/linux/modules.py +++ b/scripts/gdb/linux/modules.py @@ -73,11 +73,17 @@ class LxLsmod(gdb.Command):                  "        " if utils.get_long_type().sizeof == 8 else ""))          for module in module_list(): -            layout = module['mem'][constants.LX_MOD_TEXT] +            text = module['mem'][constants.LX_MOD_TEXT] +            text_addr = str(text['base']).split()[0] +            total_size = 0 + +            for i in range(constants.LX_MOD_TEXT, constants.LX_MOD_RO_AFTER_INIT + 1): +                total_size += module['mem'][i]['size'] +              gdb.write("{address} {name:<19} {size:>8}  {ref}".format( -                address=str(layout['base']).split()[0], +                address=text_addr,                  name=module['name'].string(), -                size=str(layout['size']), +                size=str(total_size),                  ref=str(module['refcnt']['counter'] - 1)))              t = self._module_use_type.get_type().pointer() @@ -91,5 +97,35 @@ class LxLsmod(gdb.Command):              gdb.write("\n") -  LxLsmod() + +def help(): +    t = """Usage: lx-getmod-by-textaddr [Heximal Address] +    Example: lx-getmod-by-textaddr 0xffff800002d305ac\n""" +    gdb.write("Unrecognized command\n") +    raise gdb.GdbError(t) + +class LxFindTextAddrinMod(gdb.Command): +    '''Look up loaded kernel module by text address.''' + +    def __init__(self): +        super(LxFindTextAddrinMod, self).__init__('lx-getmod-by-textaddr', gdb.COMMAND_SUPPORT) + +    def invoke(self, arg, from_tty): +        args = gdb.string_to_argv(arg) + +        if len(args) != 1: +            help() + +        addr = gdb.Value(int(args[0], 16)).cast(utils.get_ulong_type()) +        for mod in module_list(): +            mod_text_start = mod['mem'][constants.LX_MOD_TEXT]['base'] +            mod_text_end = mod_text_start + mod['mem'][constants.LX_MOD_TEXT]['size'].cast(utils.get_ulong_type()) + +            if addr >= mod_text_start and addr < mod_text_end: +                s = "0x%x" % addr + " is in " + mod['name'].string() + ".ko\n" +                gdb.write(s) +                return +        gdb.write("0x%x is not in any module text section\n" % addr) + +LxFindTextAddrinMod() | 
