aboutsummaryrefslogtreecommitdiff
path: root/tools/nx2/gdbrsp.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/nx2/gdbrsp.py')
-rw-r--r--tools/nx2/gdbrsp.py20
1 files changed, 18 insertions, 2 deletions
diff --git a/tools/nx2/gdbrsp.py b/tools/nx2/gdbrsp.py
index d7c8a16460..51968254fa 100644
--- a/tools/nx2/gdbrsp.py
+++ b/tools/nx2/gdbrsp.py
@@ -153,7 +153,8 @@ def main():
regs = rsp.regs()
print(" ".join(f"{k}={v:#x}" for k, v in regs.items()))
elif op == "mem":
- a = regs[parts[1]] if parts[1] in regs else int(parts[1], 16)
+ base, _, off = parts[1].partition("+")
+ a = (regs[base] if base in regs else int(base, 16)) + (int(off, 16) if off else 0)
data = rsp.mem(a, int(parts[2], 0))
for i in range(0, len(data), 16):
words = [struct.unpack_from("<Q", data, i + j)[0] for j in range(0, min(16, len(data) - i) - 7, 8)]
@@ -258,9 +259,24 @@ def main():
regs = r
d = rsp.mem(addr, 8)
val = struct.unpack("<Q", d)[0] if len(d) == 8 else None
- print(f" w{i} {reply[:40]} pc={r.get('pc', 0):#x} lr={r.get('x30', 0) & 0xFFFFFFFFFFFF:#x} value={val if val is None else hex(val)}")
+ chain = []
+ fp = r.get("x29", 0)
+ for _ in range(6):
+ fd = rsp.mem(fp, 16)
+ if len(fd) < 16:
+ break
+ nfp, ret = struct.unpack("<QQ", fd)
+ chain.append(ret & 0xFFFFFFFFFFFF)
+ if nfp <= fp:
+ break
+ fp = nfp
+ print(f" w{i} {reply[:40]} pc={r.get('pc', 0):#x} lr={r.get('x30', 0) & 0xFFFFFFFFFFFF:#x} value={val if val is None else hex(val)} chain=" + ",".join(f"{c:#x}" for c in chain))
if stopval is not None and val == stopval:
break
+ # Step off the access with the watchpoint removed, then re-arm it.
+ rsp.cmd(f"z2,{addr:x},8")
+ rsp.cmd("s")
+ rsp.cmd(f"Z2,{addr:x},8")
elif op == "sleep":
import time
time.sleep(float(parts[1]))