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