Merge remote-tracking branch 'origin/downloadtest' into debug-tests-more-single
authorMegan Wachs <megan@sifive.com>
Mon, 14 May 2018 23:04:10 +0000 (16:04 -0700)
committerMegan Wachs <megan@sifive.com>
Mon, 14 May 2018 23:04:10 +0000 (16:04 -0700)
1  2 
debug/gdbserver.py
debug/testlib.py

diff --combined debug/gdbserver.py
index 4472bdfbfe5ccb1bf4f6bbd012a08fc835cda18f,dd30a3decab5668db62525edf01abac162efe14e..be89d19157b07789be13bad5a105091b393569c5
@@@ -615,7 -615,7 +615,7 @@@ class MulticoreRunAllHaltOne(GdbTest)
          time.sleep(1)
          self.gdb.p("buf", fmt="")
  
 -class StepTest(GdbTest):
 +class StepTest(GdbSingleHartTest):
      compile_args = ("programs/step.S", )
  
      def setup(self):
              pc = self.gdb.p("$pc")
              assertEqual("%x" % (pc - main_address), "%x" % expected)
  
 -class TriggerTest(GdbTest):
 +class TriggerTest(GdbSingleHartTest):
      compile_args = ("programs/trigger.S", )
      def setup(self):
          self.gdb.load()
@@@ -753,7 -753,7 +753,7 @@@ class TriggerDmode(TriggerTest)
          assertIn("clear_triggers", output)
          self.check_triggers((1<<6) | (1<<0), 0xfeedac00)
  
 -class RegsTest(GdbTest):
 +class RegsTest(GdbSingleHartTest):
      compile_args = ("programs/regs.S", )
      def setup(self):
          self.gdb.load()
@@@ -830,30 -830,17 +830,17 @@@ class DownloadTest(GdbTest)
  
          self.binary = self.target.compile(self.hart, self.download_c.name,
                  "programs/checksum.c")
-         self.gdb.command("file %s" % self.binary)
+         self.gdb.global_command("file %s" % self.binary)
  
      def test(self):
-         # Some hart will compete the CRC calculation first!
-         # Let them race in RTOS mode.
-         # In non-RTOS mode, only one hart will continue.
-         # This loop will fail because the others won't know 
-         # about '_start'. But if that is the case, they
-         # won't run on the `continue` either, so we don't really care.
-         try:
-             self.gdb.load()
-             for hart in self.target.harts:
-                 self.gdb.select_hart(hart)
-                 self.gdb.p("$pc=_start")
-         except ValueError: #invalid literal for int() with base 0: 'No symbol table is loaded.  Use the "file" command.'
-             pass
-         finally:
-             
-         self.gdb.select_hart(self.hart)
+         self.gdb.load()
+         self.parkOtherHarts()
+         self.gdb.command("b _exit")
          self.gdb.c()
          assertEqual(self.gdb.p("status"), self.crc)
          os.unlink(self.download_c.name)
  
 -#class MprvTest(GdbTest):
 +#class MprvTest(GdbSingleHartTest):
  #    compile_args = ("programs/mprv.S", )
  #    def setup(self):
  #        self.gdb.load()
  #        output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)")
  #        assertIn("0xbead", output)
  
 -class PrivTest(GdbTest):
 +class PrivTest(GdbSingleHartTest):
      compile_args = ("programs/priv.S", )
      def setup(self):
          # pylint: disable=attribute-defined-outside-init
diff --combined debug/testlib.py
index 09baf1bec6bb522fb7d85631f2112c61dd1270de,0a6c1856e373e3dac240a0c15f2e1a708bf556ea..fb5bee33b1284b36ecafe918821a979ad1cf738c
@@@ -549,8 -549,6 +549,8 @@@ class Gdb(object)
          output = self.command("load", ops=1000)
          assert "failed" not in  output
          assert "Transfer rate" in output
 +        output = self.command("compare-sections", ops=1000)
 +        assert "MIS" not in output
  
      def b(self, location):
          output = self.command("b %s" % location, ops=5)
@@@ -854,25 -852,25 +854,28 @@@ class GdbTest(BaseTest)
          self.gdb.interrupt()
          self.gdb.command("disassemble", ops=20)
          self.gdb.command("info registers all", ops=100)
 +        self.gdb.command("flush regs")
 +        self.gdb.command("info threads", ops=100)
  
      def classTeardown(self):
          del self.gdb
          BaseTest.classTeardown(self)
  
- class GdbSingleHartTest(GdbTest):
-     def classSetup(self):
-         GdbTest.classSetup(self)
+     def parkOtherHarts(self):
+         """Park harts besides the currently selected one in loop_forever()."""
          for hart in self.target.harts:
              # Park all harts that we're not using in a safe place.
              if hart != self.hart:
                  self.gdb.select_hart(hart)
                  self.gdb.p("$pc=loop_forever")
 +
          self.gdb.select_hart(self.hart)
  
+ class GdbSingleHartTest(GdbTest):
+     def classSetup(self):
+         GdbTest.classSetup(self)
+         self.parkOtherHarts()
  class ExamineTarget(GdbTest):
      def test(self):
          for hart in self.target.harts: