Merge pull request #153 from dmitryryzhov/rtos-switch-active-thread
authorTim Newsome <tim@sifive.com>
Thu, 23 Aug 2018 23:52:39 +0000 (16:52 -0700)
committerGitHub <noreply@github.com>
Thu, 23 Aug 2018 23:52:39 +0000 (16:52 -0700)
Add debug test, which checks that openocd correctly switch active thread on any hart halt.

debug/gdbserver.py

index e59c3554f0211d2d5491629c3943e29fdf4b26a3..887770af6fb737deedad6db794935d941e4da1c2 100755 (executable)
@@ -633,6 +633,34 @@ class MulticoreRunAllHaltOne(GdbTest):
         time.sleep(1)
         self.gdb.p("buf", fmt="")
 
+class MulticoreRtosSwitchActiveHartTest(GdbTest):
+    compile_args = ("programs/multicore.c", "-DMULTICORE")
+
+    def early_applicable(self):
+        return len(self.target.harts) > 1
+
+    def setup(self):
+        self.gdb.select_hart(self.target.harts[0])
+        self.gdb.load()
+        for hart in self.target.harts:
+            self.gdb.select_hart(hart)
+            self.gdb.p("$pc=_start")
+
+    def test(self):
+        if self.gdb.one_hart_per_gdb():
+            return 'not_applicable'
+
+        # Set breakpoint near '_start' label to increase the chances of a situation
+        # when all harts hit breakpoint immediately and simultaneously.
+        self.gdb.b("set_trap_handler")
+
+        # Check that all harts hit breakpoint one by one.
+        for _ in range(len(self.target.harts)):
+            output = self.gdb.c()
+            assertIn("hit Breakpoint", output)
+            assertIn("set_trap_handler", output)
+            assertNotIn("received signal SIGTRAP", output)
+
 class StepTest(GdbSingleHartTest):
     compile_args = ("programs/step.S", )