|
@@ -13,7 +13,7 @@
|
|
|
|
|
|
import gdb
|
|
import gdb
|
|
|
|
|
|
-from linux import utils
|
|
|
|
|
|
+from linux import cpus, utils
|
|
|
|
|
|
|
|
|
|
module_type = utils.CachedType("struct module")
|
|
module_type = utils.CachedType("struct module")
|
|
@@ -65,3 +65,47 @@ of the target and return that module variable which MODULE matches."""
|
|
|
|
|
|
|
|
|
|
LxModule()
|
|
LxModule()
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class LxLsmod(gdb.Command):
|
|
|
|
+ """List currently loaded modules."""
|
|
|
|
+
|
|
|
|
+ _module_use_type = utils.CachedType("struct module_use")
|
|
|
|
+
|
|
|
|
+ def __init__(self):
|
|
|
|
+ super(LxLsmod, self).__init__("lx-lsmod", gdb.COMMAND_DATA)
|
|
|
|
+
|
|
|
|
+ def invoke(self, arg, from_tty):
|
|
|
|
+ gdb.write(
|
|
|
|
+ "Address{0} Module Size Used by\n".format(
|
|
|
|
+ " " if utils.get_long_type().sizeof == 8 else ""))
|
|
|
|
+
|
|
|
|
+ for module in ModuleList():
|
|
|
|
+ ref = 0
|
|
|
|
+ module_refptr = module['refptr']
|
|
|
|
+ for cpu in cpus.CpuList("cpu_possible_mask"):
|
|
|
|
+ refptr = cpus.per_cpu(module_refptr, cpu)
|
|
|
|
+ ref += refptr['incs']
|
|
|
|
+ ref -= refptr['decs']
|
|
|
|
+
|
|
|
|
+ gdb.write("{address} {name:<19} {size:>8} {ref}".format(
|
|
|
|
+ address=str(module['module_core']).split()[0],
|
|
|
|
+ name=module['name'].string(),
|
|
|
|
+ size=module['core_size'],
|
|
|
|
+ ref=ref))
|
|
|
|
+
|
|
|
|
+ source_list = module['source_list']
|
|
|
|
+ t = self._module_use_type.get_type().pointer()
|
|
|
|
+ entry = source_list['next']
|
|
|
|
+ first = True
|
|
|
|
+ while entry != source_list.address:
|
|
|
|
+ use = utils.container_of(entry, t, "source_list")
|
|
|
|
+ gdb.write("{separator}{name}".format(
|
|
|
|
+ separator=" " if first else ",",
|
|
|
|
+ name=use['source']['name'].string()))
|
|
|
|
+ first = False
|
|
|
|
+ entry = entry['next']
|
|
|
|
+ gdb.write("\n")
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+LxLsmod()
|