Add test case for `riscv expose_custom`.
[riscv-tests.git] / debug / targets.py
index d09b5764edf51e7c2b922f6c70bf0ad8c83a42e5..63994db87cd252b98839c23ade1597a198b839ae 100644 (file)
@@ -60,7 +60,7 @@ class Target(object):
 
     # Timeout waiting for the server to start up. This is different than the
     # GDB timeout, which is how long GDB waits for commands to execute.
-    # The server_timeout is how long this script waits for the Server to be
+    # The server_timeout is how long this script waits for the server to be
     # ready for GDB connections.
     server_timeout_sec = 60
 
@@ -75,6 +75,10 @@ class Target(object):
     # Supports mtime at 0x2004000
     supports_clint_mtime = True
 
+    # Implements custom debug registers like spike does. It seems unlikely any
+    # hardware will every do that.
+    implements_custom_test = False
+
     # Internal variables:
     directory = None
     temporary_files = []
@@ -96,6 +100,8 @@ class Target(object):
                 self.openocd_config_path)
         for i, hart in enumerate(self.harts):
             hart.index = i
+            if not hasattr(hart, 'id'):
+                hart.id = i
             if not hart.name:
                 hart.name = "%s-%d" % (self.name, i)
             # Default link script to <name>.lds
@@ -111,7 +117,8 @@ class Target(object):
     def server(self):
         """Start the debug server that gdb connects to, eg. OpenOCD."""
         return testlib.Openocd(server_cmd=self.server_cmd,
-                config=self.openocd_config_path)
+                config=self.openocd_config_path,
+                timeout=self.server_timeout_sec)
 
     def compile(self, hart, *sources):
         binary_name = "%s_%s-%d" % (
@@ -150,10 +157,10 @@ def add_target_options(parser):
             help="The command to use to start the debug server (e.g. OpenOCD)")
 
     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.")
+    xlen_group.add_argument("--32", action="store_const", const=32,
+            dest="xlen", default=0, help="Force the target to be 32-bit.")
+    xlen_group.add_argument("--64", action="store_const", const=64,
+            dest="xlen", default=0, 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 "
@@ -170,12 +177,20 @@ def target(parsed):
     found = []
     for name in dir(module):
         definition = getattr(module, name)
-        if type(definition) == type and issubclass(definition, Target):
+        if isinstance(definition, type) and issubclass(definition, Target):
             found.append(definition)
     assert len(found) == 1, "%s does not define exactly one subclass of " \
             "targets.Target" % parsed.target
 
     t = found[0](parsed.target, parsed)
     assert t.harts, "%s doesn't have any harts defined!" % t.name
+    if parsed.xlen > 0:
+        for h in t.harts:
+            if h.xlen == 0:
+                h.xlen = parsed.xlen
+            elif h.xlen != parsed.xlen:
+                raise Exception("The target hart specified an XLEN of %d, but "\
+                        "the command line specified an XLEN of %d. They must "\
+                        "match." % (h.xlen, parsed.xlen))
 
     return t