diff options
| author | Kieran Bingham <kieran.bingham@linaro.org> | 2016-05-23 19:24:42 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-23 20:04:14 -0400 |
| commit | a84be61d0e38034634e7cbe076179cc6f1c16d22 (patch) | |
| tree | ffc357244227cef67eb8330b37bce98e88798d61 /scripts/gdb/linux/lists.py | |
| parent | f197d75fcad125f41cc6e2fdf1b3ea733db995f1 (diff) | |
scripts/gdb: provide kernel list item generators
Facilitate linked-list items by providing a generator to return the
dereferenced, and type-cast objects from a kernel linked list
Link: http://lkml.kernel.org/r/2b0998564e6e5abe53585d466f87e491331fd2a4.1462865983.git.jan.kiszka@siemens.com
Signed-off-by: Kieran Bingham <kieran.bingham@linaro.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/gdb/linux/lists.py')
| -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()): |
