Merge pull request #156 from riscv/PrivChange
authorTim Newsome <tim@sifive.com>
Mon, 3 Sep 2018 22:03:50 +0000 (15:03 -0700)
committerGitHub <noreply@github.com>
Mon, 3 Sep 2018 22:03:50 +0000 (15:03 -0700)
Reset address translation/perms before PrivChange

1  2 
debug/gdbserver.py

diff --combined debug/gdbserver.py
index 1d58f769c2dbe0718cd691e210d6ca0537611aec,c352bc0471cf98d0f81c390e6eace2ec1ee42ef1..17e1734010d13047c8215eba0a32b25643937b46
@@@ -13,7 -13,7 +13,7 @@@ import testli
  from testlib import assertEqual, assertNotEqual, assertIn, assertNotIn
  from testlib import assertGreater, assertRegexpMatches, assertLess
  from testlib import GdbTest, GdbSingleHartTest, TestFailed
#from testlib import assertTrue
+ from testlib import assertTrue
  
  MSTATUS_UIE = 0x00000001
  MSTATUS_SIE = 0x00000002
@@@ -137,37 -137,6 +137,37 @@@ class SimpleF18Test(SimpleRegisterTest)
      def test(self):
          self.check_reg("f18", "fs2")
  
 +class CustomRegisterTest(SimpleRegisterTest):
 +    def early_applicable(self):
 +        return self.target.implements_custom_test
 +
 +    def check_custom(self, magic):
 +        regs = {k: v for k, v in self.gdb.info_registers("all").iteritems()
 +                if k.startswith("custom")}
 +        assertEqual(set(regs.keys()),
 +                set(("custom1",
 +                    "custom12345",
 +                    "custom12346",
 +                    "custom12347",
 +                    "custom12348")))
 +        for name, value in regs.iteritems():
 +            number = int(name[6:])
 +            if number % 2:
 +                expect = number + magic
 +                assertIn(value, (expect, expect + (1<<32)))
 +            else:
 +                assertIn("Could not fetch register", value)
 +
 +    def test(self):
 +        self.check_custom(0)
 +
 +        # Now test writing
 +        magic = 6667
 +        self.gdb.p("$custom12345=%d" % (12345 + magic))
 +        self.gdb.stepi()
 +
 +        self.check_custom(magic)
 +
  class SimpleNoExistTest(GdbTest):
      def test(self):
          try:
@@@ -985,9 -954,6 +985,6 @@@ class PrivTest(GdbSingleHartTest)
              self.supported.add(2)
          self.supported.add(3)
  
- class PrivRw(PrivTest):
-     def test(self):
-         """Test reading/writing priv."""
          # Disable physical memory protection by allowing U mode access to all
          # memory.
          try:
              # SATP only exists if you have S mode.
              pass
  
+ class PrivRw(PrivTest):
+     def test(self):
+         """Test reading/writing priv."""
          # Leave the PC at _start, where the first 4 instructions should be
          # legal in any mode.
          for privilege in range(4):
              if privilege in self.supported:
                  assertEqual(actual, privilege)
  
- # XXX temporarily disabling this test
- #class PrivChange(PrivTest):
- #    def test(self):
- #        """Test that the core's privilege level actually changes."""
- #
- #        if 0 not in self.supported:
- #            return 'not_applicable'
- #
- #        self.gdb.b("main")
- #        self.gdb.c()
- #
- #        # Machine mode
- #        self.gdb.p("$priv=3")
- #        main_address = self.gdb.p("$pc")
- #        self.gdb.stepi()
- #        assertEqual("%x" % self.gdb.p("$pc"), "%x" % (main_address+4))
- #
- #        # User mode
- #        self.gdb.p("$priv=0")
- #        self.gdb.stepi()
- #        # Should have taken an exception, so be nowhere near main.
- #        pc = self.gdb.p("$pc")
- #        assertTrue(pc < main_address or pc > main_address + 0x100)
+ class PrivChange(PrivTest):
+     def test(self):
+         """Test that the core's privilege level actually changes."""
+         if 0 not in self.supported:
+             return 'not_applicable'
+         self.gdb.b("main")
+         self.gdb.c()
+         # Machine mode
+         self.gdb.p("$priv=3")
+         main_address = self.gdb.p("$pc")
+         self.gdb.stepi()
+         assertEqual("%x" % self.gdb.p("$pc"), "%x" % (main_address+4))
+         # User mode
+         self.gdb.p("$priv=0")
+         self.gdb.stepi()
+         # Should have taken an exception, so be nowhere near main.
+         pc = self.gdb.p("$pc")
+         assertTrue(pc < main_address or pc > main_address + 0x100)
  
  parsed = None
  def main():