diff options
| author | Jan Kiszka <jan.kiszka@siemens.com> | 2015-02-17 16:47:29 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-17 17:34:54 -0500 |
| commit | 5403727f985ba39967c899a56fff5bbd2c9a9f36 (patch) | |
| tree | 01baa4cd5fd18c4b544c881e1a744cc8103ddf7d /scripts/gdb/linux/modules.py | |
| parent | 3d4cd9c94191f60cbb741cfbaa770d442c4680aa (diff) | |
scripts/gdb: add lx-lsmod command
This adds a lsmod-like command to list all currently loaded modules of the
target.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Borislav Petkov <bp@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/gdb/linux/modules.py')
| -rw-r--r-- | scripts/gdb/linux/modules.py | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/scripts/gdb/linux/modules.py b/scripts/gdb/linux/modules.py index 531f7632d03f..e7c99e9c9620 100644 --- a/scripts/gdb/linux/modules.py +++ b/scripts/gdb/linux/modules.py | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | import gdb | 14 | import gdb |
| 15 | 15 | ||
| 16 | from linux import utils | 16 | from linux import cpus, utils |
| 17 | 17 | ||
| 18 | 18 | ||
| 19 | module_type = utils.CachedType("struct module") | 19 | module_type = utils.CachedType("struct module") |
| @@ -65,3 +65,47 @@ of the target and return that module variable which MODULE matches.""" | |||
| 65 | 65 | ||
| 66 | 66 | ||
| 67 | LxModule() | 67 | LxModule() |
| 68 | |||
| 69 | |||
| 70 | class LxLsmod(gdb.Command): | ||
| 71 | """List currently loaded modules.""" | ||
| 72 | |||
| 73 | _module_use_type = utils.CachedType("struct module_use") | ||
| 74 | |||
| 75 | def __init__(self): | ||
| 76 | super(LxLsmod, self).__init__("lx-lsmod", gdb.COMMAND_DATA) | ||
| 77 | |||
| 78 | def invoke(self, arg, from_tty): | ||
| 79 | gdb.write( | ||
| 80 | "Address{0} Module Size Used by\n".format( | ||
| 81 | " " if utils.get_long_type().sizeof == 8 else "")) | ||
| 82 | |||
| 83 | for module in ModuleList(): | ||
| 84 | ref = 0 | ||
| 85 | module_refptr = module['refptr'] | ||
| 86 | for cpu in cpus.CpuList("cpu_possible_mask"): | ||
| 87 | refptr = cpus.per_cpu(module_refptr, cpu) | ||
| 88 | ref += refptr['incs'] | ||
| 89 | ref -= refptr['decs'] | ||
| 90 | |||
| 91 | gdb.write("{address} {name:<19} {size:>8} {ref}".format( | ||
| 92 | address=str(module['module_core']).split()[0], | ||
| 93 | name=module['name'].string(), | ||
| 94 | size=module['core_size'], | ||
| 95 | ref=ref)) | ||
| 96 | |||
| 97 | source_list = module['source_list'] | ||
| 98 | t = self._module_use_type.get_type().pointer() | ||
| 99 | entry = source_list['next'] | ||
| 100 | first = True | ||
| 101 | while entry != source_list.address: | ||
| 102 | use = utils.container_of(entry, t, "source_list") | ||
| 103 | gdb.write("{separator}{name}".format( | ||
| 104 | separator=" " if first else ",", | ||
| 105 | name=use['source']['name'].string())) | ||
| 106 | first = False | ||
| 107 | entry = entry['next'] | ||
| 108 | gdb.write("\n") | ||
| 109 | |||
| 110 | |||
| 111 | LxLsmod() | ||
