aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kapi/gdb/__init__.py9
-rw-r--r--kapi/gdb/devices/__init__.py1
-rw-r--r--kapi/gdb/devices/device.py (renamed from kapi/gdb/device.py)0
-rw-r--r--kapi/gdb/memory/__init__.py4
-rw-r--r--kapi/gdb/memory/address.py (renamed from kapi/gdb/address.py)0
-rw-r--r--kapi/gdb/memory/chunk.py41
-rw-r--r--scripts/gdb/teachos/__init__.py8
-rw-r--r--scripts/gdb/teachos/dump_mb2i.py22
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: