xref: /OK3568_Linux_fs/kernel/scripts/gdb/linux/modules.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#
2*4882a593Smuzhiyun# gdb helper commands and functions for Linux kernel debugging
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun#  module tools
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# Copyright (c) Siemens AG, 2013
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun# Authors:
9*4882a593Smuzhiyun#  Jan Kiszka <jan.kiszka@siemens.com>
10*4882a593Smuzhiyun#
11*4882a593Smuzhiyun# This work is licensed under the terms of the GNU GPL version 2.
12*4882a593Smuzhiyun#
13*4882a593Smuzhiyun
14*4882a593Smuzhiyunimport gdb
15*4882a593Smuzhiyun
16*4882a593Smuzhiyunfrom linux import cpus, utils, lists
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun
19*4882a593Smuzhiyunmodule_type = utils.CachedType("struct module")
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun
22*4882a593Smuzhiyundef module_list():
23*4882a593Smuzhiyun    global module_type
24*4882a593Smuzhiyun    modules = utils.gdb_eval_or_none("modules")
25*4882a593Smuzhiyun    if modules is None:
26*4882a593Smuzhiyun        return
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun    module_ptr_type = module_type.get_type().pointer()
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun    for module in lists.list_for_each_entry(modules, module_ptr_type, "list"):
31*4882a593Smuzhiyun        yield module
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun
34*4882a593Smuzhiyundef find_module_by_name(name):
35*4882a593Smuzhiyun    for module in module_list():
36*4882a593Smuzhiyun        if module['name'].string() == name:
37*4882a593Smuzhiyun            return module
38*4882a593Smuzhiyun    return None
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun
41*4882a593Smuzhiyunclass LxModule(gdb.Function):
42*4882a593Smuzhiyun    """Find module by name and return the module variable.
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun$lx_module("MODULE"): Given the name MODULE, iterate over all loaded modules
45*4882a593Smuzhiyunof the target and return that module variable which MODULE matches."""
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun    def __init__(self):
48*4882a593Smuzhiyun        super(LxModule, self).__init__("lx_module")
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun    def invoke(self, mod_name):
51*4882a593Smuzhiyun        mod_name = mod_name.string()
52*4882a593Smuzhiyun        module = find_module_by_name(mod_name)
53*4882a593Smuzhiyun        if module:
54*4882a593Smuzhiyun            return module.dereference()
55*4882a593Smuzhiyun        else:
56*4882a593Smuzhiyun            raise gdb.GdbError("Unable to find MODULE " + mod_name)
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun
59*4882a593SmuzhiyunLxModule()
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun
62*4882a593Smuzhiyunclass LxLsmod(gdb.Command):
63*4882a593Smuzhiyun    """List currently loaded modules."""
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun    _module_use_type = utils.CachedType("struct module_use")
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun    def __init__(self):
68*4882a593Smuzhiyun        super(LxLsmod, self).__init__("lx-lsmod", gdb.COMMAND_DATA)
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun    def invoke(self, arg, from_tty):
71*4882a593Smuzhiyun        gdb.write(
72*4882a593Smuzhiyun            "Address{0}    Module                  Size  Used by\n".format(
73*4882a593Smuzhiyun                "        " if utils.get_long_type().sizeof == 8 else ""))
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun        for module in module_list():
76*4882a593Smuzhiyun            layout = module['core_layout']
77*4882a593Smuzhiyun            gdb.write("{address} {name:<19} {size:>8}  {ref}".format(
78*4882a593Smuzhiyun                address=str(layout['base']).split()[0],
79*4882a593Smuzhiyun                name=module['name'].string(),
80*4882a593Smuzhiyun                size=str(layout['size']),
81*4882a593Smuzhiyun                ref=str(module['refcnt']['counter'] - 1)))
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun            t = self._module_use_type.get_type().pointer()
84*4882a593Smuzhiyun            first = True
85*4882a593Smuzhiyun            sources = module['source_list']
86*4882a593Smuzhiyun            for use in lists.list_for_each_entry(sources, t, "source_list"):
87*4882a593Smuzhiyun                gdb.write("{separator}{name}".format(
88*4882a593Smuzhiyun                    separator=" " if first else ",",
89*4882a593Smuzhiyun                    name=use['source']['name'].string()))
90*4882a593Smuzhiyun                first = False
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun            gdb.write("\n")
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun
95*4882a593SmuzhiyunLxLsmod()
96