diff --git a/.gitmodules b/.gitmodules index b396b1d43..1fb5889ea 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,7 +16,10 @@ url = https://github.com/google/riscv-dv [submodule "addins/embench-iot"] path = addins/embench-iot - url = https://github.com/embench/embench-iot + url = https://github.com/DTowersM/embench-iot +[submodule "addins/coremark"] + path = addins/coremark + url = https://github.com/eembc/coremark [submodule "addins/sky130_osu_sc_t18"] path = addins/sky130_osu_sc_t18 url = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t18 diff --git a/addins/coremark b/addins/coremark new file mode 160000 index 000000000..f3e8f2e09 --- /dev/null +++ b/addins/coremark @@ -0,0 +1 @@ +Subproject commit f3e8f2e0941e42961aadcc52750b1b5577c157c9 diff --git a/benchmarks/coremark/.gitignore b/benchmarks/coremark/.gitignore deleted file mode 100644 index 0f2251abe..000000000 --- a/benchmarks/coremark/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -coremark.riscv -coremark.bare.riscv \ No newline at end of file diff --git a/benchmarks/coremark/.gitmodules b/benchmarks/coremark/.gitmodules deleted file mode 100644 index 678afc830..000000000 --- a/benchmarks/coremark/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "coremark"] - path = src - url = https://github.com/eembc/coremark diff --git a/benchmarks/coremark/Makefile b/benchmarks/coremark/Makefile index dabce4c24..f25cd2cd6 100644 --- a/benchmarks/coremark/Makefile +++ b/benchmarks/coremark/Makefile @@ -1,28 +1,29 @@ #cmbase=../../addins/coremark PORT_DIR = $(CURDIR)/riscv64-baremetal -cmbase=src +cmbase=../../addins/coremark +work_dir=$(cmbase)/work sources=$(cmbase)/core_main.c $(cmbase)/core_list_join.c $(cmbase)/coremark.h \ $(cmbase)/core_matrix.c $(cmbase)/core_state.c $(cmbase)/core_util.c \ $(PORT_DIR)/core_portme.h $(PORT_DIR)/core_portme.c $(PORT_DIR)/core_portme.mak \ $(PORT_DIR)/crt.S $(PORT_DIR)/encoding.h $(PORT_DIR)/util.h $(PORT_DIR)/syscalls.c -work/coremark.bare.riscv.elf.memfile: work/coremark.bare.riscv +$(work_dir)/coremark.bare.riscv.elf.memfile: $(work_dir)/coremark.bare.riscv riscv64-unknown-elf-objdump -D $< > $<.elf.objdump riscv64-unknown-elf-elf2hex --bit-width 64 --input $< --output $@ extractFunctionRadix.sh $<.elf.objdump - (cd ../../pipelined/regression && (vsim -c -do "do wally-pipelined-batch.do rv64gc coremark" > ../../benchmarks/coremark/work/coremark.bare.riscv.sim.output)) + (cd ../../pipelined/regression && (vsim -c -do "do wally-pipelined-batch.do rv64gc coremark" > $(work_dir)/coremark.sim.log)) cd ../../benchmarks/coremark/ -work/coremark.bare.riscv: $(sources) Makefile -# make -C $(cmbase) PORT_DIR=$(PORT_DIR) compile RISCV=/opt/riscv/riscv-gnu-toolchain XCFLAGS="-march=rv64imd -mabi=lp64d -mbranch-cost=1 -DSKIP_DEFAULT_MEMSET -mtune=sifive-7-series -Ofast -funroll-all-loops -fno-delete-null-pointer-checks -fno-rename-registers --param=loop-max-datarefs-for-datadeps=0 -funroll-all-loops --param=uninlined-function-insns=8 -fno-tree-vrp -fwrapv -fno-toplevel-reorder --param=max-inline-insns-size=128 -fipa-pta" - # These flags were used by WD on CoreMark +$(work_dir)/coremark.bare.riscv: $(sources) Makefile + # make -C $(cmbase) PORT_DIR=$(PORT_DIR) compile RISCV=/opt/riscv/riscv-gnu-toolchain XCFLAGS="-march=rv64imd -mabi=lp64d -mbranch-cost=1 -DSKIP_DEFAULT_MEMSET -mtune=sifive-7-series -Ofast -funroll-all-loops -fno-delete-null-pointer-checks -fno-rename-registers --param=loop-max-datarefs-for-datadeps=0 -funroll-all-loops --param=uninlined-function-insns=8 -fno-tree-vrp -fwrapv -fno-toplevel-reorder --param=max-inline-insns-size=128 -fipa-pta" + # These flags were used by WD on CoreMark make -C $(cmbase) PORT_DIR=$(PORT_DIR) compile RISCV=$(RISCV)/riscv-gnu-toolchain XCFLAGS="-march=rv64imd -mabi=lp64d -mbranch-cost=1 -DSKIP_DEFAULT_MEMSET -mtune=sifive-7-series -Ofast -funroll-all-loops -fno-delete-null-pointer-checks -fno-rename-registers --param=loop-max-datarefs-for-datadeps=0 -funroll-all-loops --param=uninlined-function-insns=8 -fno-tree-vrp -fwrapv -fipa-pta " -# -fno-toplevel-reorder --param=max-inline-insns-size=128 " # adding this bit caused a compiler error - mkdir -p work/ - mv $(cmbase)/coremark.bare.riscv work/ + # -fno-toplevel-reorder --param=max-inline-insns-size=128 " # adding this bit caused a compiler error + mkdir -p $(work_dir) + mv $(cmbase)/coremark.bare.riscv $(work_dir) .PHONY: clean clean: - rm -f work/* + rm -f $(work_dir)/* diff --git a/benchmarks/coremark/riscv64-baremetal/core_portme.c b/benchmarks/coremark/riscv64-baremetal/core_portme.c index 86917f939..74ced52dc 100755 --- a/benchmarks/coremark/riscv64-baremetal/core_portme.c +++ b/benchmarks/coremark/riscv64-baremetal/core_portme.c @@ -210,9 +210,12 @@ CORE_TICKS get_time(void) { */ secs_ret time_in_secs(CORE_TICKS ticks) { secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; - int retvalint = (int)retval; - //ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); - return retval; + float retvalint = (float) retval; + ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); + ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %f\n", retvalint); + ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retval); + ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %f\n", retval); + return retvalint; } #else #error "Please implement timing functionality in core_portme.c" diff --git a/benchmarks/embench/Makefile b/benchmarks/embench/Makefile index c6ac3b67e..90e65f6b6 100644 --- a/benchmarks/embench/Makefile +++ b/benchmarks/embench/Makefile @@ -2,6 +2,8 @@ # Expanded and developed by Daniel Torres dtorres@hmc.edu # Compile Embench for Wally +embench_dir = ../../addins/embench-iot + all: sim size allClean: clean all @@ -10,12 +12,12 @@ build: buildspeed buildsize # uses the build_all.py python file to build the tests in addins/embench-iot/bd_speed/ optimized for speed buildspeed: - ../../addins/embench-iot/build_all.py --builddir=bd_speed --arch riscv32 --chip generic --board rv32wallyverilog --ldflags="-nostartfiles ../../../config/riscv32/boards/rv32wallyverilog/startup/crt0.S" --cflags="-O2 -nostartfiles" - find ../../addins/embench-iot/bd_speed/ -type f ! -name "*.*" | while read f; do cp "$$f" "$$f.elf"; done + $(embench_dir)/build_all.py --builddir=bd_speed --arch riscv32 --chip generic --board rv32wallyverilog --ldflags="-nostartfiles ../../../config/riscv32/boards/rv32wallyverilog/startup/crt0.S" --cflags="-O2 -nostartfiles" + find $(embench_dir)/bd_speed/ -type f ! -name "*.*" | while read f; do cp "$$f" "$$f.elf"; done # uses the build_all.py python file to build the tests in addins/embench-iot/bd_speed/ optimized for size buildsize: - ../../addins/embench-iot/build_all.py --builddir=bd_size --arch riscv32 --chip generic --board rv32wallyverilog --ldflags="-nostdlib -nostartfiles ../../../config/riscv32/boards/rv32wallyverilog/startup/dummy.S" --cflags="-Os -msave-restore" --dummy-libs="libgcc libm libc crt0" + $(embench_dir)/build_all.py --builddir=bd_size --arch riscv32 --chip generic --board rv32wallyverilog --ldflags="-nostdlib -nostartfiles ../../../config/riscv32/boards/rv32wallyverilog/startup/dummy.S" --cflags="-Os -msave-restore" --dummy-libs="libgcc libm libc crt0" # builds dependencies, then launches modelsim and finally runs python wrapper script to present results sim: modelsim_build_memfile modelsim_run speed @@ -27,36 +29,36 @@ modelsim_run: # builds the objdump based on the compiled c elf files objdump: buildspeed - find ../../addins/embench-iot/bd_speed/ -type f -name "*.elf" | while read f; do riscv64-unknown-elf-objdump -S -D "$$f" > "$$f.objdump"; done + find $(embench_dir)/bd_speed/ -type f -name "*.elf" | while read f; do riscv64-unknown-elf-objdump -S -D "$$f" > "$$f.objdump"; done # build memfiles, objdump.lab and objdump.addr files modelsim_build_memfile: objdump - find ../../addins/embench-iot/bd_speed/ -type f -name "*.elf" | while read f; do riscv64-unknown-elf-elf2hex --bit-width 32 --input "$$f" --output "$$f.memfile"; done - find ../../addins/embench-iot/bd_speed/ -type f -name "*.elf.objdump" | while read f; do extractFunctionRadix.sh $$f; done + find $(embench_dir)/bd_speed/ -type f -name "*.elf" | while read f; do riscv64-unknown-elf-elf2hex --bit-width 32 --input "$$f" --output "$$f.memfile"; done + find $(embench_dir)/bd_speed/ -type f -name "*.elf.objdump" | while read f; do extractFunctionRadix.sh $$f; done # builds the tests for speed, runs them on spike and then launches python script to present results # note that the speed python script benchmark_speed.py can get confused if there's both a .output file created from spike and modelsim # you'll need to manually remove one of the two .output files, or run make clean -spike: buildspeed spikecmd speed +spike: buildspeed objdump spike_run speed # command to run spike on all of the benchmarks -spike_run: buildspeed - find ../../addins/embench-iot/bd_speed/ -type f -name "*.elf" | while read f; do spike --isa=rv32imac +signature=$$f.spike.output +signature-granularity=4 $$f; done +spike_run: + find $(embench_dir)/bd_speed/ -type f -name "*.elf" | while read f; do spike --isa=rv32imac +signature=$$f.spike.output +signature-granularity=4 $$f; done # python wrapper to present results of embench size benchmark size: buildsize - ../../addins/embench-iot/benchmark_size.py --builddir=bd_size + $(embench_dir)/benchmark_size.py --builddir=bd_size --json-output > wallySize.output # python wrapper to present results of embench speed benchmark speed: - ../../addins/embench-iot/benchmark_speed.py --builddir=bd_speed --target-module run_wally --cpu-mhz=1 + $(embench_dir)/benchmark_speed.py --builddir=bd_speed --target-module run_wally --cpu-mhz=1 --json-output > wallySpeed.json # deletes all files clean: - rm -rf ../../addins/embench-iot/bd_speed/ - rm -rf ../../addins/embench-iot/bd_size/ + rm -rf $(embench_dir)/bd_speed/ + rm -rf $(embench_dir)/bd_size/ allclean: clean - rm -rf ../../addins/embench-iot/logs/ + rm -rf $(embench_dir)/logs/ # riscv64-unknown-elf-gcc -O2 -g -nostartfiles -I/home/harris/riscv-wally/addins/embench-iot/support -I/home/harris/riscv-wally/addins/embench-iot/config/riscv32/boards/ri5cyverilator -I/home/harris/riscv-wally/addins/embench-iot/config/riscv32/chips/generic -I/home/harris/riscv-wally/addins/embench-iot/config/riscv32 -DCPU_MHZ=1 -DWARMUP_HEAT=1 -o main.o /home/harris/riscv-wally/addins/embench-iot/support/main.c \ No newline at end of file diff --git a/benchmarks/coremark/LICENSE b/benchmarks/riscv-coremark/LICENSE similarity index 100% rename from benchmarks/coremark/LICENSE rename to benchmarks/riscv-coremark/LICENSE diff --git a/benchmarks/riscv-coremark/Makefile b/benchmarks/riscv-coremark/Makefile new file mode 100644 index 000000000..ce8dea81e --- /dev/null +++ b/benchmarks/riscv-coremark/Makefile @@ -0,0 +1,25 @@ +#cmbase=../../addins/coremark +PORT_DIR = $(CURDIR)/riscv64-baremetal +cmbase=coremark +sources=$(cmbase)/core_main.c $(cmbase)/core_list_join.c $(cmbase)/coremark.h \ + $(cmbase)/core_matrix.c $(cmbase)/core_state.c $(cmbase)/core_util.c \ + $(PORT_DIR)/core_portme.h $(PORT_DIR)/core_portme.c $(PORT_DIR)/core_portme.mak \ + $(PORT_DIR)/crt.S $(PORT_DIR)/encoding.h $(PORT_DIR)/util.h $(PORT_DIR)/syscalls.c + +work/coremark.bare.riscv.elf.memfile: work/coremark.bare.riscv + riscv64-unknown-elf-objdump -D $< > $<.elf.objdump + riscv64-unknown-elf-elf2hex --bit-width 64 --input $< --output $@ + extractFunctionRadix.sh $<.elf.objdump + +work/coremark.bare.riscv: $(sources) Makefile +# make -C $(cmbase) PORT_DIR=$(PORT_DIR) compile RISCV=/opt/riscv/riscv-gnu-toolchain XCFLAGS="-march=rv64imd -mabi=lp64d -mbranch-cost=1 -DSKIP_DEFAULT_MEMSET -mtune=sifive-7-series -Ofast -funroll-all-loops -fno-delete-null-pointer-checks -fno-rename-registers --param=loop-max-datarefs-for-datadeps=0 -funroll-all-loops --param=uninlined-function-insns=8 -fno-tree-vrp -fwrapv -fno-toplevel-reorder --param=max-inline-insns-size=128 -fipa-pta" + # These flags were used by WD on CoreMark + make -C $(cmbase) PORT_DIR=$(PORT_DIR) compile RISCV=$(RISCV)/riscv-gnu-toolchain XCFLAGS="-march=rv64imd -mabi=lp64d -mbranch-cost=1 -DSKIP_DEFAULT_MEMSET -mtune=sifive-7-series -Ofast -funroll-all-loops -fno-delete-null-pointer-checks -fno-rename-registers --param=loop-max-datarefs-for-datadeps=0 -funroll-all-loops --param=uninlined-function-insns=8 -fno-tree-vrp -fwrapv -fipa-pta " +# -fno-toplevel-reorder --param=max-inline-insns-size=128 " # adding this bit caused a compiler error + mkdir -p work/ + mv $(cmbase)/coremark.bare.riscv work/ + +.PHONY: clean + +clean: + rm -f work/* diff --git a/benchmarks/coremark/src/LICENSE.md b/benchmarks/riscv-coremark/coremark/LICENSE.md similarity index 100% rename from benchmarks/coremark/src/LICENSE.md rename to benchmarks/riscv-coremark/coremark/LICENSE.md diff --git a/benchmarks/coremark/src/Makefile b/benchmarks/riscv-coremark/coremark/Makefile similarity index 100% rename from benchmarks/coremark/src/Makefile rename to benchmarks/riscv-coremark/coremark/Makefile diff --git a/benchmarks/coremark/src/README.md b/benchmarks/riscv-coremark/coremark/README.md similarity index 100% rename from benchmarks/coremark/src/README.md rename to benchmarks/riscv-coremark/coremark/README.md diff --git a/benchmarks/coremark/src/barebones/core_portme.c b/benchmarks/riscv-coremark/coremark/barebones/core_portme.c similarity index 100% rename from benchmarks/coremark/src/barebones/core_portme.c rename to benchmarks/riscv-coremark/coremark/barebones/core_portme.c diff --git a/benchmarks/coremark/src/barebones/core_portme.h b/benchmarks/riscv-coremark/coremark/barebones/core_portme.h similarity index 100% rename from benchmarks/coremark/src/barebones/core_portme.h rename to benchmarks/riscv-coremark/coremark/barebones/core_portme.h diff --git a/benchmarks/coremark/src/barebones/core_portme.mak b/benchmarks/riscv-coremark/coremark/barebones/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/barebones/core_portme.mak rename to benchmarks/riscv-coremark/coremark/barebones/core_portme.mak diff --git a/benchmarks/coremark/src/barebones/cvt.c b/benchmarks/riscv-coremark/coremark/barebones/cvt.c similarity index 100% rename from benchmarks/coremark/src/barebones/cvt.c rename to benchmarks/riscv-coremark/coremark/barebones/cvt.c diff --git a/benchmarks/coremark/src/barebones/ee_printf.c b/benchmarks/riscv-coremark/coremark/barebones/ee_printf.c similarity index 100% rename from benchmarks/coremark/src/barebones/ee_printf.c rename to benchmarks/riscv-coremark/coremark/barebones/ee_printf.c diff --git a/benchmarks/coremark/src/core_list_join.c b/benchmarks/riscv-coremark/coremark/core_list_join.c similarity index 100% rename from benchmarks/coremark/src/core_list_join.c rename to benchmarks/riscv-coremark/coremark/core_list_join.c diff --git a/benchmarks/coremark/src/core_main.c b/benchmarks/riscv-coremark/coremark/core_main.c similarity index 100% rename from benchmarks/coremark/src/core_main.c rename to benchmarks/riscv-coremark/coremark/core_main.c diff --git a/benchmarks/coremark/src/core_matrix.c b/benchmarks/riscv-coremark/coremark/core_matrix.c similarity index 100% rename from benchmarks/coremark/src/core_matrix.c rename to benchmarks/riscv-coremark/coremark/core_matrix.c diff --git a/benchmarks/coremark/src/core_state.c b/benchmarks/riscv-coremark/coremark/core_state.c similarity index 100% rename from benchmarks/coremark/src/core_state.c rename to benchmarks/riscv-coremark/coremark/core_state.c diff --git a/benchmarks/coremark/src/core_util.c b/benchmarks/riscv-coremark/coremark/core_util.c similarity index 100% rename from benchmarks/coremark/src/core_util.c rename to benchmarks/riscv-coremark/coremark/core_util.c diff --git a/benchmarks/coremark/src/coremark.exe b/benchmarks/riscv-coremark/coremark/coremark.exe similarity index 100% rename from benchmarks/coremark/src/coremark.exe rename to benchmarks/riscv-coremark/coremark/coremark.exe diff --git a/benchmarks/coremark/src/coremark.h b/benchmarks/riscv-coremark/coremark/coremark.h similarity index 100% rename from benchmarks/coremark/src/coremark.h rename to benchmarks/riscv-coremark/coremark/coremark.h diff --git a/benchmarks/coremark/src/coremark.md5 b/benchmarks/riscv-coremark/coremark/coremark.md5 similarity index 100% rename from benchmarks/coremark/src/coremark.md5 rename to benchmarks/riscv-coremark/coremark/coremark.md5 diff --git a/benchmarks/coremark/src/cygwin/core_portme.c b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.c similarity index 100% rename from benchmarks/coremark/src/cygwin/core_portme.c rename to benchmarks/riscv-coremark/coremark/cygwin/core_portme.c diff --git a/benchmarks/coremark/src/cygwin/core_portme.h b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.h similarity index 100% rename from benchmarks/coremark/src/cygwin/core_portme.h rename to benchmarks/riscv-coremark/coremark/cygwin/core_portme.h diff --git a/benchmarks/coremark/src/cygwin/core_portme.mak b/benchmarks/riscv-coremark/coremark/cygwin/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/cygwin/core_portme.mak rename to benchmarks/riscv-coremark/coremark/cygwin/core_portme.mak diff --git a/benchmarks/coremark/src/docs/READM.md b/benchmarks/riscv-coremark/coremark/docs/READM.md similarity index 100% rename from benchmarks/coremark/src/docs/READM.md rename to benchmarks/riscv-coremark/coremark/docs/READM.md diff --git a/benchmarks/coremark/src/docs/balance_O0_joined.png b/benchmarks/riscv-coremark/coremark/docs/balance_O0_joined.png similarity index 100% rename from benchmarks/coremark/src/docs/balance_O0_joined.png rename to benchmarks/riscv-coremark/coremark/docs/balance_O0_joined.png diff --git a/benchmarks/coremark/src/docs/html/files/PIC32/core_portme-mak.html b/benchmarks/riscv-coremark/coremark/docs/html/files/PIC32/core_portme-mak.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/PIC32/core_portme-mak.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/PIC32/core_portme-mak.html diff --git a/benchmarks/coremark/src/docs/html/files/core_list_join-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_list_join-c.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/core_list_join-c.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/core_list_join-c.html diff --git a/benchmarks/coremark/src/docs/html/files/core_main-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_main-c.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/core_main-c.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/core_main-c.html diff --git a/benchmarks/coremark/src/docs/html/files/core_matrix-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_matrix-c.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/core_matrix-c.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/core_matrix-c.html diff --git a/benchmarks/coremark/src/docs/html/files/core_state-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_state-c.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/core_state-c.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/core_state-c.html diff --git a/benchmarks/coremark/src/docs/html/files/core_util-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/core_util-c.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/core_util-c.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/core_util-c.html diff --git a/benchmarks/coremark/src/docs/html/files/coremark-h.html b/benchmarks/riscv-coremark/coremark/docs/html/files/coremark-h.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/coremark-h.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/coremark-h.html diff --git a/benchmarks/coremark/src/docs/html/files/docs/core_state.png b/benchmarks/riscv-coremark/coremark/docs/html/files/docs/core_state.png similarity index 100% rename from benchmarks/coremark/src/docs/html/files/docs/core_state.png rename to benchmarks/riscv-coremark/coremark/docs/html/files/docs/core_state.png diff --git a/benchmarks/coremark/src/docs/html/files/linux/core_portme-c.html b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-c.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/linux/core_portme-c.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-c.html diff --git a/benchmarks/coremark/src/docs/html/files/linux/core_portme-h.html b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/linux/core_portme-h.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-h.html diff --git a/benchmarks/coremark/src/docs/html/files/linux/core_portme-mak.html b/benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/linux/core_portme-mak.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/linux/core_portme-mak.html diff --git a/benchmarks/coremark/src/docs/html/files/readme-txt.html b/benchmarks/riscv-coremark/coremark/docs/html/files/readme-txt.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/readme-txt.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/readme-txt.html diff --git a/benchmarks/coremark/src/docs/html/files/release_notes-txt.html b/benchmarks/riscv-coremark/coremark/docs/html/files/release_notes-txt.html similarity index 100% rename from benchmarks/coremark/src/docs/html/files/release_notes-txt.html rename to benchmarks/riscv-coremark/coremark/docs/html/files/release_notes-txt.html diff --git a/benchmarks/coremark/src/docs/html/index.html b/benchmarks/riscv-coremark/coremark/docs/html/index.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index.html rename to benchmarks/riscv-coremark/coremark/docs/html/index.html diff --git a/benchmarks/coremark/src/docs/html/index/BuildTargets.html b/benchmarks/riscv-coremark/coremark/docs/html/index/BuildTargets.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/BuildTargets.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/BuildTargets.html diff --git a/benchmarks/coremark/src/docs/html/index/Configuration.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Configuration.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/Configuration.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/Configuration.html diff --git a/benchmarks/coremark/src/docs/html/index/Configurations.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Configurations.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/Configurations.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/Configurations.html diff --git a/benchmarks/coremark/src/docs/html/index/Files.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Files.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/Files.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/Files.html diff --git a/benchmarks/coremark/src/docs/html/index/Functions.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Functions.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/Functions.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/Functions.html diff --git a/benchmarks/coremark/src/docs/html/index/General.html b/benchmarks/riscv-coremark/coremark/docs/html/index/General.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/General.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/General.html diff --git a/benchmarks/coremark/src/docs/html/index/General2.html b/benchmarks/riscv-coremark/coremark/docs/html/index/General2.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/General2.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/General2.html diff --git a/benchmarks/coremark/src/docs/html/index/Types.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Types.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/Types.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/Types.html diff --git a/benchmarks/coremark/src/docs/html/index/Variables.html b/benchmarks/riscv-coremark/coremark/docs/html/index/Variables.html similarity index 100% rename from benchmarks/coremark/src/docs/html/index/Variables.html rename to benchmarks/riscv-coremark/coremark/docs/html/index/Variables.html diff --git a/benchmarks/coremark/src/docs/html/javascript/main.js b/benchmarks/riscv-coremark/coremark/docs/html/javascript/main.js similarity index 100% rename from benchmarks/coremark/src/docs/html/javascript/main.js rename to benchmarks/riscv-coremark/coremark/docs/html/javascript/main.js diff --git a/benchmarks/coremark/src/docs/html/javascript/searchdata.js b/benchmarks/riscv-coremark/coremark/docs/html/javascript/searchdata.js similarity index 100% rename from benchmarks/coremark/src/docs/html/javascript/searchdata.js rename to benchmarks/riscv-coremark/coremark/docs/html/javascript/searchdata.js diff --git a/benchmarks/coremark/src/docs/html/search/BuildTargetsP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/BuildTargetsP.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/BuildTargetsP.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationC.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationC.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationC.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationH.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationH.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationH.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationH.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationM.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationM.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationM.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationS.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationS.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationS.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationT.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationT.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationT.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationU.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationU.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationU.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationU.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationsH.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationsH.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsH.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationsM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationsM.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsM.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationsS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationsS.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsS.html diff --git a/benchmarks/coremark/src/docs/html/search/ConfigurationsT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/ConfigurationsT.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/ConfigurationsT.html diff --git a/benchmarks/coremark/src/docs/html/search/FilesC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FilesC.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FilesC.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FilesC.html diff --git a/benchmarks/coremark/src/docs/html/search/FilesR.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FilesR.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FilesR.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FilesR.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsC.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsC.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsC.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsG.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsG.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsG.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsG.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsI.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsI.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsI.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsI.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsM.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsM.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsM.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsP.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsP.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsP.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsS.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsS.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsS.html diff --git a/benchmarks/coremark/src/docs/html/search/FunctionsT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsT.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/FunctionsT.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/FunctionsT.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralB.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralB.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralB.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralB.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralC.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralC.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralC.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralD.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralD.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralD.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralD.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralF.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralF.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralF.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralF.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralG.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralG.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralG.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralG.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralH.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralH.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralH.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralH.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralI.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralI.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralI.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralI.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralL.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralL.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralL.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralL.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralM.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralM.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralM.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralM.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralO.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralO.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralO.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralO.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralP.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralP.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralP.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralR.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralR.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralR.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralR.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralS.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralS.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralS.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralT.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralT.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralT.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralT.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralU.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralU.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralU.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralU.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralV.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralV.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralV.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralV.html diff --git a/benchmarks/coremark/src/docs/html/search/GeneralW.html b/benchmarks/riscv-coremark/coremark/docs/html/search/GeneralW.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/GeneralW.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/GeneralW.html diff --git a/benchmarks/coremark/src/docs/html/search/NoResults.html b/benchmarks/riscv-coremark/coremark/docs/html/search/NoResults.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/NoResults.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/NoResults.html diff --git a/benchmarks/coremark/src/docs/html/search/TypesS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/TypesS.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/TypesS.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/TypesS.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesC.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesC.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesC.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesC.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesD.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesD.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesD.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesD.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesL.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesL.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesL.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesL.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesO.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesO.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesO.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesO.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesP.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesP.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesP.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesP.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesR.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesR.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesR.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesR.html diff --git a/benchmarks/coremark/src/docs/html/search/VariablesS.html b/benchmarks/riscv-coremark/coremark/docs/html/search/VariablesS.html similarity index 100% rename from benchmarks/coremark/src/docs/html/search/VariablesS.html rename to benchmarks/riscv-coremark/coremark/docs/html/search/VariablesS.html diff --git a/benchmarks/coremark/src/docs/html/styles/1.css b/benchmarks/riscv-coremark/coremark/docs/html/styles/1.css similarity index 100% rename from benchmarks/coremark/src/docs/html/styles/1.css rename to benchmarks/riscv-coremark/coremark/docs/html/styles/1.css diff --git a/benchmarks/coremark/src/docs/html/styles/2.css b/benchmarks/riscv-coremark/coremark/docs/html/styles/2.css similarity index 100% rename from benchmarks/coremark/src/docs/html/styles/2.css rename to benchmarks/riscv-coremark/coremark/docs/html/styles/2.css diff --git a/benchmarks/coremark/src/docs/html/styles/main.css b/benchmarks/riscv-coremark/coremark/docs/html/styles/main.css similarity index 100% rename from benchmarks/coremark/src/docs/html/styles/main.css rename to benchmarks/riscv-coremark/coremark/docs/html/styles/main.css diff --git a/benchmarks/coremark/src/freebsd/core_portme.mak b/benchmarks/riscv-coremark/coremark/freebsd/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/freebsd/core_portme.mak rename to benchmarks/riscv-coremark/coremark/freebsd/core_portme.mak diff --git a/benchmarks/coremark/src/linux/core_portme.c b/benchmarks/riscv-coremark/coremark/linux/core_portme.c similarity index 100% rename from benchmarks/coremark/src/linux/core_portme.c rename to benchmarks/riscv-coremark/coremark/linux/core_portme.c diff --git a/benchmarks/coremark/src/linux/core_portme.h b/benchmarks/riscv-coremark/coremark/linux/core_portme.h similarity index 100% rename from benchmarks/coremark/src/linux/core_portme.h rename to benchmarks/riscv-coremark/coremark/linux/core_portme.h diff --git a/benchmarks/coremark/src/linux/core_portme.mak b/benchmarks/riscv-coremark/coremark/linux/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/linux/core_portme.mak rename to benchmarks/riscv-coremark/coremark/linux/core_portme.mak diff --git a/benchmarks/coremark/src/linux64/core_portme.c b/benchmarks/riscv-coremark/coremark/linux64/core_portme.c similarity index 100% rename from benchmarks/coremark/src/linux64/core_portme.c rename to benchmarks/riscv-coremark/coremark/linux64/core_portme.c diff --git a/benchmarks/coremark/src/linux64/core_portme.h b/benchmarks/riscv-coremark/coremark/linux64/core_portme.h similarity index 100% rename from benchmarks/coremark/src/linux64/core_portme.h rename to benchmarks/riscv-coremark/coremark/linux64/core_portme.h diff --git a/benchmarks/coremark/src/linux64/core_portme.mak b/benchmarks/riscv-coremark/coremark/linux64/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/linux64/core_portme.mak rename to benchmarks/riscv-coremark/coremark/linux64/core_portme.mak diff --git a/benchmarks/coremark/src/macos/core_portme.mak b/benchmarks/riscv-coremark/coremark/macos/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/macos/core_portme.mak rename to benchmarks/riscv-coremark/coremark/macos/core_portme.mak diff --git a/benchmarks/coremark/src/posix/core_portme.c b/benchmarks/riscv-coremark/coremark/posix/core_portme.c similarity index 100% rename from benchmarks/coremark/src/posix/core_portme.c rename to benchmarks/riscv-coremark/coremark/posix/core_portme.c diff --git a/benchmarks/coremark/src/posix/core_portme.h b/benchmarks/riscv-coremark/coremark/posix/core_portme.h similarity index 100% rename from benchmarks/coremark/src/posix/core_portme.h rename to benchmarks/riscv-coremark/coremark/posix/core_portme.h diff --git a/benchmarks/coremark/src/posix/core_portme.mak b/benchmarks/riscv-coremark/coremark/posix/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/posix/core_portme.mak rename to benchmarks/riscv-coremark/coremark/posix/core_portme.mak diff --git a/benchmarks/coremark/src/posix/core_portme_posix_overrides.h b/benchmarks/riscv-coremark/coremark/posix/core_portme_posix_overrides.h similarity index 100% rename from benchmarks/coremark/src/posix/core_portme_posix_overrides.h rename to benchmarks/riscv-coremark/coremark/posix/core_portme_posix_overrides.h diff --git a/benchmarks/coremark/src/rtems/core_portme.mak b/benchmarks/riscv-coremark/coremark/rtems/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/rtems/core_portme.mak rename to benchmarks/riscv-coremark/coremark/rtems/core_portme.mak diff --git a/benchmarks/coremark/src/rtems/init.c b/benchmarks/riscv-coremark/coremark/rtems/init.c similarity index 100% rename from benchmarks/coremark/src/rtems/init.c rename to benchmarks/riscv-coremark/coremark/rtems/init.c diff --git a/benchmarks/coremark/src/simple/core_portme.c b/benchmarks/riscv-coremark/coremark/simple/core_portme.c similarity index 100% rename from benchmarks/coremark/src/simple/core_portme.c rename to benchmarks/riscv-coremark/coremark/simple/core_portme.c diff --git a/benchmarks/coremark/src/simple/core_portme.h b/benchmarks/riscv-coremark/coremark/simple/core_portme.h similarity index 100% rename from benchmarks/coremark/src/simple/core_portme.h rename to benchmarks/riscv-coremark/coremark/simple/core_portme.h diff --git a/benchmarks/coremark/src/simple/core_portme.mak b/benchmarks/riscv-coremark/coremark/simple/core_portme.mak similarity index 100% rename from benchmarks/coremark/src/simple/core_portme.mak rename to benchmarks/riscv-coremark/coremark/simple/core_portme.mak diff --git a/benchmarks/riscv-coremark/old/README.md b/benchmarks/riscv-coremark/old/README.md new file mode 100644 index 000000000..7c02eb1bf --- /dev/null +++ b/benchmarks/riscv-coremark/old/README.md @@ -0,0 +1,23 @@ +Coremark EEMBC Wrapper +====================== + +This repository provides the utility files to port [CoreMark EEMBC](https://www.eembc.org/coremark/) to RISC-V. + +### Requirements + + - You must have installed the RISC-V tools + +### Setup + + - `git submodule update --init` + - Run the `./build-coremark.sh` script that does the following + - Builds a version of Coremark for Linux or pk (coremark.riscv) + - Builds a version of Coremark for bare-metal (coremark.bare.riscv) + - Copies the output binaries into this directory + +### Default Files + +The default files target **RV64GC** and use minimal amount of compilation flags. Additionally, the `*.mak` file in the `riscv64` +folder setups `spike pk` as the default `run` rule. + +Feel free to change these to suit your needs. diff --git a/benchmarks/riscv-coremark/old/extraPortmes/README.md b/benchmarks/riscv-coremark/old/extraPortmes/README.md new file mode 100644 index 000000000..681fc4d8b --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/README.md @@ -0,0 +1,7 @@ +This directory is a backup for the portme files associated with cygwin, linux, and linux64 + +This backup is needed in the event that a user replaces the coremark directory with a clean version +from EEMBC's github page (the clean version does not have the cygwin, linux, +and linux64 files that our version does). + +Please do not delete this directory under any circumstance. \ No newline at end of file diff --git a/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.c b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.h b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.h new file mode 100755 index 000000000..9471b12ec --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.h @@ -0,0 +1,293 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.mak b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/cygwin/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.c b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.c new file mode 100755 index 000000000..6b63610d1 --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.c @@ -0,0 +1,338 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + { + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.h b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.h new file mode 100755 index 000000000..2cf4659a4 --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.h @@ -0,0 +1,290 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef ee_u32 ee_ptr_int; +typedef size_t ee_size_t; +/* align_mem: + This macro is used to align an offset to point to a 32b value. It is used in the Matrix algorithm to initialize the input memory blocks. +*/ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.mak b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.mak new file mode 100644 index 000000000..97b6d6ace --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/linux/core_portme.mak @@ -0,0 +1,17 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +include posix/core_portme.mak diff --git a/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.c b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.c new file mode 100755 index 000000000..fe8d29983 --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.c @@ -0,0 +1,336 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + #define SAMPLE_TIME_IMPLEMENTATION 0 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.h b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.h new file mode 100755 index 000000000..1228a679b --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.h @@ -0,0 +1,291 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 1 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +#error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!" +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.mak b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.mak new file mode 100755 index 000000000..5cfabee32 --- /dev/null +++ b/benchmarks/riscv-coremark/old/extraPortmes/linux64/core_portme.mak @@ -0,0 +1,140 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += -lrt +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = + +OEXT = .o +EXE = .exe + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/old/riscv64/core_portme.c b/benchmarks/riscv-coremark/old/riscv64/core_portme.c new file mode 100755 index 000000000..8f17cb8bd --- /dev/null +++ b/benchmarks/riscv-coremark/old/riscv64/core_portme.c @@ -0,0 +1,346 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (*_t=read_csr(cycle)) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + GETMYTIME(&start_time_val ); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(&stop_time_val ); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts=MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/old/riscv64/core_portme.h b/benchmarks/riscv-coremark/old/riscv64/core_portme.h new file mode 100755 index 000000000..4e28afd36 --- /dev/null +++ b/benchmarks/riscv-coremark/old/riscv64/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_ARG +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_MALLOC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 0 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/old/riscv64/core_portme.mak b/benchmarks/riscv-coremark/old/riscv64/core_portme.mak new file mode 100755 index 000000000..edc341abc --- /dev/null +++ b/benchmarks/riscv-coremark/old/riscv64/core_portme.mak @@ -0,0 +1,147 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/old/trace b/benchmarks/riscv-coremark/old/trace new file mode 100644 index 000000000..7c76d0bfa --- /dev/null +++ b/benchmarks/riscv-coremark/old/trace @@ -0,0 +1,48 @@ +Imperas riscvOVPsimPlus + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Copyright (c) 2005-2021 Imperas Software Ltd. Contains Imperas Proprietary Information. +Licensed Software, All Rights Reserved. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + +riscvOVPsimPlus started: Wed May 12 17:55:33 2021 + + +Info (GDBT_PORT) Host: Tera.Eng.HMC.Edu, Port: 55460 +Info (DBC_LGDB) Starting Debugger /cad/riscv/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64/riscv-none-embed-gdb +Info (GDBT_WAIT) Waiting for remote debugger to connect... +Info (OR_OF) Target 'riscvOVPsim/cpu' has object file read from 'coremark.bare.riscv' +Info (OR_PH) Program Headers: +Info (OR_PH) Type Offset VirtAddr PhysAddr +Info (OR_PH) FileSiz MemSiz Flags Align +Info (OR_PD) LOAD 0x0000000000001000 0x0000000080000000 0x0000000080000000 +Info (OR_PD) 0x0000000000000204 0x0000000000000204 R-E 1000 +Info (OR_PD) LOAD 0x0000000000002000 0x0000000080001000 0x0000000080001000 +Info (OR_PD) 0x00000000000047e0 0x0000000000004ff0 RWE 1000 +Info (GDBT_CONNECTED) Client connected +Info (GDBT_GON) Client disappeared 'riscvOVPsim/cpu' +Info +Info --------------------------------------------------- +Info CPU 'riscvOVPsim/cpu' STATISTICS +Info Type : riscv (RV64GC) +Info Nominal MIPS : 100 +Info Final program counter : 0x80003558 +Info Simulated instructions: 1,455,608 +Info Simulated MIPS : 0.0 +Info --------------------------------------------------- +Info +Info --------------------------------------------------- +Info SIMULATION TIME STATISTICS +Info Simulated time : 0.02 seconds +Info User time : 99.23 seconds +Info System time : 254.08 seconds +Info Elapsed time : 1107.49 seconds +Info --------------------------------------------------- + +riscvOVPsimPlus finished: Wed May 12 18:14:04 2021 + + +riscvOVPsimPlus (64-Bit) v20210329.0 Open Virtual Platform simulator from www.IMPERAS.com. +Visit www.IMPERAS.com for multicore debug, verification and analysis solutions. + diff --git a/benchmarks/riscv-coremark/old/transferobjdump.sh b/benchmarks/riscv-coremark/old/transferobjdump.sh new file mode 100755 index 000000000..69578566a --- /dev/null +++ b/benchmarks/riscv-coremark/old/transferobjdump.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +./build-coremark.sh + +riscv64-unknown-elf-objdump -D coremark.bare.riscv > coremarkcodemod.bare.riscv.objdump +cp coremarkcodemod.bare.riscv.objdump ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark/. +pushd ~/riscv-wally/tests/imperas-riscv-tests/riscv-ovpsim-plus/examples/CoreMark +./exe2memfile.pl coremarkcodemod.bare.riscv +popd diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c new file mode 100755 index 000000000..86917f939 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.c @@ -0,0 +1,382 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +#include +#include +#include "coremark.h" +#if CALLGRIND_RUN +#include +#endif + +#if (MEM_METHOD==MEM_MALLOC) +#include +/* Function: portable_malloc + Provide malloc() functionality in a platform specific way. +*/ +void *portable_malloc(size_t size) { + return malloc(size); +} +/* Function: portable_free + Provide free() functionality in a platform specific way. +*/ +void portable_free(void *p) { + free(p); +} +#else +void *portable_malloc(size_t size) { + return NULL; +} +void portable_free(void *p) { + p=NULL; +} +#endif + +#if (SEED_METHOD==SEED_VOLATILE) +#if VALIDATION_RUN + volatile ee_s32 seed1_volatile=0x3415; + volatile ee_s32 seed2_volatile=0x3415; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PERFORMANCE_RUN + volatile ee_s32 seed1_volatile=0x0; + volatile ee_s32 seed2_volatile=0x0; + volatile ee_s32 seed3_volatile=0x66; +#endif +#if PROFILE_RUN + volatile ee_s32 seed1_volatile=0x8; + volatile ee_s32 seed2_volatile=0x8; + volatile ee_s32 seed3_volatile=0x8; +#endif + volatile ee_s32 seed4_volatile=ITERATIONS; + volatile ee_s32 seed5_volatile=0; +#endif +/* Porting: Timing functions + How to capture time and convert to seconds must be ported to whatever is supported by the platform. + e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc. + Sample implementation for standard time.h and windows.h definitions included. +*/ +/* Define: TIMER_RES_DIVIDER + Divider to trade off timer resolution and total time that can be measured. + + Use lower values to increase resolution, but make sure that overflow does not occur. + If there are issues with the return value overflowing, increase this value. + */ +#if USE_CLOCK + #define NSECS_PER_SEC CLOCKS_PER_SEC + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE clock_t + #define GETMYTIME(_t) (*_t=clock()) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + #define TIMER_RES_DIVIDER 1 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif defined(_MSC_VER) + #define NSECS_PER_SEC 10000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE FILETIME + #define GETMYTIME(_t) GetSystemTimeAsFileTime(_t) + #define MYTIMEDIFF(fin,ini) (((*(__int64*)&fin)-(*(__int64*)&ini))/TIMER_RES_DIVIDER) + /* setting to millisces resolution by default with MSDEV */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#elif HAS_TIME_H + #define NSECS_PER_SEC 1000000000 + #define EE_TIMER_TICKER_RATE 1000 + #define CORETIMETYPE struct timespec + #define GETMYTIME(_t) clock_gettime(CLOCK_REALTIME,_t) + #define MYTIMEDIFF(fin,ini) ((fin.tv_sec-ini.tv_sec)*(NSECS_PER_SEC/TIMER_RES_DIVIDER)+(fin.tv_nsec-ini.tv_nsec)/TIMER_RES_DIVIDER) + /* setting to 1/1000 of a second resolution by default with linux */ + #ifndef TIMER_RES_DIVIDER + #define TIMER_RES_DIVIDER 1000000 + #endif + #define SAMPLE_TIME_IMPLEMENTATION 1 +#else + // Defined for RISCV + #define NSECS_PER_SEC 1000000000 // TODO: What freq are we assuming? + #define EE_TIMER_TICKER_RATE 1000 // TODO: What is this? + #define CORETIMETYPE clock_t + #define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + #define GETMYTIME(_t) (_t = *(volatile unsigned long long*)0x0200BFF8) + #define MYTIMEDIFF(fin,ini) ((fin)-(ini)) + // Changing TIMER_RES_DIVIDER to 1000000 sets EE_TICKS_PER_SEC to 1000 (now counting ticks per ms) + #define TIMER_RES_DIVIDER 10000 + #define SAMPLE_TIME_IMPLEMENTATION 1 +#endif +#define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER) + +#if SAMPLE_TIME_IMPLEMENTATION +/** Define Host specific (POSIX), or target specific global time variables. */ +static CORETIMETYPE start_time_val, stop_time_val; +static unsigned long start_instr_val, stop_instr_val; + +/* Function: minstretFunc + This function will count the number of instructions. +*/ +unsigned long minstretFunc(void) +{ + unsigned long minstretRead = read_csr(minstret); + //ee_printf("Minstret is %lu\n", minstretRead); + return minstretRead; +} + +/* Function: minstretDiff + This function will take the difference between the first and second reads from the + MINSTRET csr to determine the number of machine instructions retired between two points + of time +*/ +unsigned long minstretDiff(void) +{ + unsigned long minstretDifference = MYTIMEDIFF(stop_instr_val, start_instr_val); + return minstretDifference; +} + +/* Function: start_time + This function will be called right before starting the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0. +*/ +void start_time(void) { + start_instr_val = minstretFunc(); + GETMYTIME(start_time_val); + //ee_printf("Timer started\n"); + //ee_printf(" MTIME: %u\n", start_time_val); +#if CALLGRIND_RUN + CALLGRIND_START_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif +} +/* Function: stop_time + This function will be called right after ending the timed portion of the benchmark. + + Implementation may be capturing a system timer (as implemented in the example code) + or other system parameters - e.g. reading the current value of cpu cycles counter. +*/ +void stop_time(void) { +#if CALLGRIND_RUN + CALLGRIND_STOP_INSTRUMENTATION +#endif +#if MICA + asm volatile("int3");/*1 */ +#endif + GETMYTIME(stop_time_val); + stop_instr_val = minstretFunc(); + //ee_printf("Timer stopped\n"); + //ee_printf(" MTIME: %u\n", stop_time_val); +} +/* Function: get_time + Return an abstract "ticks" number that signifies time on the system. + + Actual value returned may be cpu cycles, milliseconds or any other value, + as long as it can be converted to seconds by . + This methodology is taken to accomodate any hardware or simulated platform. + The sample implementation returns millisecs by default, + and the resolution is controlled by +*/ +CORE_TICKS get_time(void) { + CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val)); + unsigned long instructions = minstretDiff(); + ee_printf(" Called get_time\n"); + ee_printf(" Elapsed MTIME: %u\n", elapsed); + ee_printf(" Elapsed MINSTRET: %lu\n", instructions); + ee_printf(" CPI: %lu / %lu\n", elapsed, instructions); + return elapsed; +} +/* Function: time_in_secs + Convert the value returned by get_time to seconds. + + The type is used to accomodate systems with no support for floating point. + Default implementation implemented by the EE_TICKS_PER_SEC macro above. +*/ +secs_ret time_in_secs(CORE_TICKS ticks) { + secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC; + int retvalint = (int)retval; + //ee_printf("RETURN VALUE FROM TIME IN SECS FUNCTION: %d\n", retvalint); + return retval; +} +#else +#error "Please implement timing functionality in core_portme.c" +#endif /* SAMPLE_TIME_IMPLEMENTATION */ + +ee_u32 default_num_contexts = MULTITHREAD; + +/* Function: portable_init + Target specific initialization code + Test for some common mistakes. +*/ +void portable_init(core_portable *p, int *argc, char *argv[]) +{ +#if PRINT_ARGS + int i; + for (i=0; i<*argc; i++) { + ee_printf("Arg[%d]=%s\n",i,argv[i]); + } +#endif + if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) { + ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n"); + } + if (sizeof(ee_u32) != 4) { + ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n"); + } +#if (MAIN_HAS_NOARGC && (SEED_METHOD==SEED_ARG)) + ee_printf("ERROR! Main has no argc, but SEED_METHOD defined to SEED_ARG!\n"); +#endif + +#if (MULTITHREAD>1) && (SEED_METHOD==SEED_ARG) + int nargs=*argc,i; + if ((nargs>1) && (*argv[1]=='M')) { + default_num_contexts=parseval(argv[1]+1); + if (default_num_contexts>MULTITHREAD) + default_num_contexts=MULTITHREAD; + /* Shift args since first arg is directed to the portable part and not to coremark main */ + --nargs; + for (i=1; i*/ + p->portable_id=1; +} +/* Function: portable_fini + Target specific final code +*/ +void portable_fini(core_portable *p) +{ + p->portable_id=0; +} + +#if (MULTITHREAD>1) + +/* Function: core_start_parallel + Start benchmarking in a parallel context. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +/* Function: core_stop_parallel + Stop a parallel context execution of coremark, and gather the results. + + Three implementations are provided, one using pthreads, one using fork and shared mem, and one using fork and sockets. + Other implementations using MCAPI or other standards can easily be devised. +*/ +#if USE_PTHREAD +ee_u8 core_start_parallel(core_results *res) { + return (ee_u8)pthread_create(&(res->port.thread),NULL,iterate,(void *)res); +} +ee_u8 core_stop_parallel(core_results *res) { + void *retval; + return (ee_u8)pthread_join(res->port.thread,&retval); +} +#elif USE_FORK +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + key_t key=4321+key_id; + key_id++; + res->port.pid=fork(); + res->port.shmid=shmget(key, 8, IPC_CREAT | 0666); + if (res->port.shmid<0) { + ee_printf("ERROR in shmget!\n"); + } + if (res->port.pid==0) { + iterate(res); + res->port.shm=shmat(res->port.shmid, NULL, 0); + /* copy the validation values to the shared memory area and quit*/ + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in child shmat!\n"); + } else { + memcpy(res->port.shm,&(res->crc),8); + shmdt(res->port.shm); + } + exit(0); + } + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + /* after process is done, get the values from the shared memory area */ + res->port.shm=shmat(res->port.shmid, NULL, 0); + if (res->port.shm == (char *) -1) { + ee_printf("ERROR in parent shmat!\n"); + return 0; + } + memcpy(&(res->crc),res->port.shm,8); + shmdt(res->port.shm); + return 1; +} +#elif USE_SOCKET +static int key_id=0; +ee_u8 core_start_parallel(core_results *res) { + int bound, buffer_length=8; + res->port.sa.sin_family = AF_INET; + res->port.sa.sin_addr.s_addr = htonl(0x7F000001); + res->port.sa.sin_port = htons(7654+key_id); + key_id++; + res->port.pid=fork(); + if (res->port.pid==0) { /* benchmark child */ + iterate(res); + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (-1 == res->port.sock) /* if socket failed to initialize, exit */ { + ee_printf("Error Creating Socket"); + } else { + int bytes_sent = sendto(res->port.sock, &(res->crc), buffer_length, 0,(struct sockaddr*)&(res->port.sa), sizeof (struct sockaddr_in)); + if (bytes_sent < 0) + ee_printf("Error sending packet: %s\n", strerror(errno)); + close(res->port.sock); /* close the socket */ + } + exit(0); + } + /* parent process, open the socket */ + res->port.sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + bound = bind(res->port.sock,(struct sockaddr*)&(res->port.sa), sizeof(struct sockaddr)); + if (bound < 0) + ee_printf("bind(): %s\n",strerror(errno)); + return 1; +} +ee_u8 core_stop_parallel(core_results *res) { + int status; + int fromlen=sizeof(struct sockaddr); + int recsize = recvfrom(res->port.sock, &(res->crc), 8, 0, (struct sockaddr*)&(res->port.sa), &fromlen); + if (recsize < 0) { + ee_printf("Error in receive: %s\n", strerror(errno)); + return 0; + } + pid_t wpid = waitpid(res->port.pid,&status,WUNTRACED); + if (wpid != res->port.pid) { + ee_printf("ERROR waiting for child.\n"); + if (errno == ECHILD) ee_printf("errno=No such child %d\n",res->port.pid); + if (errno == EINTR) ee_printf("errno=Interrupted\n"); + return 0; + } + return 1; +} +#else /* no standard multicore implementation */ +#error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* multithread implementations */ +#endif diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h new file mode 100755 index 000000000..ef26e88ad --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.h @@ -0,0 +1,296 @@ +/* +Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Original Author: Shay Gal-on +*/ + +/* Topic: Description + This file contains configuration constants required to execute on different platforms +*/ +#ifndef CORE_PORTME_H +#define CORE_PORTME_H +/************************/ +/* Data types and settings */ +/************************/ +/* Configuration: HAS_FLOAT + Define to 1 if the platform supports floating point. +*/ +#ifndef HAS_FLOAT +#define HAS_FLOAT 1 +#endif +/* Configuration: HAS_TIME_H + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef HAS_TIME_H +#define HAS_TIME_H 0 +#endif +/* Configuration: USE_CLOCK + Define to 1 if platform has the time.h header file, + and implementation of functions thereof. +*/ +#ifndef USE_CLOCK +#define USE_CLOCK 0 +#endif +/* Configuration: HAS_STDIO + Define to 1 if the platform has stdio.h. +*/ +#ifndef HAS_STDIO +#define HAS_STDIO 1 +#endif +/* Configuration: HAS_PRINTF + Define to 1 if the platform has stdio.h and implements the printf function. +*/ +#ifndef HAS_PRINTF +#define HAS_PRINTF 1 +#endif + +/* Configuration: CORE_TICKS + Define type of return from the timing functions. + */ +#if defined(_MSC_VER) +#include +typedef size_t CORE_TICKS; +#elif HAS_TIME_H +#include +typedef clock_t CORE_TICKS; +#else +/* Configuration: size_t and clock_t + Note these need to match the size of the clock output and the xLen the processor supports + */ +typedef unsigned long int size_t; +typedef unsigned long int clock_t; +typedef clock_t CORE_TICKS; +#endif + +/* Definitions: COMPILER_VERSION, COMPILER_FLAGS, MEM_LOCATION + Initialize these strings per platform +*/ +#ifndef COMPILER_VERSION + #ifdef __GNUC__ + #define COMPILER_VERSION "GCC"__VERSION__ + #else + #define COMPILER_VERSION "Please put compiler version here (e.g. gcc 4.1)" + #endif +#endif +#ifndef COMPILER_FLAGS + #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */ +#endif +#ifndef MEM_LOCATION + #define MEM_LOCATION "Please put data memory location here\n\t\t\t(e.g. code in flash, data on heap etc)" + #define MEM_LOCATION_UNSPEC 1 +#endif + +/* Data Types: + To avoid compiler issues, define the data types that need ot be used for 8b, 16b and 32b in . + + *Imprtant*: + ee_ptr_int needs to be the data type used to hold pointers, otherwise coremark may fail!!! +*/ +typedef signed short ee_s16; +typedef unsigned short ee_u16; +typedef signed int ee_s32; +typedef double ee_f32; +typedef unsigned char ee_u8; +typedef unsigned int ee_u32; +typedef unsigned long long ee_ptr_int; +typedef size_t ee_size_t; +/* align an offset to point to a 32b value */ +#define align_mem(x) (void *)(4 + (((ee_ptr_int)(x) - 1) & ~3)) + +/* Configuration: SEED_METHOD + Defines method to get seed values that cannot be computed at compile time. + + Valid values: + SEED_ARG - from command line. + SEED_FUNC - from a system function. + SEED_VOLATILE - from volatile variables. +*/ +#ifndef SEED_METHOD +#define SEED_METHOD SEED_VOLATILE +#endif + +/* Configuration: MEM_METHOD + Defines method to get a block of memry. + + Valid values: + MEM_MALLOC - for platforms that implement malloc and have malloc.h. + MEM_STATIC - to use a static memory array. + MEM_STACK - to allocate the data block on the stack (NYI). +*/ +#ifndef MEM_METHOD +#define MEM_METHOD MEM_STATIC +#endif + +/* Configuration: MULTITHREAD + Define for parallel execution + + Valid values: + 1 - only one context (default). + N>1 - will execute N copies in parallel. + + Note: + If this flag is defined to more then 1, an implementation for launching parallel contexts must be defined. + + Two sample implementations are provided. Use or to enable them. + + It is valid to have a different implementation of and in , + to fit a particular architecture. +*/ +#ifndef MULTITHREAD +#define MULTITHREAD 1 +#endif + +/* Configuration: USE_PTHREAD + Sample implementation for launching parallel contexts + This implementation uses pthread_thread_create and pthread_join. + + Valid values: + 0 - Do not use pthreads API. + 1 - Use pthreads API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_PTHREAD +#define USE_PTHREAD 0 +#endif + +/* Configuration: USE_FORK + Sample implementation for launching parallel contexts + This implementation uses fork, waitpid, shmget,shmat and shmdt. + + Valid values: + 0 - Do not use fork API. + 1 - Use fork API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_FORK +#define USE_FORK 0 +#endif + +/* Configuration: USE_SOCKET + Sample implementation for launching parallel contexts + This implementation uses fork, socket, sendto and recvfrom + + Valid values: + 0 - Do not use fork and sockets API. + 1 - Use fork and sockets API + + Note: + This flag only matters if MULTITHREAD has been defined to a value greater then 1. +*/ +#ifndef USE_SOCKET +#define USE_SOCKET 0 +#endif + +/* Configuration: MAIN_HAS_NOARGC + Needed if platform does not support getting arguments to main. + + Valid values: + 0 - argc/argv to main is supported + 1 - argc/argv to main is not supported +*/ +#ifndef MAIN_HAS_NOARGC +#define MAIN_HAS_NOARGC 1 +#endif + +/* Configuration: MAIN_HAS_NORETURN + Needed if platform does not support returning a value from main. + + Valid values: + 0 - main returns an int, and return value will be 0. + 1 - platform does not support returning a value from main +*/ +#ifndef MAIN_HAS_NORETURN +#define MAIN_HAS_NORETURN 0 +#endif + +/* Variable: default_num_contexts + Number of contexts to spawn in multicore context. + Override this global value to change number of contexts used. + + Note: + This value may not be set higher then the define. + + To experiment, you can set the define to the highest value expected, and use argc/argv in the to set this value from the command line. +*/ +extern ee_u32 default_num_contexts; + +#if (MULTITHREAD>1) +#if USE_PTHREAD + #include + #define PARALLEL_METHOD "PThreads" +#elif USE_FORK + #include + #include + #include + #include + #include /* for memcpy */ + #define PARALLEL_METHOD "Fork" +#elif USE_SOCKET + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #define PARALLEL_METHOD "Sockets" +#else + #define PARALLEL_METHOD "Proprietary" + #error "Please implement multicore functionality in core_portme.c to use multiple contexts." +#endif /* Method for multithreading */ +#endif /* MULTITHREAD > 1 */ + +typedef struct CORE_PORTABLE_S { +#if (MULTITHREAD>1) + #if USE_PTHREAD + pthread_t thread; + #elif USE_FORK + pid_t pid; + int shmid; + void *shm; + #elif USE_SOCKET + pid_t pid; + int sock; + struct sockaddr_in sa; + #endif /* Method for multithreading */ +#endif /* MULTITHREAD>1 */ + ee_u8 portable_id; +} core_portable; + +/* target specific init/fini */ +void portable_init(core_portable *p, int *argc, char *argv[]); +void portable_fini(core_portable *p); + +#if (SEED_METHOD==SEED_VOLATILE) + #if (VALIDATION_RUN || PERFORMANCE_RUN || PROFILE_RUN) + #define RUN_TYPE_FLAG 1 + #else + #if (TOTAL_DATA_SIZE==1200) + #define PROFILE_RUN 1 + #else + #define PERFORMANCE_RUN 1 + #endif + #endif +#endif /* SEED_METHOD==SEED_VOLATILE */ + +#endif /* CORE_PORTME_H */ diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak new file mode 100755 index 000000000..4bae943dc --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/core_portme.mak @@ -0,0 +1,149 @@ +# Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Original Author: Shay Gal-on + +#File: core_portme.mak + +# Flag: RISCVTOOLS +# Use this flag to point to your RISCV tools +RISCVTOOLS=$(RISCV) +# Flag: RISCVTYPE +# Type of toolchain to use +RISCVTYPE=riscv64-unknown-elf +# Flag: OUTFLAG +# Use this flag to define how to to get an executable (e.g -o) +OUTFLAG= -o +# Flag: CC +# Use this flag to define compiler to use +# david_harris@hmc.edu 20 Nov 2021 removed full path; require +CC = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +#CC = $(RISCVTYPE)-gcc +# Flag: CFLAGS +# Use this flag to define compiler options. Note, you can add compiler options from the command line using XCFLAGS="other flags" +#PORT_CFLAGS = -O2 -static -std=gnu99 +PORT_CFLAGS = -O2 -mcmodel=medany -static -fno-tree-loop-distribute-patterns -std=gnu99 -fno-common -nostartfiles -lm -lgcc -T $(PORT_DIR)/link.ld +FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)" +CFLAGS = $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" +#Flag: LFLAGS_END +# Define any libraries needed for linking or other flags that should come at the end of the link line (e.g. linker scripts). +# Note: On certain platforms, the default clock_gettime implementation is supported but requires linking of librt. +LFLAGS_END += +# Flag: PORT_SRCS +# Port specific source files can be added here +PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/syscalls.c $(PORT_DIR)/crt.S +# Flag: LOAD +# Define this flag if you need to load to a target, as in a cross compile environment. + +# Flag: RUN +# Define this flag if running does not consist of simple invocation of the binary. +# In a cross compile environment, you need to define this. + +#For flashing and using a tera term macro, you could use +#LOAD = flash ADDR +#RUN = ttpmacro coremark.ttl + +#For copying to target and executing via SSH connection, you could use +#LOAD = scp $(OUTFILE) user@target:~ +#RUN = ssh user@target -c + +#For native compilation and execution +LOAD = echo Loading done +RUN = spike pk + +OEXT = .o +EXE = .bare.riscv + +# Flag: SEPARATE_COMPILE +# Define if you need to separate compilation from link stage. +# In this case, you also need to define below how to create an object file, and how to link. +ifdef SEPARATE_COMPILE + +LD = $(RISCVTOOLS)/bin/$(RISCVTYPE)-gcc +OBJOUT = -o +LFLAGS = +OFLAG = -o +COUT = -c +# Flag: PORT_OBJS +# Port specific object files can be added here +PORT_OBJS = $(PORT_DIR)/core_portme$(OEXT) +PORT_CLEAN = *$(OEXT) + +$(OPATH)%$(OEXT) : %.c + $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ + +endif + +# Target: port_prebuild +# Generate any files that are needed before actual build starts. +# E.g. generate profile guidance files. Sample PGO generation for gcc enabled with PGO=1 +# - First, check if PGO was defined on the command line, if so, need to add -fprofile-use to compile line. +# - Second, if PGO reference has not yet been generated, add a step to the prebuild that will build a profile-generate version and run it. +# Note - Using REBUILD=1 +# +# Use make PGO=1 to invoke this sample processing. + +ifdef PGO + ifeq (,$(findstring $(PGO),gen)) + PGO_STAGE=build_pgo_gcc + CFLAGS+=-fprofile-use + endif + PORT_CLEAN+=*.gcda *.gcno gmon.out +endif + +.PHONY: port_prebuild +port_prebuild: $(PGO_STAGE) + +.PHONY: build_pgo_gcc +build_pgo_gcc: + $(MAKE) PGO=gen XCFLAGS="$(XCFLAGS) -fprofile-generate -DTOTAL_DATA_SIZE=1200" ITERATIONS=10 gen_pgo_data REBUILD=1 + +# Target: port_postbuild +# Generate any files that are needed after actual build end. +# E.g. change format to srec, bin, zip in order to be able to load into flash +.PHONY: port_postbuild +port_postbuild: + +# Target: port_postrun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_postrun +port_postrun: + +# Target: port_prerun +# Do platform specific after run stuff. +# E.g. reset the board, backup the logfiles etc. +.PHONY: port_prerun +port_prerun: + +# Target: port_postload +# Do platform specific after load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_postload +port_postload: + +# Target: port_preload +# Do platform specific before load stuff. +# E.g. reset the reset power to the flash eraser +.PHONY: port_preload +port_preload: + +# FLAG: OPATH +# Path to the output folder. Default - current folder. +OPATH = ./ +MKDIR = mkdir -p + +# FLAG: PERL +# Define perl executable to calculate the geomean if running separate. +PERL=/usr/bin/perl diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/crt.S b/benchmarks/riscv-coremark/riscv64-baremetal/crt.S new file mode 100644 index 000000000..d75e81e06 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/crt.S @@ -0,0 +1,237 @@ +# See LICENSE for license details. + +#include "encoding.h" + +#if __riscv_xlen == 64 +# define LREG ld +# define SREG sd +# define REGBYTES 8 +#else +# define LREG lw +# define SREG sw +# define REGBYTES 4 +#endif + + .section ".text.init" + .globl _start +_start: + li x1, 0 + li x2, 0 + li x3, 0 + li x4, 0 + li x5, 0 + li x6, 0 + li x7, 0 + li x8, 0 + li x9, 0 + li x10,0 + li x11,0 + li x12,0 + li x13,0 + li x14,0 + li x15,0 + li x16,0 + li x17,0 + li x18,0 + li x19,0 + li x20,0 + li x21,0 + li x22,0 + li x23,0 + li x24,0 + li x25,0 + li x26,0 + li x27,0 + li x28,0 + li x29,0 + li x30,0 + li x31,0 + + # enable FPU and accelerator if present + li t0, MSTATUS_FS | MSTATUS_XS + csrs mstatus, t0 + + # make sure XLEN agrees with compilation choice + li t0, 1 + slli t0, t0, 31 +#if __riscv_xlen == 64 + bgez t0, 1f +#else + bltz t0, 1f +#endif +2: + li a0, 1 + sw a0, tohost, t0 + j 2b +1: + +#ifdef __riscv_flen + # initialize FPU if we have one + la t0, 1f + csrw mtvec, t0 + + fssr x0 + fmv.s.x f0, x0 + fmv.s.x f1, x0 + fmv.s.x f2, x0 + fmv.s.x f3, x0 + fmv.s.x f4, x0 + fmv.s.x f5, x0 + fmv.s.x f6, x0 + fmv.s.x f7, x0 + fmv.s.x f8, x0 + fmv.s.x f9, x0 + fmv.s.x f10,x0 + fmv.s.x f11,x0 + fmv.s.x f12,x0 + fmv.s.x f13,x0 + fmv.s.x f14,x0 + fmv.s.x f15,x0 + fmv.s.x f16,x0 + fmv.s.x f17,x0 + fmv.s.x f18,x0 + fmv.s.x f19,x0 + fmv.s.x f20,x0 + fmv.s.x f21,x0 + fmv.s.x f22,x0 + fmv.s.x f23,x0 + fmv.s.x f24,x0 + fmv.s.x f25,x0 + fmv.s.x f26,x0 + fmv.s.x f27,x0 + fmv.s.x f28,x0 + fmv.s.x f29,x0 + fmv.s.x f30,x0 + fmv.s.x f31,x0 +1: +#endif + + # initialize trap vector + la t0, trap_entry + csrw mtvec, t0 + + # initialize global pointer +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + la tp, _end + 63 + and tp, tp, -64 + + # get core id + csrr a0, mhartid + # for now, assume only 1 core + li a1, 1 +1:bgeu a0, a1, 1b + + # give each core 128KB of stack + TLS +#define STKSHIFT 17 + sll a2, a0, STKSHIFT + add tp, tp, a2 + add sp, a0, 1 + sll sp, sp, STKSHIFT + add sp, sp, tp + + j _init + + .align 2 +trap_entry: + addi sp, sp, -272 + + SREG x1, 1*REGBYTES(sp) + SREG x2, 2*REGBYTES(sp) + SREG x3, 3*REGBYTES(sp) + SREG x4, 4*REGBYTES(sp) + SREG x5, 5*REGBYTES(sp) + SREG x6, 6*REGBYTES(sp) + SREG x7, 7*REGBYTES(sp) + SREG x8, 8*REGBYTES(sp) + SREG x9, 9*REGBYTES(sp) + SREG x10, 10*REGBYTES(sp) + SREG x11, 11*REGBYTES(sp) + SREG x12, 12*REGBYTES(sp) + SREG x13, 13*REGBYTES(sp) + SREG x14, 14*REGBYTES(sp) + SREG x15, 15*REGBYTES(sp) + SREG x16, 16*REGBYTES(sp) + SREG x17, 17*REGBYTES(sp) + SREG x18, 18*REGBYTES(sp) + SREG x19, 19*REGBYTES(sp) + SREG x20, 20*REGBYTES(sp) + SREG x21, 21*REGBYTES(sp) + SREG x22, 22*REGBYTES(sp) + SREG x23, 23*REGBYTES(sp) + SREG x24, 24*REGBYTES(sp) + SREG x25, 25*REGBYTES(sp) + SREG x26, 26*REGBYTES(sp) + SREG x27, 27*REGBYTES(sp) + SREG x28, 28*REGBYTES(sp) + SREG x29, 29*REGBYTES(sp) + SREG x30, 30*REGBYTES(sp) + SREG x31, 31*REGBYTES(sp) + + csrr a0, mcause + csrr a1, mepc + mv a2, sp + jal handle_trap + csrw mepc, a0 + + # Remain in M-mode after eret + li t0, MSTATUS_MPP + csrs mstatus, t0 + + LREG x1, 1*REGBYTES(sp) + LREG x2, 2*REGBYTES(sp) + LREG x3, 3*REGBYTES(sp) + LREG x4, 4*REGBYTES(sp) + LREG x5, 5*REGBYTES(sp) + LREG x6, 6*REGBYTES(sp) + LREG x7, 7*REGBYTES(sp) + LREG x8, 8*REGBYTES(sp) + LREG x9, 9*REGBYTES(sp) + LREG x10, 10*REGBYTES(sp) + LREG x11, 11*REGBYTES(sp) + LREG x12, 12*REGBYTES(sp) + LREG x13, 13*REGBYTES(sp) + LREG x14, 14*REGBYTES(sp) + LREG x15, 15*REGBYTES(sp) + LREG x16, 16*REGBYTES(sp) + LREG x17, 17*REGBYTES(sp) + LREG x18, 18*REGBYTES(sp) + LREG x19, 19*REGBYTES(sp) + LREG x20, 20*REGBYTES(sp) + LREG x21, 21*REGBYTES(sp) + LREG x22, 22*REGBYTES(sp) + LREG x23, 23*REGBYTES(sp) + LREG x24, 24*REGBYTES(sp) + LREG x25, 25*REGBYTES(sp) + LREG x26, 26*REGBYTES(sp) + LREG x27, 27*REGBYTES(sp) + LREG x28, 28*REGBYTES(sp) + LREG x29, 29*REGBYTES(sp) + LREG x30, 30*REGBYTES(sp) + LREG x31, 31*REGBYTES(sp) + + addi sp, sp, 272 + mret + +.section ".tdata.begin" +.globl _tdata_begin +_tdata_begin: + +.section ".tdata.end" +.globl _tdata_end +_tdata_end: + +.section ".tbss.end" +.globl _tbss_end +_tbss_end: + +.section ".tohost","aw",@progbits +.align 6 +.globl tohost +tohost: .dword 0 +.align 6 +.globl fromhost +fromhost: .dword 0 diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/encoding.h b/benchmarks/riscv-coremark/riscv64-baremetal/encoding.h new file mode 100644 index 000000000..c109ce189 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/encoding.h @@ -0,0 +1,1471 @@ +// See LICENSE for license details. + +#ifndef RISCV_CSR_ENCODING_H +#define RISCV_CSR_ENCODING_H + +#define MSTATUS_UIE 0x00000001 +#define MSTATUS_SIE 0x00000002 +#define MSTATUS_HIE 0x00000004 +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_UPIE 0x00000010 +#define MSTATUS_SPIE 0x00000020 +#define MSTATUS_HPIE 0x00000040 +#define MSTATUS_MPIE 0x00000080 +#define MSTATUS_SPP 0x00000100 +#define MSTATUS_HPP 0x00000600 +#define MSTATUS_MPP 0x00001800 +#define MSTATUS_FS 0x00006000 +#define MSTATUS_XS 0x00018000 +#define MSTATUS_MPRV 0x00020000 +#define MSTATUS_SUM 0x00040000 +#define MSTATUS_MXR 0x00080000 +#define MSTATUS_TVM 0x00100000 +#define MSTATUS_TW 0x00200000 +#define MSTATUS_TSR 0x00400000 +#define MSTATUS32_SD 0x80000000 +#define MSTATUS_UXL 0x0000000300000000 +#define MSTATUS_SXL 0x0000000C00000000 +#define MSTATUS64_SD 0x8000000000000000 + +#define SSTATUS_UIE 0x00000001 +#define SSTATUS_SIE 0x00000002 +#define SSTATUS_UPIE 0x00000010 +#define SSTATUS_SPIE 0x00000020 +#define SSTATUS_SPP 0x00000100 +#define SSTATUS_FS 0x00006000 +#define SSTATUS_XS 0x00018000 +#define SSTATUS_SUM 0x00040000 +#define SSTATUS_MXR 0x00080000 +#define SSTATUS32_SD 0x80000000 +#define SSTATUS_UXL 0x0000000300000000 +#define SSTATUS64_SD 0x8000000000000000 + +#define DCSR_XDEBUGVER (3U<<30) +#define DCSR_NDRESET (1<<29) +#define DCSR_FULLRESET (1<<28) +#define DCSR_EBREAKM (1<<15) +#define DCSR_EBREAKH (1<<14) +#define DCSR_EBREAKS (1<<13) +#define DCSR_EBREAKU (1<<12) +#define DCSR_STOPCYCLE (1<<10) +#define DCSR_STOPTIME (1<<9) +#define DCSR_CAUSE (7<<6) +#define DCSR_DEBUGINT (1<<5) +#define DCSR_HALT (1<<3) +#define DCSR_STEP (1<<2) +#define DCSR_PRV (3<<0) + +#define DCSR_CAUSE_NONE 0 +#define DCSR_CAUSE_SWBP 1 +#define DCSR_CAUSE_HWBP 2 +#define DCSR_CAUSE_DEBUGINT 3 +#define DCSR_CAUSE_STEP 4 +#define DCSR_CAUSE_HALT 5 + +#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) +#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) +#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) + +#define MCONTROL_SELECT (1<<19) +#define MCONTROL_TIMING (1<<18) +#define MCONTROL_ACTION (0x3f<<12) +#define MCONTROL_CHAIN (1<<11) +#define MCONTROL_MATCH (0xf<<7) +#define MCONTROL_M (1<<6) +#define MCONTROL_H (1<<5) +#define MCONTROL_S (1<<4) +#define MCONTROL_U (1<<3) +#define MCONTROL_EXECUTE (1<<2) +#define MCONTROL_STORE (1<<1) +#define MCONTROL_LOAD (1<<0) + +#define MCONTROL_TYPE_NONE 0 +#define MCONTROL_TYPE_MATCH 2 + +#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 +#define MCONTROL_ACTION_DEBUG_MODE 1 +#define MCONTROL_ACTION_TRACE_START 2 +#define MCONTROL_ACTION_TRACE_STOP 3 +#define MCONTROL_ACTION_TRACE_EMIT 4 + +#define MCONTROL_MATCH_EQUAL 0 +#define MCONTROL_MATCH_NAPOT 1 +#define MCONTROL_MATCH_GE 2 +#define MCONTROL_MATCH_LT 3 +#define MCONTROL_MATCH_MASK_LOW 4 +#define MCONTROL_MATCH_MASK_HIGH 5 + +#define MIP_SSIP (1 << IRQ_S_SOFT) +#define MIP_HSIP (1 << IRQ_H_SOFT) +#define MIP_MSIP (1 << IRQ_M_SOFT) +#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_HTIP (1 << IRQ_H_TIMER) +#define MIP_MTIP (1 << IRQ_M_TIMER) +#define MIP_SEIP (1 << IRQ_S_EXT) +#define MIP_HEIP (1 << IRQ_H_EXT) +#define MIP_MEIP (1 << IRQ_M_EXT) + +#define SIP_SSIP MIP_SSIP +#define SIP_STIP MIP_STIP + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +#define SATP32_MODE 0x80000000 +#define SATP32_ASID 0x7FC00000 +#define SATP32_PPN 0x003FFFFF +#define SATP64_MODE 0xF000000000000000 +#define SATP64_ASID 0x0FFFF00000000000 +#define SATP64_PPN 0x00000FFFFFFFFFFF + +#define SATP_MODE_OFF 0 +#define SATP_MODE_SV32 1 +#define SATP_MODE_SV39 8 +#define SATP_MODE_SV48 9 +#define SATP_MODE_SV57 10 +#define SATP_MODE_SV64 11 + +#define PMP_R 0x01 +#define PMP_W 0x02 +#define PMP_X 0x04 +#define PMP_A 0x18 +#define PMP_L 0x80 +#define PMP_SHIFT 2 + +#define PMP_TOR 0x08 +#define PMP_NA4 0x10 +#define PMP_NAPOT 0x18 + +#define IRQ_S_SOFT 1 +#define IRQ_H_SOFT 2 +#define IRQ_M_SOFT 3 +#define IRQ_S_TIMER 5 +#define IRQ_H_TIMER 6 +#define IRQ_M_TIMER 7 +#define IRQ_S_EXT 9 +#define IRQ_H_EXT 10 +#define IRQ_M_EXT 11 +#define IRQ_COP 12 +#define IRQ_HOST 13 + +#define DEFAULT_RSTVEC 0x00001000 +#define CLINT_BASE 0x02000000 +#define CLINT_SIZE 0x000c0000 +#define EXT_IO_BASE 0x40000000 +#define DRAM_BASE 0x80000000 + +// page table entry (PTE) fields +#define PTE_V 0x001 // Valid +#define PTE_R 0x002 // Read +#define PTE_W 0x004 // Write +#define PTE_X 0x008 // Execute +#define PTE_U 0x010 // User +#define PTE_G 0x020 // Global +#define PTE_A 0x040 // Accessed +#define PTE_D 0x080 // Dirty +#define PTE_SOFT 0x300 // Reserved for Software + +#define PTE_PPN_SHIFT 10 + +#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) + +#ifdef __riscv + +#if __riscv_xlen == 64 +# define MSTATUS_SD MSTATUS64_SD +# define SSTATUS_SD SSTATUS64_SD +# define RISCV_PGLEVEL_BITS 9 +# define SATP_MODE SATP64_MODE +#else +# define MSTATUS_SD MSTATUS32_SD +# define SSTATUS_SD SSTATUS32_SD +# define RISCV_PGLEVEL_BITS 10 +# define SATP_MODE SATP32_MODE +#endif +#define RISCV_PGSHIFT 12 +#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) + +#ifndef __ASSEMBLER__ + +#ifdef __GNUC__ + +#define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + +#define write_csr(reg, val) ({ \ + asm volatile ("csrw " #reg ", %0" :: "rK"(val)); }) + +#define swap_csr(reg, val) ({ unsigned long __tmp; \ + asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "rK"(val)); \ + __tmp; }) + +#define set_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define clear_csr(reg, bit) ({ unsigned long __tmp; \ + asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "rK"(bit)); \ + __tmp; }) + +#define rdtime() read_csr(time) +#define rdcycle() read_csr(cycle) +#define rdinstret() read_csr(instret) + +#endif + +#endif + +#endif + +#endif +/* Automatically generated by parse-opcodes. */ +#ifndef RISCV_ENCODING_H +#define RISCV_ENCODING_H +#define MATCH_BEQ 0x63 +#define MASK_BEQ 0x707f +#define MATCH_BNE 0x1063 +#define MASK_BNE 0x707f +#define MATCH_BLT 0x4063 +#define MASK_BLT 0x707f +#define MATCH_BGE 0x5063 +#define MASK_BGE 0x707f +#define MATCH_BLTU 0x6063 +#define MASK_BLTU 0x707f +#define MATCH_BGEU 0x7063 +#define MASK_BGEU 0x707f +#define MATCH_JALR 0x67 +#define MASK_JALR 0x707f +#define MATCH_JAL 0x6f +#define MASK_JAL 0x7f +#define MATCH_LUI 0x37 +#define MASK_LUI 0x7f +#define MATCH_AUIPC 0x17 +#define MASK_AUIPC 0x7f +#define MATCH_ADDI 0x13 +#define MASK_ADDI 0x707f +#define MATCH_SLLI 0x1013 +#define MASK_SLLI 0xfc00707f +#define MATCH_SLTI 0x2013 +#define MASK_SLTI 0x707f +#define MATCH_SLTIU 0x3013 +#define MASK_SLTIU 0x707f +#define MATCH_XORI 0x4013 +#define MASK_XORI 0x707f +#define MATCH_SRLI 0x5013 +#define MASK_SRLI 0xfc00707f +#define MATCH_SRAI 0x40005013 +#define MASK_SRAI 0xfc00707f +#define MATCH_ORI 0x6013 +#define MASK_ORI 0x707f +#define MATCH_ANDI 0x7013 +#define MASK_ANDI 0x707f +#define MATCH_ADD 0x33 +#define MASK_ADD 0xfe00707f +#define MATCH_SUB 0x40000033 +#define MASK_SUB 0xfe00707f +#define MATCH_SLL 0x1033 +#define MASK_SLL 0xfe00707f +#define MATCH_SLT 0x2033 +#define MASK_SLT 0xfe00707f +#define MATCH_SLTU 0x3033 +#define MASK_SLTU 0xfe00707f +#define MATCH_XOR 0x4033 +#define MASK_XOR 0xfe00707f +#define MATCH_SRL 0x5033 +#define MASK_SRL 0xfe00707f +#define MATCH_SRA 0x40005033 +#define MASK_SRA 0xfe00707f +#define MATCH_OR 0x6033 +#define MASK_OR 0xfe00707f +#define MATCH_AND 0x7033 +#define MASK_AND 0xfe00707f +#define MATCH_ADDIW 0x1b +#define MASK_ADDIW 0x707f +#define MATCH_SLLIW 0x101b +#define MASK_SLLIW 0xfe00707f +#define MATCH_SRLIW 0x501b +#define MASK_SRLIW 0xfe00707f +#define MATCH_SRAIW 0x4000501b +#define MASK_SRAIW 0xfe00707f +#define MATCH_ADDW 0x3b +#define MASK_ADDW 0xfe00707f +#define MATCH_SUBW 0x4000003b +#define MASK_SUBW 0xfe00707f +#define MATCH_SLLW 0x103b +#define MASK_SLLW 0xfe00707f +#define MATCH_SRLW 0x503b +#define MASK_SRLW 0xfe00707f +#define MATCH_SRAW 0x4000503b +#define MASK_SRAW 0xfe00707f +#define MATCH_LB 0x3 +#define MASK_LB 0x707f +#define MATCH_LH 0x1003 +#define MASK_LH 0x707f +#define MATCH_LW 0x2003 +#define MASK_LW 0x707f +#define MATCH_LD 0x3003 +#define MASK_LD 0x707f +#define MATCH_LBU 0x4003 +#define MASK_LBU 0x707f +#define MATCH_LHU 0x5003 +#define MASK_LHU 0x707f +#define MATCH_LWU 0x6003 +#define MASK_LWU 0x707f +#define MATCH_SB 0x23 +#define MASK_SB 0x707f +#define MATCH_SH 0x1023 +#define MASK_SH 0x707f +#define MATCH_SW 0x2023 +#define MASK_SW 0x707f +#define MATCH_SD 0x3023 +#define MASK_SD 0x707f +#define MATCH_FENCE 0xf +#define MASK_FENCE 0x707f +#define MATCH_FENCE_I 0x100f +#define MASK_FENCE_I 0x707f +#define MATCH_MUL 0x2000033 +#define MASK_MUL 0xfe00707f +#define MATCH_MULH 0x2001033 +#define MASK_MULH 0xfe00707f +#define MATCH_MULHSU 0x2002033 +#define MASK_MULHSU 0xfe00707f +#define MATCH_MULHU 0x2003033 +#define MASK_MULHU 0xfe00707f +#define MATCH_DIV 0x2004033 +#define MASK_DIV 0xfe00707f +#define MATCH_DIVU 0x2005033 +#define MASK_DIVU 0xfe00707f +#define MATCH_REM 0x2006033 +#define MASK_REM 0xfe00707f +#define MATCH_REMU 0x2007033 +#define MASK_REMU 0xfe00707f +#define MATCH_MULW 0x200003b +#define MASK_MULW 0xfe00707f +#define MATCH_DIVW 0x200403b +#define MASK_DIVW 0xfe00707f +#define MATCH_DIVUW 0x200503b +#define MASK_DIVUW 0xfe00707f +#define MATCH_REMW 0x200603b +#define MASK_REMW 0xfe00707f +#define MATCH_REMUW 0x200703b +#define MASK_REMUW 0xfe00707f +#define MATCH_AMOADD_W 0x202f +#define MASK_AMOADD_W 0xf800707f +#define MATCH_AMOXOR_W 0x2000202f +#define MASK_AMOXOR_W 0xf800707f +#define MATCH_AMOOR_W 0x4000202f +#define MASK_AMOOR_W 0xf800707f +#define MATCH_AMOAND_W 0x6000202f +#define MASK_AMOAND_W 0xf800707f +#define MATCH_AMOMIN_W 0x8000202f +#define MASK_AMOMIN_W 0xf800707f +#define MATCH_AMOMAX_W 0xa000202f +#define MASK_AMOMAX_W 0xf800707f +#define MATCH_AMOMINU_W 0xc000202f +#define MASK_AMOMINU_W 0xf800707f +#define MATCH_AMOMAXU_W 0xe000202f +#define MASK_AMOMAXU_W 0xf800707f +#define MATCH_AMOSWAP_W 0x800202f +#define MASK_AMOSWAP_W 0xf800707f +#define MATCH_LR_W 0x1000202f +#define MASK_LR_W 0xf9f0707f +#define MATCH_SC_W 0x1800202f +#define MASK_SC_W 0xf800707f +#define MATCH_AMOADD_D 0x302f +#define MASK_AMOADD_D 0xf800707f +#define MATCH_AMOXOR_D 0x2000302f +#define MASK_AMOXOR_D 0xf800707f +#define MATCH_AMOOR_D 0x4000302f +#define MASK_AMOOR_D 0xf800707f +#define MATCH_AMOAND_D 0x6000302f +#define MASK_AMOAND_D 0xf800707f +#define MATCH_AMOMIN_D 0x8000302f +#define MASK_AMOMIN_D 0xf800707f +#define MATCH_AMOMAX_D 0xa000302f +#define MASK_AMOMAX_D 0xf800707f +#define MATCH_AMOMINU_D 0xc000302f +#define MASK_AMOMINU_D 0xf800707f +#define MATCH_AMOMAXU_D 0xe000302f +#define MASK_AMOMAXU_D 0xf800707f +#define MATCH_AMOSWAP_D 0x800302f +#define MASK_AMOSWAP_D 0xf800707f +#define MATCH_LR_D 0x1000302f +#define MASK_LR_D 0xf9f0707f +#define MATCH_SC_D 0x1800302f +#define MASK_SC_D 0xf800707f +#define MATCH_ECALL 0x73 +#define MASK_ECALL 0xffffffff +#define MATCH_EBREAK 0x100073 +#define MASK_EBREAK 0xffffffff +#define MATCH_URET 0x200073 +#define MASK_URET 0xffffffff +#define MATCH_SRET 0x10200073 +#define MASK_SRET 0xffffffff +#define MATCH_MRET 0x30200073 +#define MASK_MRET 0xffffffff +#define MATCH_DRET 0x7b200073 +#define MASK_DRET 0xffffffff +#define MATCH_SFENCE_VMA 0x12000073 +#define MASK_SFENCE_VMA 0xfe007fff +#define MATCH_WFI 0x10500073 +#define MASK_WFI 0xffffffff +#define MATCH_CSRRW 0x1073 +#define MASK_CSRRW 0x707f +#define MATCH_CSRRS 0x2073 +#define MASK_CSRRS 0x707f +#define MATCH_CSRRC 0x3073 +#define MASK_CSRRC 0x707f +#define MATCH_CSRRWI 0x5073 +#define MASK_CSRRWI 0x707f +#define MATCH_CSRRSI 0x6073 +#define MASK_CSRRSI 0x707f +#define MATCH_CSRRCI 0x7073 +#define MASK_CSRRCI 0x707f +#define MATCH_FADD_S 0x53 +#define MASK_FADD_S 0xfe00007f +#define MATCH_FSUB_S 0x8000053 +#define MASK_FSUB_S 0xfe00007f +#define MATCH_FMUL_S 0x10000053 +#define MASK_FMUL_S 0xfe00007f +#define MATCH_FDIV_S 0x18000053 +#define MASK_FDIV_S 0xfe00007f +#define MATCH_FSGNJ_S 0x20000053 +#define MASK_FSGNJ_S 0xfe00707f +#define MATCH_FSGNJN_S 0x20001053 +#define MASK_FSGNJN_S 0xfe00707f +#define MATCH_FSGNJX_S 0x20002053 +#define MASK_FSGNJX_S 0xfe00707f +#define MATCH_FMIN_S 0x28000053 +#define MASK_FMIN_S 0xfe00707f +#define MATCH_FMAX_S 0x28001053 +#define MASK_FMAX_S 0xfe00707f +#define MATCH_FSQRT_S 0x58000053 +#define MASK_FSQRT_S 0xfff0007f +#define MATCH_FADD_D 0x2000053 +#define MASK_FADD_D 0xfe00007f +#define MATCH_FSUB_D 0xa000053 +#define MASK_FSUB_D 0xfe00007f +#define MATCH_FMUL_D 0x12000053 +#define MASK_FMUL_D 0xfe00007f +#define MATCH_FDIV_D 0x1a000053 +#define MASK_FDIV_D 0xfe00007f +#define MATCH_FSGNJ_D 0x22000053 +#define MASK_FSGNJ_D 0xfe00707f +#define MATCH_FSGNJN_D 0x22001053 +#define MASK_FSGNJN_D 0xfe00707f +#define MATCH_FSGNJX_D 0x22002053 +#define MASK_FSGNJX_D 0xfe00707f +#define MATCH_FMIN_D 0x2a000053 +#define MASK_FMIN_D 0xfe00707f +#define MATCH_FMAX_D 0x2a001053 +#define MASK_FMAX_D 0xfe00707f +#define MATCH_FCVT_S_D 0x40100053 +#define MASK_FCVT_S_D 0xfff0007f +#define MATCH_FCVT_D_S 0x42000053 +#define MASK_FCVT_D_S 0xfff0007f +#define MATCH_FSQRT_D 0x5a000053 +#define MASK_FSQRT_D 0xfff0007f +#define MATCH_FADD_Q 0x6000053 +#define MASK_FADD_Q 0xfe00007f +#define MATCH_FSUB_Q 0xe000053 +#define MASK_FSUB_Q 0xfe00007f +#define MATCH_FMUL_Q 0x16000053 +#define MASK_FMUL_Q 0xfe00007f +#define MATCH_FDIV_Q 0x1e000053 +#define MASK_FDIV_Q 0xfe00007f +#define MATCH_FSGNJ_Q 0x26000053 +#define MASK_FSGNJ_Q 0xfe00707f +#define MATCH_FSGNJN_Q 0x26001053 +#define MASK_FSGNJN_Q 0xfe00707f +#define MATCH_FSGNJX_Q 0x26002053 +#define MASK_FSGNJX_Q 0xfe00707f +#define MATCH_FMIN_Q 0x2e000053 +#define MASK_FMIN_Q 0xfe00707f +#define MATCH_FMAX_Q 0x2e001053 +#define MASK_FMAX_Q 0xfe00707f +#define MATCH_FCVT_S_Q 0x40300053 +#define MASK_FCVT_S_Q 0xfff0007f +#define MATCH_FCVT_Q_S 0x46000053 +#define MASK_FCVT_Q_S 0xfff0007f +#define MATCH_FCVT_D_Q 0x42300053 +#define MASK_FCVT_D_Q 0xfff0007f +#define MATCH_FCVT_Q_D 0x46100053 +#define MASK_FCVT_Q_D 0xfff0007f +#define MATCH_FSQRT_Q 0x5e000053 +#define MASK_FSQRT_Q 0xfff0007f +#define MATCH_FLE_S 0xa0000053 +#define MASK_FLE_S 0xfe00707f +#define MATCH_FLT_S 0xa0001053 +#define MASK_FLT_S 0xfe00707f +#define MATCH_FEQ_S 0xa0002053 +#define MASK_FEQ_S 0xfe00707f +#define MATCH_FLE_D 0xa2000053 +#define MASK_FLE_D 0xfe00707f +#define MATCH_FLT_D 0xa2001053 +#define MASK_FLT_D 0xfe00707f +#define MATCH_FEQ_D 0xa2002053 +#define MASK_FEQ_D 0xfe00707f +#define MATCH_FLE_Q 0xa6000053 +#define MASK_FLE_Q 0xfe00707f +#define MATCH_FLT_Q 0xa6001053 +#define MASK_FLT_Q 0xfe00707f +#define MATCH_FEQ_Q 0xa6002053 +#define MASK_FEQ_Q 0xfe00707f +#define MATCH_FCVT_W_S 0xc0000053 +#define MASK_FCVT_W_S 0xfff0007f +#define MATCH_FCVT_WU_S 0xc0100053 +#define MASK_FCVT_WU_S 0xfff0007f +#define MATCH_FCVT_L_S 0xc0200053 +#define MASK_FCVT_L_S 0xfff0007f +#define MATCH_FCVT_LU_S 0xc0300053 +#define MASK_FCVT_LU_S 0xfff0007f +#define MATCH_FMV_X_W 0xe0000053 +#define MASK_FMV_X_W 0xfff0707f +#define MATCH_FCLASS_S 0xe0001053 +#define MASK_FCLASS_S 0xfff0707f +#define MATCH_FCVT_W_D 0xc2000053 +#define MASK_FCVT_W_D 0xfff0007f +#define MATCH_FCVT_WU_D 0xc2100053 +#define MASK_FCVT_WU_D 0xfff0007f +#define MATCH_FCVT_L_D 0xc2200053 +#define MASK_FCVT_L_D 0xfff0007f +#define MATCH_FCVT_LU_D 0xc2300053 +#define MASK_FCVT_LU_D 0xfff0007f +#define MATCH_FMV_X_D 0xe2000053 +#define MASK_FMV_X_D 0xfff0707f +#define MATCH_FCLASS_D 0xe2001053 +#define MASK_FCLASS_D 0xfff0707f +#define MATCH_FCVT_W_Q 0xc6000053 +#define MASK_FCVT_W_Q 0xfff0007f +#define MATCH_FCVT_WU_Q 0xc6100053 +#define MASK_FCVT_WU_Q 0xfff0007f +#define MATCH_FCVT_L_Q 0xc6200053 +#define MASK_FCVT_L_Q 0xfff0007f +#define MATCH_FCVT_LU_Q 0xc6300053 +#define MASK_FCVT_LU_Q 0xfff0007f +#define MATCH_FMV_X_Q 0xe6000053 +#define MASK_FMV_X_Q 0xfff0707f +#define MATCH_FCLASS_Q 0xe6001053 +#define MASK_FCLASS_Q 0xfff0707f +#define MATCH_FCVT_S_W 0xd0000053 +#define MASK_FCVT_S_W 0xfff0007f +#define MATCH_FCVT_S_WU 0xd0100053 +#define MASK_FCVT_S_WU 0xfff0007f +#define MATCH_FCVT_S_L 0xd0200053 +#define MASK_FCVT_S_L 0xfff0007f +#define MATCH_FCVT_S_LU 0xd0300053 +#define MASK_FCVT_S_LU 0xfff0007f +#define MATCH_FMV_W_X 0xf0000053 +#define MASK_FMV_W_X 0xfff0707f +#define MATCH_FCVT_D_W 0xd2000053 +#define MASK_FCVT_D_W 0xfff0007f +#define MATCH_FCVT_D_WU 0xd2100053 +#define MASK_FCVT_D_WU 0xfff0007f +#define MATCH_FCVT_D_L 0xd2200053 +#define MASK_FCVT_D_L 0xfff0007f +#define MATCH_FCVT_D_LU 0xd2300053 +#define MASK_FCVT_D_LU 0xfff0007f +#define MATCH_FMV_D_X 0xf2000053 +#define MASK_FMV_D_X 0xfff0707f +#define MATCH_FCVT_Q_W 0xd6000053 +#define MASK_FCVT_Q_W 0xfff0007f +#define MATCH_FCVT_Q_WU 0xd6100053 +#define MASK_FCVT_Q_WU 0xfff0007f +#define MATCH_FCVT_Q_L 0xd6200053 +#define MASK_FCVT_Q_L 0xfff0007f +#define MATCH_FCVT_Q_LU 0xd6300053 +#define MASK_FCVT_Q_LU 0xfff0007f +#define MATCH_FMV_Q_X 0xf6000053 +#define MASK_FMV_Q_X 0xfff0707f +#define MATCH_FLW 0x2007 +#define MASK_FLW 0x707f +#define MATCH_FLD 0x3007 +#define MASK_FLD 0x707f +#define MATCH_FLQ 0x4007 +#define MASK_FLQ 0x707f +#define MATCH_FSW 0x2027 +#define MASK_FSW 0x707f +#define MATCH_FSD 0x3027 +#define MASK_FSD 0x707f +#define MATCH_FSQ 0x4027 +#define MASK_FSQ 0x707f +#define MATCH_FMADD_S 0x43 +#define MASK_FMADD_S 0x600007f +#define MATCH_FMSUB_S 0x47 +#define MASK_FMSUB_S 0x600007f +#define MATCH_FNMSUB_S 0x4b +#define MASK_FNMSUB_S 0x600007f +#define MATCH_FNMADD_S 0x4f +#define MASK_FNMADD_S 0x600007f +#define MATCH_FMADD_D 0x2000043 +#define MASK_FMADD_D 0x600007f +#define MATCH_FMSUB_D 0x2000047 +#define MASK_FMSUB_D 0x600007f +#define MATCH_FNMSUB_D 0x200004b +#define MASK_FNMSUB_D 0x600007f +#define MATCH_FNMADD_D 0x200004f +#define MASK_FNMADD_D 0x600007f +#define MATCH_FMADD_Q 0x6000043 +#define MASK_FMADD_Q 0x600007f +#define MATCH_FMSUB_Q 0x6000047 +#define MASK_FMSUB_Q 0x600007f +#define MATCH_FNMSUB_Q 0x600004b +#define MASK_FNMSUB_Q 0x600007f +#define MATCH_FNMADD_Q 0x600004f +#define MASK_FNMADD_Q 0x600007f +#define MATCH_C_NOP 0x1 +#define MASK_C_NOP 0xffff +#define MATCH_C_ADDI16SP 0x6101 +#define MASK_C_ADDI16SP 0xef83 +#define MATCH_C_JR 0x8002 +#define MASK_C_JR 0xf07f +#define MATCH_C_JALR 0x9002 +#define MASK_C_JALR 0xf07f +#define MATCH_C_EBREAK 0x9002 +#define MASK_C_EBREAK 0xffff +#define MATCH_C_LD 0x6000 +#define MASK_C_LD 0xe003 +#define MATCH_C_SD 0xe000 +#define MASK_C_SD 0xe003 +#define MATCH_C_ADDIW 0x2001 +#define MASK_C_ADDIW 0xe003 +#define MATCH_C_LDSP 0x6002 +#define MASK_C_LDSP 0xe003 +#define MATCH_C_SDSP 0xe002 +#define MASK_C_SDSP 0xe003 +#define MATCH_C_ADDI4SPN 0x0 +#define MASK_C_ADDI4SPN 0xe003 +#define MATCH_C_FLD 0x2000 +#define MASK_C_FLD 0xe003 +#define MATCH_C_LW 0x4000 +#define MASK_C_LW 0xe003 +#define MATCH_C_FLW 0x6000 +#define MASK_C_FLW 0xe003 +#define MATCH_C_FSD 0xa000 +#define MASK_C_FSD 0xe003 +#define MATCH_C_SW 0xc000 +#define MASK_C_SW 0xe003 +#define MATCH_C_FSW 0xe000 +#define MASK_C_FSW 0xe003 +#define MATCH_C_ADDI 0x1 +#define MASK_C_ADDI 0xe003 +#define MATCH_C_JAL 0x2001 +#define MASK_C_JAL 0xe003 +#define MATCH_C_LI 0x4001 +#define MASK_C_LI 0xe003 +#define MATCH_C_LUI 0x6001 +#define MASK_C_LUI 0xe003 +#define MATCH_C_SRLI 0x8001 +#define MASK_C_SRLI 0xec03 +#define MATCH_C_SRAI 0x8401 +#define MASK_C_SRAI 0xec03 +#define MATCH_C_ANDI 0x8801 +#define MASK_C_ANDI 0xec03 +#define MATCH_C_SUB 0x8c01 +#define MASK_C_SUB 0xfc63 +#define MATCH_C_XOR 0x8c21 +#define MASK_C_XOR 0xfc63 +#define MATCH_C_OR 0x8c41 +#define MASK_C_OR 0xfc63 +#define MATCH_C_AND 0x8c61 +#define MASK_C_AND 0xfc63 +#define MATCH_C_SUBW 0x9c01 +#define MASK_C_SUBW 0xfc63 +#define MATCH_C_ADDW 0x9c21 +#define MASK_C_ADDW 0xfc63 +#define MATCH_C_J 0xa001 +#define MASK_C_J 0xe003 +#define MATCH_C_BEQZ 0xc001 +#define MASK_C_BEQZ 0xe003 +#define MATCH_C_BNEZ 0xe001 +#define MASK_C_BNEZ 0xe003 +#define MATCH_C_SLLI 0x2 +#define MASK_C_SLLI 0xe003 +#define MATCH_C_FLDSP 0x2002 +#define MASK_C_FLDSP 0xe003 +#define MATCH_C_LWSP 0x4002 +#define MASK_C_LWSP 0xe003 +#define MATCH_C_FLWSP 0x6002 +#define MASK_C_FLWSP 0xe003 +#define MATCH_C_MV 0x8002 +#define MASK_C_MV 0xf003 +#define MATCH_C_ADD 0x9002 +#define MASK_C_ADD 0xf003 +#define MATCH_C_FSDSP 0xa002 +#define MASK_C_FSDSP 0xe003 +#define MATCH_C_SWSP 0xc002 +#define MASK_C_SWSP 0xe003 +#define MATCH_C_FSWSP 0xe002 +#define MASK_C_FSWSP 0xe003 +#define MATCH_CUSTOM0 0xb +#define MASK_CUSTOM0 0x707f +#define MATCH_CUSTOM0_RS1 0x200b +#define MASK_CUSTOM0_RS1 0x707f +#define MATCH_CUSTOM0_RS1_RS2 0x300b +#define MASK_CUSTOM0_RS1_RS2 0x707f +#define MATCH_CUSTOM0_RD 0x400b +#define MASK_CUSTOM0_RD 0x707f +#define MATCH_CUSTOM0_RD_RS1 0x600b +#define MASK_CUSTOM0_RD_RS1 0x707f +#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b +#define MASK_CUSTOM0_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM1 0x2b +#define MASK_CUSTOM1 0x707f +#define MATCH_CUSTOM1_RS1 0x202b +#define MASK_CUSTOM1_RS1 0x707f +#define MATCH_CUSTOM1_RS1_RS2 0x302b +#define MASK_CUSTOM1_RS1_RS2 0x707f +#define MATCH_CUSTOM1_RD 0x402b +#define MASK_CUSTOM1_RD 0x707f +#define MATCH_CUSTOM1_RD_RS1 0x602b +#define MASK_CUSTOM1_RD_RS1 0x707f +#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b +#define MASK_CUSTOM1_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM2 0x5b +#define MASK_CUSTOM2 0x707f +#define MATCH_CUSTOM2_RS1 0x205b +#define MASK_CUSTOM2_RS1 0x707f +#define MATCH_CUSTOM2_RS1_RS2 0x305b +#define MASK_CUSTOM2_RS1_RS2 0x707f +#define MATCH_CUSTOM2_RD 0x405b +#define MASK_CUSTOM2_RD 0x707f +#define MATCH_CUSTOM2_RD_RS1 0x605b +#define MASK_CUSTOM2_RD_RS1 0x707f +#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b +#define MASK_CUSTOM2_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM3 0x7b +#define MASK_CUSTOM3 0x707f +#define MATCH_CUSTOM3_RS1 0x207b +#define MASK_CUSTOM3_RS1 0x707f +#define MATCH_CUSTOM3_RS1_RS2 0x307b +#define MASK_CUSTOM3_RS1_RS2 0x707f +#define MATCH_CUSTOM3_RD 0x407b +#define MASK_CUSTOM3_RD 0x707f +#define MATCH_CUSTOM3_RD_RS1 0x607b +#define MASK_CUSTOM3_RD_RS1 0x707f +#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b +#define MASK_CUSTOM3_RD_RS1_RS2 0x707f +#define CSR_FFLAGS 0x1 +#define CSR_FRM 0x2 +#define CSR_FCSR 0x3 +#define CSR_CYCLE 0xc00 +#define CSR_TIME 0xc01 +#define CSR_INSTRET 0xc02 +#define CSR_HPMCOUNTER3 0xc03 +#define CSR_HPMCOUNTER4 0xc04 +#define CSR_HPMCOUNTER5 0xc05 +#define CSR_HPMCOUNTER6 0xc06 +#define CSR_HPMCOUNTER7 0xc07 +#define CSR_HPMCOUNTER8 0xc08 +#define CSR_HPMCOUNTER9 0xc09 +#define CSR_HPMCOUNTER10 0xc0a +#define CSR_HPMCOUNTER11 0xc0b +#define CSR_HPMCOUNTER12 0xc0c +#define CSR_HPMCOUNTER13 0xc0d +#define CSR_HPMCOUNTER14 0xc0e +#define CSR_HPMCOUNTER15 0xc0f +#define CSR_HPMCOUNTER16 0xc10 +#define CSR_HPMCOUNTER17 0xc11 +#define CSR_HPMCOUNTER18 0xc12 +#define CSR_HPMCOUNTER19 0xc13 +#define CSR_HPMCOUNTER20 0xc14 +#define CSR_HPMCOUNTER21 0xc15 +#define CSR_HPMCOUNTER22 0xc16 +#define CSR_HPMCOUNTER23 0xc17 +#define CSR_HPMCOUNTER24 0xc18 +#define CSR_HPMCOUNTER25 0xc19 +#define CSR_HPMCOUNTER26 0xc1a +#define CSR_HPMCOUNTER27 0xc1b +#define CSR_HPMCOUNTER28 0xc1c +#define CSR_HPMCOUNTER29 0xc1d +#define CSR_HPMCOUNTER30 0xc1e +#define CSR_HPMCOUNTER31 0xc1f +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SCOUNTEREN 0x106 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_STVAL 0x143 +#define CSR_SIP 0x144 +#define CSR_SATP 0x180 +#define CSR_MSTATUS 0x300 +#define CSR_MISA 0x301 +#define CSR_MEDELEG 0x302 +#define CSR_MIDELEG 0x303 +#define CSR_MIE 0x304 +#define CSR_MTVEC 0x305 +#define CSR_MCOUNTEREN 0x306 +#define CSR_MSCRATCH 0x340 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 +#define CSR_MTVAL 0x343 +#define CSR_MIP 0x344 +#define CSR_PMPCFG0 0x3a0 +#define CSR_PMPCFG1 0x3a1 +#define CSR_PMPCFG2 0x3a2 +#define CSR_PMPCFG3 0x3a3 +#define CSR_PMPADDR0 0x3b0 +#define CSR_PMPADDR1 0x3b1 +#define CSR_PMPADDR2 0x3b2 +#define CSR_PMPADDR3 0x3b3 +#define CSR_PMPADDR4 0x3b4 +#define CSR_PMPADDR5 0x3b5 +#define CSR_PMPADDR6 0x3b6 +#define CSR_PMPADDR7 0x3b7 +#define CSR_PMPADDR8 0x3b8 +#define CSR_PMPADDR9 0x3b9 +#define CSR_PMPADDR10 0x3ba +#define CSR_PMPADDR11 0x3bb +#define CSR_PMPADDR12 0x3bc +#define CSR_PMPADDR13 0x3bd +#define CSR_PMPADDR14 0x3be +#define CSR_PMPADDR15 0x3bf +#define CSR_TSELECT 0x7a0 +#define CSR_TDATA1 0x7a1 +#define CSR_TDATA2 0x7a2 +#define CSR_TDATA3 0x7a3 +#define CSR_DCSR 0x7b0 +#define CSR_DPC 0x7b1 +#define CSR_DSCRATCH 0x7b2 +#define CSR_MCYCLE 0xb00 +#define CSR_MINSTRET 0xb02 +#define CSR_MHPMCOUNTER3 0xb03 +#define CSR_MHPMCOUNTER4 0xb04 +#define CSR_MHPMCOUNTER5 0xb05 +#define CSR_MHPMCOUNTER6 0xb06 +#define CSR_MHPMCOUNTER7 0xb07 +#define CSR_MHPMCOUNTER8 0xb08 +#define CSR_MHPMCOUNTER9 0xb09 +#define CSR_MHPMCOUNTER10 0xb0a +#define CSR_MHPMCOUNTER11 0xb0b +#define CSR_MHPMCOUNTER12 0xb0c +#define CSR_MHPMCOUNTER13 0xb0d +#define CSR_MHPMCOUNTER14 0xb0e +#define CSR_MHPMCOUNTER15 0xb0f +#define CSR_MHPMCOUNTER16 0xb10 +#define CSR_MHPMCOUNTER17 0xb11 +#define CSR_MHPMCOUNTER18 0xb12 +#define CSR_MHPMCOUNTER19 0xb13 +#define CSR_MHPMCOUNTER20 0xb14 +#define CSR_MHPMCOUNTER21 0xb15 +#define CSR_MHPMCOUNTER22 0xb16 +#define CSR_MHPMCOUNTER23 0xb17 +#define CSR_MHPMCOUNTER24 0xb18 +#define CSR_MHPMCOUNTER25 0xb19 +#define CSR_MHPMCOUNTER26 0xb1a +#define CSR_MHPMCOUNTER27 0xb1b +#define CSR_MHPMCOUNTER28 0xb1c +#define CSR_MHPMCOUNTER29 0xb1d +#define CSR_MHPMCOUNTER30 0xb1e +#define CSR_MHPMCOUNTER31 0xb1f +#define CSR_MHPMEVENT3 0x323 +#define CSR_MHPMEVENT4 0x324 +#define CSR_MHPMEVENT5 0x325 +#define CSR_MHPMEVENT6 0x326 +#define CSR_MHPMEVENT7 0x327 +#define CSR_MHPMEVENT8 0x328 +#define CSR_MHPMEVENT9 0x329 +#define CSR_MHPMEVENT10 0x32a +#define CSR_MHPMEVENT11 0x32b +#define CSR_MHPMEVENT12 0x32c +#define CSR_MHPMEVENT13 0x32d +#define CSR_MHPMEVENT14 0x32e +#define CSR_MHPMEVENT15 0x32f +#define CSR_MHPMEVENT16 0x330 +#define CSR_MHPMEVENT17 0x331 +#define CSR_MHPMEVENT18 0x332 +#define CSR_MHPMEVENT19 0x333 +#define CSR_MHPMEVENT20 0x334 +#define CSR_MHPMEVENT21 0x335 +#define CSR_MHPMEVENT22 0x336 +#define CSR_MHPMEVENT23 0x337 +#define CSR_MHPMEVENT24 0x338 +#define CSR_MHPMEVENT25 0x339 +#define CSR_MHPMEVENT26 0x33a +#define CSR_MHPMEVENT27 0x33b +#define CSR_MHPMEVENT28 0x33c +#define CSR_MHPMEVENT29 0x33d +#define CSR_MHPMEVENT30 0x33e +#define CSR_MHPMEVENT31 0x33f +#define CSR_MVENDORID 0xf11 +#define CSR_MARCHID 0xf12 +#define CSR_MIMPID 0xf13 +#define CSR_MHARTID 0xf14 +#define CSR_CYCLEH 0xc80 +#define CSR_TIMEH 0xc81 +#define CSR_INSTRETH 0xc82 +#define CSR_HPMCOUNTER3H 0xc83 +#define CSR_HPMCOUNTER4H 0xc84 +#define CSR_HPMCOUNTER5H 0xc85 +#define CSR_HPMCOUNTER6H 0xc86 +#define CSR_HPMCOUNTER7H 0xc87 +#define CSR_HPMCOUNTER8H 0xc88 +#define CSR_HPMCOUNTER9H 0xc89 +#define CSR_HPMCOUNTER10H 0xc8a +#define CSR_HPMCOUNTER11H 0xc8b +#define CSR_HPMCOUNTER12H 0xc8c +#define CSR_HPMCOUNTER13H 0xc8d +#define CSR_HPMCOUNTER14H 0xc8e +#define CSR_HPMCOUNTER15H 0xc8f +#define CSR_HPMCOUNTER16H 0xc90 +#define CSR_HPMCOUNTER17H 0xc91 +#define CSR_HPMCOUNTER18H 0xc92 +#define CSR_HPMCOUNTER19H 0xc93 +#define CSR_HPMCOUNTER20H 0xc94 +#define CSR_HPMCOUNTER21H 0xc95 +#define CSR_HPMCOUNTER22H 0xc96 +#define CSR_HPMCOUNTER23H 0xc97 +#define CSR_HPMCOUNTER24H 0xc98 +#define CSR_HPMCOUNTER25H 0xc99 +#define CSR_HPMCOUNTER26H 0xc9a +#define CSR_HPMCOUNTER27H 0xc9b +#define CSR_HPMCOUNTER28H 0xc9c +#define CSR_HPMCOUNTER29H 0xc9d +#define CSR_HPMCOUNTER30H 0xc9e +#define CSR_HPMCOUNTER31H 0xc9f +#define CSR_MCYCLEH 0xb80 +#define CSR_MINSTRETH 0xb82 +#define CSR_MHPMCOUNTER3H 0xb83 +#define CSR_MHPMCOUNTER4H 0xb84 +#define CSR_MHPMCOUNTER5H 0xb85 +#define CSR_MHPMCOUNTER6H 0xb86 +#define CSR_MHPMCOUNTER7H 0xb87 +#define CSR_MHPMCOUNTER8H 0xb88 +#define CSR_MHPMCOUNTER9H 0xb89 +#define CSR_MHPMCOUNTER10H 0xb8a +#define CSR_MHPMCOUNTER11H 0xb8b +#define CSR_MHPMCOUNTER12H 0xb8c +#define CSR_MHPMCOUNTER13H 0xb8d +#define CSR_MHPMCOUNTER14H 0xb8e +#define CSR_MHPMCOUNTER15H 0xb8f +#define CSR_MHPMCOUNTER16H 0xb90 +#define CSR_MHPMCOUNTER17H 0xb91 +#define CSR_MHPMCOUNTER18H 0xb92 +#define CSR_MHPMCOUNTER19H 0xb93 +#define CSR_MHPMCOUNTER20H 0xb94 +#define CSR_MHPMCOUNTER21H 0xb95 +#define CSR_MHPMCOUNTER22H 0xb96 +#define CSR_MHPMCOUNTER23H 0xb97 +#define CSR_MHPMCOUNTER24H 0xb98 +#define CSR_MHPMCOUNTER25H 0xb99 +#define CSR_MHPMCOUNTER26H 0xb9a +#define CSR_MHPMCOUNTER27H 0xb9b +#define CSR_MHPMCOUNTER28H 0xb9c +#define CSR_MHPMCOUNTER29H 0xb9d +#define CSR_MHPMCOUNTER30H 0xb9e +#define CSR_MHPMCOUNTER31H 0xb9f +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FETCH_ACCESS 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_LOAD_ACCESS 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_STORE_ACCESS 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb +#define CAUSE_FETCH_PAGE_FAULT 0xc +#define CAUSE_LOAD_PAGE_FAULT 0xd +#define CAUSE_STORE_PAGE_FAULT 0xf +#endif +#ifdef DECLARE_INSN +DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) +DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) +DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) +DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) +DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) +DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) +DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) +DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) +DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) +DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) +DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) +DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) +DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) +DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) +DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) +DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) +DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) +DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) +DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) +DECLARE_INSN(add, MATCH_ADD, MASK_ADD) +DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) +DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) +DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) +DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) +DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) +DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) +DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) +DECLARE_INSN(or, MATCH_OR, MASK_OR) +DECLARE_INSN(and, MATCH_AND, MASK_AND) +DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) +DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) +DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) +DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) +DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) +DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) +DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) +DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) +DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) +DECLARE_INSN(lb, MATCH_LB, MASK_LB) +DECLARE_INSN(lh, MATCH_LH, MASK_LH) +DECLARE_INSN(lw, MATCH_LW, MASK_LW) +DECLARE_INSN(ld, MATCH_LD, MASK_LD) +DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) +DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) +DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) +DECLARE_INSN(sb, MATCH_SB, MASK_SB) +DECLARE_INSN(sh, MATCH_SH, MASK_SH) +DECLARE_INSN(sw, MATCH_SW, MASK_SW) +DECLARE_INSN(sd, MATCH_SD, MASK_SD) +DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) +DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) +DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) +DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) +DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) +DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) +DECLARE_INSN(div, MATCH_DIV, MASK_DIV) +DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) +DECLARE_INSN(rem, MATCH_REM, MASK_REM) +DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) +DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) +DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) +DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) +DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) +DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) +DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) +DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) +DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) +DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) +DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) +DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) +DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) +DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) +DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) +DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) +DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) +DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) +DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) +DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) +DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) +DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) +DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) +DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) +DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) +DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) +DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) +DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) +DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) +DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) +DECLARE_INSN(uret, MATCH_URET, MASK_URET) +DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) +DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) +DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) +DECLARE_INSN(sfence_vma, MATCH_SFENCE_VMA, MASK_SFENCE_VMA) +DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) +DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) +DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) +DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) +DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) +DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) +DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) +DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) +DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) +DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) +DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) +DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) +DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) +DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) +DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) +DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) +DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) +DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) +DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) +DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) +DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) +DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) +DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) +DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) +DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) +DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) +DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) +DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) +DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) +DECLARE_INSN(fadd_q, MATCH_FADD_Q, MASK_FADD_Q) +DECLARE_INSN(fsub_q, MATCH_FSUB_Q, MASK_FSUB_Q) +DECLARE_INSN(fmul_q, MATCH_FMUL_Q, MASK_FMUL_Q) +DECLARE_INSN(fdiv_q, MATCH_FDIV_Q, MASK_FDIV_Q) +DECLARE_INSN(fsgnj_q, MATCH_FSGNJ_Q, MASK_FSGNJ_Q) +DECLARE_INSN(fsgnjn_q, MATCH_FSGNJN_Q, MASK_FSGNJN_Q) +DECLARE_INSN(fsgnjx_q, MATCH_FSGNJX_Q, MASK_FSGNJX_Q) +DECLARE_INSN(fmin_q, MATCH_FMIN_Q, MASK_FMIN_Q) +DECLARE_INSN(fmax_q, MATCH_FMAX_Q, MASK_FMAX_Q) +DECLARE_INSN(fcvt_s_q, MATCH_FCVT_S_Q, MASK_FCVT_S_Q) +DECLARE_INSN(fcvt_q_s, MATCH_FCVT_Q_S, MASK_FCVT_Q_S) +DECLARE_INSN(fcvt_d_q, MATCH_FCVT_D_Q, MASK_FCVT_D_Q) +DECLARE_INSN(fcvt_q_d, MATCH_FCVT_Q_D, MASK_FCVT_Q_D) +DECLARE_INSN(fsqrt_q, MATCH_FSQRT_Q, MASK_FSQRT_Q) +DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) +DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) +DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) +DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) +DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) +DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) +DECLARE_INSN(fle_q, MATCH_FLE_Q, MASK_FLE_Q) +DECLARE_INSN(flt_q, MATCH_FLT_Q, MASK_FLT_Q) +DECLARE_INSN(feq_q, MATCH_FEQ_Q, MASK_FEQ_Q) +DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) +DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) +DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) +DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) +DECLARE_INSN(fmv_x_w, MATCH_FMV_X_W, MASK_FMV_X_W) +DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) +DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) +DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) +DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) +DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) +DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) +DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) +DECLARE_INSN(fcvt_w_q, MATCH_FCVT_W_Q, MASK_FCVT_W_Q) +DECLARE_INSN(fcvt_wu_q, MATCH_FCVT_WU_Q, MASK_FCVT_WU_Q) +DECLARE_INSN(fcvt_l_q, MATCH_FCVT_L_Q, MASK_FCVT_L_Q) +DECLARE_INSN(fcvt_lu_q, MATCH_FCVT_LU_Q, MASK_FCVT_LU_Q) +DECLARE_INSN(fmv_x_q, MATCH_FMV_X_Q, MASK_FMV_X_Q) +DECLARE_INSN(fclass_q, MATCH_FCLASS_Q, MASK_FCLASS_Q) +DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) +DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) +DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) +DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) +DECLARE_INSN(fmv_w_x, MATCH_FMV_W_X, MASK_FMV_W_X) +DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) +DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) +DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) +DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) +DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) +DECLARE_INSN(fcvt_q_w, MATCH_FCVT_Q_W, MASK_FCVT_Q_W) +DECLARE_INSN(fcvt_q_wu, MATCH_FCVT_Q_WU, MASK_FCVT_Q_WU) +DECLARE_INSN(fcvt_q_l, MATCH_FCVT_Q_L, MASK_FCVT_Q_L) +DECLARE_INSN(fcvt_q_lu, MATCH_FCVT_Q_LU, MASK_FCVT_Q_LU) +DECLARE_INSN(fmv_q_x, MATCH_FMV_Q_X, MASK_FMV_Q_X) +DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) +DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) +DECLARE_INSN(flq, MATCH_FLQ, MASK_FLQ) +DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) +DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) +DECLARE_INSN(fsq, MATCH_FSQ, MASK_FSQ) +DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) +DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) +DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) +DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) +DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) +DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) +DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) +DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) +DECLARE_INSN(fmadd_q, MATCH_FMADD_Q, MASK_FMADD_Q) +DECLARE_INSN(fmsub_q, MATCH_FMSUB_Q, MASK_FMSUB_Q) +DECLARE_INSN(fnmsub_q, MATCH_FNMSUB_Q, MASK_FNMSUB_Q) +DECLARE_INSN(fnmadd_q, MATCH_FNMADD_Q, MASK_FNMADD_Q) +DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) +DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) +DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) +DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) +DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) +DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) +DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) +DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) +DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) +DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) +DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) +DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) +DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) +DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) +DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) +DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) +DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) +DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) +DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) +DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) +DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) +DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) +DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) +DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) +DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) +DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) +DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) +DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) +DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) +DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) +DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) +DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) +DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) +DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) +DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) +DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) +DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) +DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) +DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) +DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) +DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) +DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) +DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) +DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) +DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) +DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) +DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) +DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, MASK_CUSTOM0_RD_RS1_RS2) +DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) +DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) +DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) +DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) +DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) +DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, MASK_CUSTOM1_RD_RS1_RS2) +DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) +DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) +DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) +DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) +DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) +DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, MASK_CUSTOM2_RD_RS1_RS2) +DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) +DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) +DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) +DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) +DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) +DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, MASK_CUSTOM3_RD_RS1_RS2) +#endif +#ifdef DECLARE_CSR +DECLARE_CSR(fflags, CSR_FFLAGS) +DECLARE_CSR(frm, CSR_FRM) +DECLARE_CSR(fcsr, CSR_FCSR) +DECLARE_CSR(cycle, CSR_CYCLE) +DECLARE_CSR(time, CSR_TIME) +DECLARE_CSR(instret, CSR_INSTRET) +DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) +DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) +DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) +DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) +DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) +DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) +DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) +DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) +DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) +DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) +DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) +DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) +DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) +DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) +DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) +DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) +DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) +DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) +DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) +DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) +DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) +DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) +DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) +DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) +DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) +DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) +DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) +DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) +DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) +DECLARE_CSR(sstatus, CSR_SSTATUS) +DECLARE_CSR(sie, CSR_SIE) +DECLARE_CSR(stvec, CSR_STVEC) +DECLARE_CSR(scounteren, CSR_SCOUNTEREN) +DECLARE_CSR(sscratch, CSR_SSCRATCH) +DECLARE_CSR(sepc, CSR_SEPC) +DECLARE_CSR(scause, CSR_SCAUSE) +DECLARE_CSR(stval, CSR_STVAL) +DECLARE_CSR(sip, CSR_SIP) +DECLARE_CSR(satp, CSR_SATP) +DECLARE_CSR(mstatus, CSR_MSTATUS) +DECLARE_CSR(misa, CSR_MISA) +DECLARE_CSR(medeleg, CSR_MEDELEG) +DECLARE_CSR(mideleg, CSR_MIDELEG) +DECLARE_CSR(mie, CSR_MIE) +DECLARE_CSR(mtvec, CSR_MTVEC) +DECLARE_CSR(mcounteren, CSR_MCOUNTEREN) +DECLARE_CSR(mscratch, CSR_MSCRATCH) +DECLARE_CSR(mepc, CSR_MEPC) +DECLARE_CSR(mcause, CSR_MCAUSE) +DECLARE_CSR(mtval, CSR_MTVAL) +DECLARE_CSR(mip, CSR_MIP) +DECLARE_CSR(pmpcfg0, CSR_PMPCFG0) +DECLARE_CSR(pmpcfg1, CSR_PMPCFG1) +DECLARE_CSR(pmpcfg2, CSR_PMPCFG2) +DECLARE_CSR(pmpcfg3, CSR_PMPCFG3) +DECLARE_CSR(pmpaddr0, CSR_PMPADDR0) +DECLARE_CSR(pmpaddr1, CSR_PMPADDR1) +DECLARE_CSR(pmpaddr2, CSR_PMPADDR2) +DECLARE_CSR(pmpaddr3, CSR_PMPADDR3) +DECLARE_CSR(pmpaddr4, CSR_PMPADDR4) +DECLARE_CSR(pmpaddr5, CSR_PMPADDR5) +DECLARE_CSR(pmpaddr6, CSR_PMPADDR6) +DECLARE_CSR(pmpaddr7, CSR_PMPADDR7) +DECLARE_CSR(pmpaddr8, CSR_PMPADDR8) +DECLARE_CSR(pmpaddr9, CSR_PMPADDR9) +DECLARE_CSR(pmpaddr10, CSR_PMPADDR10) +DECLARE_CSR(pmpaddr11, CSR_PMPADDR11) +DECLARE_CSR(pmpaddr12, CSR_PMPADDR12) +DECLARE_CSR(pmpaddr13, CSR_PMPADDR13) +DECLARE_CSR(pmpaddr14, CSR_PMPADDR14) +DECLARE_CSR(pmpaddr15, CSR_PMPADDR15) +DECLARE_CSR(tselect, CSR_TSELECT) +DECLARE_CSR(tdata1, CSR_TDATA1) +DECLARE_CSR(tdata2, CSR_TDATA2) +DECLARE_CSR(tdata3, CSR_TDATA3) +DECLARE_CSR(dcsr, CSR_DCSR) +DECLARE_CSR(dpc, CSR_DPC) +DECLARE_CSR(dscratch, CSR_DSCRATCH) +DECLARE_CSR(mcycle, CSR_MCYCLE) +DECLARE_CSR(minstret, CSR_MINSTRET) +DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) +DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) +DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) +DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) +DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) +DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) +DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) +DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) +DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) +DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) +DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) +DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) +DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) +DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) +DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) +DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) +DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) +DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) +DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) +DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) +DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) +DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) +DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) +DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) +DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) +DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) +DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) +DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) +DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) +DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) +DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) +DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) +DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) +DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) +DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) +DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) +DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) +DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) +DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) +DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) +DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) +DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) +DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) +DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) +DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) +DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) +DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) +DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) +DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) +DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) +DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) +DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) +DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) +DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) +DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) +DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) +DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) +DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) +DECLARE_CSR(mvendorid, CSR_MVENDORID) +DECLARE_CSR(marchid, CSR_MARCHID) +DECLARE_CSR(mimpid, CSR_MIMPID) +DECLARE_CSR(mhartid, CSR_MHARTID) +DECLARE_CSR(cycleh, CSR_CYCLEH) +DECLARE_CSR(timeh, CSR_TIMEH) +DECLARE_CSR(instreth, CSR_INSTRETH) +DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) +DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) +DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) +DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) +DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) +DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) +DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) +DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) +DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) +DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) +DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) +DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) +DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) +DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) +DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) +DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) +DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) +DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) +DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) +DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) +DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) +DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) +DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) +DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) +DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) +DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) +DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) +DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) +DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) +DECLARE_CSR(mcycleh, CSR_MCYCLEH) +DECLARE_CSR(minstreth, CSR_MINSTRETH) +DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) +DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) +DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) +DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) +DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) +DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) +DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) +DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) +DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) +DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) +DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) +DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) +DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) +DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) +DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) +DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) +DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) +DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) +DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) +DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) +DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) +DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) +DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) +DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) +DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) +DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) +DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) +DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) +DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) +#endif +#ifdef DECLARE_CAUSE +DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) +DECLARE_CAUSE("fetch access", CAUSE_FETCH_ACCESS) +DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) +DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) +DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) +DECLARE_CAUSE("load access", CAUSE_LOAD_ACCESS) +DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) +DECLARE_CAUSE("store access", CAUSE_STORE_ACCESS) +DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) +DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) +DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) +DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) +DECLARE_CAUSE("fetch page fault", CAUSE_FETCH_PAGE_FAULT) +DECLARE_CAUSE("load page fault", CAUSE_LOAD_PAGE_FAULT) +DECLARE_CAUSE("store page fault", CAUSE_STORE_PAGE_FAULT) +#endif diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/link.ld b/benchmarks/riscv-coremark/riscv64-baremetal/link.ld new file mode 100644 index 000000000..4f8892ee2 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/link.ld @@ -0,0 +1,66 @@ +/*======================================================================*/ +/* Proxy kernel linker script */ +/*======================================================================*/ +/* This is the linker script used when building the proxy kernel. */ + +/*----------------------------------------------------------------------*/ +/* Setup */ +/*----------------------------------------------------------------------*/ + +/* The OUTPUT_ARCH command specifies the machine architecture where the + argument is one of the names used in the BFD library. More + specifically one of the entires in bfd/cpu-mips.c */ + +OUTPUT_ARCH( "riscv" ) +ENTRY(_start) + +/*----------------------------------------------------------------------*/ +/* Sections */ +/*----------------------------------------------------------------------*/ + +SECTIONS +{ + + /* text: test code section */ + . = 0x80000000; + .text.init : { *(.text.init) } + + . = ALIGN(0x1000); + .tohost : { *(.tohost) } + + .text : { *(.text) } + + /* data segment */ + .data : { *(.data) } + + .sdata : { + __global_pointer$ = . + 0x800; + *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*) + *(.sdata .sdata.* .gnu.linkonce.s.*) + } + + /* bss segment */ + .sbss : { + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } + .bss : { *(.bss) } + + /* thread-local data segment */ + .tdata : + { + _tls_data = .; + *(.tdata.begin) + *(.tdata) + *(.tdata.end) + } + .tbss : + { + *(.tbss) + *(.tbss.end) + } + + /* End of uninitalized data segement */ + _end = .; +} + diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c b/benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c new file mode 100644 index 000000000..e4322563c --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/syscallbackup.c @@ -0,0 +1,1072 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" +#undef printf +#define SYS_write 64 +#define ZEROPAD (1<<0) /* Pad with zero */ +#define SIGN (1<<1) /* Unsigned/signed long */ +#define PLUS (1<<2) /* Show plus */ +#define SPACE (1<<3) /* Spacer */ +#define LEFT (1<<4) /* Left justified */ +#define HEX_PREP (1<<5) /* 0x */ +#define UPPERCASE (1<<6) /* 'ABCDEF' */ +typedef size_t ee_size_t; +#define is_digit(c) ((c) >= '0' && (c) <= '9') +/*static ee_size_t strnlen(const char *s, ee_size_t count);*/ +#undef strcmp +static char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char *upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +char *ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); +char *fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf); +static void ee_bufcpy(char *d, char *s, int count); +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; +ee_size_t strnlen(const char *s, ee_size_t count) +{ + const char *sc; + for (sc = s; *sc != '\0' && count--; ++sc); + return sc - s; +} +static char *number(char *str, long num, int base, int size, int precision, int type) +{ + char c, sign, tmp[66]; + char *dig = digits; + int i; + + if (type & UPPERCASE) dig = upper_digits; + if (type & LEFT) type &= ~ZEROPAD; + if (base < 2 || base > 36) return 0; + + c = (type & ZEROPAD) ? '0' : ' '; + sign = 0; + if (type & SIGN) + { + if (num < 0) + { + sign = '-'; + num = -num; + size--; + } + else if (type & PLUS) + { + sign = '+'; + size--; + } + else if (type & SPACE) + { + sign = ' '; + size--; + } + } + + if (type & HEX_PREP) + { + if (base == 16) + size -= 2; + else if (base == 8) + size--; + } + + i = 0; + + if (num == 0) + tmp[i++] = '0'; + else + { + while (num != 0) + { + tmp[i++] = dig[((unsigned long) num) % (unsigned) base]; + num = ((unsigned long) num) / (unsigned) base; + } + } + + if (i > precision) precision = i; + size -= precision; + if (!(type & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; + if (sign) *str++ = sign; + + if (type & HEX_PREP) + { + if (base == 8) + *str++ = '0'; + else if (base == 16) + { + *str++ = '0'; + *str++ = digits[33]; + } + } + + if (!(type & LEFT)) while (size-- > 0) *str++ = c; + while (i < precision--) *str++ = '0'; + while (i-- > 0) *str++ = tmp[i]; + while (size-- > 0) *str++ = ' '; + + return str; +} + +static char *eaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + char *dig = digits; + int i, len; + + if (type & UPPERCASE) dig = upper_digits; + len = 0; + for (i = 0; i < 6; i++) + { + if (i != 0) tmp[len++] = ':'; + tmp[len++] = dig[addr[i] >> 4]; + tmp[len++] = dig[addr[i] & 0x0F]; + } + + if (!(type & LEFT)) while (len < size--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = tmp[i]; + while (len < size--) *str++ = ' '; + + return str; +} +static int skip_atoi(const char **s) +{ + int i = 0; + while (is_digit(**s)) i = i*10 + *((*s)++) - '0'; + return i; +} +static char *iaddr(char *str, unsigned char *addr, int size, int precision, int type) +{ + char tmp[24]; + int i, n, len; + + len = 0; + for (i = 0; i < 4; i++) + { + if (i != 0) tmp[len++] = '.'; + n = addr[i]; + + if (n == 0) + tmp[len++] = digits[0]; + else + { + if (n >= 100) + { + tmp[len++] = digits[n / 100]; + n = n % 100; + tmp[len++] = digits[n / 10]; + n = n % 10; + } + else if (n >= 10) + { + tmp[len++] = digits[n / 10]; + n = n % 10; + } + + tmp[len++] = digits[n]; + } + } + + if (!(type & LEFT)) while (len < size--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = tmp[i]; + while (len < size--) *str++ = ' '; + + return str; +} + +void ee_bufcpy(char *pd, char *ps, int count) { + char *pe=ps+count; + while (ps!=pe) + *pd++=*ps++; +} + +#if HAS_FLOAT + + + +static void parse_float(double value, char *buffer, char fmt, int precision) +{ + int decpt, sign, exp, pos; + char *digits = NULL; + char cvtbuf[80]; + int capexp = 0; + int magnitude; + + if (fmt == 'G' || fmt == 'E') + { + capexp = 1; + fmt += 'a' - 'A'; + } + + if (fmt == 'g') + { + digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); + magnitude = decpt - 1; + if (magnitude < -4 || magnitude > precision - 1) + { + fmt = 'e'; + precision -= 1; + } + else + { + fmt = 'f'; + precision -= decpt; + } + } + + if (fmt == 'e') + { + digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); + + if (sign) *buffer++ = '-'; + *buffer++ = *digits; + if (precision > 0) *buffer++ = '.'; + ee_bufcpy(buffer, digits + 1, precision); + buffer += precision; + *buffer++ = capexp ? 'E' : 'e'; + + if (decpt == 0) + { + if (value == 0.0) + exp = 0; + else + exp = -1; + } + else + exp = decpt - 1; + + if (exp < 0) + { + *buffer++ = '-'; + exp = -exp; + } + else + *buffer++ = '+'; + + buffer[2] = (exp % 10) + '0'; + exp = exp / 10; + buffer[1] = (exp % 10) + '0'; + exp = exp / 10; + buffer[0] = (exp % 10) + '0'; + buffer += 3; + } + else if (fmt == 'f') + { + digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); + if (sign) *buffer++ = '-'; + if (*digits) + { + if (decpt <= 0) + { + *buffer++ = '0'; + *buffer++ = '.'; + for (pos = 0; pos < -decpt; pos++) *buffer++ = '0'; + while (*digits) *buffer++ = *digits++; + } + else + { + pos = 0; + while (*digits) + { + if (pos++ == decpt) *buffer++ = '.'; + *buffer++ = *digits++; + } + } + } + else + { + *buffer++ = '0'; + if (precision > 0) + { + *buffer++ = '.'; + for (pos = 0; pos < precision; pos++) *buffer++ = '0'; + } + } + } + + *buffer = '\0'; +} + + +static char *flt(char *str, double num, int size, int precision, char fmt, int flags) +{ + char tmp[80]; + char c, sign; + int n, i; + + // Left align means no zero padding + if (flags & LEFT) flags &= ~ZEROPAD; + + // Determine padding and sign char + c = (flags & ZEROPAD) ? '0' : ' '; + sign = 0; + if (flags & SIGN) + { + if (num < 0.0) + { + sign = '-'; + num = -num; + size--; + } + else if (flags & PLUS) + { + sign = '+'; + size--; + } + else if (flags & SPACE) + { + sign = ' '; + size--; + } + } + + // Compute the precision value + if (precision < 0) + precision = 6; // Default precision: 6 + + // Convert floating point number to text + parse_float(num, tmp, fmt, precision); + + if ((flags & HEX_PREP) && precision == 0) decimal_point(tmp); + if (fmt == 'g' && !(flags & HEX_PREP)) cropzeros(tmp); + + n = strnlen(tmp,256); + + // Output number with alignment and padding + size -= n; + if (!(flags & (ZEROPAD | LEFT))) while (size-- > 0) *str++ = ' '; + if (sign) *str++ = sign; + if (!(flags & LEFT)) while (size-- > 0) *str++ = c; + for (i = 0; i < n; i++) *str++ = tmp[i]; + while (size-- > 0) *str++ = ' '; + + return str; +} + + +#endif +static void decimal_point(char *buffer) +{ + while (*buffer) + { + if (*buffer == '.') return; + if (*buffer == 'e' || *buffer == 'E') break; + buffer++; + } + + if (*buffer) + { + int n = strnlen(buffer,256); + while (n > 0) + { + buffer[n + 1] = buffer[n]; + n--; + } + + *buffer = '.'; + } + else + { + *buffer++ = '.'; + *buffer = '\0'; + } +} + +static void cropzeros(char *buffer) +{ + char *stop; + + while (*buffer && *buffer != '.') buffer++; + if (*buffer++) + { + while (*buffer && *buffer != 'e' && *buffer != 'E') buffer++; + stop = buffer--; + while (*buffer == '0') buffer--; + if (*buffer == '.') buffer--; + while (buffer!=stop) + *++buffer=0; + } +} + +static int ee_vsprintf(char *buf, const char *fmt, va_list args) +{ + int len; + unsigned long num; + int i, base; + char *str; + char *s; + + int flags; // Flags to number() + + int field_width; // Width of output field + int precision; // Min. # of digits for integers; max number of chars for from string + int qualifier; // 'h', 'l', or 'L' for integer fields + + for (str = buf; *fmt; fmt++) + { + if (*fmt != '%') + { + *str++ = *fmt; + continue; + } + + // Process flags + flags = 0; +repeat: + fmt++; // This also skips first '%' + switch (*fmt) + { + case '-': flags |= LEFT; goto repeat; + case '+': flags |= PLUS; goto repeat; + case ' ': flags |= SPACE; goto repeat; + case '#': flags |= HEX_PREP; goto repeat; + case '0': flags |= ZEROPAD; goto repeat; + } + + // Get field width + field_width = -1; + if (is_digit(*fmt)) + field_width = skip_atoi(&fmt); + else if (*fmt == '*') + { + fmt++; + field_width = va_arg(args, int); + if (field_width < 0) + { + field_width = -field_width; + flags |= LEFT; + } + } + + // Get the precision + precision = -1; + if (*fmt == '.') + { + ++fmt; + if (is_digit(*fmt)) + precision = skip_atoi(&fmt); + else if (*fmt == '*') + { + ++fmt; + precision = va_arg(args, int); + } + if (precision < 0) precision = 0; + } + + // Get the conversion qualifier + qualifier = -1; + if (*fmt == 'l' || *fmt == 'L') + { + qualifier = *fmt; + fmt++; + } + + // Default base + base = 10; + + switch (*fmt) + { + case 'c': + if (!(flags & LEFT)) while (--field_width > 0) *str++ = ' '; + *str++ = (unsigned char) va_arg(args, int); + while (--field_width > 0) *str++ = ' '; + continue; + + case 's': + s = va_arg(args, char *); + if (!s) s = ""; + len = strnlen(s, precision); + if (!(flags & LEFT)) while (len < field_width--) *str++ = ' '; + for (i = 0; i < len; ++i) *str++ = *s++; + while (len < field_width--) *str++ = ' '; + continue; + + case 'p': + if (field_width == -1) + { + field_width = 2 * sizeof(void *); + flags |= ZEROPAD; + } + str = number(str, (unsigned long) va_arg(args, void *), 16, field_width, precision, flags); + continue; + + case 'A': + flags |= UPPERCASE; + + case 'a': + if (qualifier == 'l') + str = eaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + else + str = iaddr(str, va_arg(args, unsigned char *), field_width, precision, flags); + continue; + + // Integer number formats - set up the flags and "break" + case 'o': + base = 8; + break; + + case 'X': + flags |= UPPERCASE; + + case 'x': + base = 16; + break; + + case 'd': + case 'i': + flags |= SIGN; + + case 'u': + break; + +#if HAS_FLOAT + + case 'f': + str = flt(str, va_arg(args, double), field_width, precision, *fmt, flags | SIGN); + continue; + +#endif + + default: + if (*fmt != '%') *str++ = '%'; + if (*fmt) + *str++ = *fmt; + else + --fmt; + continue; + } + + if (qualifier == 'l') + num = va_arg(args, unsigned long); + else if (flags & SIGN) + num = va_arg(args, int); + else + num = va_arg(args, unsigned int); + + str = number(str, num, base, field_width, precision, flags); + } + + *str = '\0'; + return str - buf; +} + +static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) +{ + volatile uint64_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; + __sync_synchronize(); + + tohost = (uintptr_t)magic_mem; + while (fromhost == 0) + ; + fromhost = 0; + + __sync_synchronize(); + return magic_mem[0]; +} + +#define NUM_COUNTERS 2 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + +#undef READ_CTR +} + +/*void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + tohost = (code << 1) | 1; + while (1); +}*/ +void __attribute__((noreturn))tohost_exit(uintptr_t code){ + tohost=(code<<1)|1; + asm ("ecall"); + } + + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tls_data; + extern __thread char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tls_data, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + + exit(ret); +} + +#undef putchar +int putchar(int ch) +{ + static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } + + return 0; +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'X': + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} +/* +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +}*/ + + +void _send_char(char c) { +/*#error "You must implement the method _send_char to use this file!\n"; +*/ +volatile unsigned char *THR=(unsigned char *)0x10000000; +volatile unsigned char *LSR=(unsigned char *)0x10000005; + +while(!(*LSR&0b100000)); +*THR=c; +while(!(*LSR&0b100000)); +} + + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} + +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)){ + *d = word; + d++;} + } else { + char *d = dest; + while (d < (char*)(dest + len)){ + *d = byte; + d++;} + } + return dest; +} +//recompile pls +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +/*size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +}*/ + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} + +int sendstring(const char *p){ + int n=0; + while (*p) { + _send_char(*p); + n++; + p++; + } + + return n; +} +int gg_printf(const char *fmt, ...) +{ + char buf[256],*p; + va_list args; + int n=0; + + va_start(args, fmt); + ee_vsprintf(buf, fmt, args); + va_end(args); + p=buf; + /* while (*p) { + _send_char(*p); + n++; + p++; + } +*/ +n=sendstring(p); + return n; +} + + +int puts(const char* s) +{ + gg_printf(s); + gg_printf("\n"); + return 0; // incorrect return value, but who cares, anyway? +} + +unsigned long getTimer(void){ + unsigned long *MTIME = (unsigned long*)0x0200BFF8; + return *MTIME; + +} diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c b/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c new file mode 100644 index 000000000..185391236 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/syscalls.c @@ -0,0 +1,540 @@ +// See LICENSE for license details. + +#include +#include +#include +#include +#include +#include +#include "util.h" +#include "coremark.h" +#include + +#define SYS_write 64 + +#undef strcmp + +extern volatile uint64_t tohost; +extern volatile uint64_t fromhost; + + +void _send_char(char c) { +/*#error "You must implement the method _send_char to use this file!\n"; +*/ +volatile unsigned char *THR=(unsigned char *)0x10000000; +volatile unsigned char *LSR=(unsigned char *)0x10000005; + +while(!(*LSR&0b100000)); +*THR=c; +while(!(*LSR&0b100000)); +} + +int sendstring(const char *p){ + int n=0; + while (*p) { + _send_char(*p); + n++; + p++; + } + + return n; +} + +static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2) +{ + volatile uint64_t magic_mem[8] __attribute__((aligned(64))); + magic_mem[0] = which; + magic_mem[1] = arg0; + magic_mem[2] = arg1; + magic_mem[3] = arg2; + __sync_synchronize(); + + tohost = (uintptr_t)magic_mem; + while (fromhost == 0) + ; + fromhost = 0; + + __sync_synchronize(); + return magic_mem[0]; +} + +#define NUM_COUNTERS 3 +static uintptr_t counters[NUM_COUNTERS]; +static char* counter_names[NUM_COUNTERS]; + +void setStats(int enable) +{ + int i = 0; +#define READ_CTR(name) do { \ + while (i >= NUM_COUNTERS) ; \ + uintptr_t csr = read_csr(name); \ + if (!enable) { csr -= counters[i]; counter_names[i] = #name; } \ + counters[i++] = csr; \ + } while (0) + + READ_CTR(mcycle); + READ_CTR(minstret); + READ_CTR(mhpmcounter3); + READ_CTR(mhpmcounter4); + READ_CTR(mhpmcounter5); + READ_CTR(mhpmcounter6); + READ_CTR(mhpmcounter7); + READ_CTR(mhpmcounter8); + READ_CTR(mhpmcounter9); + READ_CTR(mhpmcounter10); + READ_CTR(mhpmcounter11); + READ_CTR(mhpmcounter12); + +#undef READ_CTR +} + +void __attribute__((noreturn)) tohost_exit(uintptr_t code) +{ + tohost = (code << 1) | 1; + asm ("ecall"); + exit(0); +} + +uintptr_t __attribute__((weak)) handle_trap(uintptr_t cause, uintptr_t epc, uintptr_t regs[32]) +{ + tohost_exit(1337); +} + +void exit(int code) +{ + tohost_exit(code); +} + +void abort() +{ + exit(128 + SIGABRT); +} + +void printstr(const char* s) +{ + syscall(SYS_write, 1, (uintptr_t)s, strlen(s)); +} + +void __attribute__((weak)) thread_entry(int cid, int nc) +{ + // multi-threaded programs override this function. + // for the case of single-threaded programs, only let core 0 proceed. + while (cid != 0); +} + +int __attribute__((weak)) main(int argc, char** argv) +{ + // single-threaded programs override this function. + printstr("Implement main(), foo!\n"); + return -1; +} + +static void init_tls() +{ + register void* thread_pointer asm("tp"); + extern char _tls_data; + extern __thread char _tdata_begin, _tdata_end, _tbss_end; + size_t tdata_size = &_tdata_end - &_tdata_begin; + memcpy(thread_pointer, &_tls_data, tdata_size); + size_t tbss_size = &_tbss_end - &_tdata_end; + memset(thread_pointer + tdata_size, 0, tbss_size); +} + +void _init(int cid, int nc) +{ + init_tls(); + thread_entry(cid, nc); + + // only single-threaded programs should ever get here. + int ret = main(0, 0); + + char buf[NUM_COUNTERS * 32] __attribute__((aligned(64))); + char* pbuf = buf; + for (int i = 0; i < NUM_COUNTERS; i++) + if (counters[i]) + pbuf += sprintf(pbuf, "%s = %d\n", counter_names[i], counters[i]); + if (pbuf != buf) + printstr(buf); + counters[3] = read_csr(mhpmcounter3) - counters[3]; + counters[4] = read_csr(mhpmcounter4) - counters[4]; + counters[5] = read_csr(mhpmcounter5) - counters[5]; + counters[6] = read_csr(mhpmcounter6) - counters[6]; + counters[7] = read_csr(mhpmcounter7) - counters[7]; + counters[8] = read_csr(mhpmcounter8) - counters[8]; + counters[9] = read_csr(mhpmcounter9) - counters[9]; + counters[10] = read_csr(mhpmcounter10) - counters[10]; + counters[11] = read_csr(mhpmcounter11) - counters[11]; + counters[12] = read_csr(mhpmcounter12) - counters[12]; + + ee_printf("Load Stalls : %d\n", counters[3]); + ee_printf("D-Cache Accesses : %d\n", counters[11]); + ee_printf("D-Cache Misses : %d\n", counters[12]); + ee_printf("Branches : %d\n", counters[5]); + ee_printf("Branches Miss Predictions : %d\n", counters[4]); + ee_printf("BTB Misses : %d\n", counters[6]); + ee_printf("Jump, JAL, JALR : %d\n", counters[7]); + ee_printf("RAS Wrong : %d\n", counters[8]); + ee_printf("Returns : %d\n", counters[9]); + ee_printf("BP Class Wrong : %d\n", counters[10]); + ee_printf("Done printing performance counters : \n"); + + exit(ret); +} + +#undef putchar +int putchar(int ch) +{ + /*static __thread char buf[64] __attribute__((aligned(64))); + static __thread int buflen = 0; + + buf[buflen++] = ch; + + if (ch == '\n' || buflen == sizeof(buf)) + { + syscall(SYS_write, 1, (uintptr_t)buf, buflen); + buflen = 0; + } + + return 0;*/ + _send_char(ch); + return 0; + +} + +void printhex(uint64_t x) +{ + char str[17]; + int i; + for (i = 0; i < 16; i++) + { + str[15-i] = (x & 0xF) + ((x & 0xF) < 10 ? '0' : 'a'-10); + x >>= 4; + } + str[16] = 0; + + printstr(str); +} + +static inline void printnum(void (*putch)(int, void**), void **putdat, + unsigned long long num, unsigned base, int width, int padc) +{ + unsigned digs[sizeof(num)*CHAR_BIT]; + int pos = 0; + + while (1) + { + digs[pos++] = num % base; + if (num < base) + break; + num /= base; + } + + while (width-- > pos) + putch(padc, putdat); + + while (pos-- > 0) + putch(digs[pos] + (digs[pos] >= 10 ? 'a' - 10 : '0'), putdat); +} + +static unsigned long long getuint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, unsigned long long); + else if (lflag) + return va_arg(*ap, unsigned long); + else + return va_arg(*ap, unsigned int); +} + +static long long getint(va_list *ap, int lflag) +{ + if (lflag >= 2) + return va_arg(*ap, long long); + else if (lflag) + return va_arg(*ap, long); + else + return va_arg(*ap, int); +} + +static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap) +{ + register const char* p; + const char* last_fmt; + register int ch, err; + unsigned long long num; + int base, lflag, width, precision, altflag; + char padc; + + while (1) { + while ((ch = *(unsigned char *) fmt) != '%') { + if (ch == '\0') + return; + fmt++; + putch(ch, putdat); + } + fmt++; + + // Process a %-escape sequence + last_fmt = fmt; + padc = ' '; + width = -1; + precision = -1; + lflag = 0; + altflag = 0; + reswitch: + switch (ch = *(unsigned char *) fmt++) { + + // flag to pad on the right + case '-': + padc = '-'; + goto reswitch; + + // flag to pad with 0's instead of spaces + case '0': + padc = '0'; + goto reswitch; + + // width field + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + for (precision = 0; ; ++fmt) { + precision = precision * 10 + ch - '0'; + ch = *fmt; + if (ch < '0' || ch > '9') + break; + } + goto process_precision; + + case '*': + precision = va_arg(ap, int); + goto process_precision; + + case '.': + if (width < 0) + width = 0; + goto reswitch; + + case '#': + altflag = 1; + goto reswitch; + + process_precision: + if (width < 0) + width = precision, precision = -1; + goto reswitch; + + // long flag (doubled for long long) + case 'l': + lflag++; + goto reswitch; + + // character + case 'c': + putch(va_arg(ap, int), putdat); + break; + + // string + case 's': + if ((p = va_arg(ap, char *)) == NULL) + p = "(null)"; + if (width > 0 && padc != '-') + for (width -= strnlen(p, precision); width > 0; width--) + putch(padc, putdat); + for (; (ch = *p) != '\0' && (precision < 0 || --precision >= 0); width--) { + putch(ch, putdat); + p++; + } + for (; width > 0; width--) + putch(' ', putdat); + break; + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); + if ((long long) num < 0) { + putch('-', putdat); + num = -(long long) num; + } + base = 10; + goto signed_number; + + // unsigned decimal + case 'u': + base = 10; + goto unsigned_number; + + // (unsigned) octal + case 'o': + // should do something with padding so it's always 3 octits + base = 8; + goto unsigned_number; + + // pointer + case 'p': + static_assert(sizeof(long) == sizeof(void*)); + lflag = 1; + putch('0', putdat); + putch('x', putdat); + /* fall through to 'x' */ + + // (unsigned) hexadecimal + case 'X': + case 'x': + base = 16; + unsigned_number: + num = getuint(&ap, lflag); + signed_number: + printnum(putch, putdat, num, base, width, padc); + break; + + // escaped '%' character + case '%': + putch(ch, putdat); + break; + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); + fmt = last_fmt; + break; + } + } +} + +int printf(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + vprintfmt((void*)putchar, 0, fmt, ap); + + va_end(ap); + return 0; // incorrect return value, but who cares, anyway? +} + +int puts(const char* s) +{ + printf(s); + printf("\n"); + return 0; // incorrect return value, but who cares, anyway? +} + +int sprintf(char* str, const char* fmt, ...) +{ + va_list ap; + char* str0 = str; + va_start(ap, fmt); + + void sprintf_putch(int ch, void** data) + { + char** pstr = (char**)data; + **pstr = ch; + (*pstr)++; + } + + vprintfmt(sprintf_putch, (void**)&str, fmt, ap); + *str = 0; + + va_end(ap); + return str - str0; +} + +void* memcpy(void* dest, const void* src, size_t len) +{ + if ((((uintptr_t)dest | (uintptr_t)src | len) & (sizeof(uintptr_t)-1)) == 0) { + const uintptr_t* s = src; + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)) + *d++ = *s++; + } else { + const char* s = src; + char *d = dest; + while (d < (char*)(dest + len)) + *d++ = *s++; + } + return dest; +} +void* memset(void* dest, int byte, size_t len) +{ + if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) { + uintptr_t word = byte & 0xFF; + word |= word << 8; + word |= word << 16; + word |= word << 16 << 16; + + uintptr_t *d = dest; + while (d < (uintptr_t*)(dest + len)){ + *d = word; + d++;} + } else { + char *d = dest; + while (d < (char*)(dest + len)){ + *d = byte; + d++;} + } + return dest; +} + +size_t strlen(const char *s) +{ + const char *p = s; + while (*p) + p++; + return p - s; +} + +size_t strnlen(const char *s, size_t n) +{ + const char *p = s; + while (n-- && *p) + p++; + return p - s; +} + +int strcmp(const char* s1, const char* s2) +{ + unsigned char c1, c2; + + do { + c1 = *s1++; + c2 = *s2++; + } while (c1 != 0 && c1 == c2); + + return c1 - c2; +} + +char* strcpy(char* dest, const char* src) +{ + char* d = dest; + while ((*d++ = *src++)) + ; + return dest; +} + +long atol(const char* str) +{ + long res = 0; + int sign = 0; + + while (*str == ' ') + str++; + + if (*str == '-' || *str == '+') { + sign = *str == '-'; + str++; + } + + while (*str) { + res *= 10; + res += *str++ - '0'; + } + + return sign ? -res : res; +} diff --git a/benchmarks/riscv-coremark/riscv64-baremetal/util.h b/benchmarks/riscv-coremark/riscv64-baremetal/util.h new file mode 100644 index 000000000..081cfd634 --- /dev/null +++ b/benchmarks/riscv-coremark/riscv64-baremetal/util.h @@ -0,0 +1,90 @@ +// See LICENSE for license details. + +#ifndef __UTIL_H +#define __UTIL_H + +extern void setStats(int enable); + +#include + +#define static_assert(cond) switch(0) { case 0: case !!(long)(cond): ; } + +static int verify(int n, const volatile int* test, const int* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + int t0 = test[i], t1 = test[i+1]; + int v0 = verify[i], v1 = verify[i+1]; + if (t0 != v0) return i+1; + if (t1 != v1) return i+2; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static int verifyDouble(int n, const volatile double* test, const double* verify) +{ + int i; + // Unrolled for faster verification + for (i = 0; i < n/2*2; i+=2) + { + double t0 = test[i], t1 = test[i+1]; + double v0 = verify[i], v1 = verify[i+1]; + int eq1 = t0 == v0, eq2 = t1 == v1; + if (!(eq1 & eq2)) return i+1+eq1; + } + if (n % 2 != 0 && test[n-1] != verify[n-1]) + return n; + return 0; +} + +static void __attribute__((noinline)) barrier(int ncores) +{ + static volatile int sense; + static volatile int count; + static __thread int threadsense; + + __sync_synchronize(); + + threadsense = !threadsense; + if (__sync_fetch_and_add(&count, 1) == ncores-1) + { + count = 0; + sense = threadsense; + } + else while(sense != threadsense) + ; + + __sync_synchronize(); +} + +static uint64_t lfsr(uint64_t x) +{ + uint64_t bit = (x ^ (x >> 1)) & 1; + return (x >> 1) | (bit << 62); +} + +static uintptr_t insn_len(uintptr_t pc) +{ + return (*(unsigned short*)pc & 3) ? 4 : 2; +} + +#ifdef __riscv +#include "encoding.h" +#endif + +#define stringify_1(s) #s +#define stringify(s) stringify_1(s) +#define stats(code, iter) do { \ + unsigned long _c = -read_csr(mcycle), _i = -read_csr(minstret); \ + code; \ + _c += read_csr(mcycle), _i += read_csr(minstret); \ + if (cid == 0) \ + printf("\n%s: %ld cycles, %ld.%ld cycles/iter, %ld.%ld CPI\n", \ + stringify(code), _c, _c/iter, 10*_c/iter%10, _c/_i, 10*_c/_i%10); \ + } while(0) + +#endif //__UTIL_H diff --git a/pipelined/testbench/tests.vh b/pipelined/testbench/tests.vh index 7e92741be..e9911c899 100644 --- a/pipelined/testbench/tests.vh +++ b/pipelined/testbench/tests.vh @@ -36,7 +36,7 @@ string tvpaths[] = '{ "../../addins/riscv-arch-test/work/", "../../tests/wally-riscv-arch-test/work/", "../../tests/imperas-riscv-tests/work/", - "../../benchmarks/coremark/work/", + "../../benchmarks/riscv-coremark/work/", "../../addins/embench-iot/bd_speed/src/" };