Skip to content

Commit 9905a43

Browse files
authored
Merge pull request #508 from riscv-software-src/set_available
debug: Add Openocd.set_available()
2 parents 39fc8b0 + 903ec82 commit 9905a43

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

debug/gdbserver.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1830,8 +1830,7 @@ def test(self):
18301830
# Other hart should have become unavailable.
18311831
if self.target.support_unavailable_control:
18321832
self.server.wait_until_running(self.target.harts)
1833-
self.server.command(
1834-
f"riscv dmi_write 0x1f 0x{(1<<self.hart.id)&0x3:x}")
1833+
self.server.set_available([self.hart])
18351834
self.gdb.expect(r"\S+ became unavailable.")
18361835
self.gdb.interrupt()
18371836

@@ -1901,8 +1900,8 @@ def test(self):
19011900
self.gdb.c(wait=False)
19021901
if self.target.support_unavailable_control:
19031902
self.server.wait_until_running([self.hart])
1904-
self.server.command(
1905-
f"riscv dmi_write 0x1f 0x{(~(1<<self.hart.id))&0x3:x}")
1903+
self.server.set_available(
1904+
[h for h in self.target.harts if h != self.hart])
19061905
self.gdb.expect(r"\S+ became unavailable.")
19071906
self.gdb.interrupt()
19081907
# gdb might automatically switch to the available hart.
@@ -1933,14 +1932,14 @@ def test(self):
19331932
self.gdb.p("$pc=loop_forever")
19341933
self.gdb.c(wait=False)
19351934
self.server.wait_until_running([self.hart])
1936-
self.server.command(
1937-
f"riscv dmi_write 0x1f 0x{(~(1<<self.hart.id))&0x3:x}")
1935+
self.server.set_available(
1936+
[h for h in self.target.harts if h != self.hart])
19381937
self.gdb.expect(r"\S+ became unavailable.")
19391938

19401939
# Now send a DMI command through OpenOCD to make the hart available
19411940
# again.
19421941

1943-
self.server.command("riscv dmi_write 0x1f 0x3")
1942+
self.server.set_available(self.target.harts)
19441943
self.gdb.expect(r"\S+ became available")
19451944
self.gdb.interrupt()
19461945
self.gdb.p("$pc")

debug/testlib.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,30 @@ def wait_until_running(self, harts):
497497
if time.time() - start > self.timeout:
498498
raise TestLibError("Timed out waiting for targets to run.")
499499

500+
def set_available(self, harts):
501+
"""Set the given harts to available, and any others to be unavailable.
502+
This uses a custom DMI register (0x1f) that is only implemented in
503+
spike."""
504+
available_mask = 0
505+
for hart in harts:
506+
available_mask |= 1 << hart.id
507+
self.command(f"riscv dmi_write 0x1f 0x{available_mask:x}")
508+
509+
# Wait until it happened.
510+
start = time.time()
511+
while True:
512+
currently_available = set()
513+
currently_unavailable = set()
514+
for i, target in enumerate(self.targets()):
515+
if target["State"] == "unavailable":
516+
currently_unavailable.add(i)
517+
else:
518+
currently_available.add(i)
519+
if currently_available == set(hart.id for hart in harts):
520+
return
521+
if time.time() - start > self.timeout:
522+
raise TestLibError("Timed out waiting for hart availability.")
523+
500524
class OpenocdCli:
501525
def __init__(self, port=4444):
502526
self.child = pexpect.spawn(

0 commit comments

Comments
 (0)