X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=debug%2Ftargets.py;h=e92b5932c00ff453542d8165bc136a06763b34d7;hb=4590b79bc7241f3fa2424f96b4c6666a864fb6a9;hp=8efa2559d8f72c2539100b2eddfa444e6cdb414f;hpb=3a44725d27f6b2c77f0ca912d792b6856fde6a17;p=riscv-tests.git diff --git a/debug/targets.py b/debug/targets.py index 8efa255..e92b593 100644 --- a/debug/targets.py +++ b/debug/targets.py @@ -34,34 +34,10 @@ class Hart(object): # Defaults to target- name = None - def __init__(self): - self.temporary_binary = None - - def compile(self, *sources): - binary_name = "%s_%s-%d" % ( - self.name, - os.path.basename(os.path.splitext(sources[0])[0]), - self.xlen) - if Target.isolate: - self.temporary_binary = tempfile.NamedTemporaryFile( - prefix=binary_name + "_") - binary_name = self.temporary_binary.name - Target.temporary_files.append(self.temporary_binary) - march = "rv%dima" % self.xlen - for letter in "fdc": - if self.extensionSupported(letter): - march += letter - testlib.compile(sources + - ("programs/entry.S", "programs/init.c", - "-I", "../env", - "-march=%s" % march, - "-T", self.link_script_path, - "-nostartfiles", - "-mcmodel=medany", - "-DXLEN=%d" % self.xlen, - "-o", binary_name), - xlen=self.xlen) - return binary_name + # 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 @@ -84,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 @@ -96,6 +72,9 @@ class Target(object): # before starting the test. gdb_setup = [] + # Supports mtime at 0x2004000 + supports_clint_mtime = True + # Internal variables: directory = None temporary_files = [] @@ -106,6 +85,7 @@ class Target(object): self.directory = os.path.dirname(path) self.server_cmd = parsed.server_cmd self.sim_cmd = parsed.sim_cmd + self.temporary_binary = None Target.isolate = parsed.isolate if not self.name: self.name = type(self).__name__ @@ -116,6 +96,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 @@ -131,7 +113,35 @@ 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" % ( + self.name, + os.path.basename(os.path.splitext(sources[0])[0]), + hart.xlen) + if Target.isolate: + self.temporary_binary = tempfile.NamedTemporaryFile( + prefix=binary_name + "_") + binary_name = self.temporary_binary.name + Target.temporary_files.append(self.temporary_binary) + march = "rv%dima" % hart.xlen + for letter in "fdc": + if hart.extensionSupported(letter): + march += letter + testlib.compile(sources + + ("programs/entry.S", "programs/init.c", + "-DNHARTS=%d" % len(self.harts), + "-I", "../env", + "-march=%s" % march, + "-T", hart.link_script_path, + "-nostartfiles", + "-mcmodel=medany", + "-DXLEN=%d" % hart.xlen, + "-o", binary_name), + xlen=hart.xlen) + return binary_name def add_target_options(parser): parser.add_argument("target", help=".py file that contains definition for " @@ -163,12 +173,17 @@ 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 + for h in t.harts : + if (h.xlen == 0): + h.xlen = parsed.xlen + elif (h.xlen != parsed.xlen): + raise Exception("The target has an XLEN of %d, but the command line specified an XLEN of %d. They must match." % (h.xlen, parsed.xlen)) return t