aboutsummaryrefslogtreecommitdiff
path: root/debug/gdbserver.py
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2017-09-12 18:48:44 -0700
committerTim Newsome <tim@sifive.com>2017-09-14 12:32:59 -0700
commit6c2ad1c5c27f5e19e005541f7665a32814d32e0f (patch)
treebebb1df50e44a8d0d87c235eba10e7f6332f1d36 /debug/gdbserver.py
parent706b6476a2eb320a84fef39716a7c19a83b68a39 (diff)
downloadriscv-tests-6c2ad1c5c27f5e19e005541f7665a32814d32e0f.zip
riscv-tests-6c2ad1c5c27f5e19e005541f7665a32814d32e0f.tar.gz
riscv-tests-6c2ad1c5c27f5e19e005541f7665a32814d32e0f.tar.bz2
Test debugging code with interrupts.
Diffstat (limited to 'debug/gdbserver.py')
-rwxr-xr-xdebug/gdbserver.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/debug/gdbserver.py b/debug/gdbserver.py
index 21eea4e..9fedbca 100755
--- a/debug/gdbserver.py
+++ b/debug/gdbserver.py
@@ -419,6 +419,49 @@ class UserInterrupt(DebugTest):
self.gdb.p("i=0")
self.exit()
+class InterruptTest(GdbSingleHartTest):
+ compile_args = ("programs/interrupt.c",)
+
+ def early_applicable(self):
+ return self.target.supports_clint_mtime
+
+ def setup(self):
+ self.gdb.load()
+
+ def test(self):
+ self.gdb.b("main")
+ output = self.gdb.c()
+ assertIn(" main ", output)
+ self.gdb.b("trap_entry")
+ output = self.gdb.c()
+ assertIn(" trap_entry ", output)
+ assertEqual(self.gdb.p("$mip") & 0x80, 0x80)
+ assertEqual(self.gdb.p("interrupt_count"), 0)
+ # You'd expect local to still be 0, but it looks like spike doesn't
+ # jump to the interrupt handler immediately after the write to
+ # mtimecmp.
+ assertLess(self.gdb.p("local"), 1000)
+ self.gdb.command("delete breakpoints")
+ for _ in range(10):
+ self.gdb.c(wait=False)
+ time.sleep(2)
+ self.gdb.interrupt()
+ interrupt_count = self.gdb.p("interrupt_count")
+ local = self.gdb.p("local")
+ if interrupt_count > 1000 and \
+ local > 1000:
+ return
+
+ assertGreater(interrupt_count, 1000)
+ assertGreater(local, 1000)
+
+ def postMortem(self):
+ GdbSingleHartTest.postMortem(self)
+ self.gdb.p("*((long long*) 0x200bff8)")
+ self.gdb.p("*((long long*) 0x2004000)")
+ self.gdb.p("interrupt_count")
+ self.gdb.p("local")
+
class MulticoreRegTest(GdbTest):
compile_args = ("programs/infinite_loop.S", "-DMULTICORE")