Skip to content

Commit c2b4923

Browse files
authored
Merge pull request #1370 from Incarnation-p-lee/master
Inject CPU options to spike run test from elf file
2 parents 8e9fb09 + 646653b commit c2b4923

File tree

5 files changed

+112
-42
lines changed

5 files changed

+112
-42
lines changed

.github/setup-apt.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ apt update
66
apt install -y autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev \
77
libgmp-dev gawk build-essential bison flex texinfo gperf libtool \
88
patchutils bc zlib1g-dev libexpat-dev git ninja-build cmake libglib2.0-dev expect \
9-
device-tree-compiler
9+
device-tree-compiler python3-pyelftools

Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ SIM_STAMP:= stamps/build-qemu stamps/install-python-package
208208
else
209209
ifeq ($(SIM),spike)
210210
# Using spike simulator.
211-
SIM_PATH:=$(srcdir)/scripts/wrapper/spike
211+
SIM_PATH:=$(srcdir)/scripts/wrapper/spike:$(srcdir)/scripts
212212
SIM_PREPARE:=PATH="$(SIM_PATH):$(INSTALL_DIR)/bin:$(PATH)" PK_PATH="$(INSTALL_DIR)/$(NEWLIB_TUPLE)/bin/" ARCH_STR="$(WITH_ARCH)"
213213
SIM_STAMP:= stamps/build-spike
214214
ifneq (,$(findstring rv32,$(NEWLIB_MULTILIB_NAMES)))

scripts/march-to-cpu-opt

Lines changed: 95 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import elftools.elf.elffile
77
import elftools.elf.enums
88
import elftools.elf.sections
99

10-
EXT_OPTS = {
10+
QEMU_EXT_OPTS = {
1111
"zba": "zba=true",
1212
"zbb": "zbb=true",
1313
"zbc": "zbc=true",
@@ -16,21 +16,48 @@ EXT_OPTS = {
1616
"zve32f": "Zve32f=true",
1717
"zve64f": "Zve64f=true",
1818
"zfh": "Zfh=true",
19-
"zfhmin": "Zfhmin=true",
19+
"zfhmin": "Zfhmin=true",
2020
"zhinx": "zhinx=true",
2121
"zfinx": "zfinx=true",
2222
"zdinx": "zdinx=true",
2323
}
2424

25+
SPIKE_EXT_NOT_ALLOWED = [
26+
"zve32x",
27+
"zve32f",
28+
"zve64x",
29+
"zve64f",
30+
"zve64d",
31+
"zvl32b",
32+
"zvl64b",
33+
"zvl128b",
34+
"zvl256b",
35+
"zvl512b",
36+
"zvl1024b",
37+
"zvl2048b",
38+
"zvl4096b",
39+
]
40+
41+
CPU_OPTIONS = {
42+
"xlen": "",
43+
"vlen": "",
44+
"extensions": [],
45+
}
46+
2547
SUPPORTTED_EXTS = "iemafdcbvph"
2648
MC_EXT_PREFIX = "zsx"
2749

2850
def parse_opt(argv):
2951
parser = argparse.ArgumentParser()
3052
parser.add_argument('-march', '--with-arch', type=str, dest='march')
3153
parser.add_argument('-selftest', action='store_true')
32-
parser.add_argument('--get-riscv-tag', type=str)
33-
parser.add_argument('--get-elf-class', type=str)
54+
parser.add_argument('--elf-file-path', type=str)
55+
parser.add_argument('--print-xlen', action='store_true', default=False)
56+
parser.add_argument('--print-vlen', action='store_true', default=False)
57+
parser.add_argument('--print-qemu-cpu', action='store_true', default=False)
58+
parser.add_argument('--print-spike-isa', action='store_true', default=False)
59+
parser.add_argument('--print-spike-varch', action='store_true',
60+
default=False)
3461
opt = parser.parse_args()
3562
return opt
3663

@@ -119,31 +146,47 @@ def get_vlen(ext_dict):
119146
vlen = max(vlen, zvelen)
120147
return vlen
121148

122-
def conver_arch_to_qemu_cpu_opt(march):
123-
if len(march) < 5:
124-
return None
125-
126-
ext_dict = parse_march(march)
127-
128-
cpu_opt = []
129-
cpu_opt.append(march[0:4]) # rv32 or rv64
130-
131-
vlen = get_vlen(ext_dict)
149+
def print_qemu_cpu():
150+
cpu_options = []
151+
cpu_options.append("rv{0}".format(CPU_OPTIONS['xlen']))
132152

133-
if vlen != 0:
134-
cpu_opt.append("vlen=%d" % vlen)
153+
if CPU_OPTIONS['vlen']:
154+
cpu_options.append("vlen={0}".format(CPU_OPTIONS['vlen']))
135155

136156
disable_all_fd = False
137-
for ext in ext_dict.keys():
138-
if ext in EXT_OPTS:
139-
cpu_opt.append(EXT_OPTS[ext])
157+
for ext in CPU_OPTIONS['extensions']:
158+
if ext in QEMU_EXT_OPTS:
159+
cpu_options.append(QEMU_EXT_OPTS[ext])
160+
140161
if ext in ['zhinx', 'zfinx', 'zdinx']:
141162
disable_all_fd = True
163+
142164
if disable_all_fd:
143-
cpu_opt.append("f=false")
144-
cpu_opt.append("d=false")
145-
return ",".join(cpu_opt)
165+
cpu_options.append("f=false")
166+
cpu_options.append("d=false")
167+
168+
return ",".join(cpu_options)
169+
170+
def print_spike_isa():
171+
cpu_options = []
172+
cpu_options.append("rv{0}".format(CPU_OPTIONS['xlen']))
173+
174+
for ext in CPU_OPTIONS['extensions']:
175+
if ext not in SPIKE_EXT_NOT_ALLOWED:
176+
normalized_ext_name = ext
177+
178+
if len(ext) > 1:
179+
normalized_ext_name = "_{0}".format(normalized_ext_name)
146180

181+
cpu_options.append(normalized_ext_name)
182+
183+
return "".join(cpu_options)
184+
185+
def print_spike_varch():
186+
if not CPU_OPTIONS['vlen']:
187+
return ""
188+
189+
return "vlen:{0},elen:{1}".format(CPU_OPTIONS['vlen'], CPU_OPTIONS['xlen'])
147190

148191
class TestArchStringParse(unittest.TestCase):
149192
def _test(self, arch, expected_arch_list, expected_vlen=0):
@@ -168,7 +211,7 @@ def open_elf(path):
168211
raise Exception("%s is not ELF file!" % path)
169212
return elffile
170213

171-
def read_elf_class(path):
214+
def get_xlen(path):
172215
elffile = open_elf(path)
173216
return elffile.elfclass
174217

@@ -204,21 +247,41 @@ def read_arch_attr (path):
204247
return val
205248
raise Exception("Not found ELF attribute in %s?" % path)
206249

250+
def parse_elf_file(elf_file_path):
251+
extensions = []
252+
extension_dict = parse_march(read_arch_attr(elf_file_path))
253+
254+
for extension in extension_dict.keys():
255+
extensions.append(extension)
256+
257+
CPU_OPTIONS["extensions"] = extensions
258+
CPU_OPTIONS["vlen"] = get_vlen(extension_dict)
259+
CPU_OPTIONS["xlen"] = get_xlen(elf_file_path)
260+
207261
def main(argv):
208262
opt = parse_opt(argv)
209263
if opt.selftest:
210264
selftest()
211265
return 0
212-
if (opt.get_elf_class):
213-
elf_class = read_elf_class (opt.get_elf_class)
214-
print (elf_class)
266+
267+
parse_elf_file(opt.elf_file_path)
268+
269+
if opt.print_xlen:
270+
print(CPU_OPTIONS['xlen'])
215271
return
216-
if (opt.get_riscv_tag):
217-
march = read_arch_attr (opt.get_riscv_tag)
218-
else:
219-
march = opt.march
220-
cpu_opt = conver_arch_to_qemu_cpu_opt(march)
221-
print (cpu_opt)
272+
273+
if opt.print_vlen:
274+
print(CPU_OPTIONS['vlen'])
275+
return
276+
277+
if opt.print_qemu_cpu:
278+
print(print_qemu_cpu())
279+
280+
if opt.print_spike_isa:
281+
print(print_spike_isa())
282+
283+
if opt.print_spike_varch:
284+
print(print_spike_varch())
222285

223286
if __name__ == '__main__':
224287
sys.exit(main(sys.argv))

scripts/wrapper/qemu/riscv64-unknown-linux-gnu-run

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ do
1010
shift
1111
done
1212

13-
xlen="$(march-to-cpu-opt --get-elf-class $1)"
13+
xlen="$(march-to-cpu-opt --elf-file-path $1 --print-xlen)"
14+
qemu_cpu="$(march-to-cpu-opt --elf-file-path $1 --print-qemu-cpu)"
1415

15-
QEMU_CPU="$(march-to-cpu-opt --get-riscv-tag $1)" qemu-riscv$xlen -r 5.10 "${qemu_args[@]}" -L ${RISC_V_SYSROOT} "$@"
16+
QEMU_CPU="${qemu_cpu}" qemu-riscv${xlen} -r 5.10 "${qemu_args[@]}" \
17+
-L ${RISC_V_SYSROOT} "$@"
Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
#!/bin/sh
1+
#!/bin/bash
22

3-
xlen="$(readelf -h $1 | grep 'Class' | cut -d: -f 2 | xargs echo | sed 's/^ELF//')"
4-
arch="${ARCH_STR#*=}"
5-
spike \
6-
--isa=${arch} \
7-
${PK_PATH}/pk${xlen} "$@"
3+
xlen="$(march-to-cpu-opt --elf-file-path $1 --print-xlen)"
4+
isa="$(march-to-cpu-opt --elf-file-path $1 --print-spike-isa)"
5+
varch="$(march-to-cpu-opt --elf-file-path $1 --print-spike-varch)"
6+
7+
isa_option="--isa=${isa}"
8+
varch_option=""
9+
10+
[[ ! -z ${varch} ]] && varch_option="--varch=${varch}"
11+
12+
spike ${isa_option} ${varch_option} ${PK_PATH}/pk${xlen} "$@"

0 commit comments

Comments
 (0)