-
- def test_mprv(self):
- """Test that the debugger can access memory when MPRV is set."""
- self.gdb.c(wait=False)
- time.sleep(0.5)
- self.gdb.interrupt()
- output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)")
- self.assertIn("0xbead", output)
-
-class PrivTest(DeleteServer):
- def setUp(self):
- self.binary = target.compile("programs/priv.S")
- self.server = target.server()
- self.gdb = gdb(target, self.server.port, self.binary)
- self.gdb.load()
-
- misa = self.gdb.p("$misa")
- self.supported = set()
- if misa & (1<<20):
- self.supported.add(0)
- if misa & (1<<18):
- self.supported.add(1)
- if misa & (1<<7):
- self.supported.add(2)
- self.supported.add(3)
-
- def test_rw(self):
- """Test reading/writing priv."""
- for privilege in range(4):
- self.gdb.p("$priv=%d" % privilege)
- self.gdb.stepi()
- actual = self.gdb.p("$priv")
- self.assertIn(actual, self.supported)
- if privilege in self.supported:
- self.assertEqual(actual, privilege)
-
- def test_change(self):
- """Test that the core's privilege level actually changes."""
-
- if 0 not in self.supported:
- # TODO: return not applicable
- return
-
- self.gdb.b("main")
- self.gdb.c()
-
- # Machine mode
- self.gdb.p("$priv=3")
- main = self.gdb.p("$pc")
- self.gdb.stepi()
- self.assertEqual("%x" % self.gdb.p("$pc"), "%x" % (main+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")
- self.assertTrue(pc < main or pc > main + 0x100)
-
-class Target(object):
- directory = None
- timeout_sec = 2
-
- def server(self):
- raise NotImplementedError
-
- def compile(self, *sources):
- binary_name = "%s_%s-%d" % (
- self.name,
- os.path.basename(os.path.splitext(sources[0])[0]),
- self.xlen)
- if parsed.isolate:
- self.temporary_binary = tempfile.NamedTemporaryFile(
- prefix=binary_name + "_")
- binary_name = self.temporary_binary.name
- testlib.compile(sources +
- ("programs/entry.S", "programs/init.c",
- "-I", "../env",
- "-T", "targets/%s/link.lds" % (self.directory or self.name),
- "-nostartfiles",
- "-mcmodel=medany",
- "-o", binary_name),
- xlen=self.xlen)
- return binary_name
-
-class SpikeTarget(Target):
- directory = "spike"
- ram = 0x80010000
- ram_size = 5 * 1024 * 1024
- instruction_hardware_breakpoint_count = 4
- reset_vector = 0x1000
-
-class Spike64Target(SpikeTarget):
- name = "spike64"
- xlen = 64
-
- def server(self):
- return testlib.Spike(parsed.cmd, halted=True)
-
-class Spike32Target(SpikeTarget):
- name = "spike32"
- xlen = 32
-
- def server(self):
- return testlib.Spike(parsed.cmd, halted=True, xlen=32)
-
-class FreedomE300Target(Target):
- name = "freedom-e300"
- xlen = 32
- ram = 0x80000000
- ram_size = 16 * 1024
- instruction_hardware_breakpoint_count = 2
-
- def server(self):
- return testlib.Openocd(cmd=parsed.cmd,
- config="targets/%s/openocd.cfg" % self.name)
-
-class FreedomE300SimTarget(Target):
- name = "freedom-e300-sim"
- xlen = 32
- timeout_sec = 240
- ram = 0x80000000
- ram_size = 256 * 1024 * 1024
- instruction_hardware_breakpoint_count = 2
-
- def server(self):
- sim = testlib.VcsSim(simv=parsed.run, debug=False)
- openocd = testlib.Openocd(cmd=parsed.cmd,
- config="targets/%s/openocd.cfg" % self.name,
- otherProcess = sim)
- time.sleep(20)
- return openocd
-
-class FreedomU500Target(Target):
- name = "freedom-u500"
- xlen = 64
- ram = 0x80000000
- ram_size = 16 * 1024
- instruction_hardware_breakpoint_count = 2
-
- def server(self):
- return testlib.Openocd(cmd=parsed.cmd,
- config="targets/%s/openocd.cfg" % self.name)
-
-class FreedomU500SimTarget(Target):
- name = "freedom-u500-sim"
- xlen = 64
- timeout_sec = 240
- ram = 0x80000000
- ram_size = 256 * 1024 * 1024
- instruction_hardware_breakpoint_count = 2
-
- def server(self):
- sim = testlib.VcsSim(simv=parsed.run, debug=False)
- openocd = testlib.Openocd(cmd=parsed.cmd,
- config="targets/%s/openocd.cfg" % self.name,
- otherProcess = sim)
- time.sleep(20)
- return openocd
-
-targets = [
- Spike32Target,
- Spike64Target,
- FreedomE300Target,
- FreedomU500Target,
- FreedomE300SimTarget,
- FreedomU500SimTarget]
-
+ self.gdb.command("b _exit")
+ self.gdb.c(timeout=60)
+ assertEqual(self.gdb.p("status"), self.crc)
+ os.unlink(self.download_c.name)
+
+# FIXME: PRIV isn't implemented in the current OpenOCD
+#class MprvTest(GdbTest):
+# compile_args = ("programs/mprv.S", )
+# def setup(self):
+# self.gdb.load()
+#
+# def test(self):
+# """Test that the debugger can access memory when MPRV is set."""
+# self.gdb.c(wait=False)
+# time.sleep(0.5)
+# self.gdb.interrupt()
+# output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)")
+# assertIn("0xbead", output)
+#
+#class PrivTest(GdbTest):
+# compile_args = ("programs/priv.S", )
+# def setup(self):
+# # pylint: disable=attribute-defined-outside-init
+# self.gdb.load()
+#
+# misa = self.target.misa
+# self.supported = set()
+# if misa & (1<<20):
+# self.supported.add(0)
+# if misa & (1<<18):
+# self.supported.add(1)
+# if misa & (1<<7):
+# self.supported.add(2)
+# self.supported.add(3)
+#
+#class PrivRw(PrivTest):
+# def test(self):
+# """Test reading/writing priv."""
+# for privilege in range(4):
+# self.gdb.p("$priv=%d" % privilege)
+# self.gdb.stepi()
+# actual = self.gdb.p("$priv")
+# assertIn(actual, self.supported)
+# if privilege in self.supported:
+# assertEqual(actual, privilege)
+#
+#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