aboutsummaryrefslogtreecommitdiff
path: root/debug/gdbserver.py
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2021-04-13 14:41:45 -0700
committerGitHub <noreply@github.com>2021-04-13 14:41:45 -0700
commit1b05661baa79f03830f5ddefa999dc7aaf7b1ce1 (patch)
treec3b934eea5e0522888edc7a4cf742d09afaa7512 /debug/gdbserver.py
parent1ce128fa78c24bb0ed399c647e7139322b5353a7 (diff)
downloadriscv-tests-1b05661baa79f03830f5ddefa999dc7aaf7b1ce1.zip
riscv-tests-1b05661baa79f03830f5ddefa999dc7aaf7b1ce1.tar.gz
riscv-tests-1b05661baa79f03830f5ddefa999dc7aaf7b1ce1.tar.bz2
Add FreeRTOS smoke tests. (#333)
* Add FreeRTOS smoke tests. Make sure that OpenOCD can access all threads in a FreeRTOS binary on single-hart RV32 and RV64. * Also test `-rtos FreeRTOS`.
Diffstat (limited to 'debug/gdbserver.py')
-rwxr-xr-xdebug/gdbserver.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/debug/gdbserver.py b/debug/gdbserver.py
index 0a174d3..bcac02c 100755
--- a/debug/gdbserver.py
+++ b/debug/gdbserver.py
@@ -1700,6 +1700,60 @@ class VectorTest(GdbSingleHartTest):
assertIn("_exit", output)
assertEqual(self.gdb.p("status"), 0)
+class FreeRtosTest(GdbTest):
+ def early_applicable(self):
+ return self.target.freertos_binary
+
+ def freertos(self):
+ return True
+
+ def test(self):
+ self.gdb.command("file %s" % self.target.freertos_binary)
+ self.gdb.load()
+
+ output = self.gdb.command("monitor riscv_freertos_stacking mainline")
+
+ # Turn off htif, which doesn't work when the file is loaded into spike
+ # through gdb. It only works when spike loads the ELF file itself.
+ bp = self.gdb.b("main")
+ self.gdb.c()
+ self.gdb.command("delete %d" % bp)
+ self.gdb.p("*((int*) &use_htif) = 0")
+ # Need this, otherwise gdb complains that there is no current active
+ # thread.
+ self.gdb.threads()
+
+ bp = self.gdb.b("prvQueueReceiveTask")
+
+ self.gdb.c()
+ self.gdb.command("delete %d" % bp)
+
+ bp = self.gdb.b("prvQueueSendTask")
+ self.gdb.c()
+ self.gdb.command("delete %d" % bp)
+
+ # Now we know for sure at least 2 threads have executed.
+
+ threads = self.gdb.threads()
+ assertGreater(len(threads), 1)
+
+ values = {}
+ for thread in threads:
+ assertNotIn("No Name", thread[1])
+ self.gdb.thread(thread)
+ assertEqual(self.gdb.p("$zero"), 0)
+ output = self.gdb.command("info reg sp")
+ assertIn("ucHeap", output)
+ self.gdb.command("info reg mstatus")
+ values[thread.id] = self.gdb.p("$s11")
+ self.gdb.p("$s11=0x%x" % (values[thread.id] ^ int(thread.id)))
+
+ # Test that writing worked
+ self.gdb.stepi()
+ for thread in self.gdb.threads():
+ self.gdb.thread(thread)
+ assertEqual(self.gdb.p("$s11"), values[thread.id] ^ int(thread.id))
+
parsed = None
def main():
parser = argparse.ArgumentParser(