Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a84be61d authored by Kieran Bingham's avatar Kieran Bingham Committed by Linus Torvalds
Browse files

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: default avatarKieran Bingham <kieran.bingham@linaro.org>
Signed-off-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
Cc: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f197d75f
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -18,6 +18,27 @@ from linux import utils
list_head = utils.CachedType("struct list_head")


def list_for_each(head):
    if head.type == list_head.get_type().pointer():
        head = head.dereference()
    elif head.type != list_head.get_type():
        raise gdb.GdbError("Must be struct list_head not {}"
                           .format(head.type))

    node = head['next'].dereference()
    while node.address != head.address:
        yield node.address
        node = node['next'].dereference()


def list_for_each_entry(head, gdbtype, member):
    for node in list_for_each(head):
        if node.type != list_head.get_type().pointer():
            raise TypeError("Type {} found. Expected struct list_head *."
                            .format(node.type))
        yield utils.container_of(node, gdbtype, member)


def list_check(head):
    nb = 0
    if (head.type == list_head.get_type().pointer()):