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

Commit 3d4cd9c9 authored by Jan Kiszka's avatar Jan Kiszka Committed by Linus Torvalds
Browse files

scripts/gdb: add class to iterate over CPU masks



Will be used first to count module references.  It is optimized to read
the mask only once per stop.

Signed-off-by: default avatarJan 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 116b47b4
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
@@ -50,6 +50,60 @@ def per_cpu(var_ptr, cpu):
    return pointer.cast(var_ptr.type).dereference()


cpu_mask = {}


def cpu_mask_invalidate(event):
    global cpu_mask
    cpu_mask = {}
    gdb.events.stop.disconnect(cpu_mask_invalidate)
    if hasattr(gdb.events, 'new_objfile'):
        gdb.events.new_objfile.disconnect(cpu_mask_invalidate)


class CpuList():
    def __init__(self, mask_name):
        global cpu_mask
        self.mask = None
        if mask_name in cpu_mask:
            self.mask = cpu_mask[mask_name]
        if self.mask is None:
            self.mask = gdb.parse_and_eval(mask_name + ".bits")
            if hasattr(gdb, 'events'):
                cpu_mask[mask_name] = self.mask
                gdb.events.stop.connect(cpu_mask_invalidate)
                if hasattr(gdb.events, 'new_objfile'):
                    gdb.events.new_objfile.connect(cpu_mask_invalidate)
        self.bits_per_entry = self.mask[0].type.sizeof * 8
        self.num_entries = self.mask.type.sizeof * 8 / self.bits_per_entry
        self.entry = -1
        self.bits = 0

    def __iter__(self):
        return self

    def next(self):
        while self.bits == 0:
            self.entry += 1
            if self.entry == self.num_entries:
                raise StopIteration
            self.bits = self.mask[self.entry]
            if self.bits != 0:
                self.bit = 0
                break

        while self.bits & 1 == 0:
            self.bits >>= 1
            self.bit += 1

        cpu = self.entry * self.bits_per_entry + self.bit

        self.bits >>= 1
        self.bit += 1

        return cpu


class PerCpu(gdb.Function):
    """Return per-cpu variable.