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.

1  2 
debug/gdbserver.py

diff --combined debug/gdbserver.py
index e59c3554f0211d2d5491629c3943e29fdf4b26a3,528eae19a35f2e71ccaf455234397a476027f3d7..887770af6fb737deedad6db794935d941e4da1c2
@@@ -552,58 -552,58 +552,58 @@@ class MulticoreRegTest(GdbTest)
                  value = self.gdb.p("$x%d" % n)
                  assertEqual(value, hart.index * 0x800 + n - 1)
  
 -class MulticoreRunHaltStepiTest(GdbTest):
 -    compile_args = ("programs/multicore.c", "-DMULTICORE")
 -
 -    def early_applicable(self):
 -        return len(self.target.harts) > 1
 -
 -    def setup(self):
 -        self.gdb.load()
 -        for hart in self.target.harts:
 -            self.gdb.select_hart(hart)
 -            self.gdb.p("$mhartid")
 -            self.gdb.p("$pc=_start")
 -
 -    def test(self):
 -        previous_hart_count = [0 for h in self.target.harts]
 -        previous_interrupt_count = [0 for h in self.target.harts]
 -        # Check 10 times
 -        for i in range(10):
 -            # 3 attempts for each time we want the check to pass
 -            for attempt in range(3):
 -                self.gdb.global_command("echo round %d attempt %d\\n" % (i,
 -                    attempt))
 -                self.gdb.c_all(wait=False)
 -                time.sleep(2)
 -                self.gdb.interrupt_all()
 -                hart_count = self.gdb.p("hart_count")
 -                interrupt_count = self.gdb.p("interrupt_count")
 -                ok = True
 -                for i, h in enumerate(self.target.harts):
 -                    if hart_count[i] <= previous_hart_count[i]:
 -                        ok = False
 -                        break
 -                    if interrupt_count[i] <= previous_interrupt_count[i]:
 -                        ok = False
 -                        break
 -                    self.gdb.p("$mie")
 -                    self.gdb.p("$mip")
 -                    self.gdb.p("$mstatus")
 -                    self.gdb.p("$priv")
 -                    self.gdb.p("buf", fmt="")
 -                    self.gdb.select_hart(h)
 -                    pc = self.gdb.p("$pc")
 -                    self.gdb.stepi()
 -                    stepped_pc = self.gdb.p("$pc")
 -                    assertNotEqual(pc, stepped_pc)
 -                previous_hart_count = hart_count
 -                previous_interrupt_count = interrupt_count
 -                if ok:
 -                    break
 -            else:
 -                assert False, \
 -                        "hart count or interrupt didn't increment as expected"
 +#class MulticoreRunHaltStepiTest(GdbTest):
 +#    compile_args = ("programs/multicore.c", "-DMULTICORE")
 +#
 +#    def early_applicable(self):
 +#        return len(self.target.harts) > 1
 +#
 +#    def setup(self):
 +#        self.gdb.load()
 +#        for hart in self.target.harts:
 +#            self.gdb.select_hart(hart)
 +#            self.gdb.p("$mhartid")
 +#            self.gdb.p("$pc=_start")
 +#
 +#    def test(self):
 +#        previous_hart_count = [0 for h in self.target.harts]
 +#        previous_interrupt_count = [0 for h in self.target.harts]
 +#        # Check 10 times
 +#        for i in range(10):
 +#            # 3 attempts for each time we want the check to pass
 +#            for attempt in range(3):
 +#                self.gdb.global_command("echo round %d attempt %d\\n" % (i,
 +#                    attempt))
 +#                self.gdb.c_all(wait=False)
 +#                time.sleep(2)
 +#                self.gdb.interrupt_all()
 +#                hart_count = self.gdb.p("hart_count")
 +#                interrupt_count = self.gdb.p("interrupt_count")
 +#                ok = True
 +#                for i, h in enumerate(self.target.harts):
 +#                    if hart_count[i] <= previous_hart_count[i]:
 +#                        ok = False
 +#                        break
 +#                    if interrupt_count[i] <= previous_interrupt_count[i]:
 +#                        ok = False
 +#                        break
 +#                    self.gdb.p("$mie")
 +#                    self.gdb.p("$mip")
 +#                    self.gdb.p("$mstatus")
 +#                    self.gdb.p("$priv")
 +#                    self.gdb.p("buf", fmt="")
 +#                    self.gdb.select_hart(h)
 +#                    pc = self.gdb.p("$pc")
 +#                    self.gdb.stepi()
 +#                    stepped_pc = self.gdb.p("$pc")
 +#                    assertNotEqual(pc, stepped_pc)
 +#                previous_hart_count = hart_count
 +#                previous_interrupt_count = interrupt_count
 +#                if ok:
 +#                    break
 +#            else:
 +#                assert False, \
 +#                        "hart count or interrupt didn't increment as expected"
  
  class MulticoreRunAllHaltOne(GdbTest):
      compile_args = ("programs/multicore.c", "-DMULTICORE")
          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", )