# Defaults to target-<index>
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
# 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
# before starting the test.
gdb_setup = []
+ # Supports mtime at 0x2004000
+ supports_clint_mtime = True
+
# Internal variables:
directory = None
temporary_files = []
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__
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
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 "
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 "
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