aboutsummaryrefslogtreecommitdiff
path: root/debug/targets.py
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2016-10-18 14:21:02 -0700
committerTim Newsome <tim@sifive.com>2016-10-18 14:21:02 -0700
commit5cd2b39a28c2c77debce4b55c140917c55dc1189 (patch)
tree95a9e94668a02a9a284d24d03c5fb279c26139d7 /debug/targets.py
parentf59770c98f8f3a7762e8a1751cca922ba8afe870 (diff)
downloadriscv-tests-5cd2b39a28c2c77debce4b55c140917c55dc1189.zip
riscv-tests-5cd2b39a28c2c77debce4b55c140917c55dc1189.tar.gz
riscv-tests-5cd2b39a28c2c77debce4b55c140917c55dc1189.tar.bz2
Add framework to test OpenOCD directly.
This took a lot of refactoring to make it look reasonable. There isn't actually any functional OpenOCD test yet. But a dummy test runs a command (and fails).
Diffstat (limited to 'debug/targets.py')
-rw-r--r--debug/targets.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/debug/targets.py b/debug/targets.py
new file mode 100644
index 0000000..3cf9728
--- /dev/null
+++ b/debug/targets.py
@@ -0,0 +1,141 @@
+import os.path
+import tempfile
+
+import testlib
+
+class Target(object):
+ name = "name"
+ xlen = 0
+ directory = None
+ timeout_sec = 2
+ temporary_files = []
+ temporary_binary = None
+ openocd_config = []
+
+ def __init__(self, cmd, run, isolate):
+ self.cmd = cmd
+ self.run = run
+ self.isolate = isolate
+
+ def target(self):
+ """Start the target, eg. a simulator."""
+ pass
+
+ def server(self):
+ """Start the debug server that gdb connects to, eg. OpenOCD."""
+ if self.openocd_config:
+ return testlib.Openocd(cmd=self.cmd, config=self.openocd_config)
+ else:
+ 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 self.isolate:
+ self.temporary_binary = tempfile.NamedTemporaryFile(
+ prefix=binary_name + "_")
+ binary_name = self.temporary_binary.name
+ Target.temporary_files.append(self.temporary_binary)
+ 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):
+ # pylint: disable=abstract-method
+ 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(self.cmd, halted=True)
+
+class Spike32Target(SpikeTarget):
+ name = "spike32"
+ xlen = 32
+
+ def server(self):
+ return testlib.Spike(self.cmd, halted=True, xlen=32)
+
+class FreedomE300Target(Target):
+ name = "freedom-e300"
+ xlen = 32
+ ram = 0x80000000
+ ram_size = 16 * 1024
+ instruction_hardware_breakpoint_count = 2
+ openocd_config = "targets/%s/openocd.cfg" % 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
+ openocd_config = "targets/%s/openocd.cfg" % name
+
+ def target(self):
+ return testlib.VcsSim(simv=self.run, debug=False)
+
+class FreedomU500Target(Target):
+ name = "freedom-u500"
+ xlen = 64
+ ram = 0x80000000
+ ram_size = 16 * 1024
+ instruction_hardware_breakpoint_count = 2
+ openocd_config = "targets/%s/openocd.cfg" % 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
+ openocd_config = "targets/%s/openocd.cfg" % name
+
+ def target(self):
+ return testlib.VcsSim(simv=self.run, debug=False)
+
+targets = [
+ Spike32Target,
+ Spike64Target,
+ FreedomE300Target,
+ FreedomU500Target,
+ FreedomE300SimTarget,
+ FreedomU500SimTarget]
+
+def add_target_options(parser):
+ group = parser.add_mutually_exclusive_group(required=True)
+ for t in targets:
+ group.add_argument("--%s" % t.name, action="store_const", const=t,
+ dest="target")
+ parser.add_argument("--run",
+ help="The command to use to start the actual target (e.g. "
+ "simulation)")
+ parser.add_argument("--cmd",
+ help="The command to use to start the debug server.")
+
+ xlen_group = parser.add_mutually_exclusive_group()
+ xlen_group.add_argument("--32", action="store_const", const=32, dest="xlen",
+ help="Force the target to be 32-bit.")
+ xlen_group.add_argument("--64", action="store_const", const=64, dest="xlen",
+ help="Force the target to be 64-bit.")
+
+ parser.add_argument("--isolate", action="store_true",
+ help="Try to run in such a way that multiple instances can run at "
+ "the same time. This may make it harder to debug a failure if it "
+ "does occur.")