12 temporary_binary
= None
17 def __init__(self
, server_cmd
, sim_cmd
, isolate
):
18 self
.server_cmd
= server_cmd
19 self
.sim_cmd
= sim_cmd
20 self
.isolate
= isolate
23 """Start the target, eg. a simulator."""
27 """Start the debug server that gdb connects to, eg. OpenOCD."""
28 if self
.openocd_config
:
29 return testlib
.Openocd(server_cmd
=self
.server_cmd
,
30 config
=self
.openocd_config
)
32 raise NotImplementedError
34 def compile(self
, *sources
):
35 binary_name
= "%s_%s-%d" % (
37 os
.path
.basename(os
.path
.splitext(sources
[0])[0]),
40 self
.temporary_binary
= tempfile
.NamedTemporaryFile(
41 prefix
=binary_name
+ "_")
42 binary_name
= self
.temporary_binary
.name
43 Target
.temporary_files
.append(self
.temporary_binary
)
44 march
= "rv%dima" % self
.xlen
47 if self
.extensionSupported("c"):
49 testlib
.compile(sources
+
50 ("programs/entry.S", "programs/init.c",
53 "-T", "targets/%s/link.lds" % (self
.directory
or self
.name
),
56 "-DXLEN=%d" % self
.xlen
,
61 def extensionSupported(self
, letter
):
62 # target.misa is set by testlib.ExamineTarget
64 return self
.misa
& (1 << (ord(letter
.upper()) - ord('A')))
68 class SpikeTarget(Target
):
69 # pylint: disable=abstract-method
70 instruction_hardware_breakpoint_count
= 4
73 class Spike64Target(SpikeTarget
):
78 # Would like to use 0x7fffffffffff0000 because it crosses the 0x8000...
79 # boundary, but spike doesn't support that in the code where it generates
83 openocd_config
= "targets/%s/openocd.cfg" % directory
86 return testlib
.Spike(self
)
88 class Spike32Target(SpikeTarget
):
94 openocd_config
= "targets/%s/openocd.cfg" % directory
97 return testlib
.Spike(self
)
99 class FreedomE300Target(Target
):
100 name
= "freedom-e300"
104 instruction_hardware_breakpoint_count
= 2
105 openocd_config
= "targets/%s/openocd.cfg" % name
107 class HiFive1Target(FreedomE300Target
):
109 openocd_config
= "targets/%s/openocd.cfg" % name
111 class FreedomE300SimTarget(Target
):
112 name
= "freedom-e300-sim"
116 ram_size
= 256 * 1024 * 1024
117 instruction_hardware_breakpoint_count
= 2
118 openocd_config
= "targets/%s/openocd.cfg" % name
121 return testlib
.VcsSim(sim_cmd
=self
.sim_cmd
, debug
=False)
123 class FreedomU500Target(Target
):
124 name
= "freedom-u500"
128 instruction_hardware_breakpoint_count
= 2
129 openocd_config
= "targets/%s/openocd.cfg" % name
131 class FreedomU500SimTarget(Target
):
132 name
= "freedom-u500-sim"
136 ram_size
= 256 * 1024 * 1024
137 instruction_hardware_breakpoint_count
= 2
138 openocd_config
= "targets/%s/openocd.cfg" % name
141 return testlib
.VcsSim(sim_cmd
=self
.sim_cmd
, debug
=False)
148 FreedomE300SimTarget
,
149 FreedomU500SimTarget
,
152 def add_target_options(parser
):
153 group
= parser
.add_mutually_exclusive_group(required
=True)
155 group
.add_argument("--%s" % t
.name
, action
="store_const", const
=t
,
157 parser
.add_argument("--sim_cmd",
158 help="The command to use to start the actual target (e.g. "
160 parser
.add_argument("--server_cmd",
161 help="The command to use to start the debug server (e.g. OpenOCD)")
163 xlen_group
= parser
.add_mutually_exclusive_group()
164 xlen_group
.add_argument("--32", action
="store_const", const
=32, dest
="xlen",
165 help="Force the target to be 32-bit.")
166 xlen_group
.add_argument("--64", action
="store_const", const
=64, dest
="xlen",
167 help="Force the target to be 64-bit.")
169 parser
.add_argument("--isolate", action
="store_true",
170 help="Try to run in such a way that multiple instances can run at "
171 "the same time. This may make it harder to debug a failure if it "