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
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:
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():