diff --git a/.gitmodules b/.gitmodules index fdeb85ef..4f456278 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,3 +28,11 @@ path = musl url = git://git.musl-libc.org/musl branch = master +[submodule "spike"] + path = spike + url = https://github.com/riscv-software-src/riscv-isa-sim.git + branch = master +[submodule "pk"] + path = pk + url = https://github.com/riscv-software-src/riscv-pk.git + branch = master diff --git a/Makefile.in b/Makefile.in index 7f36894d..a67c4b91 100644 --- a/Makefile.in +++ b/Makefile.in @@ -10,12 +10,10 @@ MUSL_SRCDIR := @with_musl_src@ LINUX_HEADERS_SRCDIR := @with_linux_headers_src@ GDB_SRCDIR := @with_gdb_src@ QEMU_SRCDIR := @with_qemu_src@ +SPIKE_SRCDIR := @with_spike_src@ +PK_SRCDIR := @with_pk_src@ -SIM:=qemu - -# Default branch for proxy kernel and spike -SPIKE_BRANCH:=master -PK_BRANCH:=master +SIM ?= @WITH_SIM@ ifeq ($(srcdir)/riscv-gcc,$(GCC_SRCDIR)) # We need a relative source dir for the gcc configure, to make msys2 mingw64 @@ -36,6 +34,7 @@ WITH_TUNE ?= @WITH_TUNE@ WITH_ISA_SPEC ?= @WITH_ISA_SPEC@ SYSROOT := $(INSTALL_DIR)/sysroot ENABLE_LIBSANITIZER ?= @enable_libsanitizer@ +QEMU_TARGETS ?= @qemu_targets@ SHELL := /bin/sh AWK := @GAWK@ @@ -172,14 +171,15 @@ report-gdb: report-gdb-@default_target@ .PHONY: build-sim ifeq ($(SIM),qemu) +QEMU_CPU=$(shell $(srcdir)/scripts/march-to-cpu-opt $(WITH_ARCH)) SIM_PATH:=$(srcdir)/scripts/wrapper/qemu -SIM_PREPARE:=PATH="$(SIM_PATH):$(INSTALL_DIR)/bin:$(PATH)" RISC_V_SYSROOT="$(SYSROOT)" +SIM_PREPARE:=PATH="$(SIM_PATH):$(INSTALL_DIR)/bin:$(PATH)" RISC_V_SYSROOT="$(SYSROOT)" QEMU_CPU="$(QEMU_CPU)" SIM_STAMP:= stamps/build-qemu else ifeq ($(SIM),spike) # Using spike simulator. SIM_PATH:=$(srcdir)/scripts/wrapper/spike -SIM_PREPARE:=PATH="$(SIM_PATH):$(INSTALL_DIR)/bin:$(PATH)" PK_PATH="$(INSTALL_DIR)/$(NEWLIB_TUPLE)/bin/" +SIM_PREPARE:=PATH="$(SIM_PATH):$(INSTALL_DIR)/bin:$(PATH)" PK_PATH="$(INSTALL_DIR)/$(NEWLIB_TUPLE)/bin/" ARCH_STR="$(WITH_ARCH)" SIM_STAMP:= stamps/build-spike ifneq (,$(findstring rv32,$(NEWLIB_MULTILIB_NAMES))) SIM_STAMP+= stamps/build-pk32 @@ -258,6 +258,12 @@ else QEMU_SRC_GIT := endif +ifeq ($(findstring $(srcdir),$(SPIKE_SRCDIR)),$(srcdir)) +SPIKE_SRC_GIT := $(SPIKE_SRCDIR)/.git +else +SPIKE_SRC_GIT := +endif + ifneq ("$(wildcard $(GCC_SRCDIR)/.git)","") GCCPKGVER := g$(shell git -C $(GCC_SRCDIR) describe --always --dirty --exclude '*') else @@ -803,26 +809,20 @@ stamps/build-gcc-musl-stage2: $(GCC_SRCDIR) $(GCC_SRC_GIT) stamps/build-musl-lin cp -a $(INSTALL_DIR)/$(MUSL_TUPLE)/lib* $(SYSROOT) mkdir -p $(dir $@) && touch $@ -spike-src: - git clone https://github.com/riscv/riscv-isa-sim.git -b $(SPIKE_BRANCH) $@ - -pk-src: - git clone https://github.com/riscv/riscv-pk.git -b $(PK_BRANCH) $@ - -stamps/build-spike: spike-src +stamps/build-spike: $(SPIKE_SRCDIR) $(SPIKE_SRC_GIT) rm -rf $@ $(notdir $@) mkdir $(notdir $@) - cd $(notdir $@) && ../$ $@ -stamps/build-pk32: pk-src stamps/build-gcc-newlib-stage2 +stamps/build-pk32: $(PK_SRCDIR) stamps/build-gcc-newlib-stage2 rm -rf $@ $(notdir $@) mkdir $(notdir $@) - cd $(notdir $@) && ../$ $@ -stamps/build-pk64: pk-src stamps/build-gcc-newlib-stage2 +stamps/build-pk64: $(PK_SRCDIR) stamps/build-gcc-newlib-stage2 rm -rf $@ $(notdir $@) mkdir $(notdir $@) - cd $(notdir $@) && ../$ idx: + v_idx -= 1 + major = int(ext_str[v_idx+1:end_idx]) + version_begin_idx = v_idx+1 + if (ext_str[v_idx] == 'p'): + minor = major + major_v_idx = v_idx - 1 + while (ext_str[major_v_idx].isdigit()) and major_v_idx > idx: + major_v_idx -= 1 + major = int(ext_str[major_v_idx+1:v_idx]) + version_begin_idx = major_v_idx+1 + + return end_idx, ext_str[idx:version_begin_idx], major, minor + +def parse_version(ext_str, idx): + major = 2 + minor = 0 + strlen = len(ext_str) + end_idx = idx + 1 + if idx+1 < strlen and ext_str[idx+1].isdigit(): + v_idx = idx + 1 + while v_idx < strlen and (ext_str[v_idx].isdigit()): + v_idx += 1 + major = int(ext_str[idx+1:v_idx]) + end_idx = v_idx + if (ext_str[v_idx] == 'p'): + minor_v_idx = v_idx + 1 + while minor_v_idx < strlen and (ext_str[minor_v_idx].isdigit()): + minor_v_idx += 1 + minor = int(ext_str[v_idx+1:minor_v_idx]) + end_idx = minor_v_idx + + return end_idx, ext_str[idx], major, minor + +def parse_march(march): + if len(march) < 5: + return None + march = march.replace("rv64g", "rv64imafd").replace("rv32g", "rv32imafd") + if march[0:5] not in ['rv64i', 'rv32i', 'rv32e']: + print (march[0:5]) + return None + + ext_str = march[4:] + idx = 0 + extstrlens = len(ext_str) + exts = dict() + while idx < extstrlens: + if ext_str[idx] in SUPPORTTED_EXTS: + idx, ext_name, major, minor = parse_version(ext_str, idx) + elif ext_str[idx] in MC_EXT_PREFIX: + idx, ext_name, major, minor = parse_mc_ext(ext_str, idx) + elif ext_str[idx] == '_': + idx = idx + 1 + continue + else: + raise Exception("Unrecognized ext : `%s`, %s" % + (ext_str[idx], ext_str)) + exts[ext_name] = (major, minor) + return exts + +def get_vlen(ext_dict): + vlen = 0 + for ext in ext_dict.keys(): + if ext == 'v': + vlen = max(vlen, 128) + elif (ext.startswith('zvl') and ext[-1] == 'b'): + zvlen = int(arch[3:-1]) + vlen = max(vlen, zvlen) + elif ext.startswith("zve"): + zvelen = int(arch[3:-1]) + vlen = max(vlen, zvelen) + return vlen + +def conver_arch_to_qemu_cpu_opt(march): + if len(march) < 5: + return None + + ext_dict = parse_march(march) + + cpu_opt = [] + cpu_opt.append(march[0:4]) # rv32 or rv64 + + vlen = get_vlen(ext_dict) + + if vlen != 0: + cpu_opt.append("vlen=%d" % vlen) + + for ext in ext_dict.keys(): + if ext in EXT_OPTS: + cpu_opt.append(EXT_OPTS[ext]) + return ",".join(cpu_opt) + +def selftest(): + print(parse_march("rv64gc")) + +def main(argv): + opt = parse_opt(argv) + if opt.selftest: + selftest() + return 0 + cpu_opt = conver_arch_to_qemu_cpu_opt(opt.march) + print (cpu_opt) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/scripts/wrapper/qemu/riscv64-unknown-linux-gnu-run b/scripts/wrapper/qemu/riscv64-unknown-linux-gnu-run index 386c9175..078360e0 100755 --- a/scripts/wrapper/qemu/riscv64-unknown-linux-gnu-run +++ b/scripts/wrapper/qemu/riscv64-unknown-linux-gnu-run @@ -12,4 +12,4 @@ done xlen="$(readelf -h $1 | grep 'Class' | cut -d: -f 2 | xargs echo | sed 's/^ELF//')" -qemu-riscv$xlen -r 5.10 "${qemu_args[@]}" -L ${RISC_V_SYSROOT} "$@" +QEMU_CPU=${QEMU_CPU} qemu-riscv$xlen -r 5.10 "${qemu_args[@]}" -L ${RISC_V_SYSROOT} "$@" diff --git a/scripts/wrapper/spike/riscv64-unknown-linux-gnu-run b/scripts/wrapper/spike/riscv64-unknown-linux-gnu-run index 14a5b00a..6f5ba837 100755 --- a/scripts/wrapper/spike/riscv64-unknown-linux-gnu-run +++ b/scripts/wrapper/spike/riscv64-unknown-linux-gnu-run @@ -1,7 +1,7 @@ #!/bin/sh xlen="$(readelf -h $1 | grep 'Class' | cut -d: -f 2 | xargs echo | sed 's/^ELF//')" - +arch="${ARCH_STR#*=}" spike \ - --isa=RV${xlen}GC \ + --isa=${arch} \ ${PK_PATH}/pk${xlen} "$@" diff --git a/spike b/spike new file mode 160000 index 00000000..a0298a33 --- /dev/null +++ b/spike @@ -0,0 +1 @@ +Subproject commit a0298a33e7b2091ba8d9f3a20838d96dc1164cac