summaryrefslogtreecommitdiffstats
path: root/debug/risc-v-gsp-rm-vm/sim/devices/base.py
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-04 18:42:36 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-04 18:42:36 -0400
commit1f2073d4fbb1d412d9bbf373312e3c51b83db92a (patch)
treea661537d7ec9510324e0a40a5a65e4b8c853f01b /debug/risc-v-gsp-rm-vm/sim/devices/base.py
parentc1adf2727983f5cace8ca0f5d1119ac2256c348e (diff)
downloadopen-iov-1f2073d4fbb1d412d9bbf373312e3c51b83db92a.tar.gz
open-iov-1f2073d4fbb1d412d9bbf373312e3c51b83db92a.zip
greeneye: GMMU/FBIF observability, PTE decoder and oracle, MPU/libos simulator wave
Simulator development wave (docs 42-44): GMMU page-table entry decode with its oracle/workflow harness, FBIF observability, and MPU/LIBOS device surfaces in the device model, plus refreshed boot/machine/profile data (tu104-570.144), the qemu-line results, and the new unit tests. Docs 00/06/35-41 updated to match; harness helpers and .gitignore included.
Diffstat (limited to 'debug/risc-v-gsp-rm-vm/sim/devices/base.py')
-rw-r--r--debug/risc-v-gsp-rm-vm/sim/devices/base.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/debug/risc-v-gsp-rm-vm/sim/devices/base.py b/debug/risc-v-gsp-rm-vm/sim/devices/base.py
index 877109c..7254334 100644
--- a/debug/risc-v-gsp-rm-vm/sim/devices/base.py
+++ b/debug/risc-v-gsp-rm-vm/sim/devices/base.py
@@ -44,6 +44,11 @@ class Device:
name = "device"
+ #: Opt-in hook: when True the registry forwards the faulting PC to
+ #: ``read``/``write`` as ``pc=`` (observer windows record it; every other
+ #: device keeps the original two-/three-argument call unchanged).
+ wants_pc = False
+
def __init__(self, base: int = 0, size: int = 0):
self.base = base
self.size = size
@@ -184,7 +189,10 @@ class DeviceRegistry:
matched = False
for win in self._candidates(addr, size):
matched = True
- value = win.device.read(addr - win.base, size)
+ if win.device.wants_pc:
+ value = win.device.read(addr - win.base, size, pc=pc)
+ else:
+ value = win.device.read(addr - win.base, size)
if value is not None:
self._record(addr, size, False, value, True, pc)
return True, value
@@ -202,7 +210,11 @@ class DeviceRegistry:
matched = False
for win in self._candidates(addr, size):
matched = True
- if win.device.write(addr - win.base, size, value):
+ if win.device.wants_pc:
+ handled = win.device.write(addr - win.base, size, value, pc=pc)
+ else:
+ handled = win.device.write(addr - win.base, size, value)
+ if handled:
self._record(addr, size, True, value, True, pc)
return True
self.unhandled += 1