diff options
-rw-r--r-- | scripts/gdb/linux/lists.py | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/scripts/gdb/linux/lists.py b/scripts/gdb/linux/lists.py index 3a3775bc162b..2f335fbd86fd 100644 --- a/scripts/gdb/linux/lists.py +++ b/scripts/gdb/linux/lists.py | |||
@@ -18,6 +18,27 @@ from linux import utils | |||
18 | list_head = utils.CachedType("struct list_head") | 18 | list_head = utils.CachedType("struct list_head") |
19 | 19 | ||
20 | 20 | ||
21 | def list_for_each(head): | ||
22 | if head.type == list_head.get_type().pointer(): | ||
23 | head = head.dereference() | ||
24 | elif head.type != list_head.get_type(): | ||
25 | raise gdb.GdbError("Must be struct list_head not {}" | ||
26 | .format(head.type)) | ||
27 | |||
28 | node = head['next'].dereference() | ||
29 | while node.address != head.address: | ||
30 | yield node.address | ||
31 | node = node['next'].dereference() | ||
32 | |||
33 | |||
34 | def list_for_each_entry(head, gdbtype, member): | ||
35 | for node in list_for_each(head): | ||
36 | if node.type != list_head.get_type().pointer(): | ||
37 | raise TypeError("Type {} found. Expected struct list_head *." | ||
38 | .format(node.type)) | ||
39 | yield utils.container_of(node, gdbtype, member) | ||
40 | |||
41 | |||
21 | def list_check(head): | 42 | def list_check(head): |
22 | nb = 0 | 43 | nb = 0 |
23 | if (head.type == list_head.get_type().pointer()): | 44 | if (head.type == list_head.get_type().pointer()): |