diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-05-08 17:12:24 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-05-08 17:12:24 +0200 |
| commit | 07fb219869099c719b0fbfeae81b95512487639e (patch) | |
| tree | 87c7bc3c6d6d3897bf8853c0bf6291ba136277c5 | |
| parent | fb09cd6633b26ef2cfb4f21b8cd852611cfe59d8 (diff) | |
| download | kernel-07fb219869099c719b0fbfeae81b95512487639e.tar.xz kernel-07fb219869099c719b0fbfeae81b95512487639e.zip | |
debug: add page and frame formatters
| -rw-r--r-- | kapi/gdb/__init__.py | 9 | ||||
| -rw-r--r-- | kapi/gdb/devices/__init__.py | 1 | ||||
| -rw-r--r-- | kapi/gdb/devices/device.py (renamed from kapi/gdb/device.py) | 0 | ||||
| -rw-r--r-- | kapi/gdb/memory/__init__.py | 4 | ||||
| -rw-r--r-- | kapi/gdb/memory/address.py (renamed from kapi/gdb/address.py) | 0 | ||||
| -rw-r--r-- | kapi/gdb/memory/chunk.py | 41 | ||||
| -rw-r--r-- | scripts/gdb/teachos/__init__.py | 8 | ||||
| -rw-r--r-- | scripts/gdb/teachos/dump_mb2i.py | 22 |
8 files changed, 68 insertions, 17 deletions
diff --git a/kapi/gdb/__init__.py b/kapi/gdb/__init__.py index ce95628..afb68f8 100644 --- a/kapi/gdb/__init__.py +++ b/kapi/gdb/__init__.py @@ -1,7 +1,7 @@ import gdb.printing -from .address import KapiMemoryAddressPrinter -from .device import KapiDevicesDevicePrinter +from .memory import * +from .devices import * def build_pretty_printers(): @@ -10,6 +10,11 @@ def build_pretty_printers(): "kapi_memory_address", "^kapi::memory::address<.*>$", KapiMemoryAddressPrinter ) pp.add_printer( + "kapi_memory_chunk", "^kapi::memory::chunk<.*>$", KapiMemoryChunkPrinter + ) + pp.add_printer("kapi_memory_frame", "^kapi::memory::frame$", KapiMemoryFramePrinter) + pp.add_printer("kapi_memory_page", "^kapi::memory::page$", KapiMemoryPagePrinter) + pp.add_printer( "kapi_devices_device", "^kapi::devices::device$", KapiDevicesDevicePrinter ) return pp diff --git a/kapi/gdb/devices/__init__.py b/kapi/gdb/devices/__init__.py new file mode 100644 index 0000000..3bab1ea --- /dev/null +++ b/kapi/gdb/devices/__init__.py @@ -0,0 +1 @@ +from .device import KapiDevicesDevicePrinter diff --git a/kapi/gdb/device.py b/kapi/gdb/devices/device.py index 8e515ef..8e515ef 100644 --- a/kapi/gdb/device.py +++ b/kapi/gdb/devices/device.py diff --git a/kapi/gdb/memory/__init__.py b/kapi/gdb/memory/__init__.py new file mode 100644 index 0000000..2aa6564 --- /dev/null +++ b/kapi/gdb/memory/__init__.py @@ -0,0 +1,4 @@ +from .address import KapiMemoryAddressPrinter +from .chunk import KapiMemoryFramePrinter +from .chunk import KapiMemoryPagePrinter +from .chunk import KapiMemoryChunkPrinter diff --git a/kapi/gdb/address.py b/kapi/gdb/memory/address.py index 429db1d..429db1d 100644 --- a/kapi/gdb/address.py +++ b/kapi/gdb/memory/address.py diff --git a/kapi/gdb/memory/chunk.py b/kapi/gdb/memory/chunk.py new file mode 100644 index 0000000..74b1407 --- /dev/null +++ b/kapi/gdb/memory/chunk.py @@ -0,0 +1,41 @@ +import gdb +from teachos import format_size + + +class KapiMemoryChunkPrinter(gdb.ValuePrinter): + + def __init__(self, val: gdb.Value, typename="chunk"): + self.__val = val + try: + self.__number = int(val["m_number"]) + except gdb.error: + self.__number = "<number unreadable>" + + try: + self.__size = int(gdb.parse_and_eval(f"{val.type.name}::size")["value"]) + except gdb.error: + self.__size = "<size unreadable>" + + self.__typename = typename + + def to_string(self): + return f"{self.__typename} {self.__number} of size {format_size(self.__size)}" + + def children(self): + yield ("number", self.__number) + yield ("size", self.__size) + + def display_hint(self): + return None + + +class KapiMemoryFramePrinter(KapiMemoryChunkPrinter): + + def __init__(self, val): + super().__init__(val, "frame") + + +class KapiMemoryPagePrinter(KapiMemoryChunkPrinter): + + def __init__(self, val): + super().__init__(val, "page") diff --git a/scripts/gdb/teachos/__init__.py b/scripts/gdb/teachos/__init__.py index e69de29..a5eca92 100644 --- a/scripts/gdb/teachos/__init__.py +++ b/scripts/gdb/teachos/__init__.py @@ -0,0 +1,8 @@ +def format_size(size): + for unit in ["Bytes", "KiB", "MiB", "GiB", "TiB", "PiB"]: + if size < 1024.0: + if unit == "Bytes": + return f"{int(size)} {unit}" + return f"{size:.2f} {unit}" + size /= 1024.0 + return f"{size:.2f} PiB" diff --git a/scripts/gdb/teachos/dump_mb2i.py b/scripts/gdb/teachos/dump_mb2i.py index 3a9ee4a..0657ebd 100644 --- a/scripts/gdb/teachos/dump_mb2i.py +++ b/scripts/gdb/teachos/dump_mb2i.py @@ -1,6 +1,7 @@ import gdb import struct from enum import IntEnum +from teachos import format_size class TagType(IntEnum): @@ -150,19 +151,10 @@ class DumpMB2I(gdb.Command): offset += (tag_size + 7) & ~7 - def _format_size(self, size): - for unit in ["Bytes", "KiB", "MiB", "GiB", "TiB", "PiB"]: - if size < 1024.0: - if unit == "Bytes": - return f"{int(size)} {unit}" - return f"{size:.2f} {unit}" - size /= 1024.0 - return f"{size:.2f} PiB" - def _print_tag(self, inferior, tag_address, tag_type, tag_size): name = TAG_NAMES.get(tag_type, f"Unknown Tag") - size = self._format_size(tag_size) - payload = self._format_size(tag_size - 8) + size = format_size(tag_size) + payload = format_size(tag_size - 8) gdb.write(f"[Tag {tag_type:#04x}] {name} (size: {size} | payload: {payload})\n") if tag_size <= 8 and tag_type != TagType.END: @@ -198,7 +190,7 @@ class DumpMB2I(gdb.Command): start, end = struct.unpack_from("<II", data) string = data[8:].split(b"\x00")[0].decode("ascii", "replace") gdb.write( - f"{INDENT}start: {start:#010x} | end: {end:#010x} | size: {self._format_size(end - start)}\n" + f"{INDENT}start: {start:#010x} | end: {end:#010x} | size: {format_size(end - start)}\n" ) if string: gdb.write(f'{INDENT}string: "{string}"\n') @@ -206,7 +198,7 @@ class DumpMB2I(gdb.Command): def _write_basic_memory_info_tag(self, data): lower, upper = struct.unpack_from("<II", data) gdb.write( - f"{INDENT}upper memory: {self._format_size(upper * 1024)} | lower memory: {self._format_size(lower * 1024)}\n" + f"{INDENT}upper memory: {format_size(upper * 1024)} | lower memory: {format_size(lower * 1024)}\n" ) def _write_boot_device_tag(self, data): @@ -225,7 +217,7 @@ class DumpMB2I(gdb.Command): base, length, memory_type = struct.unpack_from("<QQI", data, entry_offset) type_string = MEMORY_TYPES.get(memory_type, "Unknown") gdb.write( - f"{INDENT}[{i:02d}] {base:#018x} - {base + length:#018x} | {self._format_size(length)} | type: {type_string}\n" + f"{INDENT}[{i:02d}] {base:#018x} - {base + length:#018x} | {format_size(length)} | type: {type_string}\n" ) def _write_image_load_base_physical_address_tag(self, data): @@ -236,7 +228,7 @@ class DumpMB2I(gdb.Command): address, pitch, width, height, bpp, type = struct.unpack_from("<QIIIBB", data) type_string = FRAMEBUFFER_TYPES.get(type, "Unknown") gdb.write(f"{INDENT}address: {address:#010x} | type: {type_string}\n") - gdb.write(f"{INDENT}depth: {bpp} | pitch: {self._format_size(pitch)}\n") + gdb.write(f"{INDENT}depth: {bpp} | pitch: {format_size(pitch)}\n") if type == FramebufferType.TEXT: gdb.write(f"{INDENT}width: {width} chars | height: {height} chars\n") else: |
