cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

modules.py (2597B)


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