summaryrefslogtreecommitdiffstats
path: root/debug/risc-v-gsp-rm-vm/sim/devices/base.py
diff options
context:
space:
mode:
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