diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2015-02-17 16:46:41 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-17 17:34:53 -0500 |
commit | b0fecd8c570310c5041035a94eda7a4610402ace (patch) | |
tree | 12b69ee5e9d3aa56d72491a212aff3aa47dd7aa6 /scripts/gdb | |
parent | 2b514827ef06fd69e1739e7f367712619dee7784 (diff) |
scripts/gdb: add container_of helper and convenience function
Provide an internal helper with container_of semantics. As type lookups
are very slow in gdb-python and we need a type "long" for this, cache the
reference to this type object. Then export the helper also as a
convenience function form use at the gdb command line.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Ben Widawsky <ben@bwidawsk.net>
Cc: Borislav Petkov <bp@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/gdb')
-rw-r--r-- | scripts/gdb/linux/utils.py | 35 | ||||
-rw-r--r-- | scripts/gdb/vmlinux-gdb.py | 2 |
2 files changed, 37 insertions, 0 deletions
diff --git a/scripts/gdb/linux/utils.py b/scripts/gdb/linux/utils.py index f88361130e4c..c9d705b62bfe 100644 --- a/scripts/gdb/linux/utils.py +++ b/scripts/gdb/linux/utils.py | |||
@@ -32,3 +32,38 @@ class CachedType: | |||
32 | if hasattr(gdb, 'events') and hasattr(gdb.events, 'new_objfile'): | 32 | if hasattr(gdb, 'events') and hasattr(gdb.events, 'new_objfile'): |
33 | gdb.events.new_objfile.connect(self._new_objfile_handler) | 33 | gdb.events.new_objfile.connect(self._new_objfile_handler) |
34 | return self._type | 34 | return self._type |
35 | |||
36 | |||
37 | long_type = CachedType("long") | ||
38 | |||
39 | |||
40 | def get_long_type(): | ||
41 | global long_type | ||
42 | return long_type.get_type() | ||
43 | |||
44 | |||
45 | def offset_of(typeobj, field): | ||
46 | element = gdb.Value(0).cast(typeobj) | ||
47 | return int(str(element[field].address).split()[0], 16) | ||
48 | |||
49 | |||
50 | def container_of(ptr, typeobj, member): | ||
51 | return (ptr.cast(get_long_type()) - | ||
52 | offset_of(typeobj, member)).cast(typeobj) | ||
53 | |||
54 | |||
55 | class ContainerOf(gdb.Function): | ||
56 | """Return pointer to containing data structure. | ||
57 | |||
58 | $container_of(PTR, "TYPE", "ELEMENT"): Given PTR, return a pointer to the | ||
59 | data structure of the type TYPE in which PTR is the address of ELEMENT. | ||
60 | Note that TYPE and ELEMENT have to be quoted as strings.""" | ||
61 | |||
62 | def __init__(self): | ||
63 | super(ContainerOf, self).__init__("container_of") | ||
64 | |||
65 | def invoke(self, ptr, typename, elementname): | ||
66 | return container_of(ptr, gdb.lookup_type(typename.string()).pointer(), | ||
67 | elementname.string()) | ||
68 | |||
69 | ContainerOf() | ||
diff --git a/scripts/gdb/vmlinux-gdb.py b/scripts/gdb/vmlinux-gdb.py index c1d90cea5288..649584105a72 100644 --- a/scripts/gdb/vmlinux-gdb.py +++ b/scripts/gdb/vmlinux-gdb.py | |||
@@ -21,3 +21,5 @@ try: | |||
21 | except: | 21 | except: |
22 | gdb.write("NOTE: gdb 7.2 or later required for Linux helper scripts to " | 22 | gdb.write("NOTE: gdb 7.2 or later required for Linux helper scripts to " |
23 | "work.\n") | 23 | "work.\n") |
24 | else: | ||
25 | import linux.utils | ||