X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=debug%2Ftargets.py;h=63994db87cd252b98839c23ade1597a198b839ae;hb=4dddbc79ada7f0a836cf538676c57c8df103ccf6;hp=d661d14a59a4638a3ef2924e142c75699d99ac2e;hpb=6c2ad1c5c27f5e19e005541f7665a32814d32e0f;p=riscv-tests.git diff --git a/debug/targets.py b/debug/targets.py index d661d14..63994db 100644 --- a/debug/targets.py +++ b/debug/targets.py @@ -34,6 +34,11 @@ class Hart(object): # Defaults to target- name = None + # When reset, the PC must be at one of the values listed here. + # This is a list because on some boards the reset vector depends on + # jumpers. + reset_vectors = [] + def extensionSupported(self, letter): # target.misa is set by testlib.ExamineTarget if self.misa: @@ -55,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 @@ -70,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 = [] @@ -91,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 .lds @@ -106,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" % ( @@ -145,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 " @@ -165,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