1# 2# gdb helper commands and functions for Linux kernel debugging 3# 4# module tools 5# 6# Copyright (c) Siemens AG, 2013 7# 8# Authors: 9# Jan Kiszka <[email protected]> 10# 11# This work is licensed under the terms of the GNU GPL version 2. 12# 13 14import gdb 15 16from linux import utils 17 18 19module_type = utils.CachedType("struct module") 20 21 22class ModuleList: 23 def __init__(self): 24 global module_type 25 self.module_ptr_type = module_type.get_type().pointer() 26 modules = gdb.parse_and_eval("modules") 27 self.curr_entry = modules['next'] 28 self.end_of_list = modules.address 29 30 def __iter__(self): 31 return self 32 33 def next(self): 34 entry = self.curr_entry 35 if entry != self.end_of_list: 36 self.curr_entry = entry['next'] 37 return utils.container_of(entry, self.module_ptr_type, "list") 38 else: 39 raise StopIteration 40 41 42def find_module_by_name(name): 43 for module in ModuleList(): 44 if module['name'].string() == name: 45 return module 46 return None 47 48 49class LxModule(gdb.Function): 50 """Find module by name and return the module variable. 51 52$lx_module("MODULE"): Given the name MODULE, iterate over all loaded modules 53of the target and return that module variable which MODULE matches.""" 54 55 def __init__(self): 56 super(LxModule, self).__init__("lx_module") 57 58 def invoke(self, mod_name): 59 mod_name = mod_name.string() 60 module = find_module_by_name(mod_name) 61 if module: 62 return module.dereference() 63 else: 64 raise gdb.GdbError("Unable to find MODULE " + mod_name) 65 66 67LxModule() 68