From 1c600a0458137650df0bf050ddbaf3ab31de1ba0 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 13 Jan 2024 08:28:11 +0100 Subject: [PATCH] removes firmwares to just keep BSP --- .gitmodules | 7 - CMakeLists.txt | 19 - README.md | 2 +- bare-metal-bsp/.project | 27 - benchmarks/coremark/cm | 1 - benchmarks/coremark/tgc/core_portme.c | 197 -- benchmarks/coremark/tgc/core_portme.h | 210 -- benchmarks/coremark/tgc/core_portme.mak | 94 - benchmarks/coremark/tgc/cvt.c | 127 - benchmarks/coremark/tgc/ee_printf.c | 701 ----- benchmarks/coremark/tgc/tgc.lds | 241 -- benchmarks/dhrystone/.cproject | 91 - benchmarks/dhrystone/.gdbinit | 3 - benchmarks/dhrystone/.gitignore | 2 - benchmarks/dhrystone/.project | 28 - benchmarks/dhrystone/Makefile | 24 - benchmarks/dhrystone/dhry.h | 423 ---- benchmarks/dhrystone/dhry_1.c | 386 --- benchmarks/dhrystone/dhry_2.c | 192 -- benchmarks/dhrystone/dhry_printf.c | 15 - benchmarks/dhrystone/dhry_stubs.c | 22 - .../drivers => drivers}/clic/clic_driver.c | 0 .../drivers => drivers}/clic/clic_driver.h | 0 .../fe300prci/fe300prci_driver.c | 0 .../fe300prci/fe300prci_driver.h | 0 .../drivers => drivers}/plic/plic_driver.c | 0 .../drivers => drivers}/plic/plic_driver.h | 0 {bare-metal-bsp/env => env}/.gitignore | 0 {bare-metal-bsp/env => env}/TGC5L/.gitignore | 0 {bare-metal-bsp/env => env}/TGC5L/init.c | 0 {bare-metal-bsp/env => env}/TGC5L/link.lds | 0 {bare-metal-bsp/env => env}/TGC5L/platform.h | 0 {bare-metal-bsp/env => env}/common-clang.mk | 0 {bare-metal-bsp/env => env}/common-gcc.mk | 0 {bare-metal-bsp/env => env}/encoding.h | 0 {bare-metal-bsp/env => env}/entry.S | 0 {bare-metal-bsp/env => env}/hifive1.h | 0 .../env => env}/hifive1/dhrystone.lds | 0 {bare-metal-bsp/env => env}/hifive1/flash.lds | 0 {bare-metal-bsp/env => env}/hifive1/init.c | 0 .../env => env}/hifive1/openocd.cfg | 0 .../env => env}/hifive1/platform.h | 0 .../env => env}/hifive1/settings.mk | 0 {bare-metal-bsp/env => env}/iss/.gitignore | 0 {bare-metal-bsp/env => env}/iss/init.c | 0 {bare-metal-bsp/env => env}/iss/link.lds | 0 {bare-metal-bsp/env => env}/iss/platform.h | 0 {bare-metal-bsp/env => env}/rtl/.gitignore | 0 {bare-metal-bsp/env => env}/rtl/init.c | 0 {bare-metal-bsp/env => env}/rtl/link.lds | 0 {bare-metal-bsp/env => env}/rtl/platform.h | 0 {bare-metal-bsp/env => env}/start.S | 0 {bare-metal-bsp/env => env}/tgc-vp/.gitignore | 0 {bare-metal-bsp/env => env}/tgc-vp/init.c | 0 {bare-metal-bsp/env => env}/tgc-vp/link.lds | 0 {bare-metal-bsp/env => env}/tgc-vp/platform.h | 0 hello-world/.cproject | 90 - hello-world/.gitignore | 2 - hello-world/.project | 27 - hello-world/Makefile | 27 - hello-world/hello.c | 24 - hello-world/wrap_stubs.c | 15 - hifive1-vp/hello/.cproject | 235 -- hifive1-vp/hello/.project | 28 - hifive1-vp/hello/Makefile | 13 - .../bsp/Debug/drivers/fe300prci/subdir.mk | 24 - .../hello/bsp/Debug/drivers/plic/subdir.mk | 24 - .../bsp/Debug/env/freedom-e300-arty/subdir.mk | 24 - .../Debug/env/freedom-e300-hifive1/subdir.mk | 27 - hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk | 27 - hifive1-vp/hello/bsp/Debug/env/subdir.mk | 27 - .../hello/bsp/Debug/libwrap/stdlib/subdir.mk | 27 - .../hello/bsp/Debug/libwrap/sys/subdir.mk | 98 - hifive1-vp/hello/bsp/Debug/makefile | 66 - hifive1-vp/hello/bsp/Debug/objects.mk | 8 - hifive1-vp/hello/bsp/Debug/sources.mk | 35 - .../bsp/drivers/fe300prci/fe300prci_driver.c | 252 -- .../bsp/drivers/fe300prci/fe300prci_driver.h | 79 - .../hello/bsp/drivers/plic/plic_driver.c | 127 - .../hello/bsp/drivers/plic/plic_driver.h | 51 - hifive1-vp/hello/bsp/env/common.mk | 62 - hifive1-vp/hello/bsp/env/encoding.h | 1313 ---------- hifive1-vp/hello/bsp/env/entry.S | 97 - .../hello/bsp/env/freedom-e300-arty/init.c | 87 - .../hello/bsp/env/freedom-e300-arty/link.lds | 167 -- .../bsp/env/freedom-e300-arty/openocd.cfg | 30 - .../bsp/env/freedom-e300-arty/platform.h | 125 - .../hello/bsp/env/freedom-e300-hifive1/init.c | 238 -- .../bsp/env/freedom-e300-hifive1/link.lds | 167 -- .../bsp/env/freedom-e300-hifive1/openocd.cfg | 34 - .../bsp/env/freedom-e300-hifive1/platform.h | 133 - hifive1-vp/hello/bsp/env/hifive1.h | 79 - hifive1-vp/hello/bsp/env/iss/init.c | 238 -- hifive1-vp/hello/bsp/env/iss/link.lds | 168 -- hifive1-vp/hello/bsp/env/iss/openocd.cfg | 34 - hifive1-vp/hello/bsp/env/iss/platform.h | 133 - hifive1-vp/hello/bsp/env/start.S | 54 - hifive1-vp/hello/bsp/include/sifive/bits.h | 35 - hifive1-vp/hello/bsp/include/sifive/const.h | 17 - .../hello/bsp/include/sifive/devices/aon.h | 88 - .../hello/bsp/include/sifive/devices/clint.h | 14 - .../hello/bsp/include/sifive/devices/gpio.h | 24 - .../hello/bsp/include/sifive/devices/otp.h | 23 - .../hello/bsp/include/sifive/devices/plic.h | 31 - .../hello/bsp/include/sifive/devices/prci.h | 56 - .../hello/bsp/include/sifive/devices/pwm.h | 37 - .../hello/bsp/include/sifive/devices/spi.h | 80 - .../hello/bsp/include/sifive/devices/uart.h | 27 - .../hello/bsp/include/sifive/sections.h | 16 - hifive1-vp/hello/bsp/libwrap/libwrap.mk | 53 - hifive1-vp/hello/bsp/libwrap/stdlib/malloc.c | 17 - hifive1-vp/hello/bsp/libwrap/sys/_exit.c | 16 - hifive1-vp/hello/bsp/libwrap/sys/close.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/execve.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/fork.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/fstat.c | 16 - hifive1-vp/hello/bsp/libwrap/sys/getpid.c | 6 - hifive1-vp/hello/bsp/libwrap/sys/isatty.c | 11 - hifive1-vp/hello/bsp/libwrap/sys/kill.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/link.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/lseek.c | 14 - hifive1-vp/hello/bsp/libwrap/sys/open.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/openat.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/read.c | 30 - hifive1-vp/hello/bsp/libwrap/sys/sbrk.c | 16 - hifive1-vp/hello/bsp/libwrap/sys/stat.c | 10 - hifive1-vp/hello/bsp/libwrap/sys/stub.h | 10 - hifive1-vp/hello/bsp/libwrap/sys/times.c | 10 - hifive1-vp/hello/bsp/libwrap/sys/unlink.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/wait.c | 9 - hifive1-vp/hello/bsp/libwrap/sys/write.c | 29 - hifive1-vp/hello/hello | Bin 64448 -> 0 bytes hifive1-vp/hello/hello.c | 69 - hifive1-vp/hello/hello.dis | 2253 ----------------- hifive1-vp/hello/wrap_printf.c | 271 -- .../riscv-bldc-forced-commutation/.gitignore | 1 - .../riscv-bldc-forced-commutation/.project | 28 - .../riscv-bldc-forced-commutation/Makefile | 27 - .../bsp/drivers/clic/clic_driver.c | 163 -- .../bsp/drivers/clic/clic_driver.h | 44 - .../bsp/drivers/fe300prci/fe300prci_driver.c | 252 -- .../bsp/drivers/fe300prci/fe300prci_driver.h | 79 - .../bsp/drivers/plic/plic_driver.c | 127 - .../bsp/drivers/plic/plic_driver.h | 51 - .../bsp/env/common.mk | 66 - .../bsp/env/coreip-e2-arty/flash.lds | 161 -- .../bsp/env/coreip-e2-arty/init.c | 98 - .../bsp/env/coreip-e2-arty/openocd.cfg | 31 - .../bsp/env/coreip-e2-arty/platform.h | 98 - .../bsp/env/coreip-e2-arty/settings.mk | 3 - .../bsp/env/coreip-e2-arty/tim-split.lds | 157 -- .../bsp/env/coreip-e2-arty/tim.lds | 161 -- .../bsp/env/coreplexip-arty.h | 102 - .../bsp/env/coreplexip-e31-arty/dhrystone.lds | 157 -- .../bsp/env/coreplexip-e31-arty/flash.lds | 161 -- .../bsp/env/coreplexip-e31-arty/init.c | 122 - .../bsp/env/coreplexip-e31-arty/openocd.cfg | 31 - .../bsp/env/coreplexip-e31-arty/platform.h | 100 - .../env/coreplexip-e31-arty/scratchpad.lds | 161 -- .../bsp/env/coreplexip-e31-arty/settings.mk | 3 - .../bsp/env/coreplexip-e51-arty/dhrystone.lds | 157 -- .../bsp/env/coreplexip-e51-arty/flash.lds | 161 -- .../bsp/env/coreplexip-e51-arty/init.c | 122 - .../bsp/env/coreplexip-e51-arty/openocd.cfg | 31 - .../bsp/env/coreplexip-e51-arty/platform.h | 100 - .../env/coreplexip-e51-arty/scratchpad.lds | 161 -- .../bsp/env/coreplexip-e51-arty/settings.mk | 3 - .../bsp/env/encoding.h | 1313 ---------- .../bsp/env/entry.S | 98 - .../bsp/env/freedom-e300-arty/flash.lds | 161 -- .../bsp/env/freedom-e300-arty/init.c | 87 - .../bsp/env/freedom-e300-arty/openocd.cfg | 30 - .../bsp/env/freedom-e300-arty/platform.h | 124 - .../bsp/env/freedom-e300-arty/settings.mk | 3 - .../env/freedom-e300-hifive1/dhrystone.lds | 157 -- .../bsp/env/freedom-e300-hifive1/flash.lds | 161 -- .../bsp/env/freedom-e300-hifive1/init.c | 238 -- .../bsp/env/freedom-e300-hifive1/openocd.cfg | 34 - .../bsp/env/freedom-e300-hifive1/platform.h | 133 - .../bsp/env/freedom-e300-hifive1/settings.mk | 3 - .../bsp/env/hifive1.h | 81 - .../bsp/env/start.S | 111 - .../bsp/env/ventry.S | 288 --- .../bsp/include/sifive/bits.h | 36 - .../bsp/include/sifive/const.h | 18 - .../bsp/include/sifive/devices/aon.h | 88 - .../bsp/include/sifive/devices/clic.h | 30 - .../bsp/include/sifive/devices/clint.h | 14 - .../bsp/include/sifive/devices/gpio.h | 24 - .../bsp/include/sifive/devices/otp.h | 23 - .../bsp/include/sifive/devices/plic.h | 31 - .../bsp/include/sifive/devices/prci.h | 56 - .../bsp/include/sifive/devices/pwm.h | 37 - .../bsp/include/sifive/devices/spi.h | 80 - .../bsp/include/sifive/devices/uart.h | 27 - .../bsp/include/sifive/sections.h | 17 - .../bsp/include/sifive/smp.h | 65 - .../bsp/libwrap/libwrap.mk | 56 - .../bsp/libwrap/misc/write_hex.c | 19 - .../bsp/libwrap/stdlib/malloc.c | 17 - .../bsp/libwrap/sys/_exit.c | 17 - .../bsp/libwrap/sys/close.c | 11 - .../bsp/libwrap/sys/execve.c | 11 - .../bsp/libwrap/sys/fork.c | 9 - .../bsp/libwrap/sys/fstat.c | 18 - .../bsp/libwrap/sys/getpid.c | 8 - .../bsp/libwrap/sys/isatty.c | 13 - .../bsp/libwrap/sys/kill.c | 11 - .../bsp/libwrap/sys/link.c | 11 - .../bsp/libwrap/sys/lseek.c | 16 - .../bsp/libwrap/sys/open.c | 11 - .../bsp/libwrap/sys/openat.c | 11 - .../bsp/libwrap/sys/puts.c | 28 - .../bsp/libwrap/sys/read.c | 32 - .../bsp/libwrap/sys/sbrk.c | 18 - .../bsp/libwrap/sys/stat.c | 12 - .../bsp/libwrap/sys/stub.h | 10 - .../bsp/libwrap/sys/times.c | 12 - .../bsp/libwrap/sys/unlink.c | 11 - .../bsp/libwrap/sys/wait.c | 9 - .../bsp/libwrap/sys/weak_under_alias.h | 7 - .../bsp/libwrap/sys/write.c | 31 - .../riscv-bldc-forced-commutation/riscv-bldc | Bin 171836 -> 0 bytes .../riscv-bldc-forced-commutation/src/bsp.h | 22 - .../riscv-bldc-forced-commutation/src/delay.c | 123 - .../riscv-bldc-forced-commutation/src/delay.h | 25 - .../src/hifive1_io.cpp | 16 - .../src/hifive1_io.h | 26 - .../src/io/gpio.h | 89 - .../src/io/pwm.h | 122 - .../src/io/spi.h | 200 -- .../src/io/uart.h | 83 - .../src/riscv-bldc.cpp | 250 -- .../src/riscv-bldc.h | 41 - .../src/util/bit_field.h | 179 -- .../src/wrap_printf.c | 271 -- .../toolchain-rv32.cmake | 33 - .../include => include}/rtl/bits.h | 0 .../include => include}/rtl/const.h | 0 .../include => include}/rtl/sections.h | 0 .../include => include}/sifive/bits.h | 0 .../include => include}/sifive/const.h | 0 .../include => include}/sifive/devices/aon.h | 0 .../include => include}/sifive/devices/clic.h | 0 .../sifive/devices/clint.h | 0 .../include => include}/sifive/devices/gpio.h | 0 .../include => include}/sifive/devices/otp.h | 0 .../include => include}/sifive/devices/plic.h | 0 .../include => include}/sifive/devices/prci.h | 0 .../include => include}/sifive/devices/pwm.h | 0 .../include => include}/sifive/devices/spi.h | 0 .../include => include}/sifive/devices/uart.h | 0 .../include => include}/sifive/sections.h | 0 .../include => include}/sifive/smp.h | 0 .../include => include}/tgc-vp/bits.h | 0 .../include => include}/tgc-vp/const.h | 0 .../include => include}/tgc-vp/devices/aon.h | 0 .../tgc-vp/devices/clint.h | 0 .../include => include}/tgc-vp/devices/gpio.h | 0 .../include => include}/tgc-vp/devices/otp.h | 0 .../include => include}/tgc-vp/devices/plic.h | 0 .../include => include}/tgc-vp/devices/prci.h | 0 .../include => include}/tgc-vp/devices/pwm.h | 0 .../include => include}/tgc-vp/devices/spi.h | 0 .../include => include}/tgc-vp/devices/uart.h | 0 .../include => include}/tgc-vp/sections.h | 0 .../libwrap => libwrap}/libwrap.mk | 0 .../libwrap => libwrap}/misc/.gitignore | 0 .../libwrap => libwrap}/misc/write_hex.c | 0 .../libwrap => libwrap}/stdlib/.gitignore | 0 .../libwrap => libwrap}/stdlib/malloc.c | 0 .../libwrap => libwrap}/sys/.gitignore | 0 .../libwrap => libwrap}/sys/_exit.c | 0 .../libwrap => libwrap}/sys/close.c | 0 .../libwrap => libwrap}/sys/execve.c | 0 .../libwrap => libwrap}/sys/fork.c | 0 .../libwrap => libwrap}/sys/fstat.c | 0 .../libwrap => libwrap}/sys/getpid.c | 0 .../libwrap => libwrap}/sys/isatty.c | 0 .../libwrap => libwrap}/sys/kill.c | 0 .../libwrap => libwrap}/sys/link.c | 0 .../libwrap => libwrap}/sys/lseek.c | 0 .../libwrap => libwrap}/sys/open.c | 0 .../libwrap => libwrap}/sys/openat.c | 0 .../libwrap => libwrap}/sys/printf.c | 0 .../libwrap => libwrap}/sys/puts.c | 0 .../libwrap => libwrap}/sys/read.c | 0 .../libwrap => libwrap}/sys/sbrk.c | 0 .../libwrap => libwrap}/sys/stat.c | 0 .../libwrap => libwrap}/sys/stub.h | 0 .../libwrap => libwrap}/sys/times.c | 0 .../libwrap => libwrap}/sys/unlink.c | 0 .../libwrap => libwrap}/sys/wait.c | 0 .../sys/weak_under_alias.h | 0 .../libwrap => libwrap}/sys/write.c | 0 295 files changed, 1 insertion(+), 19263 deletions(-) delete mode 100644 .gitmodules delete mode 100644 CMakeLists.txt delete mode 100644 bare-metal-bsp/.project delete mode 160000 benchmarks/coremark/cm delete mode 100644 benchmarks/coremark/tgc/core_portme.c delete mode 100644 benchmarks/coremark/tgc/core_portme.h delete mode 100755 benchmarks/coremark/tgc/core_portme.mak delete mode 100644 benchmarks/coremark/tgc/cvt.c delete mode 100644 benchmarks/coremark/tgc/ee_printf.c delete mode 100644 benchmarks/coremark/tgc/tgc.lds delete mode 100644 benchmarks/dhrystone/.cproject delete mode 100644 benchmarks/dhrystone/.gdbinit delete mode 100644 benchmarks/dhrystone/.gitignore delete mode 100644 benchmarks/dhrystone/.project delete mode 100644 benchmarks/dhrystone/Makefile delete mode 100644 benchmarks/dhrystone/dhry.h delete mode 100644 benchmarks/dhrystone/dhry_1.c delete mode 100644 benchmarks/dhrystone/dhry_2.c delete mode 100644 benchmarks/dhrystone/dhry_printf.c delete mode 100644 benchmarks/dhrystone/dhry_stubs.c rename {bare-metal-bsp/drivers => drivers}/clic/clic_driver.c (100%) rename {bare-metal-bsp/drivers => drivers}/clic/clic_driver.h (100%) rename {bare-metal-bsp/drivers => drivers}/fe300prci/fe300prci_driver.c (100%) rename {bare-metal-bsp/drivers => drivers}/fe300prci/fe300prci_driver.h (100%) rename {bare-metal-bsp/drivers => drivers}/plic/plic_driver.c (100%) rename {bare-metal-bsp/drivers => drivers}/plic/plic_driver.h (100%) rename {bare-metal-bsp/env => env}/.gitignore (100%) rename {bare-metal-bsp/env => env}/TGC5L/.gitignore (100%) rename {bare-metal-bsp/env => env}/TGC5L/init.c (100%) rename {bare-metal-bsp/env => env}/TGC5L/link.lds (100%) rename {bare-metal-bsp/env => env}/TGC5L/platform.h (100%) rename {bare-metal-bsp/env => env}/common-clang.mk (100%) rename {bare-metal-bsp/env => env}/common-gcc.mk (100%) rename {bare-metal-bsp/env => env}/encoding.h (100%) rename {bare-metal-bsp/env => env}/entry.S (100%) rename {bare-metal-bsp/env => env}/hifive1.h (100%) rename {bare-metal-bsp/env => env}/hifive1/dhrystone.lds (100%) rename {bare-metal-bsp/env => env}/hifive1/flash.lds (100%) rename {bare-metal-bsp/env => env}/hifive1/init.c (100%) rename {bare-metal-bsp/env => env}/hifive1/openocd.cfg (100%) rename {bare-metal-bsp/env => env}/hifive1/platform.h (100%) rename {bare-metal-bsp/env => env}/hifive1/settings.mk (100%) rename {bare-metal-bsp/env => env}/iss/.gitignore (100%) rename {bare-metal-bsp/env => env}/iss/init.c (100%) rename {bare-metal-bsp/env => env}/iss/link.lds (100%) rename {bare-metal-bsp/env => env}/iss/platform.h (100%) rename {bare-metal-bsp/env => env}/rtl/.gitignore (100%) rename {bare-metal-bsp/env => env}/rtl/init.c (100%) rename {bare-metal-bsp/env => env}/rtl/link.lds (100%) rename {bare-metal-bsp/env => env}/rtl/platform.h (100%) rename {bare-metal-bsp/env => env}/start.S (100%) rename {bare-metal-bsp/env => env}/tgc-vp/.gitignore (100%) rename {bare-metal-bsp/env => env}/tgc-vp/init.c (100%) rename {bare-metal-bsp/env => env}/tgc-vp/link.lds (100%) rename {bare-metal-bsp/env => env}/tgc-vp/platform.h (100%) delete mode 100644 hello-world/.cproject delete mode 100644 hello-world/.gitignore delete mode 100644 hello-world/.project delete mode 100644 hello-world/Makefile delete mode 100644 hello-world/hello.c delete mode 100644 hello-world/wrap_stubs.c delete mode 100644 hifive1-vp/hello/.cproject delete mode 100644 hifive1-vp/hello/.project delete mode 100644 hifive1-vp/hello/Makefile delete mode 100644 hifive1-vp/hello/bsp/Debug/drivers/fe300prci/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/drivers/plic/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/env/freedom-e300-arty/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/env/freedom-e300-hifive1/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/env/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/libwrap/stdlib/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/libwrap/sys/subdir.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/makefile delete mode 100644 hifive1-vp/hello/bsp/Debug/objects.mk delete mode 100644 hifive1-vp/hello/bsp/Debug/sources.mk delete mode 100644 hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.c delete mode 100644 hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.h delete mode 100644 hifive1-vp/hello/bsp/drivers/plic/plic_driver.c delete mode 100644 hifive1-vp/hello/bsp/drivers/plic/plic_driver.h delete mode 100644 hifive1-vp/hello/bsp/env/common.mk delete mode 100644 hifive1-vp/hello/bsp/env/encoding.h delete mode 100644 hifive1-vp/hello/bsp/env/entry.S delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-arty/init.c delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-arty/link.lds delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-arty/openocd.cfg delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-arty/platform.h delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-hifive1/init.c delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-hifive1/link.lds delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-hifive1/openocd.cfg delete mode 100644 hifive1-vp/hello/bsp/env/freedom-e300-hifive1/platform.h delete mode 100644 hifive1-vp/hello/bsp/env/hifive1.h delete mode 100644 hifive1-vp/hello/bsp/env/iss/init.c delete mode 100644 hifive1-vp/hello/bsp/env/iss/link.lds delete mode 100644 hifive1-vp/hello/bsp/env/iss/openocd.cfg delete mode 100644 hifive1-vp/hello/bsp/env/iss/platform.h delete mode 100644 hifive1-vp/hello/bsp/env/start.S delete mode 100644 hifive1-vp/hello/bsp/include/sifive/bits.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/const.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/aon.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/clint.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/gpio.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/otp.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/plic.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/prci.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/pwm.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/spi.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/devices/uart.h delete mode 100644 hifive1-vp/hello/bsp/include/sifive/sections.h delete mode 100644 hifive1-vp/hello/bsp/libwrap/libwrap.mk delete mode 100644 hifive1-vp/hello/bsp/libwrap/stdlib/malloc.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/_exit.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/close.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/execve.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/fork.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/fstat.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/getpid.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/isatty.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/kill.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/link.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/lseek.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/open.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/openat.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/read.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/sbrk.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/stat.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/stub.h delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/times.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/unlink.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/wait.c delete mode 100644 hifive1-vp/hello/bsp/libwrap/sys/write.c delete mode 100755 hifive1-vp/hello/hello delete mode 100644 hifive1-vp/hello/hello.c delete mode 100644 hifive1-vp/hello/hello.dis delete mode 100644 hifive1-vp/hello/wrap_printf.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/.gitignore delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/.project delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/Makefile delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/common.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/flash.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/init.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/openocd.cfg delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/platform.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/settings.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/tim-split.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/tim.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-arty.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/dhrystone.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/flash.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/init.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/openocd.cfg delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/platform.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/scratchpad.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/settings.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/dhrystone.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/flash.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/init.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/openocd.cfg delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/platform.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/scratchpad.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/settings.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/encoding.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/entry.S delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/flash.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/init.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/openocd.cfg delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/platform.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/settings.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/dhrystone.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/flash.lds delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/init.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/openocd.cfg delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/platform.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/settings.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/hifive1.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/start.S delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/env/ventry.S delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/bits.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/const.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/aon.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clic.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clint.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/gpio.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/otp.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/plic.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/prci.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/pwm.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/spi.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/uart.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/sections.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/smp.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/libwrap.mk delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/misc/write_hex.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/stdlib/malloc.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/_exit.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/close.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/execve.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fork.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fstat.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/getpid.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/isatty.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/kill.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/link.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/lseek.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/open.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/openat.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/puts.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/read.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/sbrk.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stat.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stub.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/times.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/unlink.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/wait.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/weak_under_alias.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/write.c delete mode 100755 hifive1-vp/riscv-bldc-forced-commutation/riscv-bldc delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/bsp.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/delay.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/delay.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.cpp delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/io/gpio.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/io/pwm.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/io/spi.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/io/uart.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.cpp delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/util/bit_field.h delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/src/wrap_printf.c delete mode 100644 hifive1-vp/riscv-bldc-forced-commutation/toolchain-rv32.cmake rename {bare-metal-bsp/include => include}/rtl/bits.h (100%) rename {bare-metal-bsp/include => include}/rtl/const.h (100%) rename {bare-metal-bsp/include => include}/rtl/sections.h (100%) rename {bare-metal-bsp/include => include}/sifive/bits.h (100%) rename {bare-metal-bsp/include => include}/sifive/const.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/aon.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/clic.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/clint.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/gpio.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/otp.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/plic.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/prci.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/pwm.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/spi.h (100%) rename {bare-metal-bsp/include => include}/sifive/devices/uart.h (100%) rename {bare-metal-bsp/include => include}/sifive/sections.h (100%) rename {bare-metal-bsp/include => include}/sifive/smp.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/bits.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/const.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/aon.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/clint.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/gpio.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/otp.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/plic.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/prci.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/pwm.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/spi.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/devices/uart.h (100%) rename {bare-metal-bsp/include => include}/tgc-vp/sections.h (100%) rename {bare-metal-bsp/libwrap => libwrap}/libwrap.mk (100%) rename {bare-metal-bsp/libwrap => libwrap}/misc/.gitignore (100%) rename {bare-metal-bsp/libwrap => libwrap}/misc/write_hex.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/stdlib/.gitignore (100%) rename {bare-metal-bsp/libwrap => libwrap}/stdlib/malloc.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/.gitignore (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/_exit.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/close.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/execve.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/fork.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/fstat.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/getpid.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/isatty.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/kill.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/link.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/lseek.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/open.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/openat.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/printf.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/puts.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/read.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/sbrk.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/stat.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/stub.h (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/times.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/unlink.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/wait.c (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/weak_under_alias.h (100%) rename {bare-metal-bsp/libwrap => libwrap}/sys/write.c (100%) diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index a5a6bfb..0000000 --- a/.gitmodules +++ /dev/null @@ -1,7 +0,0 @@ -[submodule "cm"] - path = benchmarks/coremark/cm - url = https://github.com/eembc/coremark.git - -[submodule "benchmarks/coremark/cm"] - path = benchmarks/coremark/cm - url = https://github.com/eembc/coremark.git diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index cb6ffae..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -if (NOT DEFINED BOARD) - set(BOARD iss) -endif() -if (NOT DEFINED ISA) - set(ISA imc) -endif() -message(STATUS "Building firmware using ${BOARD} board configuration") -add_custom_target(fw-hello-world ALL - COMMAND make -C ${riscvfw_SOURCE_DIR}/hello-world BOARD=${BOARD} ISA=${ISA} - USES_TERMINAL - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -add_custom_target(fw-dhrystone ALL - COMMAND make -C ${riscvfw_SOURCE_DIR}/benchmarks/dhrystone BOARD=${BOARD} ISA=${ISA} - USES_TERMINAL - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -add_custom_target(fw-coremark ALL - COMMAND make -C ${riscvfw_SOURCE_DIR}/benchmarks/coremark/cm PORT_DIR=../tgc BOARD=${BOARD} ISA=${ISA} - USES_TERMINAL - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/README.md b/README.md index 9e9abe5..fcc31e9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# Firmware +# TGC board support package diff --git a/bare-metal-bsp/.project b/bare-metal-bsp/.project deleted file mode 100644 index 6aa10ed..0000000 --- a/bare-metal-bsp/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - bare-metal-bsp - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/benchmarks/coremark/cm b/benchmarks/coremark/cm deleted file mode 160000 index d5fad6b..0000000 --- a/benchmarks/coremark/cm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d5fad6bd094899101a4e5fd53af7298160ced6ab diff --git a/benchmarks/coremark/tgc/core_portme.c b/benchmarks/coremark/tgc/core_portme.c deleted file mode 100644 index 56639c7..0000000 --- a/benchmarks/coremark/tgc/core_portme.c +++ /dev/null @@ -1,197 +0,0 @@ -/* -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 "coremark.h" -#include "core_portme.h" -//Read cycle CSR -unsigned long long _read_cycle() -{ - unsigned long long result; - unsigned long lower; - unsigned long upper1; - unsigned long upper2; - - asm volatile ( - "repeat_cycle_%=: csrr %0, cycleh;\n" - " csrr %1, cycle;\n" - " csrr %2, cycleh;\n" - " bne %0, %2, repeat_cycle_%=;\n" - : "=r" (upper1),"=r" (lower),"=r" (upper2) // Outputs : temp variable for load result - : - : - ); - *(unsigned long *)(&result) = lower; - *((unsigned long *)(&result)+1) = upper1; - - return result; -} - -volatile int tohost; -volatile int fromhost; - -void exit(int n){ - tohost = 0x1; - for (;;); -} - -void __libc_init_array (void) { -/* - size_t count; - size_t i; - count = __preinit_array_end - __preinit_array_start; - for (i = 0; i < count; i++) - __preinit_array_start[i] (); - -#ifdef HAVE_INIT_FINI - _init (); -#endif - - count = __init_array_end - __init_array_start; - for (i = 0; i < count; i++) - __init_array_start[i] (); -*/ -} -#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; -/* 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. -*/ -CORETIMETYPE -barebones_clock() -{ - return (CORETIMETYPE)_read_cycle(); -} -/* 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. - */ -#define GETMYTIME(_t) (*_t = barebones_clock()) -#define MYTIMEDIFF(fin, ini) ((fin) - (ini)) -#define TIMER_RES_DIVIDER 1 -#define SAMPLE_TIME_IMPLEMENTATION 1 -#define EE_TICKS_PER_SEC (CLOCKS_PER_SEC / TIMER_RES_DIVIDER) - -/** 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); -} -/* 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) -{ - 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; -} - -ee_u32 default_num_contexts = 1; - -/* Function : portable_init - Target specific initialization code - Test for some common mistakes. -*/ -void -portable_init(core_portable *p, int *argc, char *argv[]) -{ - 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"); - } - p->portable_id = 1; -} -/* Function : portable_fini - Target specific final code -*/ -void -portable_fini(core_portable *p) -{ - p->portable_id = 0; -} diff --git a/benchmarks/coremark/tgc/core_portme.h b/benchmarks/coremark/tgc/core_portme.h deleted file mode 100644 index cf0f769..0000000 --- a/benchmarks/coremark/tgc/core_portme.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -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 0 -#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 0 -#endif -/* Configuration : HAS_PRINTF - Define to 1 if the platform has stdio.h and implements the printf - function. -*/ -#ifndef HAS_PRINTF -#define HAS_PRINTF 0 -#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 "STACK" -#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 ee_u32 ee_size_t; -#define NULL ((void *)0) -/* 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 : CORE_TICKS - Define type of return from the timing functions. - */ -#define CORETIMETYPE ee_u32 -typedef ee_u32 CORE_TICKS; - -/* 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_STACK -#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 -#define USE_PTHREAD 0 -#define USE_FORK 0 -#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 - - Note : - This flag only matters if MULTITHREAD has been defined to a value - greater then 1. -*/ -#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 - Not used for this simple port, must cintain the value 1. -*/ -extern ee_u32 default_num_contexts; - -typedef struct CORE_PORTABLE_S -{ - 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 !defined(PROFILE_RUN) && !defined(PERFORMANCE_RUN) \ - && !defined(VALIDATION_RUN) -#if (TOTAL_DATA_SIZE == 1200) -#define PROFILE_RUN 1 -#elif (TOTAL_DATA_SIZE == 2000) -#define PERFORMANCE_RUN 1 -#else -#define VALIDATION_RUN 1 -#endif -#endif - -int ee_printf(const char *fmt, ...); - -#endif /* CORE_PORTME_H */ diff --git a/benchmarks/coremark/tgc/core_portme.mak b/benchmarks/coremark/tgc/core_portme.mak deleted file mode 100755 index 8dcac1c..0000000 --- a/benchmarks/coremark/tgc/core_portme.mak +++ /dev/null @@ -1,94 +0,0 @@ -# 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 -ISA?=imc -RISCV_ARCH:=rv32$(ISA)_zicsr_zifencei -RISCV_ABI:=ilp32 -TRIPLET?=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 = $(TRIPLET)-gcc -# Flag : LD -# Use this flag to define compiler to use -LD = $(TRIPLET)-gcc -# Flag : AS -# Use this flag to define compiler to use -AS = $(TRIPLET)-as -# 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 = -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -O3 -DCLOCKS_PER_SEC=10000000 -nostdlib -nostartfiles -nodefaultlibs \ - -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las -flto -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. -SEPARATE_COMPILE=1 -# Flag : SEPARATE_COMPILE -# You must also define below how to create an object file, and how to link. -OBJOUT = -o -LFLAGS = -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -#--specs=nano.specs -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -ASFLAGS = -OFLAG = -o -COUT = -c - -LFLAGS_END = -# Flag : PORT_SRCS -# Port specific source files can be added here -# You may also need cvt.c if the fcvt functions are not provided as intrinsics by your compiler! -PORT_SRCS = $(PORT_DIR)/core_portme.c $(PORT_DIR)/ee_printf.c -vpath %.c $(PORT_DIR) -vpath %.s $(PORT_DIR) -PORT_OBJS = core_portme.o ee_printf.o -# Flag : LOAD -# For a simple port, we assume self hosted compile and run, no load needed. - -# Flag : RUN -# For a simple port, we assume self hosted compile and run, simple invocation of the executable - -LOAD = echo "" -RUN = echo "" - -OEXT = .o -EXE = .elf - -$(OPATH)$(PORT_DIR)/%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -$(OPATH)%$(OEXT) : %.c - $(CC) $(CFLAGS) $(XCFLAGS) $(COUT) $< $(OBJOUT) $@ - -$(OPATH)$(PORT_DIR)/%$(OEXT) : %.s - $(AS) $(ASFLAGS) $< $(OBJOUT) $@ - -# Target : port_pre% and port_post% -# For the purpose of this simple port, no pre or post steps needed. - -.PHONY : port_prebuild port_postbuild port_prerun port_postrun port_preload port_postload -port_pre% port_post% : - -# FLAG : OPATH -# Path to the output folder. Default - current folder. -OPATH = ./ -MKDIR = mkdir -p - -dist-clean: clean - rm -f *.o diff --git a/benchmarks/coremark/tgc/cvt.c b/benchmarks/coremark/tgc/cvt.c deleted file mode 100644 index 333e8ea..0000000 --- a/benchmarks/coremark/tgc/cvt.c +++ /dev/null @@ -1,127 +0,0 @@ -/* -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. -*/ -#include -#define CVTBUFSIZE 80 -static char CVTBUF[CVTBUFSIZE]; - -static char * -cvt(double arg, int ndigits, int *decpt, int *sign, char *buf, int eflag) -{ - int r2; - double fi, fj; - char * p, *p1; - - if (ndigits < 0) - ndigits = 0; - if (ndigits >= CVTBUFSIZE - 1) - ndigits = CVTBUFSIZE - 2; - r2 = 0; - *sign = 0; - p = &buf[0]; - if (arg < 0) - { - *sign = 1; - arg = -arg; - } - arg = modf(arg, &fi); - p1 = &buf[CVTBUFSIZE]; - - if (fi != 0) - { - p1 = &buf[CVTBUFSIZE]; - while (fi != 0) - { - fj = modf(fi / 10, &fi); - *--p1 = (int)((fj + .03) * 10) + '0'; - r2++; - } - while (p1 < &buf[CVTBUFSIZE]) - *p++ = *p1++; - } - else if (arg > 0) - { - while ((fj = arg * 10) < 1) - { - arg = fj; - r2--; - } - } - p1 = &buf[ndigits]; - if (eflag == 0) - p1 += r2; - *decpt = r2; - if (p1 < &buf[0]) - { - buf[0] = '\0'; - return buf; - } - while (p <= p1 && p < &buf[CVTBUFSIZE]) - { - arg *= 10; - arg = modf(arg, &fj); - *p++ = (int)fj + '0'; - } - if (p1 >= &buf[CVTBUFSIZE]) - { - buf[CVTBUFSIZE - 1] = '\0'; - return buf; - } - p = p1; - *p1 += 5; - while (*p1 > '9') - { - *p1 = '0'; - if (p1 > buf) - ++*--p1; - else - { - *p1 = '1'; - (*decpt)++; - if (eflag == 0) - { - if (p > buf) - *p = '0'; - p++; - } - } - } - *p = '\0'; - return buf; -} - -char * -ecvt(double arg, int ndigits, int *decpt, int *sign) -{ - return cvt(arg, ndigits, decpt, sign, CVTBUF, 1); -} - -char * -ecvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return cvt(arg, ndigits, decpt, sign, buf, 1); -} - -char * -fcvt(double arg, int ndigits, int *decpt, int *sign) -{ - return cvt(arg, ndigits, decpt, sign, CVTBUF, 0); -} - -char * -fcvtbuf(double arg, int ndigits, int *decpt, int *sign, char *buf) -{ - return cvt(arg, ndigits, decpt, sign, buf, 0); -} diff --git a/benchmarks/coremark/tgc/ee_printf.c b/benchmarks/coremark/tgc/ee_printf.c deleted file mode 100644 index 161f582..0000000 --- a/benchmarks/coremark/tgc/ee_printf.c +++ /dev/null @@ -1,701 +0,0 @@ -/* -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. -*/ - -#include -#include - -#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' */ - -#define is_digit(c) ((c) >= '0' && (c) <= '9') - -static char * digits = "0123456789abcdefghijklmnopqrstuvwxyz"; -static char * upper_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -static ee_size_t strnlen(const char *s, ee_size_t count); - -static 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 int -skip_atoi(const char **s) -{ - int i = 0; - while (is_digit(**s)) - i = i * 10 + *((*s)++) - '0'; - return i; -} - -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 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; -} - -#if HAS_FLOAT - -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); - -void -ee_bufcpy(char *pd, char *ps, int count) -{ - char *pe = ps + count; - while (ps != pe) - *pd++ = *ps++; -} - -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 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 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 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; -} - -#define UART0_BASE_ADDR 0xffff0000ULL - -#define UART_REG_TXFIFO 0x00 -#define UART_REG_RXFIFO 0x04 -#define UART_REG_TXCTRL 0x08 -#define UART_REG_RXCTRL 0x0c -#define UART_REG_IE 0x10 -#define UART_REG_IP 0x14 -#define UART_REG_DIV 0x18 -#define UART_TXEN 0x1 - -#define UART0_REG(ADDR) *((ee_u32*) (UART0_BASE_ADDR + ADDR)) - -void -uart_send_char(char c) -{ - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = (unsigned char)c; -} - -int -ee_printf(const char *fmt, ...) -{ - char buf[1024], *p; - va_list args; - int n = 0; - - va_start(args, fmt); - ee_vsprintf(buf, fmt, args); - va_end(args); - p = buf; - while (*p) - { - uart_send_char(*p); - n++; - p++; - } - - return n; -} diff --git a/benchmarks/coremark/tgc/tgc.lds b/benchmarks/coremark/tgc/tgc.lds deleted file mode 100644 index 08de74d..0000000 --- a/benchmarks/coremark/tgc/tgc.lds +++ /dev/null @@ -1,241 +0,0 @@ -OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv") -OUTPUT_ARCH(riscv) -MEMORY -{ - RAM (rwx) : ORIGIN = 0x0, LENGTH = 128M -} - -ENTRY(_start) - -SECTIONS -{ - /* Read-only sections, merged into text segment: */ - .interp : { *(.interp) } - .note.gnu.build-id : { *(.note.gnu.build-id) } - .hash : { *(.hash) } - .gnu.hash : { *(.gnu.hash) } - .dynsym : { *(.dynsym) } - .dynstr : { *(.dynstr) } - .gnu.version : { *(.gnu.version) } - .gnu.version_d : { *(.gnu.version_d) } - .gnu.version_r : { *(.gnu.version_r) } - .rela.dyn : - { - *(.rela.init) - *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) - *(.rela.fini) - *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) - *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) - *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) - *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) - *(.rela.ctors) - *(.rela.dtors) - *(.rela.got) - *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) - *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) - *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) - *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) - *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) - PROVIDE_HIDDEN (__rela_iplt_start = .); - *(.rela.iplt) - PROVIDE_HIDDEN (__rela_iplt_end = .); - } - .rela.plt : - { - *(.rela.plt) - } - .plt : { *(.plt) } - .iplt : { *(.iplt) } - .init : - { - KEEP (*(SORT_NONE(.init))) - *crt0.o(.text .text.*) - } > RAM - .text : - { - *(.text.init) - *(.text.unlikely .text.*_unlikely .text.unlikely.*) - *(.text.exit .text.exit.*) - *(.text.startup .text.startup.*) - *(.text.hot .text.hot.*) - *(.text .stub .text.* .gnu.linkonce.t.*) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - } - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } - .rodata1 : { *(.rodata1) } - .sdata2 : - { - *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) - } - .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } - .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } - .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } - .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } - .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } - /* These sections are generated by the Sun/Oracle C++ compiler. */ - .exception_ranges : ONLY_IF_RO { *(.exception_ranges*) } - /* Adjust the address for the data segment. We want to adjust up to - the same address within the page on the next page up. */ - . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); - /* Exception handling */ - .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } - .gnu_extab : ONLY_IF_RW { *(.gnu_extab) } - .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } - .exception_ranges : ONLY_IF_RW { *(.exception_ranges*) } - /* Thread Local Storage sections */ - .tdata : - { - PROVIDE_HIDDEN (__tdata_start = .); - *(.tdata .tdata.* .gnu.linkonce.td.*) - } - .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } - .jcr : { KEEP (*(.jcr)) } - .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } - .dynamic : { *(.dynamic) } - . = DATA_SEGMENT_RELRO_END (0, .); - .data : - { - __DATA_BEGIN__ = .; - *(.data .data.* .gnu.linkonce.d.*) - SORT(CONSTRUCTORS) - } - .data1 : { *(.data1) } - .got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) } - /* We want the small data sections together, so single-instruction offsets - can access them all, and initialized data all before uninitialized, so - we can shorten the on-disk segment size. */ - .sdata : - { - __SDATA_BEGIN__ = .; - *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) - *(.sdata .sdata.* .gnu.linkonce.s.*) - } - _edata = .; PROVIDE (edata = .); - . = .; - __bss_start = .; - .sbss : - { - *(.dynsbss) - *(.sbss .sbss.* .gnu.linkonce.sb.*) - *(.scommon) - } - .bss : - { - *(.dynbss) - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - /* Align here to ensure that the .bss section occupies space up to - _end. Align after .bss to ensure correct alignment even if the - .bss section disappears because there are no input sections. - FIXME: Why do we need it? When there is no .bss section, we do not - pad the .data section. */ - . = ALIGN(. != 0 ? 32 / 8 : 1); - } - . = ALIGN(32 / 8); - . = SEGMENT_START("ldata-segment", .); - . = ALIGN(32 / 8); - __BSS_END__ = .; - __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, - MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); - _end = .; PROVIDE (end = .); - . = DATA_SEGMENT_END (.); - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - /* DWARF 3 */ - .debug_pubtypes 0 : { *(.debug_pubtypes) } - .debug_ranges 0 : { *(.debug_ranges) } - /* DWARF Extension. */ - .debug_macro 0 : { *(.debug_macro) } - .debug_addr 0 : { *(.debug_addr) } - .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } - /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } -} diff --git a/benchmarks/dhrystone/.cproject b/benchmarks/dhrystone/.cproject deleted file mode 100644 index e1e7a04..0000000 --- a/benchmarks/dhrystone/.cproject +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - make - - all - true - true - true - - - make - clean - true - true - true - - - make - - all BOARD=tgc-vp - true - true - true - - - make - - all BOARD=iss - true - true - true - - - - \ No newline at end of file diff --git a/benchmarks/dhrystone/.gdbinit b/benchmarks/dhrystone/.gdbinit deleted file mode 100644 index f53f67e..0000000 --- a/benchmarks/dhrystone/.gdbinit +++ /dev/null @@ -1,3 +0,0 @@ -target remote :20000 -set remotebreak -b main diff --git a/benchmarks/dhrystone/.gitignore b/benchmarks/dhrystone/.gitignore deleted file mode 100644 index f8028c7..0000000 --- a/benchmarks/dhrystone/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -dhrystone -/dhrystone.dis diff --git a/benchmarks/dhrystone/.project b/benchmarks/dhrystone/.project deleted file mode 100644 index 39e1517..0000000 --- a/benchmarks/dhrystone/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - dhrystone - - - bare-metal-bsp - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/benchmarks/dhrystone/Makefile b/benchmarks/dhrystone/Makefile deleted file mode 100644 index 42a88cd..0000000 --- a/benchmarks/dhrystone/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -TARGET := dhrystone -ISA?=imc - -ASM_SRCS := -C_SRCS := dhry_stubs.c dhry_printf.c dhry_1.c dhry_2.c -HEADERS := dhry.h - -BOARD=iss -LINK_TARGET=link -RISCV_ARCH:=rv32$(ISA) -ifneq (,$(findstring e,$(ISA))) - RISCV_ABI:=ilp32e -else - RISCV_ABI:=ilp32 -endif -# '-lgcc -lm' are needed to add softfloat routines -CFLAGS := -g -march=$(RISCV_ARCH)_zicsr_zifencei -mabi=$(RISCV_ABI) -mcmodel=medlow -O3 -DHZ=32768 -DTIME -DNO_INIT -fno-inline -fno-builtin-printf -fno-common -Wno-implicit \ - -funroll-loops -fpeel-loops -fgcse-sm -fgcse-las -LDFLAGS := -g -march=$(RISCV_ARCH)_zicsr_zifencei -mabi=$(RISCV_ABI) -mcmodel=medlow -Wl,--wrap=scanf -Wl,--wrap=printf -Wl,--wrap=exit -lgcc -lm - -TOOL_DIR=$(dir $(compiler)) - -BSP_BASE = ../../bare-metal-bsp -include $(BSP_BASE)/env/common-gcc.mk diff --git a/benchmarks/dhrystone/dhry.h b/benchmarks/dhrystone/dhry.h deleted file mode 100644 index b556ecc..0000000 --- a/benchmarks/dhrystone/dhry.h +++ /dev/null @@ -1,423 +0,0 @@ -/* - **************************************************************************** - * - * "DHRYSTONE" Benchmark Program - * ----------------------------- - * - * Version: C, Version 2.1 - * - * File: dhry.h (part 1 of 3) - * - * Date: May 25, 1988 - * - * Author: Reinhold P. Weicker - * Siemens AG, AUT E 51 - * Postfach 3220 - * 8520 Erlangen - * Germany (West) - * Phone: [+49]-9131-7-20330 - * (8-17 Central European Time) - * Usenet: ..!mcsun!unido!estevax!weicker - * - * Original Version (in Ada) published in - * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), - * pp. 1013 - 1030, together with the statistics - * on which the distribution of statements etc. is based. - * - * In this C version, the following C library functions are used: - * - strcpy, strcmp (inside the measurement loop) - * - printf, scanf (outside the measurement loop) - * In addition, Berkeley UNIX system calls "times ()" or "time ()" - * are used for execution time measurement. For measurements - * on other systems, these calls have to be changed. - * - * Collection of Results: - * Reinhold Weicker (address see above) and - * - * Rick Richardson - * PC Research. Inc. - * 94 Apple Orchard Drive - * Tinton Falls, NJ 07724 - * Phone: (201) 389-8963 (9-17 EST) - * Usenet: ...!uunet!pcrat!rick - * - * Please send results to Rick Richardson and/or Reinhold Weicker. - * Complete information should be given on hardware and software used. - * Hardware information includes: Machine type, CPU, type and size - * of caches; for microprocessors: clock frequency, memory speed - * (number of wait states). - * Software information includes: Compiler (and runtime library) - * manufacturer and version, compilation switches, OS version. - * The Operating System version may give an indication about the - * compiler; Dhrystone itself performs no OS calls in the measurement loop. - * - * The complete output generated by the program should be mailed - * such that at least some checks for correctness can be made. - * - *************************************************************************** - * - * History: This version C/2.1 has been made for two reasons: - * - * 1) There is an obvious need for a common C version of - * Dhrystone, since C is at present the most popular system - * programming language for the class of processors - * (microcomputers, minicomputers) where Dhrystone is used most. - * There should be, as far as possible, only one C version of - * Dhrystone such that results can be compared without - * restrictions. In the past, the C versions distributed - * by Rick Richardson (Version 1.1) and by Reinhold Weicker - * had small (though not significant) differences. - * - * 2) As far as it is possible without changes to the Dhrystone - * statistics, optimizing compilers should be prevented from - * removing significant statements. - * - * This C version has been developed in cooperation with - * Rick Richardson (Tinton Falls, NJ), it incorporates many - * ideas from the "Version 1.1" distributed previously by - * him over the UNIX network Usenet. - * I also thank Chaim Benedelac (National Semiconductor), - * David Ditzel (SUN), Earl Killian and John Mashey (MIPS), - * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) - * for their help with comments on earlier versions of the - * benchmark. - * - * Changes: In the initialization part, this version follows mostly - * Rick Richardson's version distributed via Usenet, not the - * version distributed earlier via floppy disk by Reinhold Weicker. - * As a concession to older compilers, names have been made - * unique within the first 8 characters. - * Inside the measurement loop, this version follows the - * version previously distributed by Reinhold Weicker. - * - * At several places in the benchmark, code has been added, - * but within the measurement loop only in branches that - * are not executed. The intention is that optimizing compilers - * should be prevented from moving code out of the measurement - * loop, or from removing code altogether. Since the statements - * that are executed within the measurement loop have NOT been - * changed, the numbers defining the "Dhrystone distribution" - * (distribution of statements, operand types and locality) - * still hold. Except for sophisticated optimizing compilers, - * execution times for this version should be the same as - * for previous versions. - * - * Since it has proven difficult to subtract the time for the - * measurement loop overhead in a correct way, the loop check - * has been made a part of the benchmark. This does have - * an impact - though a very minor one - on the distribution - * statistics which have been updated for this version. - * - * All changes within the measurement loop are described - * and discussed in the companion paper "Rationale for - * Dhrystone version 2". - * - * Because of the self-imposed limitation that the order and - * distribution of the executed statements should not be - * changed, there are still cases where optimizing compilers - * may not generate code for some statements. To a certain - * degree, this is unavoidable for small synthetic benchmarks. - * Users of the benchmark are advised to check code listings - * whether code is generated for all statements of Dhrystone. - * - * Version 2.1 is identical to version 2.0 distributed via - * the UNIX network Usenet in March 1988 except that it corrects - * some minor deficiencies that were found by users of version 2.0. - * The only change within the measurement loop is that a - * non-executed "else" part was added to the "if" statement in - * Func_3, and a non-executed "else" part removed from Proc_3. - * - *************************************************************************** - * - * Defines: The following "Defines" are possible: - * -DREG=register (default: Not defined) - * As an approximation to what an average C programmer - * might do, the "register" storage class is applied - * (if enabled by -DREG=register) - * - for local variables, if they are used (dynamically) - * five or more times - * - for parameters if they are used (dynamically) - * six or more times - * Note that an optimal "register" strategy is - * compiler-dependent, and that "register" declarations - * do not necessarily lead to faster execution. - * -DNOSTRUCTASSIGN (default: Not defined) - * Define if the C compiler does not support - * assignment of structures. - * -DNOENUMS (default: Not defined) - * Define if the C compiler does not support - * enumeration types. - * -DTIMES (default) - * -DTIME - * The "times" function of UNIX (returning process times) - * or the "time" function (returning wallclock time) - * is used for measurement. - * For single user machines, "time ()" is adequate. For - * multi-user machines where you cannot get single-user - * access, use the "times ()" function. If you have - * neither, use a stopwatch in the dead of night. - * "printf"s are provided marking the points "Start Timer" - * and "Stop Timer". DO NOT use the UNIX "time(1)" - * command, as this will measure the total time to - * run this program, which will (erroneously) include - * the time to allocate storage (malloc) and to perform - * the initialization. - * -DHZ=nnn - * In Berkeley UNIX, the function "times" returns process - * time in 1/HZ seconds, with HZ = 60 for most systems. - * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY - * A VALUE. - * - *************************************************************************** - * - * Compilation model and measurement (IMPORTANT): - * - * This C version of Dhrystone consists of three files: - * - dhry.h (this file, containing global definitions and comments) - * - dhry_1.c (containing the code corresponding to Ada package Pack_1) - * - dhry_2.c (containing the code corresponding to Ada package Pack_2) - * - * The following "ground rules" apply for measurements: - * - Separate compilation - * - No procedure merging - * - Otherwise, compiler optimizations are allowed but should be indicated - * - Default results are those without register declarations - * See the companion paper "Rationale for Dhrystone Version 2" for a more - * detailed discussion of these ground rules. - * - * For 16-Bit processors (e.g. 80186, 80286), times for all compilation - * models ("small", "medium", "large" etc.) should be given if possible, - * together with a definition of these models for the compiler system used. - * - ************************************************************************** - * - * Dhrystone (C version) statistics: - * - * [Comment from the first distribution, updated for version 2. - * Note that because of language differences, the numbers are slightly - * different from the Ada version.] - * - * The following program contains statements of a high level programming - * language (here: C) in a distribution considered representative: - * - * assignments 52 (51.0 %) - * control statements 33 (32.4 %) - * procedure, function calls 17 (16.7 %) - * - * 103 statements are dynamically executed. The program is balanced with - * respect to the three aspects: - * - * - statement type - * - operand type - * - operand locality - * operand global, local, parameter, or constant. - * - * The combination of these three aspects is balanced only approximately. - * - * 1. Statement Type: - * ----------------- number - * - * V1 = V2 9 - * (incl. V1 = F(..) - * V = Constant 12 - * Assignment, 7 - * with array element - * Assignment, 6 - * with record component - * -- - * 34 34 - * - * X = Y +|-|"&&"|"|" Z 5 - * X = Y +|-|"==" Constant 6 - * X = X +|- 1 3 - * X = Y *|/ Z 2 - * X = Expression, 1 - * two operators - * X = Expression, 1 - * three operators - * -- - * 18 18 - * - * if .... 14 - * with "else" 7 - * without "else" 7 - * executed 3 - * not executed 4 - * for ... 7 | counted every time - * while ... 4 | the loop condition - * do ... while 1 | is evaluated - * switch ... 1 - * break 1 - * declaration with 1 - * initialization - * -- - * 34 34 - * - * P (...) procedure call 11 - * user procedure 10 - * library procedure 1 - * X = F (...) - * function call 6 - * user function 5 - * library function 1 - * -- - * 17 17 - * --- - * 103 - * - * The average number of parameters in procedure or function calls - * is 1.82 (not counting the function values as implicit parameters). - * - * - * 2. Operators - * ------------ - * number approximate - * percentage - * - * Arithmetic 32 50.8 - * - * + 21 33.3 - * - 7 11.1 - * * 3 4.8 - * / (int div) 1 1.6 - * - * Comparison 27 42.8 - * - * == 9 14.3 - * /= 4 6.3 - * > 1 1.6 - * < 3 4.8 - * >= 1 1.6 - * <= 9 14.3 - * - * Logic 4 6.3 - * - * && (AND-THEN) 1 1.6 - * | (OR) 1 1.6 - * ! (NOT) 2 3.2 - * - * -- ----- - * 63 100.1 - * - * - * 3. Operand Type (counted once per operand reference): - * --------------- - * number approximate - * percentage - * - * Integer 175 72.3 % - * Character 45 18.6 % - * Pointer 12 5.0 % - * String30 6 2.5 % - * Array 2 0.8 % - * Record 2 0.8 % - * --- ------- - * 242 100.0 % - * - * When there is an access path leading to the final operand (e.g. a record - * component), only the final data type on the access path is counted. - * - * - * 4. Operand Locality: - * ------------------- - * number approximate - * percentage - * - * local variable 114 47.1 % - * global variable 22 9.1 % - * parameter 45 18.6 % - * value 23 9.5 % - * reference 22 9.1 % - * function result 6 2.5 % - * constant 55 22.7 % - * --- ------- - * 242 100.0 % - * - * - * The program does not compute anything meaningful, but it is syntactically - * and semantically correct. All variables have a value assigned to them - * before they are used as a source operand. - * - * There has been no explicit effort to account for the effects of a - * cache, or to balance the use of long or short displacements for code or - * data. - * - *************************************************************************** - */ - -/* Compiler and system dependent definitions: */ - -#ifndef TIME -#define TIMES -#endif - /* Use times(2) time function unless */ - /* explicitly defined otherwise */ - -#ifdef TIMES -#include -#include - /* for "times" */ -#endif - -#define Mic_secs_Per_Second 1000000 - /* Berkeley UNIX C returns process times in seconds/HZ */ - -#ifdef NOSTRUCTASSIGN -#define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) -#else -#define structassign(d, s) d = s -#endif - -#ifdef NOENUM -#define Ident_1 0 -#define Ident_2 1 -#define Ident_3 2 -#define Ident_4 3 -#define Ident_5 4 - typedef int Enumeration; -#else - typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} - Enumeration; -#endif - /* for boolean and enumeration types in Ada, Pascal */ - -/* General definitions: */ - -#include - /* for strcpy, strcmp */ - -#define Null 0 - /* Value of a Null pointer */ -#define true 1 -#define false 0 - -typedef int One_Thirty; -typedef int One_Fifty; -typedef char Capital_Letter; -typedef int Boolean; -typedef char Str_30 [31]; -typedef int Arr_1_Dim [50]; -typedef int Arr_2_Dim [50] [50]; - -typedef struct record - { - struct record *Ptr_Comp; - Enumeration Discr; - union { - struct { - Enumeration Enum_Comp; - int Int_Comp; - char Str_Comp [31]; - } var_1; - struct { - Enumeration E_Comp_2; - char Str_2_Comp [31]; - } var_2; - struct { - char Ch_1_Comp; - char Ch_2_Comp; - } var_3; - } variant; - } Rec_Type, *Rec_Pointer; - - diff --git a/benchmarks/dhrystone/dhry_1.c b/benchmarks/dhrystone/dhry_1.c deleted file mode 100644 index 5255fe3..0000000 --- a/benchmarks/dhrystone/dhry_1.c +++ /dev/null @@ -1,386 +0,0 @@ -/* - **************************************************************************** - * - * "DHRYSTONE" Benchmark Program - * ----------------------------- - * - * Version: C, Version 2.1 - * - * File: dhry_1.c (part 2 of 3) - * - * Date: May 25, 1988 - * - * Author: Reinhold P. Weicker - * - **************************************************************************** - */ - -#include "dhry.h" -extern char* strcpy(char* dest, const char* src); - -/* Global Variables: */ - -Rec_Pointer Ptr_Glob, - Next_Ptr_Glob; -int Int_Glob; -Boolean Bool_Glob; -char Ch_1_Glob, - Ch_2_Glob; -int Arr_1_Glob [50]; -int Arr_2_Glob [50] [50]; - -extern void *malloc (); -Enumeration Func_1 (); - /* forward declaration necessary since Enumeration may not simply be int */ - -#ifndef REG - Boolean Reg = false; -#define REG - /* REG becomes defined as empty */ - /* i.e. no register variables */ -#else - Boolean Reg = true; -#endif - -/* variables for time measurement: */ - -#ifdef TIMES -struct tms time_info; -extern int times (); - /* see library function "times" */ -#define Too_Small_Time 120 - /* Measurements should last at least about 2 seconds */ -#endif -#ifdef TIME -extern long time(); - /* see library function "time" */ -#define Too_Small_Time 2 - /* Measurements should last at least 2 seconds */ -#endif - -long Begin_Time, - End_Time, - User_Time; -float Microseconds, - Dhrystones_Per_Second; - -/* end of variables for time measurement */ - - -main () -/*****/ - - /* main program, corresponds to procedures */ - /* Main and Proc_0 in the Ada version */ -{ - One_Fifty Int_1_Loc; - REG One_Fifty Int_2_Loc; - One_Fifty Int_3_Loc; - REG char Ch_Index; - Enumeration Enum_Loc; - Str_30 Str_1_Loc; - Str_30 Str_2_Loc; - REG int Run_Index; - REG int Number_Of_Runs; - - /* Initializations */ - - Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); - Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); - - Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; - Ptr_Glob->Discr = Ident_1; - Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; - Ptr_Glob->variant.var_1.Int_Comp = 40; - strcpy (Ptr_Glob->variant.var_1.Str_Comp, - "DHRYSTONE PROGRAM, SOME STRING"); - strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); - - Arr_2_Glob [8][7] = 10; - /* Was missing in published program. Without this statement, */ - /* Arr_2_Glob [8][7] would have an undefined value. */ - /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ - /* overflow may occur for this array element. */ - - printf ("\n"); - printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); - printf ("\n"); - if (Reg) - { - printf ("Program compiled with 'register' attribute\n"); - printf ("\n"); - } - else - { - printf ("Program compiled without 'register' attribute\n"); - printf ("\n"); - } - printf ("Please give the number of runs through the benchmark: "); - { - int n; - scanf ("%d", &n); - Number_Of_Runs = n; - } - printf ("\n"); - - printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); - - /***************/ - /* Start timer */ - /***************/ - -#ifdef TIMES - times (&time_info); - Begin_Time = (long) time_info.tms_utime; -#endif -#ifdef TIME - Begin_Time = time ( (long *) 0); -#endif - - for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) - { - - Proc_5(); - Proc_4(); - /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ - Int_1_Loc = 2; - Int_2_Loc = 3; - strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); - Enum_Loc = Ident_2; - Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); - /* Bool_Glob == 1 */ - while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ - { - Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; - /* Int_3_Loc == 7 */ - Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); - /* Int_3_Loc == 7 */ - Int_1_Loc += 1; - } /* while */ - /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ - Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); - /* Int_Glob == 5 */ - Proc_1 (Ptr_Glob); - for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) - /* loop body executed twice */ - { - if (Enum_Loc == Func_1 (Ch_Index, 'C')) - /* then, not executed */ - { - Proc_6 (Ident_1, &Enum_Loc); - strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); - Int_2_Loc = Run_Index; - Int_Glob = Run_Index; - } - } - /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ - Int_2_Loc = Int_2_Loc * Int_1_Loc; - Int_1_Loc = Int_2_Loc / Int_3_Loc; - Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; - /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ - Proc_2 (&Int_1_Loc); - /* Int_1_Loc == 5 */ - - } /* loop "for Run_Index" */ - - /**************/ - /* Stop timer */ - /**************/ - -#ifdef TIMES - times (&time_info); - End_Time = (long) time_info.tms_utime; -#endif -#ifdef TIME - End_Time = time ( (long *) 0); -#endif - - printf ("Execution ends\n"); - printf ("\n"); - printf ("Final values of the variables used in the benchmark:\n"); - printf ("\n"); - printf ("Int_Glob: %d\n", Int_Glob); - printf (" should be: %d\n", 5); - printf ("Bool_Glob: %d\n", Bool_Glob); - printf (" should be: %d\n", 1); - printf ("Ch_1_Glob: %c\n", Ch_1_Glob); - printf (" should be: %c\n", 'A'); - printf ("Ch_2_Glob: %c\n", Ch_2_Glob); - printf (" should be: %c\n", 'B'); - printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); - printf (" should be: %d\n", 7); - printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); - printf (" should be: Number_Of_Runs + 10\n"); - printf ("Ptr_Glob->\n"); - printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); - printf (" should be: (implementation-dependent)\n"); - printf (" Discr: %d\n", Ptr_Glob->Discr); - printf (" should be: %d\n", 0); - printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); - printf (" should be: %d\n", 2); - printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); - printf (" should be: %d\n", 17); - printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); - printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); - printf ("Next_Ptr_Glob->\n"); - printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); - printf (" should be: (implementation-dependent), same as above\n"); - printf (" Discr: %d\n", Next_Ptr_Glob->Discr); - printf (" should be: %d\n", 0); - printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); - printf (" should be: %d\n", 1); - printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); - printf (" should be: %d\n", 18); - printf (" Str_Comp: %s\n", - Next_Ptr_Glob->variant.var_1.Str_Comp); - printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); - printf ("Int_1_Loc: %d\n", Int_1_Loc); - printf (" should be: %d\n", 5); - printf ("Int_2_Loc: %d\n", Int_2_Loc); - printf (" should be: %d\n", 13); - printf ("Int_3_Loc: %d\n", Int_3_Loc); - printf (" should be: %d\n", 7); - printf ("Enum_Loc: %d\n", Enum_Loc); - printf (" should be: %d\n", 1); - printf ("Str_1_Loc: %s\n", Str_1_Loc); - printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); - printf ("Str_2_Loc: %s\n", Str_2_Loc); - printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); - printf ("\n"); - - User_Time = End_Time - Begin_Time; - - if (User_Time < Too_Small_Time) - { - printf ("Measured time too small to obtain meaningful results\n"); - printf ("Please increase number of runs\n"); - printf ("\n"); - } - else - { -#ifdef TIME - Microseconds = ((float) User_Time/(float)HZ) * Mic_secs_Per_Second - / (float) Number_Of_Runs; - Dhrystones_Per_Second = (float) Number_Of_Runs / ((float) User_Time/(float)HZ); -#else - Microseconds = (float) User_Time * Mic_secs_Per_Second - / ((float) HZ * ((float) Number_Of_Runs)); - Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) - / (float) User_Time; -#endif - printf ("Microseconds for one run through Dhrystone: "); - printf ("%6.1f \n", Microseconds); - printf ("Dhrystones per Second: "); - printf ("%6.1f \n", Dhrystones_Per_Second); - printf ("\n"); - } - -} - - -Proc_1 (Ptr_Val_Par) -/******************/ - -REG Rec_Pointer Ptr_Val_Par; - /* executed once */ -{ - REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; - /* == Ptr_Glob_Next */ - /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ - /* corresponds to "rename" in Ada, "with" in Pascal */ - - structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); - Ptr_Val_Par->variant.var_1.Int_Comp = 5; - Next_Record->variant.var_1.Int_Comp - = Ptr_Val_Par->variant.var_1.Int_Comp; - Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; - Proc_3 (&Next_Record->Ptr_Comp); - /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp - == Ptr_Glob->Ptr_Comp */ - if (Next_Record->Discr == Ident_1) - /* then, executed */ - { - Next_Record->variant.var_1.Int_Comp = 6; - Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, - &Next_Record->variant.var_1.Enum_Comp); - Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; - Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, - &Next_Record->variant.var_1.Int_Comp); - } - else /* not executed */ - structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); -} /* Proc_1 */ - - -Proc_2 (Int_Par_Ref) -/******************/ - /* executed once */ - /* *Int_Par_Ref == 1, becomes 4 */ - -One_Fifty *Int_Par_Ref; -{ - One_Fifty Int_Loc; - Enumeration Enum_Loc; - - Int_Loc = *Int_Par_Ref + 10; - do /* executed once */ - if (Ch_1_Glob == 'A') - /* then, executed */ - { - Int_Loc -= 1; - *Int_Par_Ref = Int_Loc - Int_Glob; - Enum_Loc = Ident_1; - } /* if */ - while (Enum_Loc != Ident_1); /* true */ -} /* Proc_2 */ - - -Proc_3 (Ptr_Ref_Par) -/******************/ - /* executed once */ - /* Ptr_Ref_Par becomes Ptr_Glob */ - -Rec_Pointer *Ptr_Ref_Par; - -{ - if (Ptr_Glob != Null) - /* then, executed */ - *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; - Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); -} /* Proc_3 */ - - -Proc_4 () /* without parameters */ -/*******/ - /* executed once */ -{ - Boolean Bool_Loc; - - Bool_Loc = Ch_1_Glob == 'A'; - Bool_Glob = Bool_Loc | Bool_Glob; - Ch_2_Glob = 'B'; -} /* Proc_4 */ - - -Proc_5 () /* without parameters */ -/*******/ - /* executed once */ -{ - Ch_1_Glob = 'A'; - Bool_Glob = false; -} /* Proc_5 */ - - - /* Procedure for the assignment of structures, */ - /* if the C compiler doesn't support this feature */ -#ifdef NOSTRUCTASSIGN -memcpy (d, s, l) -register char *d; -register char *s; -register int l; -{ - while (l--) *d++ = *s++; -} -#endif - - diff --git a/benchmarks/dhrystone/dhry_2.c b/benchmarks/dhrystone/dhry_2.c deleted file mode 100644 index 63a3d3e..0000000 --- a/benchmarks/dhrystone/dhry_2.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - **************************************************************************** - * - * "DHRYSTONE" Benchmark Program - * ----------------------------- - * - * Version: C, Version 2.1 - * - * File: dhry_2.c (part 3 of 3) - * - * Date: May 25, 1988 - * - * Author: Reinhold P. Weicker - * - **************************************************************************** - */ - -#include "dhry.h" - -#ifndef REG -#define REG - /* REG becomes defined as empty */ - /* i.e. no register variables */ -#endif - -extern int Int_Glob; -extern char Ch_1_Glob; - - -Proc_6 (Enum_Val_Par, Enum_Ref_Par) -/*********************************/ - /* executed once */ - /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ - -Enumeration Enum_Val_Par; -Enumeration *Enum_Ref_Par; -{ - *Enum_Ref_Par = Enum_Val_Par; - if (! Func_3 (Enum_Val_Par)) - /* then, not executed */ - *Enum_Ref_Par = Ident_4; - switch (Enum_Val_Par) - { - case Ident_1: - *Enum_Ref_Par = Ident_1; - break; - case Ident_2: - if (Int_Glob > 100) - /* then */ - *Enum_Ref_Par = Ident_1; - else *Enum_Ref_Par = Ident_4; - break; - case Ident_3: /* executed */ - *Enum_Ref_Par = Ident_2; - break; - case Ident_4: break; - case Ident_5: - *Enum_Ref_Par = Ident_3; - break; - } /* switch */ -} /* Proc_6 */ - - -Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) -/**********************************************/ - /* executed three times */ - /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ - /* Int_Par_Ref becomes 7 */ - /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ - /* Int_Par_Ref becomes 17 */ - /* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ - /* Int_Par_Ref becomes 18 */ -One_Fifty Int_1_Par_Val; -One_Fifty Int_2_Par_Val; -One_Fifty *Int_Par_Ref; -{ - One_Fifty Int_Loc; - - Int_Loc = Int_1_Par_Val + 2; - *Int_Par_Ref = Int_2_Par_Val + Int_Loc; -} /* Proc_7 */ - - -Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val) -/*********************************************************************/ - /* executed once */ - /* Int_Par_Val_1 == 3 */ - /* Int_Par_Val_2 == 7 */ -Arr_1_Dim Arr_1_Par_Ref; -Arr_2_Dim Arr_2_Par_Ref; -int Int_1_Par_Val; -int Int_2_Par_Val; -{ - REG One_Fifty Int_Index; - REG One_Fifty Int_Loc; - - Int_Loc = Int_1_Par_Val + 5; - Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; - Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; - Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; - for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) - Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; - Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; - Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; - Int_Glob = 5; -} /* Proc_8 */ - - -Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) -/*************************************************/ - /* executed three times */ - /* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */ - /* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */ - /* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ - -Capital_Letter Ch_1_Par_Val; -Capital_Letter Ch_2_Par_Val; -{ - Capital_Letter Ch_1_Loc; - Capital_Letter Ch_2_Loc; - - Ch_1_Loc = Ch_1_Par_Val; - Ch_2_Loc = Ch_1_Loc; - if (Ch_2_Loc != Ch_2_Par_Val) - /* then, executed */ - return (Ident_1); - else /* not executed */ - { - Ch_1_Glob = Ch_1_Loc; - return (Ident_2); - } -} /* Func_1 */ - - -Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) -/*************************************************/ - /* executed once */ - /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ - /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ - -Str_30 Str_1_Par_Ref; -Str_30 Str_2_Par_Ref; -{ - REG One_Thirty Int_Loc; - Capital_Letter Ch_Loc; - - Int_Loc = 2; - while (Int_Loc <= 2) /* loop body executed once */ - if (Func_1 (Str_1_Par_Ref[Int_Loc], - Str_2_Par_Ref[Int_Loc+1]) == Ident_1) - /* then, executed */ - { - Ch_Loc = 'A'; - Int_Loc += 1; - } /* if, while */ - if (Ch_Loc >= 'W' && Ch_Loc < 'Z') - /* then, not executed */ - Int_Loc = 7; - if (Ch_Loc == 'R') - /* then, not executed */ - return (true); - else /* executed */ - { - if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) - /* then, not executed */ - { - Int_Loc += 7; - Int_Glob = Int_Loc; - return (true); - } - else /* executed */ - return (false); - } /* if Ch_Loc */ -} /* Func_2 */ - - -Boolean Func_3 (Enum_Par_Val) -/***************************/ - /* executed once */ - /* Enum_Par_Val == Ident_3 */ -Enumeration Enum_Par_Val; -{ - Enumeration Enum_Loc; - - Enum_Loc = Enum_Par_Val; - if (Enum_Loc == Ident_3) - /* then, executed */ - return (true); - else /* not executed */ - return (false); -} /* Func_3 */ - diff --git a/benchmarks/dhrystone/dhry_printf.c b/benchmarks/dhrystone/dhry_printf.c deleted file mode 100644 index d1c6b0c..0000000 --- a/benchmarks/dhrystone/dhry_printf.c +++ /dev/null @@ -1,15 +0,0 @@ -/* The functions in this file are only meant to support Dhrystone on an - * embedded RV32 system and are obviously incorrect in general. */ - -#include -#include -#include -#include -#include -#include - -//#undef putchar -//int putchar(int ch) -//{ -// return write(1, &ch, 1) == 1 ? ch : -1; -//} diff --git a/benchmarks/dhrystone/dhry_stubs.c b/benchmarks/dhrystone/dhry_stubs.c deleted file mode 100644 index 9dfdda0..0000000 --- a/benchmarks/dhrystone/dhry_stubs.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "platform.h" - -/* The functions in this file are only meant to support Dhrystone on an - * embedded RV32 system and are obviously incorrect in general. */ - -long time(void) -{ - return get_timer_value(); -} - -// set the number of dhrystone iterations -void __wrap_scanf(const char* fmt, int* n) -{ - *n = 200000; -} - -extern volatile uint32_t tohost; - -void exit(int n){ - tohost = 0x1; - for (;;); -} diff --git a/bare-metal-bsp/drivers/clic/clic_driver.c b/drivers/clic/clic_driver.c similarity index 100% rename from bare-metal-bsp/drivers/clic/clic_driver.c rename to drivers/clic/clic_driver.c diff --git a/bare-metal-bsp/drivers/clic/clic_driver.h b/drivers/clic/clic_driver.h similarity index 100% rename from bare-metal-bsp/drivers/clic/clic_driver.h rename to drivers/clic/clic_driver.h diff --git a/bare-metal-bsp/drivers/fe300prci/fe300prci_driver.c b/drivers/fe300prci/fe300prci_driver.c similarity index 100% rename from bare-metal-bsp/drivers/fe300prci/fe300prci_driver.c rename to drivers/fe300prci/fe300prci_driver.c diff --git a/bare-metal-bsp/drivers/fe300prci/fe300prci_driver.h b/drivers/fe300prci/fe300prci_driver.h similarity index 100% rename from bare-metal-bsp/drivers/fe300prci/fe300prci_driver.h rename to drivers/fe300prci/fe300prci_driver.h diff --git a/bare-metal-bsp/drivers/plic/plic_driver.c b/drivers/plic/plic_driver.c similarity index 100% rename from bare-metal-bsp/drivers/plic/plic_driver.c rename to drivers/plic/plic_driver.c diff --git a/bare-metal-bsp/drivers/plic/plic_driver.h b/drivers/plic/plic_driver.h similarity index 100% rename from bare-metal-bsp/drivers/plic/plic_driver.h rename to drivers/plic/plic_driver.h diff --git a/bare-metal-bsp/env/.gitignore b/env/.gitignore similarity index 100% rename from bare-metal-bsp/env/.gitignore rename to env/.gitignore diff --git a/bare-metal-bsp/env/TGC5L/.gitignore b/env/TGC5L/.gitignore similarity index 100% rename from bare-metal-bsp/env/TGC5L/.gitignore rename to env/TGC5L/.gitignore diff --git a/bare-metal-bsp/env/TGC5L/init.c b/env/TGC5L/init.c similarity index 100% rename from bare-metal-bsp/env/TGC5L/init.c rename to env/TGC5L/init.c diff --git a/bare-metal-bsp/env/TGC5L/link.lds b/env/TGC5L/link.lds similarity index 100% rename from bare-metal-bsp/env/TGC5L/link.lds rename to env/TGC5L/link.lds diff --git a/bare-metal-bsp/env/TGC5L/platform.h b/env/TGC5L/platform.h similarity index 100% rename from bare-metal-bsp/env/TGC5L/platform.h rename to env/TGC5L/platform.h diff --git a/bare-metal-bsp/env/common-clang.mk b/env/common-clang.mk similarity index 100% rename from bare-metal-bsp/env/common-clang.mk rename to env/common-clang.mk diff --git a/bare-metal-bsp/env/common-gcc.mk b/env/common-gcc.mk similarity index 100% rename from bare-metal-bsp/env/common-gcc.mk rename to env/common-gcc.mk diff --git a/bare-metal-bsp/env/encoding.h b/env/encoding.h similarity index 100% rename from bare-metal-bsp/env/encoding.h rename to env/encoding.h diff --git a/bare-metal-bsp/env/entry.S b/env/entry.S similarity index 100% rename from bare-metal-bsp/env/entry.S rename to env/entry.S diff --git a/bare-metal-bsp/env/hifive1.h b/env/hifive1.h similarity index 100% rename from bare-metal-bsp/env/hifive1.h rename to env/hifive1.h diff --git a/bare-metal-bsp/env/hifive1/dhrystone.lds b/env/hifive1/dhrystone.lds similarity index 100% rename from bare-metal-bsp/env/hifive1/dhrystone.lds rename to env/hifive1/dhrystone.lds diff --git a/bare-metal-bsp/env/hifive1/flash.lds b/env/hifive1/flash.lds similarity index 100% rename from bare-metal-bsp/env/hifive1/flash.lds rename to env/hifive1/flash.lds diff --git a/bare-metal-bsp/env/hifive1/init.c b/env/hifive1/init.c similarity index 100% rename from bare-metal-bsp/env/hifive1/init.c rename to env/hifive1/init.c diff --git a/bare-metal-bsp/env/hifive1/openocd.cfg b/env/hifive1/openocd.cfg similarity index 100% rename from bare-metal-bsp/env/hifive1/openocd.cfg rename to env/hifive1/openocd.cfg diff --git a/bare-metal-bsp/env/hifive1/platform.h b/env/hifive1/platform.h similarity index 100% rename from bare-metal-bsp/env/hifive1/platform.h rename to env/hifive1/platform.h diff --git a/bare-metal-bsp/env/hifive1/settings.mk b/env/hifive1/settings.mk similarity index 100% rename from bare-metal-bsp/env/hifive1/settings.mk rename to env/hifive1/settings.mk diff --git a/bare-metal-bsp/env/iss/.gitignore b/env/iss/.gitignore similarity index 100% rename from bare-metal-bsp/env/iss/.gitignore rename to env/iss/.gitignore diff --git a/bare-metal-bsp/env/iss/init.c b/env/iss/init.c similarity index 100% rename from bare-metal-bsp/env/iss/init.c rename to env/iss/init.c diff --git a/bare-metal-bsp/env/iss/link.lds b/env/iss/link.lds similarity index 100% rename from bare-metal-bsp/env/iss/link.lds rename to env/iss/link.lds diff --git a/bare-metal-bsp/env/iss/platform.h b/env/iss/platform.h similarity index 100% rename from bare-metal-bsp/env/iss/platform.h rename to env/iss/platform.h diff --git a/bare-metal-bsp/env/rtl/.gitignore b/env/rtl/.gitignore similarity index 100% rename from bare-metal-bsp/env/rtl/.gitignore rename to env/rtl/.gitignore diff --git a/bare-metal-bsp/env/rtl/init.c b/env/rtl/init.c similarity index 100% rename from bare-metal-bsp/env/rtl/init.c rename to env/rtl/init.c diff --git a/bare-metal-bsp/env/rtl/link.lds b/env/rtl/link.lds similarity index 100% rename from bare-metal-bsp/env/rtl/link.lds rename to env/rtl/link.lds diff --git a/bare-metal-bsp/env/rtl/platform.h b/env/rtl/platform.h similarity index 100% rename from bare-metal-bsp/env/rtl/platform.h rename to env/rtl/platform.h diff --git a/bare-metal-bsp/env/start.S b/env/start.S similarity index 100% rename from bare-metal-bsp/env/start.S rename to env/start.S diff --git a/bare-metal-bsp/env/tgc-vp/.gitignore b/env/tgc-vp/.gitignore similarity index 100% rename from bare-metal-bsp/env/tgc-vp/.gitignore rename to env/tgc-vp/.gitignore diff --git a/bare-metal-bsp/env/tgc-vp/init.c b/env/tgc-vp/init.c similarity index 100% rename from bare-metal-bsp/env/tgc-vp/init.c rename to env/tgc-vp/init.c diff --git a/bare-metal-bsp/env/tgc-vp/link.lds b/env/tgc-vp/link.lds similarity index 100% rename from bare-metal-bsp/env/tgc-vp/link.lds rename to env/tgc-vp/link.lds diff --git a/bare-metal-bsp/env/tgc-vp/platform.h b/env/tgc-vp/platform.h similarity index 100% rename from bare-metal-bsp/env/tgc-vp/platform.h rename to env/tgc-vp/platform.h diff --git a/hello-world/.cproject b/hello-world/.cproject deleted file mode 100644 index 9ce61b2..0000000 --- a/hello-world/.cproject +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - make - all - true - true - true - - - make - clean - true - true - true - - - make - - clean all BOARD=tgc-vp - true - true - true - - - make - - clean all BOARD=iss - true - true - true - - - - \ No newline at end of file diff --git a/hello-world/.gitignore b/hello-world/.gitignore deleted file mode 100644 index 35be72e..0000000 --- a/hello-world/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/hello -/hello.dis diff --git a/hello-world/.project b/hello-world/.project deleted file mode 100644 index 0464423..0000000 --- a/hello-world/.project +++ /dev/null @@ -1,27 +0,0 @@ - - - hello-world - - - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/hello-world/Makefile b/hello-world/Makefile deleted file mode 100644 index aaa1e40..0000000 --- a/hello-world/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -TARGET = hello -ISA?=imc - -C_SRCS = $(wildcard *.c) -HEADERS = $(wildcard *.h) -OPT ?= -O2 -CFLAGS += $(OPT) -g - -BOARD=iss -LINK_TARGET=link -RISCV_ARCH:=rv32$(ISA) -ifneq (,$(findstring e,$(ISA))) - RISCV_ABI:=ilp32e -else - RISCV_ABI:=ilp32 -endif -LDFLAGS += -g -Wl,--wrap=printf - -compiler := $(shell which riscv64-unknown-elf-gcc) -TOOL_DIR=$(dir $(compiler)) - -TRIPLET=riscv64-unknown-elf -BSP_BASE = ../bare-metal-bsp -include $(BSP_BASE)/env/common-gcc.mk - -$(TARGET).vlog:$(TARGET) - riscv32-unknown-elf-objcopy -O verilog $(TARGET) $(TARGET).vlog diff --git a/hello-world/hello.c b/hello-world/hello.c deleted file mode 100644 index 219ed8a..0000000 --- a/hello-world/hello.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -int factorial(int i){ - - volatile int result = 1; - for (int ii = 1; ii <= i; ii++) { - result = result * ii; - } - return result; - -} - -int main() -{ - volatile int result = factorial (10); - printf("Factorial is %d\n", result); - printf("End of execution"); - return 0; -} diff --git a/hello-world/wrap_stubs.c b/hello-world/wrap_stubs.c deleted file mode 100644 index 0616f86..0000000 --- a/hello-world/wrap_stubs.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "platform.h" - -/* The functions in this file are only meant to support Dhrystone on an - * embedded RV32 system and are obviously incorrect in general. */ - -long time(void) -{ - return get_timer_value() / get_timer_freq(); -} - -// set the number of dhrystone iterations -void __wrap_scanf(const char* fmt, int* n) -{ - *n = 100000000; -} diff --git a/hifive1-vp/hello/.cproject b/hifive1-vp/hello/.cproject deleted file mode 100644 index 1135715..0000000 --- a/hifive1-vp/hello/.cproject +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - make - - all - true - true - true - - - make - - clean - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hifive1-vp/hello/.project b/hifive1-vp/hello/.project deleted file mode 100644 index 5635cdb..0000000 --- a/hifive1-vp/hello/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - hello - - - bsp - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/hifive1-vp/hello/Makefile b/hifive1-vp/hello/Makefile deleted file mode 100644 index 9d622b6..0000000 --- a/hifive1-vp/hello/Makefile +++ /dev/null @@ -1,13 +0,0 @@ - -TARGET = hello -C_SRCS += $(wildcard *.c) -CFLAGS += -g -#-fno-builtin-printf -LDFLAGS := -Wl,--wrap=scanf -Wl,--wrap=printf - -#BOARD = iss -BOARD=freedom-e300-hifive1 -TOOL_DIR=/opt/shared/riscv/FreedomStudio/20180122/SiFive/riscv64-unknown-elf-gcc-20171231-x86_64-linux-centos6/bin - -BSP_BASE = ./bsp -include $(BSP_BASE)/env/common.mk diff --git a/hifive1-vp/hello/bsp/Debug/drivers/fe300prci/subdir.mk b/hifive1-vp/hello/bsp/Debug/drivers/fe300prci/subdir.mk deleted file mode 100644 index 9a05361..0000000 --- a/hifive1-vp/hello/bsp/Debug/drivers/fe300prci/subdir.mk +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../drivers/fe300prci/fe300prci_driver.c - -OBJS += \ -./drivers/fe300prci/fe300prci_driver.o - -C_DEPS += \ -./drivers/fe300prci/fe300prci_driver.d - - -# Each subdirectory must supply rules for building sources it contributes -drivers/fe300prci/%.o: ../drivers/fe300prci/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/drivers/plic/subdir.mk b/hifive1-vp/hello/bsp/Debug/drivers/plic/subdir.mk deleted file mode 100644 index be3a955..0000000 --- a/hifive1-vp/hello/bsp/Debug/drivers/plic/subdir.mk +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../drivers/plic/plic_driver.c - -OBJS += \ -./drivers/plic/plic_driver.o - -C_DEPS += \ -./drivers/plic/plic_driver.d - - -# Each subdirectory must supply rules for building sources it contributes -drivers/plic/%.o: ../drivers/plic/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/env/freedom-e300-arty/subdir.mk b/hifive1-vp/hello/bsp/Debug/env/freedom-e300-arty/subdir.mk deleted file mode 100644 index c0bee22..0000000 --- a/hifive1-vp/hello/bsp/Debug/env/freedom-e300-arty/subdir.mk +++ /dev/null @@ -1,24 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../env/freedom-e300-arty/init.c - -OBJS += \ -./env/freedom-e300-arty/init.o - -C_DEPS += \ -./env/freedom-e300-arty/init.d - - -# Each subdirectory must supply rules for building sources it contributes -env/freedom-e300-arty/%.o: ../env/freedom-e300-arty/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/env/freedom-e300-hifive1/subdir.mk b/hifive1-vp/hello/bsp/Debug/env/freedom-e300-hifive1/subdir.mk deleted file mode 100644 index 16eea64..0000000 --- a/hifive1-vp/hello/bsp/Debug/env/freedom-e300-hifive1/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../env/freedom-e300-hifive1/init.c - -O_SRCS += \ -../env/freedom-e300-hifive1/init.o - -OBJS += \ -./env/freedom-e300-hifive1/init.o - -C_DEPS += \ -./env/freedom-e300-hifive1/init.d - - -# Each subdirectory must supply rules for building sources it contributes -env/freedom-e300-hifive1/%.o: ../env/freedom-e300-hifive1/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk b/hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk deleted file mode 100644 index 88f2d87..0000000 --- a/hifive1-vp/hello/bsp/Debug/env/iss/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../env/iss/init.c - -O_SRCS += \ -../env/iss/init.o - -OBJS += \ -./env/iss/init.o - -C_DEPS += \ -./env/iss/init.d - - -# Each subdirectory must supply rules for building sources it contributes -env/iss/%.o: ../env/iss/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/env/subdir.mk b/hifive1-vp/hello/bsp/Debug/env/subdir.mk deleted file mode 100644 index b8eaa7a..0000000 --- a/hifive1-vp/hello/bsp/Debug/env/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -O_SRCS += \ -../env/entry.o \ -../env/start.o - -S_UPPER_SRCS += \ -../env/entry.S \ -../env/start.S - -OBJS += \ -./env/entry.o \ -./env/start.o - - -# Each subdirectory must supply rules for building sources it contributes -env/%.o: ../env/%.S - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Assembler' - riscv32-unknown-elf-as -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/libwrap/stdlib/subdir.mk b/hifive1-vp/hello/bsp/Debug/libwrap/stdlib/subdir.mk deleted file mode 100644 index 2327c6d..0000000 --- a/hifive1-vp/hello/bsp/Debug/libwrap/stdlib/subdir.mk +++ /dev/null @@ -1,27 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../libwrap/stdlib/malloc.c - -O_SRCS += \ -../libwrap/stdlib/malloc.o - -OBJS += \ -./libwrap/stdlib/malloc.o - -C_DEPS += \ -./libwrap/stdlib/malloc.d - - -# Each subdirectory must supply rules for building sources it contributes -libwrap/stdlib/%.o: ../libwrap/stdlib/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/libwrap/sys/subdir.mk b/hifive1-vp/hello/bsp/Debug/libwrap/sys/subdir.mk deleted file mode 100644 index a93df2a..0000000 --- a/hifive1-vp/hello/bsp/Debug/libwrap/sys/subdir.mk +++ /dev/null @@ -1,98 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../libwrap/sys/_exit.c \ -../libwrap/sys/close.c \ -../libwrap/sys/execve.c \ -../libwrap/sys/fork.c \ -../libwrap/sys/fstat.c \ -../libwrap/sys/getpid.c \ -../libwrap/sys/isatty.c \ -../libwrap/sys/kill.c \ -../libwrap/sys/link.c \ -../libwrap/sys/lseek.c \ -../libwrap/sys/open.c \ -../libwrap/sys/openat.c \ -../libwrap/sys/read.c \ -../libwrap/sys/sbrk.c \ -../libwrap/sys/stat.c \ -../libwrap/sys/times.c \ -../libwrap/sys/unlink.c \ -../libwrap/sys/wait.c \ -../libwrap/sys/write.c - -O_SRCS += \ -../libwrap/sys/_exit.o \ -../libwrap/sys/close.o \ -../libwrap/sys/execve.o \ -../libwrap/sys/fork.o \ -../libwrap/sys/fstat.o \ -../libwrap/sys/getpid.o \ -../libwrap/sys/isatty.o \ -../libwrap/sys/kill.o \ -../libwrap/sys/link.o \ -../libwrap/sys/lseek.o \ -../libwrap/sys/open.o \ -../libwrap/sys/read.o \ -../libwrap/sys/sbrk.o \ -../libwrap/sys/stat.o \ -../libwrap/sys/times.o \ -../libwrap/sys/unlink.o \ -../libwrap/sys/wait.o \ -../libwrap/sys/write.o - -OBJS += \ -./libwrap/sys/_exit.o \ -./libwrap/sys/close.o \ -./libwrap/sys/execve.o \ -./libwrap/sys/fork.o \ -./libwrap/sys/fstat.o \ -./libwrap/sys/getpid.o \ -./libwrap/sys/isatty.o \ -./libwrap/sys/kill.o \ -./libwrap/sys/link.o \ -./libwrap/sys/lseek.o \ -./libwrap/sys/open.o \ -./libwrap/sys/openat.o \ -./libwrap/sys/read.o \ -./libwrap/sys/sbrk.o \ -./libwrap/sys/stat.o \ -./libwrap/sys/times.o \ -./libwrap/sys/unlink.o \ -./libwrap/sys/wait.o \ -./libwrap/sys/write.o - -C_DEPS += \ -./libwrap/sys/_exit.d \ -./libwrap/sys/close.d \ -./libwrap/sys/execve.d \ -./libwrap/sys/fork.d \ -./libwrap/sys/fstat.d \ -./libwrap/sys/getpid.d \ -./libwrap/sys/isatty.d \ -./libwrap/sys/kill.d \ -./libwrap/sys/link.d \ -./libwrap/sys/lseek.d \ -./libwrap/sys/open.d \ -./libwrap/sys/openat.d \ -./libwrap/sys/read.d \ -./libwrap/sys/sbrk.d \ -./libwrap/sys/stat.d \ -./libwrap/sys/times.d \ -./libwrap/sys/unlink.d \ -./libwrap/sys/wait.d \ -./libwrap/sys/write.d - - -# Each subdirectory must supply rules for building sources it contributes -libwrap/sys/%.o: ../libwrap/sys/%.c - @echo 'Building file: $<' - @echo 'Invoking: Cross GCC Compiler' - riscv32-unknown-elf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/hifive1-vp/hello/bsp/Debug/makefile b/hifive1-vp/hello/bsp/Debug/makefile deleted file mode 100644 index 34f9759..0000000 --- a/hifive1-vp/hello/bsp/Debug/makefile +++ /dev/null @@ -1,66 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - --include ../makefile.init - -RM := rm -rf - -# All of the sources participating in the build are defined here --include sources.mk --include libwrap/sys/subdir.mk --include libwrap/stdlib/subdir.mk --include libwrap/misc/subdir.mk --include env/iss/subdir.mk --include env/freedom-e300-hifive1/subdir.mk --include env/freedom-e300-arty/subdir.mk --include env/subdir.mk --include drivers/plic/subdir.mk --include drivers/fe300prci/subdir.mk --include subdir.mk --include objects.mk - -ifneq ($(MAKECMDGOALS),clean) -ifneq ($(strip $(CC_DEPS)),) --include $(CC_DEPS) -endif -ifneq ($(strip $(C++_DEPS)),) --include $(C++_DEPS) -endif -ifneq ($(strip $(C_UPPER_DEPS)),) --include $(C_UPPER_DEPS) -endif -ifneq ($(strip $(CXX_DEPS)),) --include $(CXX_DEPS) -endif -ifneq ($(strip $(C_DEPS)),) --include $(C_DEPS) -endif -ifneq ($(strip $(CPP_DEPS)),) --include $(CPP_DEPS) -endif -endif - --include ../makefile.defs - -# Add inputs and outputs from these tool invocations to the build variables - -# All Target -all: bsp - -# Tool invocations -bsp: $(OBJS) $(USER_OBJS) - @echo 'Building target: $@' - @echo 'Invoking: Cross G++ Linker' - riscv32-unknown-elf-g++ -o "bsp" $(OBJS) $(USER_OBJS) $(LIBS) - @echo 'Finished building target: $@' - @echo ' ' - -# Other Targets -clean: - -$(RM) $(CC_DEPS)$(C++_DEPS)$(EXECUTABLES)$(OBJS)$(C_UPPER_DEPS)$(CXX_DEPS)$(C_DEPS)$(CPP_DEPS) bsp - -@echo ' ' - -.PHONY: all clean dependents - --include ../makefile.targets diff --git a/hifive1-vp/hello/bsp/Debug/objects.mk b/hifive1-vp/hello/bsp/Debug/objects.mk deleted file mode 100644 index 742c2da..0000000 --- a/hifive1-vp/hello/bsp/Debug/objects.mk +++ /dev/null @@ -1,8 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -USER_OBJS := - -LIBS := - diff --git a/hifive1-vp/hello/bsp/Debug/sources.mk b/hifive1-vp/hello/bsp/Debug/sources.mk deleted file mode 100644 index bfb7eff..0000000 --- a/hifive1-vp/hello/bsp/Debug/sources.mk +++ /dev/null @@ -1,35 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -C_UPPER_SRCS := -CXX_SRCS := -C++_SRCS := -OBJ_SRCS := -CC_SRCS := -ASM_SRCS := -C_SRCS := -CPP_SRCS := -O_SRCS := -S_UPPER_SRCS := -CC_DEPS := -C++_DEPS := -EXECUTABLES := -OBJS := -C_UPPER_DEPS := -CXX_DEPS := -C_DEPS := -CPP_DEPS := - -# Every subdirectory with source files must be described here -SUBDIRS := \ -drivers/fe300prci \ -drivers/plic \ -env \ -env/freedom-e300-arty \ -env/freedom-e300-hifive1 \ -env/iss \ -libwrap/misc \ -libwrap/stdlib \ -libwrap/sys \ - diff --git a/hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.c b/hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.c deleted file mode 100644 index 2d9c52f..0000000 --- a/hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.c +++ /dev/null @@ -1,252 +0,0 @@ -// See LICENSE file for license details - -#include "platform.h" - -#ifdef PRCI_BASE_ADDR -#include "fe300prci/fe300prci_driver.h" -#include - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) -{ - - uint32_t start_mtime = CLINT_REG(CLINT_MTIME); - uint32_t end_mtime = start_mtime + mtime_ticks + 1; - - // Make sure we won't get rollover. - while (end_mtime < start_mtime){ - start_mtime = CLINT_REG(CLINT_MTIME); - end_mtime = start_mtime + mtime_ticks + 1; - } - - // Don't start measuring until mtime edge. - uint32_t tmp = start_mtime; - do { - start_mtime = CLINT_REG(CLINT_MTIME); - } while (start_mtime == tmp); - - uint64_t start_mcycle; - rdmcycle(&start_mcycle); - - while (CLINT_REG(CLINT_MTIME) < end_mtime) ; - - uint64_t end_mcycle; - rdmcycle(&end_mcycle); - uint32_t difference = (uint32_t) (end_mcycle - start_mcycle); - - uint64_t freq = ((uint64_t) difference * mtime_freq) / mtime_ticks; - return (uint32_t) freq & 0xFFFFFFFF; - -} - - -void PRCI_use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - // It is OK to change this even if we are running off of it. - - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0); - - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - PRCI_use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if desired. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - - // To overclock, use the hfrosc - if (hfrosctrim >= 0 && hfroscdiv >= 0) { - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - } - - // Set DIV Settings for PLL - - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - if (finaldiv == 1){ - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV(finaldiv-1)); - } - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = CLINT_REG(CLINT_MTIME); - while (CLINT_REG(CLINT_MTIME) - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0); - - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); - - // If we're running off HFXOSC, turn off the HFROSC to - // save power. - if (refsel) { - PRCI_REG(PRCI_HFROSCCFG) &= ~ROSC_EN(1); - } - -} - -void PRCI_use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - PRCI_use_hfrosc(4, 16); -} - -void PRCI_use_hfxosc(uint32_t finaldiv) -{ - - PRCI_use_pll(1, // Use HFXTAL - 1, // Bypass = 1 - 0, // PLL settings don't matter - 0, // PLL settings don't matter - 0, // PLL settings don't matter - finaldiv, - -1, - -1); -} - -// This is a generic function, which -// doesn't span the entire range of HFROSC settings. -// It only adjusts the trim, which can span a hundred MHz or so. -// This function does not check the legality of the PLL settings -// at all, and it is quite possible to configure invalid PLL settings -// this way. -// It returns the actual measured CPU frequency. - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target ) -{ - - uint32_t hfrosctrim = 0; - uint32_t hfroscdiv = 4; - uint32_t prev_trim = 0; - - // In this function we use PLL settings which - // will give us a 32x multiplier from the output - // of the HFROSC source to the output of the - // PLL. We first measure our HFROSC to get the - // right trim, then finally use it as the PLL source. - // We should really check here that the f_cpu - // requested is something in the limit of the PLL. For - // now that is up to the user. - - // This will undershoot for frequencies not divisible by 16. - uint32_t desired_hfrosc_freq = (f_cpu/ 16); - - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - - // Ignore the first run (for icache reasons) - uint32_t cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - uint32_t prev_freq = cpu_freq; - - while ((cpu_freq < desired_hfrosc_freq) && (hfrosctrim < 0x1F)){ - prev_trim = hfrosctrim; - prev_freq = cpu_freq; - hfrosctrim ++; - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - } - - // We couldn't go low enough - if (prev_freq > desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // We couldn't go high enough - if (cpu_freq < desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // Check for over/undershoot - switch(target) { - case(PRCI_FREQ_CLOSEST): - if ((desired_hfrosc_freq - prev_freq) < (cpu_freq - desired_hfrosc_freq)) { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - } else { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - break; - case(PRCI_FREQ_UNDERSHOOT): - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - break; - default: - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - -} - -#endif diff --git a/hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.h b/hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.h deleted file mode 100644 index 7100f46..0000000 --- a/hifive1-vp/hello/bsp/drivers/fe300prci/fe300prci_driver.h +++ /dev/null @@ -1,79 +0,0 @@ -// See LICENSE file for license details - -#ifndef _FE300PRCI_DRIVER_H_ -#define _FE300PRCI_DRIVER_H_ - -__BEGIN_DECLS - -#include - -typedef enum prci_freq_target { - - PRCI_FREQ_OVERSHOOT, - PRCI_FREQ_CLOSEST, - PRCI_FREQ_UNDERSHOOT - -} PRCI_freq_target; - -/* Measure and return the approximate frequency of the - * CPU, as given by measuring the mcycle counter against - * the mtime ticks. - */ -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq); - -/* Safely switch over to the HFROSC using the given div - * and trim settings. - */ -void PRCI_use_hfrosc(int div, int trim); - -/* Safely switch over to the 16MHz HFXOSC, - * applying the finaldiv clock divider (1 is the lowest - * legal value). - */ -void PRCI_use_hfxosc(uint32_t finaldiv); - -/* Safely switch over to the PLL using the given - * settings. - * - * Note that not all combinations of the inputs are actually - * legal, and this function does not check for their - * legality ("safely" means that this function won't turn off - * or glitch the clock the CPU is actually running off, but - * doesn't protect against you making it too fast or slow.) - */ - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim); - -/* Use the default clocks configured at reset. - * This is ~16Mhz HFROSC and turns off the LFROSC - * (on the current FE310 Dev Platforms, an external LFROSC is - * used as it is more power efficient). - */ -void PRCI_use_default_clocks(); - -/* This routine will adjust the HFROSC trim - * while using HFROSC as the clock source, - * measure the resulting frequency, then - * use it as the PLL clock source, - * in an attempt to get over, under, or close to the - * requested frequency. It returns the actual measured - * frequency. - * - * Note that the requested frequency must be within the - * range supported by the PLL so not all values are - * achievable with this function, and not all - * are guaranteed to actually work. The PLL - * is rated higher than the hardware. - * - * There is no check on the desired f_cpu frequency, it - * is up to the user to specify something reasonable. - */ - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target); - -__END_DECLS - -#endif - diff --git a/hifive1-vp/hello/bsp/drivers/plic/plic_driver.c b/hifive1-vp/hello/bsp/drivers/plic/plic_driver.c deleted file mode 100644 index b27d7a5..0000000 --- a/hifive1-vp/hello/bsp/drivers/plic/plic_driver.c +++ /dev/null @@ -1,127 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/plic.h" -#include "plic/plic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -// Note that there are no assertions or bounds checking on these -// parameter values. - -void volatile_memzero(uint8_t * base, unsigned int size) -{ - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities - ) -{ - - this_plic->base_addr = base_addr; - this_plic->num_sources = num_sources; - this_plic->num_priorities = num_priorities; - - // Disable all interrupts (don't assume that these registers are reset). - unsigned long hart_id = read_csr(mhartid); - volatile_memzero((uint8_t*) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET)), - (num_sources + 8) / 8); - - // Set all priorities to 0 (equal priority -- don't assume that these are reset). - volatile_memzero ((uint8_t *)(this_plic->base_addr + - PLIC_PRIORITY_OFFSET), - (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE); - - // Set the threshold to 0. - volatile plic_threshold* threshold = (plic_threshold*) - (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold = 0; - -} - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold){ - - unsigned long hart_id = read_csr(mhartid); - volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold_ptr = threshold; - -} - - -void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){ - - unsigned long hart_id = read_csr(mhartid); - volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current | ( 1 << (source & 0x7)); - *current_ptr = current; - -} - -void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){ - - unsigned long hart_id = read_csr(mhartid); - volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current & ~(( 1 << (source & 0x7))); - *current_ptr = current; - -} - -void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){ - - if (this_plic->num_priorities > 0) { - volatile plic_priority * priority_ptr = (volatile plic_priority *) - (this_plic->base_addr + - PLIC_PRIORITY_OFFSET + - (source << PLIC_PRIORITY_SHIFT_PER_SOURCE)); - *priority_ptr = priority; - } -} - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){ - - unsigned long hart_id = read_csr(mhartid); - - volatile plic_source * claim_addr = (volatile plic_source * ) - (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET)); - - return *claim_addr; - -} - -void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){ - - unsigned long hart_id = read_csr(mhartid); - volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET)); - *claim_addr = source; - -} - diff --git a/hifive1-vp/hello/bsp/drivers/plic/plic_driver.h b/hifive1-vp/hello/bsp/drivers/plic/plic_driver.h deleted file mode 100644 index e7d609b..0000000 --- a/hifive1-vp/hello/bsp/drivers/plic/plic_driver.h +++ /dev/null @@ -1,51 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef struct __plic_instance_t -{ - uintptr_t base_addr; - - uint32_t num_sources; - uint32_t num_priorities; - -} plic_instance_t; - -typedef uint32_t plic_source; -typedef uint32_t plic_priority; -typedef uint32_t plic_threshold; - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities - ); - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold); - -void PLIC_enable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_disable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_set_priority (plic_instance_t * this_plic, - plic_source source, - plic_priority priority); - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic); - -void PLIC_complete_interrupt(plic_instance_t * this_plic, - plic_source source); - -__END_DECLS - -#endif diff --git a/hifive1-vp/hello/bsp/env/common.mk b/hifive1-vp/hello/bsp/env/common.mk deleted file mode 100644 index 0995009..0000000 --- a/hifive1-vp/hello/bsp/env/common.mk +++ /dev/null @@ -1,62 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_COMMON -_SIFIVE_MK_COMMON := # defined - -.PHONY: all -all: $(TARGET) - -include $(BSP_BASE)/libwrap/libwrap.mk - -BOARD ?= freedom-e300-hifive1 -ENV_DIR = $(BSP_BASE)/env -PLATFORM_DIR = $(ENV_DIR)/$(BOARD) - -#TARGET_FLAVOR := -march=rv32imac -mabi=ilp32 -mcmodel=medany -msmall-data-limit=8 -x assembler-with-cpp -TARGET_FLAVOR := -march=rv32i -mabi=ilp32 - -ASM_SRCS += $(ENV_DIR)/start.S -ASM_SRCS += $(ENV_DIR)/entry.S -C_SRCS += $(PLATFORM_DIR)/init.c - -LINKER_SCRIPT := $(PLATFORM_DIR)/link.lds - -INCLUDES += -I$(BSP_BASE)/include -INCLUDES += -I$(BSP_BASE)/drivers/ -INCLUDES += -I$(ENV_DIR) -INCLUDES += -I$(PLATFORM_DIR) - -TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin - -CC := $(TOOL_DIR)/riscv64-unknown-elf-gcc ${TARGET_FLAVOR} -AR := $(TOOL_DIR)/riscv64-unknown-elf-ar -OBJDUMP := $(TOOL_DIR)/riscv64-unknown-elf-objdump - -LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles -LDFLAGS += -L$(ENV_DIR) - -ASM_OBJS := $(ASM_SRCS:.S=.o) -C_OBJS := $(C_SRCS:.c=.o) - -LINK_OBJS += $(ASM_OBJS) $(C_OBJS) -LINK_DEPS += $(LINKER_SCRIPT) - -CLEAN_OBJS += $(TARGET) $(LINK_OBJS) - -CFLAGS += -g - -$(TARGET): $(LINK_OBJS) $(LINK_DEPS) - $(CC) $(CFLAGS) $(INCLUDES) $(LINK_OBJS) -o $@ $(LDFLAGS) - $(OBJDUMP) -d $(TARGET) > $(TARGET).dis - -$(ASM_OBJS): %.o: %.S $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(C_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -.PHONY: clean -clean: - rm -f $(CLEAN_OBJS) - -endif # _SIFIVE_MK_COMMON diff --git a/hifive1-vp/hello/bsp/env/encoding.h b/hifive1-vp/hello/bsp/env/encoding.h deleted file mode 100644 index 35e0f9f..0000000 --- a/hifive1-vp/hello/bsp/env/encoding.h +++ /dev/null @@ -1,1313 +0,0 @@ -// 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_PUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_VM 0x1F000000 -#define MSTATUS32_SD 0x80000000 -#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_PUM 0x00040000 -#define SSTATUS32_SD 0x80000000 -#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 VM_MBARE 0 -#define VM_MBB 1 -#define VM_MBBID 2 -#define VM_SV32 8 -#define VM_SV39 9 -#define VM_SV48 10 - -#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 DEFAULT_NMIVEC 0x00001004 -#define DEFAULT_MTVEC 0x00001010 -#define CONFIG_STRING_ADDR 0x0000100C -#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 - -#ifdef __riscv64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -#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) ({ \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrw " #reg ", %0" :: "i"(val)); \ - else \ - asm volatile ("csrw " #reg ", %0" :: "r"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \ - else \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(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_HRET 0x20200073 -#define MASK_HRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VM 0x10400073 -#define MASK_SFENCE_VM 0xfff07fff -#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_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_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_S 0xe0000053 -#define MASK_FMV_X_S 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_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_S_X 0xf0000053 -#define MASK_FMV_S_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_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 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_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_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_SBADADDR 0x143 -#define CSR_SIP 0x144 -#define CSR_SPTBR 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_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MBADADDR 0x343 -#define CSR_MIP 0x344 -#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_MUCOUNTEREN 0x320 -#define CSR_MSCOUNTEREN 0x321 -#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_FAULT_FETCH 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_FAULT_LOAD 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_FAULT_STORE 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#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(hret, MATCH_HRET, MASK_HRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) -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(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(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_s, MATCH_FMV_X_S, MASK_FMV_X_S) -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_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_s_x, MATCH_FMV_S_X, MASK_FMV_S_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(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -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(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(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(sbadaddr, CSR_SBADADDR) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(sptbr, CSR_SPTBR) -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(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mbadaddr, CSR_MBADADDR) -DECLARE_CSR(mip, CSR_MIP) -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(mucounteren, CSR_MUCOUNTEREN) -DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) -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("fault fetch", CAUSE_FAULT_FETCH) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("fault load", CAUSE_FAULT_LOAD) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("fault store", CAUSE_FAULT_STORE) -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) -#endif diff --git a/hifive1-vp/hello/bsp/env/entry.S b/hifive1-vp/hello/bsp/env/entry.S deleted file mode 100644 index 1f5de24..0000000 --- a/hifive1-vp/hello/bsp/env/entry.S +++ /dev/null @@ -1,97 +0,0 @@ -// See LICENSE for license details - -#ifndef ENTRY_S -#define ENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - - .section .text.entry - .align 2 - .global trap_entry -trap_entry: - addi sp, sp, -32*REGBYTES - - STORE x1, 1*REGBYTES(sp) - STORE x2, 2*REGBYTES(sp) - STORE x3, 3*REGBYTES(sp) - STORE x4, 4*REGBYTES(sp) - STORE x5, 5*REGBYTES(sp) - STORE x6, 6*REGBYTES(sp) - STORE x7, 7*REGBYTES(sp) - STORE x8, 8*REGBYTES(sp) - STORE x9, 9*REGBYTES(sp) - STORE x10, 10*REGBYTES(sp) - STORE x11, 11*REGBYTES(sp) - STORE x12, 12*REGBYTES(sp) - STORE x13, 13*REGBYTES(sp) - STORE x14, 14*REGBYTES(sp) - STORE x15, 15*REGBYTES(sp) - STORE x16, 16*REGBYTES(sp) - STORE x17, 17*REGBYTES(sp) - STORE x18, 18*REGBYTES(sp) - STORE x19, 19*REGBYTES(sp) - STORE x20, 20*REGBYTES(sp) - STORE x21, 21*REGBYTES(sp) - STORE x22, 22*REGBYTES(sp) - STORE x23, 23*REGBYTES(sp) - STORE x24, 24*REGBYTES(sp) - STORE x25, 25*REGBYTES(sp) - STORE x26, 26*REGBYTES(sp) - STORE x27, 27*REGBYTES(sp) - STORE x28, 28*REGBYTES(sp) - STORE x29, 29*REGBYTES(sp) - STORE x30, 30*REGBYTES(sp) - STORE x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - call handle_trap - csrw mepc, a0 - - # Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 1*REGBYTES(sp) - LOAD x2, 2*REGBYTES(sp) - LOAD x3, 3*REGBYTES(sp) - LOAD x4, 4*REGBYTES(sp) - LOAD x5, 5*REGBYTES(sp) - LOAD x6, 6*REGBYTES(sp) - LOAD x7, 7*REGBYTES(sp) - LOAD x8, 8*REGBYTES(sp) - LOAD x9, 9*REGBYTES(sp) - LOAD x10, 10*REGBYTES(sp) - LOAD x11, 11*REGBYTES(sp) - LOAD x12, 12*REGBYTES(sp) - LOAD x13, 13*REGBYTES(sp) - LOAD x14, 14*REGBYTES(sp) - LOAD x15, 15*REGBYTES(sp) - LOAD x16, 16*REGBYTES(sp) - LOAD x17, 17*REGBYTES(sp) - LOAD x18, 18*REGBYTES(sp) - LOAD x19, 19*REGBYTES(sp) - LOAD x20, 20*REGBYTES(sp) - LOAD x21, 21*REGBYTES(sp) - LOAD x22, 22*REGBYTES(sp) - LOAD x23, 23*REGBYTES(sp) - LOAD x24, 24*REGBYTES(sp) - LOAD x25, 25*REGBYTES(sp) - LOAD x26, 26*REGBYTES(sp) - LOAD x27, 27*REGBYTES(sp) - LOAD x28, 28*REGBYTES(sp) - LOAD x29, 29*REGBYTES(sp) - LOAD x30, 30*REGBYTES(sp) - LOAD x31, 31*REGBYTES(sp) - - addi sp, sp, 32*REGBYTES - mret - -.weak handle_trap -handle_trap: -1: - j 1b - -#endif diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-arty/init.c b/hifive1-vp/hello/bsp/env/freedom-e300-arty/init.c deleted file mode 100644 index a6f4b39..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-arty/init.c +++ /dev/null @@ -1,87 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long get_cpu_freq() -{ - return 65000000; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - #endif -} - -void _fini() -{ -} diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-arty/link.lds b/hifive1-vp/hello/bsp/env/freedom-e300-arty/link.lds deleted file mode 100644 index 90e5c8f..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-arty/link.lds +++ /dev/null @@ -1,167 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - } >ram AT>flash :ram_init - - .srodata : - { - PROVIDE( _gp = . + 0x800 ); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - .sdata : - { - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-arty/openocd.cfg b/hifive1-vp/hello/bsp/env/freedom-e300-arty/openocd.cfg deleted file mode 100644 index f4b28ed..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-arty/openocd.cfg +++ /dev/null @@ -1,30 +0,0 @@ -adapter_khz 10000 - -#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg] - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 -# - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-arty/platform.h b/hifive1-vp/hello/bsp/env/freedom-e300-arty/platform.h deleted file mode 100644 index d5d6dda..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-arty/platform.h +++ /dev/null @@ -1,125 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -#define TRAPVEC_TABLE_BASE_ADDR _AC(0x00001010,UL) -#define CLINT_BASE_ADDR _AC(0x02000000,UL) -#define PLIC_BASE_ADDR _AC(0x0C000000,UL) -#define AON_BASE_ADDR _AC(0x10000000,UL) -#define GPIO_BASE_ADDR _AC(0x10012000,UL) -#define UART0_BASE_ADDR _AC(0x10013000,UL) -#define SPI0_BASE_ADDR _AC(0x10014000,UL) -#define PWM0_BASE_ADDR _AC(0x10015000,UL) -#define UART1_BASE_ADDR _AC(0x10023000,UL) -#define SPI1_BASE_ADDR _AC(0x10024000,UL) -#define PWM1_BASE_ADDR _AC(0x10025000,UL) -#define SPI2_BASE_ADDR _AC(0x10034000,UL) -#define PWM2_BASE_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_BASE_ADDR _AC(0x80000000,UL) - -// IOF Mappings -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt Numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_BASE_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_BASE_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_BASE_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_BASE_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_BASE_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_BASE_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_BASE_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_BASE_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_BASE_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_BASE_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_BASE_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_BASE_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_BASE_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_BASE_ADDR, offset) - -// Misc - -#include - - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS -#include "hifive1.h" - -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/init.c b/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/init.c deleted file mode 100644 index de046cc..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/init.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long mtime_lo(void) -{ - return *(volatile unsigned long *)(CLINT_BASE_ADDR + CLINT_MTIME); -} - -#ifdef __riscv32 - -static uint32_t mtime_hi(void) -{ - return *(volatile uint32_t *)(CLINT_BASE_ADDR + CLINT_MTIME + 4); -} - -uint64_t get_timer_value() -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#else /* __riscv32 */ - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -static void use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -static void use_pll(int refsel, int bypass, int r, int f, int q) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if available. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - // In case we are executing from QSPI, - // (which is quite likely) we need to - // set the QSPI clock divider appropriately - // before boosting the clock frequency. - - // Div = f_sck/2 - SPI0_REG(SPI_REG_SCKDIV) = 8; - - // Set DIV Settings for PLL - // Both HFROSC and HFXOSC are modeled as ideal - // 16MHz sources (assuming dividers are set properly for - // HFROSC). - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = mtime_lo(); - while (mtime_lo() - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); -} - -static void use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - use_hfrosc(4, 16); -} - -static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) -{ - unsigned long start_mtime, delta_mtime; - unsigned long mtime_freq = get_timer_freq(); - - // Don't start measuruing until we see an mtime tick - unsigned long tmp = mtime_lo(); - do { - start_mtime = mtime_lo(); - } while (start_mtime == tmp); - - unsigned long start_mcycle = read_csr(mcycle); - - do { - delta_mtime = mtime_lo() - start_mtime; - } while (delta_mtime < n); - - unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; - - return (delta_mcycle / delta_mtime) * mtime_freq - + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; -} - -unsigned long get_cpu_freq() -{ - static uint32_t cpu_freq; - - if (!cpu_freq) { - // warm up I$ - measure_cpu_freq(1); - // measure for real - cpu_freq = measure_cpu_freq(10); - } - - return cpu_freq; -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - - #ifndef NO_INIT - use_default_clocks(); - use_pll(0, 0, 1, 31, 1); - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - #endif - -} - -void _fini() -{ -} diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/link.lds b/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/link.lds deleted file mode 100644 index 90e5c8f..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/link.lds +++ /dev/null @@ -1,167 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - } >ram AT>flash :ram_init - - .srodata : - { - PROVIDE( _gp = . + 0x800 ); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - .sdata : - { - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/openocd.cfg b/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/openocd.cfg deleted file mode 100644 index b531e9c..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/openocd.cfg +++ /dev/null @@ -1,34 +0,0 @@ -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Dual RS232-HS" -ftdi_vid_pid 0x0403 0x6010 - -ftdi_layout_init 0x0008 0x001b -ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 - -#Reset Stretcher logic on FE310 is ~1 second long -#This doesn't apply if you use -# ftdi_set_signal, but still good to document -#adapter_nsrst_delay 1500 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -- This type of reset is not implemented yet -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z - #Wait for the reset stretcher - #It will work without this, but - #will incur lots of delays for later commands. - sleep 1500 -} -halt -#flash protect 0 64 last off diff --git a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/platform.h b/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/platform.h deleted file mode 100644 index 63efc9e..0000000 --- a/hifive1-vp/hello/bsp/env/freedom-e300-hifive1/platform.h +++ /dev/null @@ -1,133 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/otp.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/prci.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define MASKROM_BASE_ADDR _AC(0x00001000,UL) -#define TRAPVEC_TABLE_BASE_ADDR _AC(0x00001010,UL) -#define OTP_MMAP_ADDR _AC(0x00020000,UL) -#define CLINT_BASE_ADDR _AC(0x02000000,UL) -#define PLIC_BASE_ADDR _AC(0x0C000000,UL) -#define AON_BASE_ADDR _AC(0x10000000,UL) -#define PRCI_BASE_ADDR _AC(0x10008000,UL) -#define OTP_BASE_ADDR _AC(0x10010000,UL) -#define GPIO_BASE_ADDR _AC(0x10012000,UL) -#define UART0_BASE_ADDR _AC(0x10013000,UL) -#define SPI0_BASE_ADDR _AC(0x10014000,UL) -#define PWM0_BASE_ADDR _AC(0x10015000,UL) -#define UART1_BASE_ADDR _AC(0x10023000,UL) -#define SPI1_BASE_ADDR _AC(0x10024000,UL) -#define PWM1_BASE_ADDR _AC(0x10025000,UL) -#define SPI2_BASE_ADDR _AC(0x10034000,UL) -#define PWM2_BASE_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_BASE_ADDR _AC(0x80000000,UL) - -// IOF masks -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -//#define IOF0_I2C_MASK _AC(0x00003000,UL) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_BASE_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_BASE_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_BASE_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_BASE_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_BASE_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_BASE_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_BASE_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_BASE_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_BASE_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_BASE_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_BASE_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_BASE_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_BASE_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_BASE_ADDR, offset) - -// Misc - -#include - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#include "hifive1.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/hello/bsp/env/hifive1.h b/hifive1-vp/hello/bsp/env/hifive1.h deleted file mode 100644 index cfd7099..0000000 --- a/hifive1-vp/hello/bsp/env/hifive1.h +++ /dev/null @@ -1,79 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_HIFIVE1_H -#define _SIFIVE_HIFIVE1_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the RGB LED on HiFive1 Board. -// These are also mapped to RGB LEDs on the Freedom E300 Arty -// FPGA -// Dev Kit. - -#define RED_LED_OFFSET 22 -#define GREEN_LED_OFFSET 19 -#define BLUE_LED_OFFSET 21 - -// These are the GPIO bit offsets for the differen digital pins -// on the headers for both the HiFive1 Board and the Freedom E300 Arty FPGA Dev Kit. -#define PIN_0_OFFSET 16 -#define PIN_1_OFFSET 17 -#define PIN_2_OFFSET 18 -#define PIN_3_OFFSET 19 -#define PIN_4_OFFSET 20 -#define PIN_5_OFFSET 21 -#define PIN_6_OFFSET 22 -#define PIN_7_OFFSET 23 -#define PIN_8_OFFSET 0 -#define PIN_9_OFFSET 1 -#define PIN_10_OFFSET 2 -#define PIN_11_OFFSET 3 -#define PIN_12_OFFSET 4 -#define PIN_13_OFFSET 5 -//#define PIN_14_OFFSET 8 //This pin is not connected on either board. -#define PIN_15_OFFSET 9 -#define PIN_16_OFFSET 10 -#define PIN_17_OFFSET 11 -#define PIN_18_OFFSET 12 -#define PIN_19_OFFSET 13 - -// These are *PIN* numbers, not -// GPIO Offset Numbers. -#define PIN_SPI1_SCK (13u) -#define PIN_SPI1_MISO (12u) -#define PIN_SPI1_MOSI (11u) -#define PIN_SPI1_SS0 (10u) -#define PIN_SPI1_SS1 (14u) -#define PIN_SPI1_SS2 (15u) -#define PIN_SPI1_SS3 (16u) - -#define SS_PIN_TO_CS_ID(x) \ - ((x==PIN_SPI1_SS0 ? 0 : \ - (x==PIN_SPI1_SS1 ? 1 : \ - (x==PIN_SPI1_SS2 ? 2 : \ - (x==PIN_SPI1_SS3 ? 3 : \ - -1))))) - - -// These buttons are present only on the Freedom E300 Arty Dev Kit. -#ifdef HAS_BOARD_BUTTONS -#define BUTTON_0_OFFSET 15 -#define BUTTON_1_OFFSET 30 -#define BUTTON_2_OFFSET 31 - -#define INT_DEVICE_BUTTON_0 (INT_GPIO_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (INT_GPIO_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (INT_GPIO_BASE + BUTTON_2_OFFSET) - -#endif - -#define HAS_HFXOSC 1 -#define HAS_LFROSC_BYPASS 1 - -#define RTC_FREQ 32768 - -#endif /* _SIFIVE_HIFIVE1_H */ diff --git a/hifive1-vp/hello/bsp/env/iss/init.c b/hifive1-vp/hello/bsp/env/iss/init.c deleted file mode 100644 index de046cc..0000000 --- a/hifive1-vp/hello/bsp/env/iss/init.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long mtime_lo(void) -{ - return *(volatile unsigned long *)(CLINT_BASE_ADDR + CLINT_MTIME); -} - -#ifdef __riscv32 - -static uint32_t mtime_hi(void) -{ - return *(volatile uint32_t *)(CLINT_BASE_ADDR + CLINT_MTIME + 4); -} - -uint64_t get_timer_value() -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#else /* __riscv32 */ - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -static void use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -static void use_pll(int refsel, int bypass, int r, int f, int q) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if available. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - // In case we are executing from QSPI, - // (which is quite likely) we need to - // set the QSPI clock divider appropriately - // before boosting the clock frequency. - - // Div = f_sck/2 - SPI0_REG(SPI_REG_SCKDIV) = 8; - - // Set DIV Settings for PLL - // Both HFROSC and HFXOSC are modeled as ideal - // 16MHz sources (assuming dividers are set properly for - // HFROSC). - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = mtime_lo(); - while (mtime_lo() - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); -} - -static void use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - use_hfrosc(4, 16); -} - -static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) -{ - unsigned long start_mtime, delta_mtime; - unsigned long mtime_freq = get_timer_freq(); - - // Don't start measuruing until we see an mtime tick - unsigned long tmp = mtime_lo(); - do { - start_mtime = mtime_lo(); - } while (start_mtime == tmp); - - unsigned long start_mcycle = read_csr(mcycle); - - do { - delta_mtime = mtime_lo() - start_mtime; - } while (delta_mtime < n); - - unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; - - return (delta_mcycle / delta_mtime) * mtime_freq - + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; -} - -unsigned long get_cpu_freq() -{ - static uint32_t cpu_freq; - - if (!cpu_freq) { - // warm up I$ - measure_cpu_freq(1); - // measure for real - cpu_freq = measure_cpu_freq(10); - } - - return cpu_freq; -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - - #ifndef NO_INIT - use_default_clocks(); - use_pll(0, 0, 1, 31, 1); - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - #endif - -} - -void _fini() -{ -} diff --git a/hifive1-vp/hello/bsp/env/iss/link.lds b/hifive1-vp/hello/bsp/env/iss/link.lds deleted file mode 100644 index bc60026..0000000 --- a/hifive1-vp/hello/bsp/env/iss/link.lds +++ /dev/null @@ -1,168 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - /*flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M*/ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - } >ram AT>flash :ram_init - - .srodata : - { - PROVIDE( _gp = . + 0x800 ); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - .sdata : - { - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/hello/bsp/env/iss/openocd.cfg b/hifive1-vp/hello/bsp/env/iss/openocd.cfg deleted file mode 100644 index b531e9c..0000000 --- a/hifive1-vp/hello/bsp/env/iss/openocd.cfg +++ /dev/null @@ -1,34 +0,0 @@ -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Dual RS232-HS" -ftdi_vid_pid 0x0403 0x6010 - -ftdi_layout_init 0x0008 0x001b -ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 - -#Reset Stretcher logic on FE310 is ~1 second long -#This doesn't apply if you use -# ftdi_set_signal, but still good to document -#adapter_nsrst_delay 1500 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -- This type of reset is not implemented yet -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z - #Wait for the reset stretcher - #It will work without this, but - #will incur lots of delays for later commands. - sleep 1500 -} -halt -#flash protect 0 64 last off diff --git a/hifive1-vp/hello/bsp/env/iss/platform.h b/hifive1-vp/hello/bsp/env/iss/platform.h deleted file mode 100644 index 63efc9e..0000000 --- a/hifive1-vp/hello/bsp/env/iss/platform.h +++ /dev/null @@ -1,133 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/otp.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/prci.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define MASKROM_BASE_ADDR _AC(0x00001000,UL) -#define TRAPVEC_TABLE_BASE_ADDR _AC(0x00001010,UL) -#define OTP_MMAP_ADDR _AC(0x00020000,UL) -#define CLINT_BASE_ADDR _AC(0x02000000,UL) -#define PLIC_BASE_ADDR _AC(0x0C000000,UL) -#define AON_BASE_ADDR _AC(0x10000000,UL) -#define PRCI_BASE_ADDR _AC(0x10008000,UL) -#define OTP_BASE_ADDR _AC(0x10010000,UL) -#define GPIO_BASE_ADDR _AC(0x10012000,UL) -#define UART0_BASE_ADDR _AC(0x10013000,UL) -#define SPI0_BASE_ADDR _AC(0x10014000,UL) -#define PWM0_BASE_ADDR _AC(0x10015000,UL) -#define UART1_BASE_ADDR _AC(0x10023000,UL) -#define SPI1_BASE_ADDR _AC(0x10024000,UL) -#define PWM1_BASE_ADDR _AC(0x10025000,UL) -#define SPI2_BASE_ADDR _AC(0x10034000,UL) -#define PWM2_BASE_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_BASE_ADDR _AC(0x80000000,UL) - -// IOF masks -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -//#define IOF0_I2C_MASK _AC(0x00003000,UL) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_BASE_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_BASE_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_BASE_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_BASE_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_BASE_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_BASE_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_BASE_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_BASE_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_BASE_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_BASE_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_BASE_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_BASE_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_BASE_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_BASE_ADDR, offset) - -// Misc - -#include - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#include "hifive1.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/hello/bsp/env/start.S b/hifive1-vp/hello/bsp/env/start.S deleted file mode 100644 index b526411..0000000 --- a/hifive1-vp/hello/bsp/env/start.S +++ /dev/null @@ -1,54 +0,0 @@ -// See LICENSE for license details. - - .section .init - .globl _start - .type _start,@function - -_start: - la gp, _gp - la sp, _sp - - /* Load data section */ - la a0, _data_lma - la a1, _data - la a2, _edata - bgeu a1, a2, 2f -1: - lw t0, (a0) - sw t0, (a1) - addi a0, a0, 4 - addi a1, a1, 4 - bltu a1, a2, 1b -2: - - /* Clear bss section */ - la a0, __bss_start - la a1, _end - bgeu a0, a1, 2f -1: - sw zero, (a0) - addi a0, a0, 4 - bltu a0, a1, 1b -2: - - /* Call global constructors */ - la a0, __libc_fini_array - call atexit - call __libc_init_array - -#ifndef __riscv_float_abi_soft - /* Enable FPU */ - li t0, MSTATUS_FS - csrs mstatus, t0 - csrr t1, mstatus - and t1, t1, t0 - beqz t1, 1f - fssr x0 -1: -#endif - - /* argc = argv = 0 */ - li a0, 0 - li a1, 0 - call main - tail exit diff --git a/hifive1-vp/hello/bsp/include/sifive/bits.h b/hifive1-vp/hello/bsp/include/sifive/bits.h deleted file mode 100644 index e550f80..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/bits.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _RISCV_BITS_H -#define _RISCV_BITS_H - -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - -#define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) -#define ROUNDDOWN(a, b) ((a)/(b)*(b)) - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) - -#define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) -#define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) - -#define STR(x) XSTR(x) -#define XSTR(x) #x - -#ifdef __riscv64 -# define SLL32 sllw -# define STORE sd -# define LOAD ld -# define LWU lwu -# define LOG_REGBYTES 3 -#else -# define SLL32 sll -# define STORE sw -# define LOAD lw -# define LWU lw -# define LOG_REGBYTES 2 -#endif -#define REGBYTES (1 << LOG_REGBYTES) - -#endif diff --git a/hifive1-vp/hello/bsp/include/sifive/const.h b/hifive1-vp/hello/bsp/include/sifive/const.h deleted file mode 100644 index 3e0a681..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/const.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Derived from */ - -#ifndef _SIFIVE_CONST_H -#define _SIFIVE_CONST_H - -#ifdef __ASSEMBLER__ -#define _AC(X,Y) X -#define _AT(T,X) X -#else -#define _AC(X,Y) (X##Y) -#define _AT(T,X) ((T)(X)) -#endif /* !__ASSEMBLER__*/ - -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) - -#endif /* _SIFIVE_CONST_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/aon.h b/hifive1-vp/hello/bsp/include/sifive/devices/aon.h deleted file mode 100644 index 63f1db3..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/aon.h +++ /dev/null @@ -1,88 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_AON_H -#define _SIFIVE_AON_H - -/* Register offsets */ - -#define AON_WDOGCFG 0x000 -#define AON_WDOGCOUNT 0x008 -#define AON_WDOGS 0x010 -#define AON_WDOGFEED 0x018 -#define AON_WDOGKEY 0x01C -#define AON_WDOGCMP 0x020 - -#define AON_RTCCFG 0x040 -#define AON_RTCLO 0x048 -#define AON_RTCHI 0x04C -#define AON_RTCS 0x050 -#define AON_RTCCMP 0x060 - -#define AON_BACKUP0 0x080 -#define AON_BACKUP1 0x084 -#define AON_BACKUP2 0x088 -#define AON_BACKUP3 0x08C -#define AON_BACKUP4 0x090 -#define AON_BACKUP5 0x094 -#define AON_BACKUP6 0x098 -#define AON_BACKUP7 0x09C -#define AON_BACKUP8 0x0A0 -#define AON_BACKUP9 0x0A4 -#define AON_BACKUP10 0x0A8 -#define AON_BACKUP11 0x0AC -#define AON_BACKUP12 0x0B0 -#define AON_BACKUP13 0x0B4 -#define AON_BACKUP14 0x0B8 -#define AON_BACKUP15 0x0BC - -#define AON_PMUWAKEUPI0 0x100 -#define AON_PMUWAKEUPI1 0x104 -#define AON_PMUWAKEUPI2 0x108 -#define AON_PMUWAKEUPI3 0x10C -#define AON_PMUWAKEUPI4 0x110 -#define AON_PMUWAKEUPI5 0x114 -#define AON_PMUWAKEUPI6 0x118 -#define AON_PMUWAKEUPI7 0x11C -#define AON_PMUSLEEPI0 0x120 -#define AON_PMUSLEEPI1 0x124 -#define AON_PMUSLEEPI2 0x128 -#define AON_PMUSLEEPI3 0x12C -#define AON_PMUSLEEPI4 0x130 -#define AON_PMUSLEEPI5 0x134 -#define AON_PMUSLEEPI6 0x138 -#define AON_PMUSLEEPI7 0x13C -#define AON_PMUIE 0x140 -#define AON_PMUCAUSE 0x144 -#define AON_PMUSLEEP 0x148 -#define AON_PMUKEY 0x14C - -#define AON_LFROSC 0x070 -/* Constants */ - -#define AON_WDOGKEY_VALUE 0x51F15E -#define AON_WDOGFEED_VALUE 0xD09F00D - -#define AON_WDOGCFG_SCALE 0x0000000F -#define AON_WDOGCFG_RSTEN 0x00000100 -#define AON_WDOGCFG_ZEROCMP 0x00000200 -#define AON_WDOGCFG_ENALWAYS 0x00001000 -#define AON_WDOGCFG_ENCOREAWAKE 0x00002000 -#define AON_WDOGCFG_CMPIP 0x10000000 - -#define AON_RTCCFG_SCALE 0x0000000F -#define AON_RTCCFG_ENALWAYS 0x00001000 -#define AON_RTCCFG_CMPIP 0x10000000 - -#define AON_WAKEUPCAUSE_RESET 0x00 -#define AON_WAKEUPCAUSE_RTC 0x01 -#define AON_WAKEUPCAUSE_DWAKEUP 0x02 -#define AON_WAKEUPCAUSE_AWAKEUP 0x03 - -#define AON_RESETCAUSE_POWERON 0x0000 -#define AON_RESETCAUSE_EXTERNAL 0x0100 -#define AON_RESETCAUSE_WATCHDOG 0x0200 - -#define AON_PMUCAUSE_WAKEUPCAUSE 0x00FF -#define AON_PMUCAUSE_RESETCAUSE 0xFF00 - -#endif /* _SIFIVE_AON_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/clint.h b/hifive1-vp/hello/bsp/include/sifive/devices/clint.h deleted file mode 100644 index cd3e0c7..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/clint.h +++ /dev/null @@ -1,14 +0,0 @@ -// See LICENSE for license details - -#ifndef _SIFIVE_CLINT_H -#define _SIFIVE_CLINT_H - - -#define CLINT_MSIP 0x0000 -#define CLINT_MSIP_size 0x4 -#define CLINT_MTIMECMP 0x4000 -#define CLINT_MTIMECMP_size 0x8 -#define CLINT_MTIME 0xBFF8 -#define CLINT_MTIME_size 0x8 - -#endif /* _SIFIVE_CLINT_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/gpio.h b/hifive1-vp/hello/bsp/include/sifive/devices/gpio.h deleted file mode 100644 index f7f0acb..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/gpio.h +++ /dev/null @@ -1,24 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_GPIO_H -#define _SIFIVE_GPIO_H - -#define GPIO_INPUT_VAL (0x00) -#define GPIO_INPUT_EN (0x04) -#define GPIO_OUTPUT_EN (0x08) -#define GPIO_OUTPUT_VAL (0x0C) -#define GPIO_PULLUP_EN (0x10) -#define GPIO_DRIVE (0x14) -#define GPIO_RISE_IE (0x18) -#define GPIO_RISE_IP (0x1C) -#define GPIO_FALL_IE (0x20) -#define GPIO_FALL_IP (0x24) -#define GPIO_HIGH_IE (0x28) -#define GPIO_HIGH_IP (0x2C) -#define GPIO_LOW_IE (0x30) -#define GPIO_LOW_IP (0x34) -#define GPIO_IOF_EN (0x38) -#define GPIO_IOF_SEL (0x3C) -#define GPIO_OUTPUT_XOR (0x40) - -#endif /* _SIFIVE_GPIO_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/otp.h b/hifive1-vp/hello/bsp/include/sifive/devices/otp.h deleted file mode 100644 index 93833e2..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/otp.h +++ /dev/null @@ -1,23 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_OTP_H -#define _SIFIVE_OTP_H - -/* Register offsets */ - -#define OTP_LOCK 0x00 -#define OTP_CK 0x04 -#define OTP_OE 0x08 -#define OTP_SEL 0x0C -#define OTP_WE 0x10 -#define OTP_MR 0x14 -#define OTP_MRR 0x18 -#define OTP_MPP 0x1C -#define OTP_VRREN 0x20 -#define OTP_VPPEN 0x24 -#define OTP_A 0x28 -#define OTP_D 0x2C -#define OTP_Q 0x30 -#define OTP_READ_TIMINGS 0x34 - -#endif diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/plic.h b/hifive1-vp/hello/bsp/include/sifive/devices/plic.h deleted file mode 100644 index e1ca5d6..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/plic.h +++ /dev/null @@ -1,31 +0,0 @@ -// See LICENSE for license details. - -#ifndef PLIC_H -#define PLIC_H - -#include - -// 32 bits per source -#define PLIC_PRIORITY_OFFSET _AC(0x0000,UL) -#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 -// 1 bit per source (1 address) -#define PLIC_PENDING_OFFSET _AC(0x1000,UL) -#define PLIC_PENDING_SHIFT_PER_SOURCE 0 - -//0x80 per target -#define PLIC_ENABLE_OFFSET _AC(0x2000,UL) -#define PLIC_ENABLE_SHIFT_PER_TARGET 7 - - -#define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL) -#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) -#define PLIC_THRESHOLD_SHIFT_PER_TARGET 12 -#define PLIC_CLAIM_SHIFT_PER_TARGET 12 - -#define PLIC_MAX_SOURCE 1023 -#define PLIC_SOURCE_MASK 0x3FF - -#define PLIC_MAX_TARGET 15871 -#define PLIC_TARGET_MASK 0x3FFF - -#endif /* PLIC_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/prci.h b/hifive1-vp/hello/bsp/include/sifive/devices/prci.h deleted file mode 100644 index 1a3de58..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/prci.h +++ /dev/null @@ -1,56 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PRCI_H -#define _SIFIVE_PRCI_H - -/* Register offsets */ - -#define PRCI_HFROSCCFG (0x0000) -#define PRCI_HFXOSCCFG (0x0004) -#define PRCI_PLLCFG (0x0008) -#define PRCI_PLLDIV (0x000C) -#define PRCI_PROCMONCFG (0x00F0) - -/* Fields */ -#define ROSC_DIV(x) (((x) & 0x2F) << 0 ) -#define ROSC_TRIM(x) (((x) & 0x1F) << 16) -#define ROSC_EN(x) (((x) & 0x1 ) << 30) -#define ROSC_RDY(x) (((x) & 0x1 ) << 31) - -#define XOSC_EN(x) (((x) & 0x1) << 30) -#define XOSC_RDY(x) (((x) & 0x1) << 31) - -#define PLL_R(x) (((x) & 0x7) << 0) -// single reserved bit for F LSB. -#define PLL_F(x) (((x) & 0x3F) << 4) -#define PLL_Q(x) (((x) & 0x3) << 10) -#define PLL_SEL(x) (((x) & 0x1) << 16) -#define PLL_REFSEL(x) (((x) & 0x1) << 17) -#define PLL_BYPASS(x) (((x) & 0x1) << 18) -#define PLL_LOCK(x) (((x) & 0x1) << 31) - -#define PLL_R_default 0x1 -#define PLL_F_default 0x1F -#define PLL_Q_default 0x3 - -#define PLL_REFSEL_HFROSC 0x0 -#define PLL_REFSEL_HFXOSC 0x1 - -#define PLL_SEL_HFROSC 0x0 -#define PLL_SEL_PLL 0x1 - -#define PLL_FINAL_DIV(x) (((x) & 0x3F) << 0) -#define PLL_FINAL_DIV_BY_1(x) (((x) & 0x1 ) << 8) - -#define PROCMON_DIV(x) (((x) & 0x1F) << 0) -#define PROCMON_TRIM(x) (((x) & 0x1F) << 8) -#define PROCMON_EN(x) (((x) & 0x1) << 16) -#define PROCMON_SEL(x) (((x) & 0x3) << 24) -#define PROCMON_NT_EN(x) (((x) & 0x1) << 28) - -#define PROCMON_SEL_HFCLK 0 -#define PROCMON_SEL_HFXOSCIN 1 -#define PROCMON_SEL_PLLOUTDIV 2 -#define PROCMON_SEL_PROCMON 3 - -#endif // _SIFIVE_PRCI_H diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/pwm.h b/hifive1-vp/hello/bsp/include/sifive/devices/pwm.h deleted file mode 100644 index 067889a..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/pwm.h +++ /dev/null @@ -1,37 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PWM_H -#define _SIFIVE_PWM_H - -/* Register offsets */ - -#define PWM_CFG 0x00 -#define PWM_COUNT 0x08 -#define PWM_S 0x10 -#define PWM_CMP0 0x20 -#define PWM_CMP1 0x24 -#define PWM_CMP2 0x28 -#define PWM_CMP3 0x2C - -/* Constants */ - -#define PWM_CFG_SCALE 0x0000000F -#define PWM_CFG_STICKY 0x00000100 -#define PWM_CFG_ZEROCMP 0x00000200 -#define PWM_CFG_DEGLITCH 0x00000400 -#define PWM_CFG_ENALWAYS 0x00001000 -#define PWM_CFG_ONESHOT 0x00002000 -#define PWM_CFG_CMP0CENTER 0x00010000 -#define PWM_CFG_CMP1CENTER 0x00020000 -#define PWM_CFG_CMP2CENTER 0x00040000 -#define PWM_CFG_CMP3CENTER 0x00080000 -#define PWM_CFG_CMP0GANG 0x01000000 -#define PWM_CFG_CMP1GANG 0x02000000 -#define PWM_CFG_CMP2GANG 0x04000000 -#define PWM_CFG_CMP3GANG 0x08000000 -#define PWM_CFG_CMP0IP 0x10000000 -#define PWM_CFG_CMP1IP 0x20000000 -#define PWM_CFG_CMP2IP 0x40000000 -#define PWM_CFG_CMP3IP 0x80000000 - -#endif /* _SIFIVE_PWM_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/spi.h b/hifive1-vp/hello/bsp/include/sifive/devices/spi.h deleted file mode 100644 index 916d86b..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/spi.h +++ /dev/null @@ -1,80 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_SPI_H -#define _SIFIVE_SPI_H - -/* Register offsets */ - -#define SPI_REG_SCKDIV 0x00 -#define SPI_REG_SCKMODE 0x04 -#define SPI_REG_CSID 0x10 -#define SPI_REG_CSDEF 0x14 -#define SPI_REG_CSMODE 0x18 - -#define SPI_REG_DCSSCK 0x28 -#define SPI_REG_DSCKCS 0x2a -#define SPI_REG_DINTERCS 0x2c -#define SPI_REG_DINTERXFR 0x2e - -#define SPI_REG_FMT 0x40 -#define SPI_REG_TXFIFO 0x48 -#define SPI_REG_RXFIFO 0x4c -#define SPI_REG_TXCTRL 0x50 -#define SPI_REG_RXCTRL 0x54 - -#define SPI_REG_FCTRL 0x60 -#define SPI_REG_FFMT 0x64 - -#define SPI_REG_IE 0x70 -#define SPI_REG_IP 0x74 - -/* Fields */ - -#define SPI_SCK_POL 0x1 -#define SPI_SCK_PHA 0x2 - -#define SPI_FMT_PROTO(x) ((x) & 0x3) -#define SPI_FMT_ENDIAN(x) (((x) & 0x1) << 2) -#define SPI_FMT_DIR(x) (((x) & 0x1) << 3) -#define SPI_FMT_LEN(x) (((x) & 0xf) << 16) - -/* TXCTRL register */ -#define SPI_TXWM(x) ((x) & 0xffff) -/* RXCTRL register */ -#define SPI_RXWM(x) ((x) & 0xffff) - -#define SPI_IP_TXWM 0x1 -#define SPI_IP_RXWM 0x2 - -#define SPI_FCTRL_EN 0x1 - -#define SPI_INSN_CMD_EN 0x1 -#define SPI_INSN_ADDR_LEN(x) (((x) & 0x7) << 1) -#define SPI_INSN_PAD_CNT(x) (((x) & 0xf) << 4) -#define SPI_INSN_CMD_PROTO(x) (((x) & 0x3) << 8) -#define SPI_INSN_ADDR_PROTO(x) (((x) & 0x3) << 10) -#define SPI_INSN_DATA_PROTO(x) (((x) & 0x3) << 12) -#define SPI_INSN_CMD_CODE(x) (((x) & 0xff) << 16) -#define SPI_INSN_PAD_CODE(x) (((x) & 0xff) << 24) - -#define SPI_TXFIFO_FULL (1 << 31) -#define SPI_RXFIFO_EMPTY (1 << 31) - -/* Values */ - -#define SPI_CSMODE_AUTO 0 -#define SPI_CSMODE_HOLD 2 -#define SPI_CSMODE_OFF 3 - -#define SPI_DIR_RX 0 -#define SPI_DIR_TX 1 - -#define SPI_PROTO_S 0 -#define SPI_PROTO_D 1 -#define SPI_PROTO_Q 2 - -#define SPI_ENDIAN_MSB 0 -#define SPI_ENDIAN_LSB 1 - - -#endif /* _SIFIVE_SPI_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/devices/uart.h b/hifive1-vp/hello/bsp/include/sifive/devices/uart.h deleted file mode 100644 index 71bea6f..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/devices/uart.h +++ /dev/null @@ -1,27 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_UART_H -#define _SIFIVE_UART_H - -/* Register offsets */ -#define UART_REG_TXFIFO 0x00 -#define UART_REG_RXFIFO 0x04 -#define UART_REG_TXCTRL 0x08 -#define UART_REG_RXCTRL 0x0c -#define UART_REG_IE 0x10 -#define UART_REG_IP 0x14 -#define UART_REG_DIV 0x18 - -/* TXCTRL register */ -#define UART_TXEN 0x1 -#define UART_TXWM(x) (((x) & 0xffff) << 16) - -/* RXCTRL register */ -#define UART_RXEN 0x1 -#define UART_RXWM(x) (((x) & 0xffff) << 16) - -/* IP register */ -#define UART_IP_TXWM 0x1 -#define UART_IP_RXWM 0x2 - -#endif /* _SIFIVE_UART_H */ diff --git a/hifive1-vp/hello/bsp/include/sifive/sections.h b/hifive1-vp/hello/bsp/include/sifive/sections.h deleted file mode 100644 index 848c237..0000000 --- a/hifive1-vp/hello/bsp/include/sifive/sections.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _SECTIONS_H -#define _SECTIONS_H - -extern unsigned char _rom[]; -extern unsigned char _rom_end[]; - -extern unsigned char _ram[]; -extern unsigned char _ram_end[]; - -extern unsigned char _ftext[]; -extern unsigned char _etext[]; -extern unsigned char _fbss[]; -extern unsigned char _ebss[]; -extern unsigned char _end[]; - -#endif /* _SECTIONS_H */ diff --git a/hifive1-vp/hello/bsp/libwrap/libwrap.mk b/hifive1-vp/hello/bsp/libwrap/libwrap.mk deleted file mode 100644 index add3285..0000000 --- a/hifive1-vp/hello/bsp/libwrap/libwrap.mk +++ /dev/null @@ -1,53 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_LIBWRAP -_SIFIVE_MK_LIBWRAP := # defined - -LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -LIBWRAP_DIR := $(LIBWRAP_DIR:/=) - -LIBWRAP_SRCS := \ - stdlib/malloc.c \ - sys/open.c \ - sys/lseek.c \ - sys/read.c \ - sys/write.c \ - sys/fstat.c \ - sys/stat.c \ - sys/close.c \ - sys/link.c \ - sys/unlink.c \ - sys/execve.c \ - sys/fork.c \ - sys/getpid.c \ - sys/kill.c \ - sys/wait.c \ - sys/isatty.c \ - sys/times.c \ - sys/sbrk.c \ - sys/_exit.c - -LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f)) -LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o) - -LIBWRAP_SYMS := malloc free \ - open lseek read write fstat stat close link unlink \ - execve fork getpid kill wait \ - isatty times sbrk _exit - -LIBWRAP := libwrap.a - -LINK_DEPS += $(LIBWRAP) - -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s)) -LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group - -CLEAN_OBJS += $(LIBWRAP_OBJS) - -$(LIBWRAP_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(LIBWRAP): $(LIBWRAP_OBJS) - $(AR) rcs $@ $^ - -endif # _SIFIVE_MK_LIBWRAP diff --git a/hifive1-vp/hello/bsp/libwrap/stdlib/malloc.c b/hifive1-vp/hello/bsp/libwrap/stdlib/malloc.c deleted file mode 100644 index 8f4f432..0000000 --- a/hifive1-vp/hello/bsp/libwrap/stdlib/malloc.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE for license details. */ - -/* These functions are intended for embedded RV32 systems and are - obviously incorrect in general. */ - -void* __wrap_malloc(unsigned long sz) -{ - extern void* sbrk(long); - void* res = sbrk(sz); - if ((long)res == -1) - return 0; - return res; -} - -void __wrap_free(void* ptr) -{ -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/_exit.c b/hifive1-vp/hello/bsp/libwrap/sys/_exit.c deleted file mode 100644 index ceb0b82..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/_exit.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "platform.h" - -void __wrap__exit(int code) -{ -//volatile uint32_t* leds = (uint32_t*) (GPIO_BASE_ADDR + GPIO_OUT_OFFSET); - const char message[] = "\nProgam has exited with code:"; -//*leds = (~(code)); - - write(STDERR_FILENO, message, sizeof(message) - 1); - write(STDERR_FILENO, "\n", 1); - - for (;;); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/close.c b/hifive1-vp/hello/bsp/libwrap/sys/close.c deleted file mode 100644 index e4f8e14..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/close.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_close(int fd) -{ - return _stub(EBADF); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/execve.c b/hifive1-vp/hello/bsp/libwrap/sys/execve.c deleted file mode 100644 index 6178a01..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/execve.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_execve(const char* name, char* const argv[], char* const env[]) -{ - return _stub(ENOMEM); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/fork.c b/hifive1-vp/hello/bsp/libwrap/sys/fork.c deleted file mode 100644 index 13a3e65..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/fork.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int fork(void) -{ - return _stub(EAGAIN); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/fstat.c b/hifive1-vp/hello/bsp/libwrap/sys/fstat.c deleted file mode 100644 index 6ea3e6a..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/fstat.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" - -int __wrap_fstat(int fd, struct stat* st) -{ - if (isatty(fd)) { - st->st_mode = S_IFCHR; - return 0; - } - - return _stub(EBADF); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/getpid.c b/hifive1-vp/hello/bsp/libwrap/sys/getpid.c deleted file mode 100644 index 5aa510b..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/getpid.c +++ /dev/null @@ -1,6 +0,0 @@ -/* See LICENSE of license details. */ - -int __wrap_getpid(void) -{ - return 1; -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/isatty.c b/hifive1-vp/hello/bsp/libwrap/sys/isatty.c deleted file mode 100644 index 55eab0a..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/isatty.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include - -int __wrap_isatty(int fd) -{ - if (fd == STDOUT_FILENO || fd == STDERR_FILENO) - return 1; - - return 0; -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/kill.c b/hifive1-vp/hello/bsp/libwrap/sys/kill.c deleted file mode 100644 index 9c56632..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/kill.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_kill(int pid, int sig) -{ - return _stub(EINVAL); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/link.c b/hifive1-vp/hello/bsp/libwrap/sys/link.c deleted file mode 100644 index 9340cad..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/link.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_link(const char *old_name, const char *new_name) -{ - return _stub(EMLINK); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/lseek.c b/hifive1-vp/hello/bsp/libwrap/sys/lseek.c deleted file mode 100644 index 46f58fa..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/lseek.c +++ /dev/null @@ -1,14 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" - -off_t __wrap_lseek(int fd, off_t ptr, int dir) -{ - if (isatty(fd)) - return 0; - - return _stub(EBADF); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/open.c b/hifive1-vp/hello/bsp/libwrap/sys/open.c deleted file mode 100644 index d1871f9..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/open.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_open(const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/openat.c b/hifive1-vp/hello/bsp/libwrap/sys/openat.c deleted file mode 100644 index 7f1c945..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/openat.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_openat(int dirfd, const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/read.c b/hifive1-vp/hello/bsp/libwrap/sys/read.c deleted file mode 100644 index 4e57f08..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/read.c +++ /dev/null @@ -1,30 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" - -ssize_t __wrap_read(int fd, void* ptr, size_t len) -{ - uint8_t * current = (uint8_t *)ptr; - volatile uint32_t * uart_rx = (uint32_t *)(UART0_BASE_ADDR + UART_REG_RXFIFO); - volatile uint8_t * uart_rx_cnt = (uint8_t *)(UART0_BASE_ADDR + UART_REG_RXCTRL + 2); - - ssize_t result = 0; - - if (isatty(fd)) { - for (current = (uint8_t *)ptr; - (current < ((uint8_t *)ptr) + len) && (*uart_rx_cnt > 0); - current ++) { - *current = *uart_rx; - result++; - } - return result; - } - - return _stub(EBADF); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/sbrk.c b/hifive1-vp/hello/bsp/libwrap/sys/sbrk.c deleted file mode 100644 index 6e6b36a..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/sbrk.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include - -void *__wrap_sbrk(ptrdiff_t incr) -{ - extern char _end[]; - extern char _heap_end[]; - static char *curbrk = _end; - - if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) - return NULL - 1; - - curbrk += incr; - return curbrk - incr; -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/stat.c b/hifive1-vp/hello/bsp/libwrap/sys/stat.c deleted file mode 100644 index 1ccc2f4..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/stat.c +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" - -int __wrap_stat(const char* file, struct stat* st) -{ - return _stub(EACCES); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/stub.h b/hifive1-vp/hello/bsp/libwrap/sys/stub.h deleted file mode 100644 index fb5e5be..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/stub.h +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ -#ifndef _SIFIVE_SYS_STUB_H -#define _SIFIVE_SYS_STUB_H - -static inline int _stub(int err) -{ - return -1; -} - -#endif /* _SIFIVE_SYS_STUB_H */ diff --git a/hifive1-vp/hello/bsp/libwrap/sys/times.c b/hifive1-vp/hello/bsp/libwrap/sys/times.c deleted file mode 100644 index 26a9566..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/times.c +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" - -clock_t __wrap_times(struct tms* buf) -{ - return _stub(EACCES); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/unlink.c b/hifive1-vp/hello/bsp/libwrap/sys/unlink.c deleted file mode 100644 index b62b1ba..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/unlink.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int __wrap_unlink(const char* name) -{ - return _stub(ENOENT); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/wait.c b/hifive1-vp/hello/bsp/libwrap/sys/wait.c deleted file mode 100644 index ea3225b..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/wait.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int wait(int* status) -{ - return _stub(ECHILD); -} diff --git a/hifive1-vp/hello/bsp/libwrap/sys/write.c b/hifive1-vp/hello/bsp/libwrap/sys/write.c deleted file mode 100644 index d00eb17..0000000 --- a/hifive1-vp/hello/bsp/libwrap/sys/write.c +++ /dev/null @@ -1,29 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" - -ssize_t __wrap_write(int fd, const void* ptr, size_t len) -{ - const uint8_t * current = (const char *)ptr; - - if (isatty(fd)) { - for (size_t jj = 0; jj < len; jj++) { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = current[jj]; - - if (current[jj] == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - } - return len; - } - - return _stub(EBADF); -} diff --git a/hifive1-vp/hello/hello b/hifive1-vp/hello/hello deleted file mode 100755 index 4971919d6a503f46cd6d7ecdef8244fddbe3cc7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64448 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 diff --git a/hifive1-vp/hello/hello.c b/hifive1-vp/hello/hello.c deleted file mode 100644 index 75a83f2..0000000 --- a/hifive1-vp/hello/hello.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define IOF_SPI1_MASK (0x38 | 0x4) -int factorial(int i){ - - volatile int result = 1; - for (int ii = 1; ii <= i; ii++) { - result = result * ii; - } - return result; - -} - -unsigned read_adc(unsigned index){ - unsigned char txdata[3]; - unsigned result=0; - volatile int x; - - txdata[0]=0x1; - txdata[1]=(0x8 | (index&0x7))<<4; - txdata[2]=0x0; - - GPIO_REG(GPIO_IOF_SEL) &= ~IOF_SPI1_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF_SPI1_MASK; - - SPI1_REG(SPI_REG_FMT) = - SPI_FMT_PROTO(SPI_PROTO_S) | - SPI_FMT_ENDIAN(SPI_ENDIAN_MSB) | - SPI_FMT_DIR(SPI_DIR_RX) | - SPI_FMT_LEN(8); - SPI1_REG(SPI_REG_CSID) = 0; - SPI1_REG(SPI_REG_CSDEF) = 0xFFFF; - SPI1_REG(SPI_REG_SCKDIV) = 7; - SPI1_REG(SPI_REG_SCKMODE) = SPI_SCK_PHA | SPI_SCK_POL; //shifted on the leading edge, sampled on trailing, Inactive state of SCK is logical 1 - SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; - - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL) ; - SPI1_REG(SPI_REG_TXFIFO) = txdata[0]; - while ((x = SPI1_REG(SPI_REG_RXFIFO)) & SPI_RXFIFO_EMPTY); - - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL) ; - SPI1_REG(SPI_REG_TXFIFO) = txdata[1]; - while ((x = SPI1_REG(SPI_REG_RXFIFO)) & SPI_RXFIFO_EMPTY); - result = (x & 0xFF)<<8; - - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL) ; - SPI1_REG(SPI_REG_TXFIFO) = txdata[2]; - while ((x = SPI1_REG(SPI_REG_RXFIFO)) & SPI_RXFIFO_EMPTY); - result += (x & 0xFF); - - SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; - return result&0x03ff; -} - -int main() -{ - GPIO_REG(GPIO_IOF_EN) |= 0x30000; - int result = factorial (10); - printf("Factorial of 10 is %d\n", result); - for(unsigned i=0; i<8; ++i) - printf("ADC%u value read is %u\n", i, read_adc(i)); - printf("End of execution"); - return 0; -} diff --git a/hifive1-vp/hello/hello.dis b/hifive1-vp/hello/hello.dis deleted file mode 100644 index d761a89..0000000 --- a/hifive1-vp/hello/hello.dis +++ /dev/null @@ -1,2253 +0,0 @@ - -hello: file format elf32-littleriscv - - -Disassembly of section .init: - -20400000 <_start>: -20400000: 5fc01197 auipc gp,0x5fc01 -20400004: c2818193 addi gp,gp,-984 # 80000c28 <_gp> -20400008: 5fc04117 auipc sp,0x5fc04 -2040000c: ff810113 addi sp,sp,-8 # 80004000 <_sp> -20400010: 00002517 auipc a0,0x2 -20400014: 4cc50513 addi a0,a0,1228 # 204024dc <__fini_array_end> -20400018: 5fc00597 auipc a1,0x5fc00 -2040001c: fe858593 addi a1,a1,-24 # 80000000 <_data> -20400020: 5fc00617 auipc a2,0x5fc00 -20400024: 41060613 addi a2,a2,1040 # 80000430 <__bss_start> -20400028: 00c5fc63 bleu a2,a1,20400040 <_start+0x40> -2040002c: 00052283 lw t0,0(a0) -20400030: 0055a023 sw t0,0(a1) -20400034: 00450513 addi a0,a0,4 -20400038: 00458593 addi a1,a1,4 -2040003c: fec5e8e3 bltu a1,a2,2040002c <_start+0x2c> -20400040: 5fc00517 auipc a0,0x5fc00 -20400044: 3f050513 addi a0,a0,1008 # 80000430 <__bss_start> -20400048: 5fc00597 auipc a1,0x5fc00 -2040004c: 3f058593 addi a1,a1,1008 # 80000438 <_end> -20400050: 00b57863 bleu a1,a0,20400060 <_start+0x60> -20400054: 00052023 sw zero,0(a0) -20400058: 00450513 addi a0,a0,4 -2040005c: feb56ce3 bltu a0,a1,20400054 <_start+0x54> -20400060: 00001517 auipc a0,0x1 -20400064: 5fc50513 addi a0,a0,1532 # 2040165c <__libc_fini_array> -20400068: 5a8010ef jal ra,20401610 -2040006c: 660010ef jal ra,204016cc <__libc_init_array> -20400070: 00000513 li a0,0 -20400074: 00000593 li a1,0 -20400078: 384000ef jal ra,204003fc
-2040007c: 5a80106f j 20401624 - -Disassembly of section .text: - -20400080 : -20400080: f8010113 addi sp,sp,-128 -20400084: 00112223 sw ra,4(sp) -20400088: 00212423 sw sp,8(sp) -2040008c: 00312623 sw gp,12(sp) -20400090: 00412823 sw tp,16(sp) -20400094: 00512a23 sw t0,20(sp) -20400098: 00612c23 sw t1,24(sp) -2040009c: 00712e23 sw t2,28(sp) -204000a0: 02812023 sw s0,32(sp) -204000a4: 02912223 sw s1,36(sp) -204000a8: 02a12423 sw a0,40(sp) -204000ac: 02b12623 sw a1,44(sp) -204000b0: 02c12823 sw a2,48(sp) -204000b4: 02d12a23 sw a3,52(sp) -204000b8: 02e12c23 sw a4,56(sp) -204000bc: 02f12e23 sw a5,60(sp) -204000c0: 05012023 sw a6,64(sp) -204000c4: 05112223 sw a7,68(sp) -204000c8: 05212423 sw s2,72(sp) -204000cc: 05312623 sw s3,76(sp) -204000d0: 05412823 sw s4,80(sp) -204000d4: 05512a23 sw s5,84(sp) -204000d8: 05612c23 sw s6,88(sp) -204000dc: 05712e23 sw s7,92(sp) -204000e0: 07812023 sw s8,96(sp) -204000e4: 07912223 sw s9,100(sp) -204000e8: 07a12423 sw s10,104(sp) -204000ec: 07b12623 sw s11,108(sp) -204000f0: 07c12823 sw t3,112(sp) -204000f4: 07d12a23 sw t4,116(sp) -204000f8: 07e12c23 sw t5,120(sp) -204000fc: 07f12e23 sw t6,124(sp) -20400100: 34202573 csrr a0,mcause -20400104: 341025f3 csrr a1,mepc -20400108: 00010613 mv a2,sp -2040010c: 23c010ef jal ra,20401348 -20400110: 34151073 csrw mepc,a0 -20400114: 000022b7 lui t0,0x2 -20400118: 80028293 addi t0,t0,-2048 # 1800 <__stack_size+0x1000> -2040011c: 3002a073 csrs mstatus,t0 -20400120: 00412083 lw ra,4(sp) -20400124: 00812103 lw sp,8(sp) -20400128: 00c12183 lw gp,12(sp) -2040012c: 01012203 lw tp,16(sp) -20400130: 01412283 lw t0,20(sp) -20400134: 01812303 lw t1,24(sp) -20400138: 01c12383 lw t2,28(sp) -2040013c: 02012403 lw s0,32(sp) -20400140: 02412483 lw s1,36(sp) -20400144: 02812503 lw a0,40(sp) -20400148: 02c12583 lw a1,44(sp) -2040014c: 03012603 lw a2,48(sp) -20400150: 03412683 lw a3,52(sp) -20400154: 03812703 lw a4,56(sp) -20400158: 03c12783 lw a5,60(sp) -2040015c: 04012803 lw a6,64(sp) -20400160: 04412883 lw a7,68(sp) -20400164: 04812903 lw s2,72(sp) -20400168: 04c12983 lw s3,76(sp) -2040016c: 05012a03 lw s4,80(sp) -20400170: 05412a83 lw s5,84(sp) -20400174: 05812b03 lw s6,88(sp) -20400178: 05c12b83 lw s7,92(sp) -2040017c: 06012c03 lw s8,96(sp) -20400180: 06412c83 lw s9,100(sp) -20400184: 06812d03 lw s10,104(sp) -20400188: 06c12d83 lw s11,108(sp) -2040018c: 07012e03 lw t3,112(sp) -20400190: 07412e83 lw t4,116(sp) -20400194: 07812f03 lw t5,120(sp) -20400198: 07c12f83 lw t6,124(sp) -2040019c: 08010113 addi sp,sp,128 -204001a0: 30200073 mret -204001a4: 0000006f j 204001a4 - -204001a8 : -204001a8: fd010113 addi sp,sp,-48 -204001ac: 02112623 sw ra,44(sp) -204001b0: 02812423 sw s0,40(sp) -204001b4: 03010413 addi s0,sp,48 -204001b8: fca42e23 sw a0,-36(s0) -204001bc: 00100793 li a5,1 -204001c0: fef42423 sw a5,-24(s0) -204001c4: 00100793 li a5,1 -204001c8: fef42623 sw a5,-20(s0) -204001cc: 0280006f j 204001f4 -204001d0: fe842783 lw a5,-24(s0) -204001d4: fec42583 lw a1,-20(s0) -204001d8: 00078513 mv a0,a5 -204001dc: 6b1010ef jal ra,2040208c <__mulsi3> -204001e0: 00050793 mv a5,a0 -204001e4: fef42423 sw a5,-24(s0) -204001e8: fec42783 lw a5,-20(s0) -204001ec: 00178793 addi a5,a5,1 -204001f0: fef42623 sw a5,-20(s0) -204001f4: fec42703 lw a4,-20(s0) -204001f8: fdc42783 lw a5,-36(s0) -204001fc: fce7dae3 ble a4,a5,204001d0 -20400200: fe842783 lw a5,-24(s0) -20400204: 00078513 mv a0,a5 -20400208: 02c12083 lw ra,44(sp) -2040020c: 02812403 lw s0,40(sp) -20400210: 03010113 addi sp,sp,48 -20400214: 00008067 ret - -20400218 : -20400218: fd010113 addi sp,sp,-48 -2040021c: 02812623 sw s0,44(sp) -20400220: 03010413 addi s0,sp,48 -20400224: fca42e23 sw a0,-36(s0) -20400228: fe042623 sw zero,-20(s0) -2040022c: 00100793 li a5,1 -20400230: fef40423 sb a5,-24(s0) -20400234: fdc42783 lw a5,-36(s0) -20400238: 0ff7f793 andi a5,a5,255 -2040023c: 00479793 slli a5,a5,0x4 -20400240: 0ff7f793 andi a5,a5,255 -20400244: 0707f793 andi a5,a5,112 -20400248: 0ff7f793 andi a5,a5,255 -2040024c: f807e793 ori a5,a5,-128 -20400250: 0ff7f793 andi a5,a5,255 -20400254: fef404a3 sb a5,-23(s0) -20400258: fe040523 sb zero,-22(s0) -2040025c: 100127b7 lui a5,0x10012 -20400260: 03c78793 addi a5,a5,60 # 1001203c <__stack_size+0x1001183c> -20400264: 0007a703 lw a4,0(a5) -20400268: 100127b7 lui a5,0x10012 -2040026c: 03c78793 addi a5,a5,60 # 1001203c <__stack_size+0x1001183c> -20400270: fc377713 andi a4,a4,-61 -20400274: 00e7a023 sw a4,0(a5) -20400278: 100127b7 lui a5,0x10012 -2040027c: 03878793 addi a5,a5,56 # 10012038 <__stack_size+0x10011838> -20400280: 0007a703 lw a4,0(a5) -20400284: 100127b7 lui a5,0x10012 -20400288: 03878793 addi a5,a5,56 # 10012038 <__stack_size+0x10011838> -2040028c: 03c76713 ori a4,a4,60 -20400290: 00e7a023 sw a4,0(a5) -20400294: 100247b7 lui a5,0x10024 -20400298: 04078793 addi a5,a5,64 # 10024040 <__stack_size+0x10023840> -2040029c: 00080737 lui a4,0x80 -204002a0: 00e7a023 sw a4,0(a5) -204002a4: 100247b7 lui a5,0x10024 -204002a8: 01078793 addi a5,a5,16 # 10024010 <__stack_size+0x10023810> -204002ac: 0007a023 sw zero,0(a5) -204002b0: 100247b7 lui a5,0x10024 -204002b4: 01478793 addi a5,a5,20 # 10024014 <__stack_size+0x10023814> -204002b8: 00010737 lui a4,0x10 -204002bc: fff70713 addi a4,a4,-1 # ffff <__stack_size+0xf7ff> -204002c0: 00e7a023 sw a4,0(a5) -204002c4: 100247b7 lui a5,0x10024 -204002c8: 00700713 li a4,7 -204002cc: 00e7a023 sw a4,0(a5) # 10024000 <__stack_size+0x10023800> -204002d0: 100247b7 lui a5,0x10024 -204002d4: 00478793 addi a5,a5,4 # 10024004 <__stack_size+0x10023804> -204002d8: 00300713 li a4,3 -204002dc: 00e7a023 sw a4,0(a5) -204002e0: 100247b7 lui a5,0x10024 -204002e4: 01878793 addi a5,a5,24 # 10024018 <__stack_size+0x10023818> -204002e8: 00200713 li a4,2 -204002ec: 00e7a023 sw a4,0(a5) -204002f0: 00000013 nop -204002f4: 100247b7 lui a5,0x10024 -204002f8: 04878793 addi a5,a5,72 # 10024048 <__stack_size+0x10023848> -204002fc: 0007a783 lw a5,0(a5) -20400300: fe07cae3 bltz a5,204002f4 -20400304: fe844703 lbu a4,-24(s0) -20400308: 100247b7 lui a5,0x10024 -2040030c: 04878793 addi a5,a5,72 # 10024048 <__stack_size+0x10023848> -20400310: 00e7a023 sw a4,0(a5) -20400314: 00000013 nop -20400318: 100247b7 lui a5,0x10024 -2040031c: 04c78793 addi a5,a5,76 # 1002404c <__stack_size+0x1002384c> -20400320: 0007a783 lw a5,0(a5) -20400324: fef42223 sw a5,-28(s0) -20400328: fe07c8e3 bltz a5,20400318 -2040032c: 00000013 nop -20400330: 100247b7 lui a5,0x10024 -20400334: 04878793 addi a5,a5,72 # 10024048 <__stack_size+0x10023848> -20400338: 0007a783 lw a5,0(a5) -2040033c: fe07cae3 bltz a5,20400330 -20400340: fe944703 lbu a4,-23(s0) -20400344: 100247b7 lui a5,0x10024 -20400348: 04878793 addi a5,a5,72 # 10024048 <__stack_size+0x10023848> -2040034c: 00e7a023 sw a4,0(a5) -20400350: 00000013 nop -20400354: 100247b7 lui a5,0x10024 -20400358: 04c78793 addi a5,a5,76 # 1002404c <__stack_size+0x1002384c> -2040035c: 0007a783 lw a5,0(a5) -20400360: fef42223 sw a5,-28(s0) -20400364: fe07c8e3 bltz a5,20400354 -20400368: fe442783 lw a5,-28(s0) -2040036c: 00879793 slli a5,a5,0x8 -20400370: 00078713 mv a4,a5 -20400374: 000107b7 lui a5,0x10 -20400378: f0078793 addi a5,a5,-256 # ff00 <__stack_size+0xf700> -2040037c: 00f777b3 and a5,a4,a5 -20400380: fef42623 sw a5,-20(s0) -20400384: 00000013 nop -20400388: 100247b7 lui a5,0x10024 -2040038c: 04878793 addi a5,a5,72 # 10024048 <__stack_size+0x10023848> -20400390: 0007a783 lw a5,0(a5) -20400394: fe07cae3 bltz a5,20400388 -20400398: fea44703 lbu a4,-22(s0) -2040039c: 100247b7 lui a5,0x10024 -204003a0: 04878793 addi a5,a5,72 # 10024048 <__stack_size+0x10023848> -204003a4: 00e7a023 sw a4,0(a5) -204003a8: 00000013 nop -204003ac: 100247b7 lui a5,0x10024 -204003b0: 04c78793 addi a5,a5,76 # 1002404c <__stack_size+0x1002384c> -204003b4: 0007a783 lw a5,0(a5) -204003b8: fef42223 sw a5,-28(s0) -204003bc: fe07c8e3 bltz a5,204003ac -204003c0: fe442783 lw a5,-28(s0) -204003c4: 0ff7f793 andi a5,a5,255 -204003c8: 00078713 mv a4,a5 -204003cc: fec42783 lw a5,-20(s0) -204003d0: 00e787b3 add a5,a5,a4 -204003d4: fef42623 sw a5,-20(s0) -204003d8: 100247b7 lui a5,0x10024 -204003dc: 01878793 addi a5,a5,24 # 10024018 <__stack_size+0x10023818> -204003e0: 0007a023 sw zero,0(a5) -204003e4: fec42783 lw a5,-20(s0) -204003e8: 3ff7f793 andi a5,a5,1023 -204003ec: 00078513 mv a0,a5 -204003f0: 02c12403 lw s0,44(sp) -204003f4: 03010113 addi sp,sp,48 -204003f8: 00008067 ret - -204003fc
: -204003fc: fe010113 addi sp,sp,-32 -20400400: 00112e23 sw ra,28(sp) -20400404: 00812c23 sw s0,24(sp) -20400408: 02010413 addi s0,sp,32 -2040040c: 100127b7 lui a5,0x10012 -20400410: 03878793 addi a5,a5,56 # 10012038 <__stack_size+0x10011838> -20400414: 0007a683 lw a3,0(a5) -20400418: 100127b7 lui a5,0x10012 -2040041c: 03878793 addi a5,a5,56 # 10012038 <__stack_size+0x10011838> -20400420: 00030737 lui a4,0x30 -20400424: 00e6e733 or a4,a3,a4 -20400428: 00e7a023 sw a4,0(a5) -2040042c: 00a00513 li a0,10 -20400430: d79ff0ef jal ra,204001a8 -20400434: fea42423 sw a0,-24(s0) -20400438: fe842583 lw a1,-24(s0) -2040043c: 204027b7 lui a5,0x20402 -20400440: 1b078513 addi a0,a5,432 # 204021b0 <__clzsi2+0x4c> -20400444: 0d1000ef jal ra,20400d14 <__wrap_printf> -20400448: fe042623 sw zero,-20(s0) -2040044c: 0300006f j 2040047c -20400450: fec42503 lw a0,-20(s0) -20400454: dc5ff0ef jal ra,20400218 -20400458: 00050793 mv a5,a0 -2040045c: 00078613 mv a2,a5 -20400460: fec42583 lw a1,-20(s0) -20400464: 204027b7 lui a5,0x20402 -20400468: 1c878513 addi a0,a5,456 # 204021c8 <__clzsi2+0x64> -2040046c: 0a9000ef jal ra,20400d14 <__wrap_printf> -20400470: fec42783 lw a5,-20(s0) -20400474: 00178793 addi a5,a5,1 -20400478: fef42623 sw a5,-20(s0) -2040047c: fec42703 lw a4,-20(s0) -20400480: 00700793 li a5,7 -20400484: fce7f6e3 bleu a4,a5,20400450 -20400488: 204027b7 lui a5,0x20402 -2040048c: 1e078513 addi a0,a5,480 # 204021e0 <__clzsi2+0x7c> -20400490: 085000ef jal ra,20400d14 <__wrap_printf> -20400494: 00000793 li a5,0 -20400498: 00078513 mv a0,a5 -2040049c: 01c12083 lw ra,28(sp) -204004a0: 01812403 lw s0,24(sp) -204004a4: 02010113 addi sp,sp,32 -204004a8: 00008067 ret - -204004ac : -204004ac: fe010113 addi sp,sp,-32 -204004b0: 00112e23 sw ra,28(sp) -204004b4: 00812c23 sw s0,24(sp) -204004b8: 02010413 addi s0,sp,32 -204004bc: fea42623 sw a0,-20(s0) -204004c0: fec40793 addi a5,s0,-20 -204004c4: 00100613 li a2,1 -204004c8: 00078593 mv a1,a5 -204004cc: 00100513 li a0,1 -204004d0: 785000ef jal ra,20401454 <__wrap_write> -204004d4: 00050713 mv a4,a0 -204004d8: 00100793 li a5,1 -204004dc: 00f71663 bne a4,a5,204004e8 -204004e0: fec42783 lw a5,-20(s0) -204004e4: 0080006f j 204004ec -204004e8: fff00793 li a5,-1 -204004ec: 00078513 mv a0,a5 -204004f0: 01c12083 lw ra,28(sp) -204004f4: 01812403 lw s0,24(sp) -204004f8: 02010113 addi sp,sp,32 -204004fc: 00008067 ret - -20400500 : -20400500: fd010113 addi sp,sp,-48 -20400504: 02812623 sw s0,44(sp) -20400508: 03010413 addi s0,sp,48 -2040050c: fca42e23 sw a0,-36(s0) -20400510: fcb42c23 sw a1,-40(s0) -20400514: fd842783 lw a5,-40(s0) -20400518: fef42623 sw a5,-20(s0) -2040051c: fec42783 lw a5,-20(s0) -20400520: 0007a783 lw a5,0(a5) -20400524: fdc42703 lw a4,-36(s0) -20400528: 0ff77713 andi a4,a4,255 -2040052c: 00e78023 sb a4,0(a5) -20400530: fec42783 lw a5,-20(s0) -20400534: 0007a783 lw a5,0(a5) -20400538: 00178713 addi a4,a5,1 -2040053c: fec42783 lw a5,-20(s0) -20400540: 00e7a023 sw a4,0(a5) -20400544: 00000013 nop -20400548: 02c12403 lw s0,44(sp) -2040054c: 03010113 addi sp,sp,48 -20400550: 00008067 ret - -20400554 : -20400554: fe010113 addi sp,sp,-32 -20400558: 00812e23 sw s0,28(sp) -2040055c: 02010413 addi s0,sp,32 -20400560: fea42623 sw a0,-20(s0) -20400564: feb42423 sw a1,-24(s0) -20400568: fe842783 lw a5,-24(s0) -2040056c: 02078063 beqz a5,2040058c -20400570: fec42783 lw a5,-20(s0) -20400574: 0007a783 lw a5,0(a5) -20400578: 00478693 addi a3,a5,4 -2040057c: fec42703 lw a4,-20(s0) -20400580: 00d72023 sw a3,0(a4) # 30000 <__stack_size+0x2f800> -20400584: 0007a783 lw a5,0(a5) -20400588: 01c0006f j 204005a4 -2040058c: fec42783 lw a5,-20(s0) -20400590: 0007a783 lw a5,0(a5) -20400594: 00478693 addi a3,a5,4 -20400598: fec42703 lw a4,-20(s0) -2040059c: 00d72023 sw a3,0(a4) -204005a0: 0007a783 lw a5,0(a5) -204005a4: 00078513 mv a0,a5 -204005a8: 01c12403 lw s0,28(sp) -204005ac: 02010113 addi sp,sp,32 -204005b0: 00008067 ret - -204005b4 : -204005b4: fe010113 addi sp,sp,-32 -204005b8: 00812e23 sw s0,28(sp) -204005bc: 02010413 addi s0,sp,32 -204005c0: fea42623 sw a0,-20(s0) -204005c4: feb42423 sw a1,-24(s0) -204005c8: fe842783 lw a5,-24(s0) -204005cc: 02078063 beqz a5,204005ec -204005d0: fec42783 lw a5,-20(s0) -204005d4: 0007a783 lw a5,0(a5) -204005d8: 00478693 addi a3,a5,4 -204005dc: fec42703 lw a4,-20(s0) -204005e0: 00d72023 sw a3,0(a4) -204005e4: 0007a783 lw a5,0(a5) -204005e8: 01c0006f j 20400604 -204005ec: fec42783 lw a5,-20(s0) -204005f0: 0007a783 lw a5,0(a5) -204005f4: 00478693 addi a3,a5,4 -204005f8: fec42703 lw a4,-20(s0) -204005fc: 00d72023 sw a3,0(a4) -20400600: 0007a783 lw a5,0(a5) -20400604: 00078513 mv a0,a5 -20400608: 01c12403 lw s0,28(sp) -2040060c: 02010113 addi sp,sp,32 -20400610: 00008067 ret - -20400614 : -20400614: f4010113 addi sp,sp,-192 -20400618: 0a112e23 sw ra,188(sp) -2040061c: 0a812c23 sw s0,184(sp) -20400620: 0a912a23 sw s1,180(sp) -20400624: 0c010413 addi s0,sp,192 -20400628: f4a42e23 sw a0,-164(s0) -2040062c: f4b42c23 sw a1,-168(s0) -20400630: f4c42a23 sw a2,-172(s0) -20400634: f4d42823 sw a3,-176(s0) -20400638: f4e42623 sw a4,-180(s0) -2040063c: f4f42423 sw a5,-184(s0) -20400640: fe042623 sw zero,-20(s0) -20400644: fec42483 lw s1,-20(s0) -20400648: 00148793 addi a5,s1,1 -2040064c: fef42623 sw a5,-20(s0) -20400650: f5442783 lw a5,-172(s0) -20400654: f5042583 lw a1,-176(s0) -20400658: 00078513 mv a0,a5 -2040065c: 2a5010ef jal ra,20402100 <__umodsi3> -20400660: 00050793 mv a5,a0 -20400664: 00078713 mv a4,a5 -20400668: 00249793 slli a5,s1,0x2 -2040066c: ff040693 addi a3,s0,-16 -20400670: 00f687b3 add a5,a3,a5 -20400674: f6e7ae23 sw a4,-132(a5) -20400678: f5442703 lw a4,-172(s0) -2040067c: f5042783 lw a5,-176(s0) -20400680: 00f76e63 bltu a4,a5,2040069c -20400684: f5042583 lw a1,-176(s0) -20400688: f5442503 lw a0,-172(s0) -2040068c: 22d010ef jal ra,204020b8 <__udivsi3> -20400690: 00050793 mv a5,a0 -20400694: f4f42a23 sw a5,-172(s0) -20400698: fadff06f j 20400644 -2040069c: 00000013 nop -204006a0: 0140006f j 204006b4 -204006a4: f5c42783 lw a5,-164(s0) -204006a8: f5842583 lw a1,-168(s0) -204006ac: f4842503 lw a0,-184(s0) -204006b0: 000780e7 jalr a5 -204006b4: f4c42783 lw a5,-180(s0) -204006b8: fff78713 addi a4,a5,-1 -204006bc: f4e42623 sw a4,-180(s0) -204006c0: fec42703 lw a4,-20(s0) -204006c4: fef740e3 blt a4,a5,204006a4 -204006c8: 0540006f j 2040071c -204006cc: fec42783 lw a5,-20(s0) -204006d0: 00279793 slli a5,a5,0x2 -204006d4: ff040713 addi a4,s0,-16 -204006d8: 00f707b3 add a5,a4,a5 -204006dc: f7c7a703 lw a4,-132(a5) -204006e0: fec42783 lw a5,-20(s0) -204006e4: 00279793 slli a5,a5,0x2 -204006e8: ff040693 addi a3,s0,-16 -204006ec: 00f687b3 add a5,a3,a5 -204006f0: f7c7a683 lw a3,-132(a5) -204006f4: 00900793 li a5,9 -204006f8: 00d7f663 bleu a3,a5,20400704 -204006fc: 05700793 li a5,87 -20400700: 0080006f j 20400708 -20400704: 03000793 li a5,48 -20400708: 00e787b3 add a5,a5,a4 -2040070c: f5c42703 lw a4,-164(s0) -20400710: f5842583 lw a1,-168(s0) -20400714: 00078513 mv a0,a5 -20400718: 000700e7 jalr a4 -2040071c: fec42783 lw a5,-20(s0) -20400720: fff78713 addi a4,a5,-1 -20400724: fee42623 sw a4,-20(s0) -20400728: faf042e3 bgtz a5,204006cc -2040072c: 00000013 nop -20400730: 0bc12083 lw ra,188(sp) -20400734: 0b812403 lw s0,184(sp) -20400738: 0b412483 lw s1,180(sp) -2040073c: 0c010113 addi sp,sp,192 -20400740: 00008067 ret - -20400744 : -20400744: f9010113 addi sp,sp,-112 -20400748: 06112623 sw ra,108(sp) -2040074c: 06812423 sw s0,104(sp) -20400750: 07212223 sw s2,100(sp) -20400754: 07312023 sw s3,96(sp) -20400758: 07010413 addi s0,sp,112 -2040075c: faa42623 sw a0,-84(s0) -20400760: fab42423 sw a1,-88(s0) -20400764: fac42023 sw a2,-96(s0) -20400768: fad42223 sw a3,-92(s0) -2040076c: f8e42e23 sw a4,-100(s0) -20400770: f8f42c23 sw a5,-104(s0) -20400774: fa042783 lw a5,-96(s0) -20400778: fa442803 lw a6,-92(s0) -2040077c: fcf42c23 sw a5,-40(s0) -20400780: fd042e23 sw a6,-36(s0) -20400784: fd842783 lw a5,-40(s0) -20400788: fdc42803 lw a6,-36(s0) -2040078c: 00080793 mv a5,a6 -20400790: 0207da63 bgez a5,204007c4 -20400794: fac42783 lw a5,-84(s0) -20400798: fa842583 lw a1,-88(s0) -2040079c: 02d00513 li a0,45 -204007a0: 000780e7 jalr a5 -204007a4: fd842783 lw a5,-40(s0) -204007a8: fdc42803 lw a6,-36(s0) -204007ac: fff7f913 andi s2,a5,-1 -204007b0: 80000737 lui a4,0x80000 -204007b4: fff74713 not a4,a4 -204007b8: 00e879b3 and s3,a6,a4 -204007bc: fd242c23 sw s2,-40(s0) -204007c0: fd342e23 sw s3,-36(s0) -204007c4: fe042623 sw zero,-20(s0) -204007c8: 0400006f j 20400808 -204007cc: fd842783 lw a5,-40(s0) -204007d0: fdc42803 lw a6,-36(s0) -204007d4: 20402737 lui a4,0x20402 -204007d8: 35872603 lw a2,856(a4) # 20402358 <__clzsi2+0x1f4> -204007dc: 35c72683 lw a3,860(a4) -204007e0: 00078513 mv a0,a5 -204007e4: 00080593 mv a1,a6 -204007e8: 138010ef jal ra,20401920 <__muldf3> -204007ec: 00050793 mv a5,a0 -204007f0: 00058813 mv a6,a1 -204007f4: fcf42c23 sw a5,-40(s0) -204007f8: fd042e23 sw a6,-36(s0) -204007fc: fec42783 lw a5,-20(s0) -20400800: 00178793 addi a5,a5,1 -20400804: fef42623 sw a5,-20(s0) -20400808: fec42703 lw a4,-20(s0) -2040080c: f9842783 lw a5,-104(s0) -20400810: faf74ee3 blt a4,a5,204007cc -20400814: fb840793 addi a5,s0,-72 -20400818: faf42a23 sw a5,-76(s0) -2040081c: fd842783 lw a5,-40(s0) -20400820: fdc42803 lw a6,-36(s0) -20400824: 00078513 mv a0,a5 -20400828: 00080593 mv a1,a6 -2040082c: 7e4010ef jal ra,20402010 <__fixunsdfsi> -20400830: 00050613 mv a2,a0 -20400834: fb440593 addi a1,s0,-76 -20400838: 00000793 li a5,0 -2040083c: 00000713 li a4,0 -20400840: 00a00693 li a3,10 -20400844: 20400537 lui a0,0x20400 -20400848: 50050513 addi a0,a0,1280 # 20400500 -2040084c: dc9ff0ef jal ra,20400614 -20400850: f9842783 lw a5,-104(s0) -20400854: 06f05863 blez a5,204008c4 -20400858: fe042423 sw zero,-24(s0) -2040085c: 0380006f j 20400894 -20400860: fb442703 lw a4,-76(s0) -20400864: fe842783 lw a5,-24(s0) -20400868: fff7c793 not a5,a5 -2040086c: 00f70733 add a4,a4,a5 -20400870: fb442783 lw a5,-76(s0) -20400874: fe842683 lw a3,-24(s0) -20400878: 40d006b3 neg a3,a3 -2040087c: 00d787b3 add a5,a5,a3 -20400880: 00074703 lbu a4,0(a4) -20400884: 00e78023 sb a4,0(a5) -20400888: fe842783 lw a5,-24(s0) -2040088c: 00178793 addi a5,a5,1 -20400890: fef42423 sw a5,-24(s0) -20400894: fe842703 lw a4,-24(s0) -20400898: f9842783 lw a5,-104(s0) -2040089c: fcf742e3 blt a4,a5,20400860 -204008a0: fb442783 lw a5,-76(s0) -204008a4: f9842703 lw a4,-104(s0) -204008a8: 40e00733 neg a4,a4 -204008ac: 00e787b3 add a5,a5,a4 -204008b0: 02e00713 li a4,46 -204008b4: 00e78023 sb a4,0(a5) -204008b8: fb442783 lw a5,-76(s0) -204008bc: 00178793 addi a5,a5,1 -204008c0: faf42a23 sw a5,-76(s0) -204008c4: fb840793 addi a5,s0,-72 -204008c8: fef42223 sw a5,-28(s0) -204008cc: 0280006f j 204008f4 -204008d0: fe442783 lw a5,-28(s0) -204008d4: 0007c783 lbu a5,0(a5) -204008d8: fac42703 lw a4,-84(s0) -204008dc: fa842583 lw a1,-88(s0) -204008e0: 00078513 mv a0,a5 -204008e4: 000700e7 jalr a4 -204008e8: fe442783 lw a5,-28(s0) -204008ec: 00178793 addi a5,a5,1 -204008f0: fef42223 sw a5,-28(s0) -204008f4: fb442783 lw a5,-76(s0) -204008f8: fe442703 lw a4,-28(s0) -204008fc: fcf76ae3 bltu a4,a5,204008d0 -20400900: 00000013 nop -20400904: 06c12083 lw ra,108(sp) -20400908: 06812403 lw s0,104(sp) -2040090c: 06412903 lw s2,100(sp) -20400910: 06012983 lw s3,96(sp) -20400914: 07010113 addi sp,sp,112 -20400918: 00008067 ret - -2040091c : -2040091c: fc010113 addi sp,sp,-64 -20400920: 02112e23 sw ra,60(sp) -20400924: 02812c23 sw s0,56(sp) -20400928: 02912a23 sw s1,52(sp) -2040092c: 03212823 sw s2,48(sp) -20400930: 04010413 addi s0,sp,64 -20400934: fca42623 sw a0,-52(s0) -20400938: fcb42423 sw a1,-56(s0) -2040093c: fcc42223 sw a2,-60(s0) -20400940: fcd42023 sw a3,-64(s0) -20400944: 0240006f j 20400968 -20400948: 3a048863 beqz s1,20400cf8 -2040094c: fc442783 lw a5,-60(s0) -20400950: 00178793 addi a5,a5,1 -20400954: fcf42223 sw a5,-60(s0) -20400958: fcc42783 lw a5,-52(s0) -2040095c: fc842583 lw a1,-56(s0) -20400960: 00048513 mv a0,s1 -20400964: 000780e7 jalr a5 -20400968: fc442783 lw a5,-60(s0) -2040096c: 0007c783 lbu a5,0(a5) -20400970: 00078493 mv s1,a5 -20400974: 02500793 li a5,37 -20400978: fcf498e3 bne s1,a5,20400948 -2040097c: fc442783 lw a5,-60(s0) -20400980: 00178793 addi a5,a5,1 -20400984: fcf42223 sw a5,-60(s0) -20400988: fc442783 lw a5,-60(s0) -2040098c: fcf42a23 sw a5,-44(s0) -20400990: 02000793 li a5,32 -20400994: fcf40da3 sb a5,-37(s0) -20400998: fff00793 li a5,-1 -2040099c: fef42023 sw a5,-32(s0) -204009a0: fff00793 li a5,-1 -204009a4: fcf42e23 sw a5,-36(s0) -204009a8: fe042223 sw zero,-28(s0) -204009ac: fc042823 sw zero,-48(s0) -204009b0: fc442783 lw a5,-60(s0) -204009b4: 00178713 addi a4,a5,1 -204009b8: fce42223 sw a4,-60(s0) -204009bc: 0007c783 lbu a5,0(a5) -204009c0: 00078493 mv s1,a5 -204009c4: fdd48793 addi a5,s1,-35 -204009c8: 05500713 li a4,85 -204009cc: 30f76663 bltu a4,a5,20400cd8 -204009d0: 00279713 slli a4,a5,0x2 -204009d4: 204027b7 lui a5,0x20402 -204009d8: 20078793 addi a5,a5,512 # 20402200 <__clzsi2+0x9c> -204009dc: 00f707b3 add a5,a4,a5 -204009e0: 0007a783 lw a5,0(a5) -204009e4: 00078067 jr a5 -204009e8: 02d00793 li a5,45 -204009ec: fcf40da3 sb a5,-37(s0) -204009f0: fc1ff06f j 204009b0 -204009f4: 03000793 li a5,48 -204009f8: fcf40da3 sb a5,-37(s0) -204009fc: fb5ff06f j 204009b0 -20400a00: fc042e23 sw zero,-36(s0) -20400a04: fdc42703 lw a4,-36(s0) -20400a08: 00070793 mv a5,a4 -20400a0c: 00279793 slli a5,a5,0x2 -20400a10: 00e787b3 add a5,a5,a4 -20400a14: 00179793 slli a5,a5,0x1 -20400a18: 00f487b3 add a5,s1,a5 -20400a1c: fd078793 addi a5,a5,-48 -20400a20: fcf42e23 sw a5,-36(s0) -20400a24: fc442783 lw a5,-60(s0) -20400a28: 0007c783 lbu a5,0(a5) -20400a2c: 00078493 mv s1,a5 -20400a30: 02f00793 li a5,47 -20400a34: 0497d863 ble s1,a5,20400a84 -20400a38: 03900793 li a5,57 -20400a3c: 0497c463 blt a5,s1,20400a84 -20400a40: fc442783 lw a5,-60(s0) -20400a44: 00178793 addi a5,a5,1 -20400a48: fcf42223 sw a5,-60(s0) -20400a4c: fb9ff06f j 20400a04 -20400a50: fc042783 lw a5,-64(s0) -20400a54: 00478713 addi a4,a5,4 -20400a58: fce42023 sw a4,-64(s0) -20400a5c: 0007a783 lw a5,0(a5) -20400a60: fcf42e23 sw a5,-36(s0) -20400a64: 0240006f j 20400a88 -20400a68: fe042783 lw a5,-32(s0) -20400a6c: f407d2e3 bgez a5,204009b0 -20400a70: fe042023 sw zero,-32(s0) -20400a74: f3dff06f j 204009b0 -20400a78: 00100793 li a5,1 -20400a7c: fcf42823 sw a5,-48(s0) -20400a80: f31ff06f j 204009b0 -20400a84: 00000013 nop -20400a88: fe042783 lw a5,-32(s0) -20400a8c: f207d2e3 bgez a5,204009b0 -20400a90: fdc42783 lw a5,-36(s0) -20400a94: fef42023 sw a5,-32(s0) -20400a98: fff00793 li a5,-1 -20400a9c: fcf42e23 sw a5,-36(s0) -20400aa0: f11ff06f j 204009b0 -20400aa4: fe442783 lw a5,-28(s0) -20400aa8: 22079663 bnez a5,20400cd4 -20400aac: f05ff06f j 204009b0 -20400ab0: fc042783 lw a5,-64(s0) -20400ab4: 00478713 addi a4,a5,4 -20400ab8: fce42023 sw a4,-64(s0) -20400abc: 0007a783 lw a5,0(a5) -20400ac0: fcc42703 lw a4,-52(s0) -20400ac4: fc842583 lw a1,-56(s0) -20400ac8: 00078513 mv a0,a5 -20400acc: 000700e7 jalr a4 -20400ad0: 2240006f j 20400cf4 -20400ad4: fc042783 lw a5,-64(s0) -20400ad8: 00778793 addi a5,a5,7 -20400adc: ff87f793 andi a5,a5,-8 -20400ae0: 00878713 addi a4,a5,8 -20400ae4: fce42023 sw a4,-64(s0) -20400ae8: 0007a603 lw a2,0(a5) -20400aec: 0047a683 lw a3,4(a5) -20400af0: fdc42783 lw a5,-36(s0) -20400af4: fe042703 lw a4,-32(s0) -20400af8: fc842583 lw a1,-56(s0) -20400afc: fcc42503 lw a0,-52(s0) -20400b00: c45ff0ef jal ra,20400744 -20400b04: 1f00006f j 20400cf4 -20400b08: fc042783 lw a5,-64(s0) -20400b0c: 00478713 addi a4,a5,4 -20400b10: fce42023 sw a4,-64(s0) -20400b14: 0007a903 lw s2,0(a5) -20400b18: 00091663 bnez s2,20400b24 -20400b1c: 204027b7 lui a5,0x20402 -20400b20: 1f878913 addi s2,a5,504 # 204021f8 <__clzsi2+0x94> -20400b24: fe042783 lw a5,-32(s0) -20400b28: 08f05063 blez a5,20400ba8 -20400b2c: fdb44703 lbu a4,-37(s0) -20400b30: 02d00793 li a5,45 -20400b34: 06f70a63 beq a4,a5,20400ba8 -20400b38: fdc42783 lw a5,-36(s0) -20400b3c: 00078593 mv a1,a5 -20400b40: 00090513 mv a0,s2 -20400b44: 421000ef jal ra,20401764 -20400b48: 00050713 mv a4,a0 -20400b4c: fe042783 lw a5,-32(s0) -20400b50: 40e787b3 sub a5,a5,a4 -20400b54: fef42023 sw a5,-32(s0) -20400b58: 0240006f j 20400b7c -20400b5c: fdb44783 lbu a5,-37(s0) -20400b60: fcc42703 lw a4,-52(s0) -20400b64: fc842583 lw a1,-56(s0) -20400b68: 00078513 mv a0,a5 -20400b6c: 000700e7 jalr a4 -20400b70: fe042783 lw a5,-32(s0) -20400b74: fff78793 addi a5,a5,-1 -20400b78: fef42023 sw a5,-32(s0) -20400b7c: fe042783 lw a5,-32(s0) -20400b80: fcf04ee3 bgtz a5,20400b5c -20400b84: 0240006f j 20400ba8 -20400b88: fcc42783 lw a5,-52(s0) -20400b8c: fc842583 lw a1,-56(s0) -20400b90: 00048513 mv a0,s1 -20400b94: 000780e7 jalr a5 -20400b98: 00190913 addi s2,s2,1 -20400b9c: fe042783 lw a5,-32(s0) -20400ba0: fff78793 addi a5,a5,-1 -20400ba4: fef42023 sw a5,-32(s0) -20400ba8: 00094783 lbu a5,0(s2) -20400bac: 00078493 mv s1,a5 -20400bb0: 04048063 beqz s1,20400bf0 -20400bb4: fdc42783 lw a5,-36(s0) -20400bb8: fc07c8e3 bltz a5,20400b88 -20400bbc: fdc42783 lw a5,-36(s0) -20400bc0: fff78793 addi a5,a5,-1 -20400bc4: fcf42e23 sw a5,-36(s0) -20400bc8: fdc42783 lw a5,-36(s0) -20400bcc: fa07dee3 bgez a5,20400b88 -20400bd0: 0200006f j 20400bf0 -20400bd4: fcc42783 lw a5,-52(s0) -20400bd8: fc842583 lw a1,-56(s0) -20400bdc: 02000513 li a0,32 -20400be0: 000780e7 jalr a5 -20400be4: fe042783 lw a5,-32(s0) -20400be8: fff78793 addi a5,a5,-1 -20400bec: fef42023 sw a5,-32(s0) -20400bf0: fe042783 lw a5,-32(s0) -20400bf4: fef040e3 bgtz a5,20400bd4 -20400bf8: 0fc0006f j 20400cf4 -20400bfc: fc040793 addi a5,s0,-64 -20400c00: fe442583 lw a1,-28(s0) -20400c04: 00078513 mv a0,a5 -20400c08: 9adff0ef jal ra,204005b4 -20400c0c: 00050793 mv a5,a0 -20400c10: fef42623 sw a5,-20(s0) -20400c14: fec42783 lw a5,-20(s0) -20400c18: 0207d063 bgez a5,20400c38 -20400c1c: fcc42783 lw a5,-52(s0) -20400c20: fc842583 lw a1,-56(s0) -20400c24: 02d00513 li a0,45 -20400c28: 000780e7 jalr a5 -20400c2c: fec42783 lw a5,-20(s0) -20400c30: 40f007b3 neg a5,a5 -20400c34: fef42623 sw a5,-20(s0) -20400c38: 00a00793 li a5,10 -20400c3c: fef42423 sw a5,-24(s0) -20400c40: 0600006f j 20400ca0 -20400c44: 00a00793 li a5,10 -20400c48: fef42423 sw a5,-24(s0) -20400c4c: 0400006f j 20400c8c -20400c50: 00800793 li a5,8 -20400c54: fef42423 sw a5,-24(s0) -20400c58: 0340006f j 20400c8c -20400c5c: 00100793 li a5,1 -20400c60: fef42223 sw a5,-28(s0) -20400c64: fcc42783 lw a5,-52(s0) -20400c68: fc842583 lw a1,-56(s0) -20400c6c: 03000513 li a0,48 -20400c70: 000780e7 jalr a5 -20400c74: fcc42783 lw a5,-52(s0) -20400c78: fc842583 lw a1,-56(s0) -20400c7c: 07800513 li a0,120 -20400c80: 000780e7 jalr a5 -20400c84: 01000793 li a5,16 -20400c88: fef42423 sw a5,-24(s0) -20400c8c: fc040793 addi a5,s0,-64 -20400c90: fe442583 lw a1,-28(s0) -20400c94: 00078513 mv a0,a5 -20400c98: 8bdff0ef jal ra,20400554 -20400c9c: fea42623 sw a0,-20(s0) -20400ca0: fe842683 lw a3,-24(s0) -20400ca4: fdb44783 lbu a5,-37(s0) -20400ca8: fe042703 lw a4,-32(s0) -20400cac: fec42603 lw a2,-20(s0) -20400cb0: fc842583 lw a1,-56(s0) -20400cb4: fcc42503 lw a0,-52(s0) -20400cb8: 95dff0ef jal ra,20400614 -20400cbc: 0380006f j 20400cf4 -20400cc0: fcc42783 lw a5,-52(s0) -20400cc4: fc842583 lw a1,-56(s0) -20400cc8: 00048513 mv a0,s1 -20400ccc: 000780e7 jalr a5 -20400cd0: 0240006f j 20400cf4 -20400cd4: 00000013 nop -20400cd8: fcc42783 lw a5,-52(s0) -20400cdc: fc842583 lw a1,-56(s0) -20400ce0: 02500513 li a0,37 -20400ce4: 000780e7 jalr a5 -20400ce8: fd442783 lw a5,-44(s0) -20400cec: fcf42223 sw a5,-60(s0) -20400cf0: 00000013 nop -20400cf4: c75ff06f j 20400968 -20400cf8: 00000013 nop -20400cfc: 03c12083 lw ra,60(sp) -20400d00: 03812403 lw s0,56(sp) -20400d04: 03412483 lw s1,52(sp) -20400d08: 03012903 lw s2,48(sp) -20400d0c: 04010113 addi sp,sp,64 -20400d10: 00008067 ret - -20400d14 <__wrap_printf>: -20400d14: fb010113 addi sp,sp,-80 -20400d18: 02112623 sw ra,44(sp) -20400d1c: 02812423 sw s0,40(sp) -20400d20: 03010413 addi s0,sp,48 -20400d24: fca42e23 sw a0,-36(s0) -20400d28: 00b42223 sw a1,4(s0) -20400d2c: 00c42423 sw a2,8(s0) -20400d30: 00d42623 sw a3,12(s0) -20400d34: 00e42823 sw a4,16(s0) -20400d38: 00f42a23 sw a5,20(s0) -20400d3c: 01042c23 sw a6,24(s0) -20400d40: 01142e23 sw a7,28(s0) -20400d44: 02040793 addi a5,s0,32 -20400d48: fe478793 addi a5,a5,-28 -20400d4c: fef42623 sw a5,-20(s0) -20400d50: fec42783 lw a5,-20(s0) -20400d54: 00078693 mv a3,a5 -20400d58: fdc42603 lw a2,-36(s0) -20400d5c: 00000593 li a1,0 -20400d60: 204007b7 lui a5,0x20400 -20400d64: 4ac78513 addi a0,a5,1196 # 204004ac -20400d68: bb5ff0ef jal ra,2040091c -20400d6c: 00000793 li a5,0 -20400d70: 00078513 mv a0,a5 -20400d74: 02c12083 lw ra,44(sp) -20400d78: 02812403 lw s0,40(sp) -20400d7c: 05010113 addi sp,sp,80 -20400d80: 00008067 ret - -20400d84 <__wrap_sprintf>: -20400d84: fb010113 addi sp,sp,-80 -20400d88: 02112623 sw ra,44(sp) -20400d8c: 02812423 sw s0,40(sp) -20400d90: 03010413 addi s0,sp,48 -20400d94: fca42e23 sw a0,-36(s0) -20400d98: fcb42c23 sw a1,-40(s0) -20400d9c: 00c42423 sw a2,8(s0) -20400da0: 00d42623 sw a3,12(s0) -20400da4: 00e42823 sw a4,16(s0) -20400da8: 00f42a23 sw a5,20(s0) -20400dac: 01042c23 sw a6,24(s0) -20400db0: 01142e23 sw a7,28(s0) -20400db4: fdc42783 lw a5,-36(s0) -20400db8: fef42623 sw a5,-20(s0) -20400dbc: 02040793 addi a5,s0,32 -20400dc0: fe878793 addi a5,a5,-24 -20400dc4: fef42423 sw a5,-24(s0) -20400dc8: fe842703 lw a4,-24(s0) -20400dcc: fdc40793 addi a5,s0,-36 -20400dd0: 00070693 mv a3,a4 -20400dd4: fd842603 lw a2,-40(s0) -20400dd8: 00078593 mv a1,a5 -20400ddc: 204007b7 lui a5,0x20400 -20400de0: 50078513 addi a0,a5,1280 # 20400500 -20400de4: b39ff0ef jal ra,2040091c -20400de8: fdc42783 lw a5,-36(s0) -20400dec: 00078023 sb zero,0(a5) -20400df0: fdc42783 lw a5,-36(s0) -20400df4: 00078713 mv a4,a5 -20400df8: fec42783 lw a5,-20(s0) -20400dfc: 40f707b3 sub a5,a4,a5 -20400e00: 00078513 mv a0,a5 -20400e04: 02c12083 lw ra,44(sp) -20400e08: 02812403 lw s0,40(sp) -20400e0c: 05010113 addi sp,sp,80 -20400e10: 00008067 ret - -20400e14 : -20400e14: ff010113 addi sp,sp,-16 -20400e18: 00812623 sw s0,12(sp) -20400e1c: 01010413 addi s0,sp,16 -20400e20: 0200c7b7 lui a5,0x200c -20400e24: ff878793 addi a5,a5,-8 # 200bff8 <__stack_size+0x200b7f8> -20400e28: 0007a783 lw a5,0(a5) -20400e2c: 00078513 mv a0,a5 -20400e30: 00c12403 lw s0,12(sp) -20400e34: 01010113 addi sp,sp,16 -20400e38: 00008067 ret - -20400e3c : -20400e3c: ff010113 addi sp,sp,-16 -20400e40: 00112623 sw ra,12(sp) -20400e44: 00812423 sw s0,8(sp) -20400e48: 01212223 sw s2,4(sp) -20400e4c: 01312023 sw s3,0(sp) -20400e50: 01010413 addi s0,sp,16 -20400e54: fc1ff0ef jal ra,20400e14 -20400e58: 00050793 mv a5,a0 -20400e5c: 00078913 mv s2,a5 -20400e60: 00000993 li s3,0 -20400e64: 00090793 mv a5,s2 -20400e68: 00098813 mv a6,s3 -20400e6c: 00078513 mv a0,a5 -20400e70: 00080593 mv a1,a6 -20400e74: 00c12083 lw ra,12(sp) -20400e78: 00812403 lw s0,8(sp) -20400e7c: 00412903 lw s2,4(sp) -20400e80: 00012983 lw s3,0(sp) -20400e84: 01010113 addi sp,sp,16 -20400e88: 00008067 ret - -20400e8c : -20400e8c: ff010113 addi sp,sp,-16 -20400e90: 00812623 sw s0,12(sp) -20400e94: 01010413 addi s0,sp,16 -20400e98: 000087b7 lui a5,0x8 -20400e9c: 00078513 mv a0,a5 -20400ea0: 00c12403 lw s0,12(sp) -20400ea4: 01010113 addi sp,sp,16 -20400ea8: 00008067 ret - -20400eac : -20400eac: fe010113 addi sp,sp,-32 -20400eb0: 00812e23 sw s0,28(sp) -20400eb4: 02010413 addi s0,sp,32 -20400eb8: fea42623 sw a0,-20(s0) -20400ebc: feb42423 sw a1,-24(s0) -20400ec0: fec42783 lw a5,-20(s0) -20400ec4: 02f7f713 andi a4,a5,47 -20400ec8: fe842783 lw a5,-24(s0) -20400ecc: 01079693 slli a3,a5,0x10 -20400ed0: 001f07b7 lui a5,0x1f0 -20400ed4: 00f6f7b3 and a5,a3,a5 -20400ed8: 00f76733 or a4,a4,a5 -20400edc: 400007b7 lui a5,0x40000 -20400ee0: 00f76733 or a4,a4,a5 -20400ee4: 100087b7 lui a5,0x10008 -20400ee8: 00e7a023 sw a4,0(a5) # 10008000 <__stack_size+0x10007800> -20400eec: 00000013 nop -20400ef0: 100087b7 lui a5,0x10008 -20400ef4: 0007a783 lw a5,0(a5) # 10008000 <__stack_size+0x10007800> -20400ef8: fe07dce3 bgez a5,20400ef0 -20400efc: 100087b7 lui a5,0x10008 -20400f00: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -20400f04: 0007a683 lw a3,0(a5) -20400f08: 100087b7 lui a5,0x10008 -20400f0c: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -20400f10: ffff0737 lui a4,0xffff0 -20400f14: fff70713 addi a4,a4,-1 # fffeffff <_sp+0x7ffebfff> -20400f18: 00e6f733 and a4,a3,a4 -20400f1c: 00e7a023 sw a4,0(a5) -20400f20: 00000013 nop -20400f24: 01c12403 lw s0,28(sp) -20400f28: 02010113 addi sp,sp,32 -20400f2c: 00008067 ret - -20400f30 : -20400f30: fc010113 addi sp,sp,-64 -20400f34: 02112e23 sw ra,60(sp) -20400f38: 02812c23 sw s0,56(sp) -20400f3c: 04010413 addi s0,sp,64 -20400f40: fca42e23 sw a0,-36(s0) -20400f44: fcb42c23 sw a1,-40(s0) -20400f48: fcc42a23 sw a2,-44(s0) -20400f4c: fcd42823 sw a3,-48(s0) -20400f50: fce42623 sw a4,-52(s0) -20400f54: 100087b7 lui a5,0x10008 -20400f58: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -20400f5c: 0007a703 lw a4,0(a5) -20400f60: 000107b7 lui a5,0x10 -20400f64: 00f777b3 and a5,a4,a5 -20400f68: 00078863 beqz a5,20400f78 -20400f6c: 01000593 li a1,16 -20400f70: 00400513 li a0,4 -20400f74: f39ff0ef jal ra,20400eac -20400f78: fe042623 sw zero,-20(s0) -20400f7c: fdc42783 lw a5,-36(s0) -20400f80: 01179793 slli a5,a5,0x11 -20400f84: 00078713 mv a4,a5 -20400f88: 000207b7 lui a5,0x20 -20400f8c: 00f777b3 and a5,a4,a5 -20400f90: fec42703 lw a4,-20(s0) -20400f94: 00f767b3 or a5,a4,a5 -20400f98: fef42623 sw a5,-20(s0) -20400f9c: fd842783 lw a5,-40(s0) -20400fa0: 02078c63 beqz a5,20400fd8 -20400fa4: fec42703 lw a4,-20(s0) -20400fa8: 000407b7 lui a5,0x40 -20400fac: 00f767b3 or a5,a4,a5 -20400fb0: fef42623 sw a5,-20(s0) -20400fb4: 100087b7 lui a5,0x10008 -20400fb8: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -20400fbc: fec42703 lw a4,-20(s0) -20400fc0: 00e7a023 sw a4,0(a5) -20400fc4: 100087b7 lui a5,0x10008 -20400fc8: 00c78793 addi a5,a5,12 # 1000800c <__stack_size+0x1000780c> -20400fcc: 10000713 li a4,256 -20400fd0: 00e7a023 sw a4,0(a5) -20400fd4: 0ec0006f j 204010c0 -20400fd8: 100147b7 lui a5,0x10014 -20400fdc: 00800713 li a4,8 -20400fe0: 00e7a023 sw a4,0(a5) # 10014000 <__stack_size+0x10013800> -20400fe4: fec42703 lw a4,-20(s0) -20400fe8: 000407b7 lui a5,0x40 -20400fec: 00f767b3 or a5,a4,a5 -20400ff0: fef42623 sw a5,-20(s0) -20400ff4: fd442783 lw a5,-44(s0) -20400ff8: 0077f793 andi a5,a5,7 -20400ffc: fec42703 lw a4,-20(s0) -20401000: 00f767b3 or a5,a4,a5 -20401004: fef42623 sw a5,-20(s0) -20401008: fd042783 lw a5,-48(s0) -2040100c: 00479793 slli a5,a5,0x4 -20401010: 3f07f793 andi a5,a5,1008 -20401014: fec42703 lw a4,-20(s0) -20401018: 00f767b3 or a5,a4,a5 -2040101c: fef42623 sw a5,-20(s0) -20401020: fcc42783 lw a5,-52(s0) -20401024: 00a79793 slli a5,a5,0xa -20401028: 00078713 mv a4,a5 -2040102c: 000017b7 lui a5,0x1 -20401030: c0078793 addi a5,a5,-1024 # c00 <__stack_size+0x400> -20401034: 00f777b3 and a5,a4,a5 -20401038: fec42703 lw a4,-20(s0) -2040103c: 00f767b3 or a5,a4,a5 -20401040: fef42623 sw a5,-20(s0) -20401044: 100087b7 lui a5,0x10008 -20401048: 00c78793 addi a5,a5,12 # 1000800c <__stack_size+0x1000780c> -2040104c: 10000713 li a4,256 -20401050: 00e7a023 sw a4,0(a5) -20401054: 100087b7 lui a5,0x10008 -20401058: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -2040105c: fec42703 lw a4,-20(s0) -20401060: 00e7a023 sw a4,0(a5) -20401064: 100087b7 lui a5,0x10008 -20401068: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -2040106c: 0007a683 lw a3,0(a5) -20401070: 100087b7 lui a5,0x10008 -20401074: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -20401078: fffc0737 lui a4,0xfffc0 -2040107c: fff70713 addi a4,a4,-1 # fffbffff <_sp+0x7ffbbfff> -20401080: 00e6f733 and a4,a3,a4 -20401084: 00e7a023 sw a4,0(a5) -20401088: d8dff0ef jal ra,20400e14 -2040108c: fea42423 sw a0,-24(s0) -20401090: 00000013 nop -20401094: d81ff0ef jal ra,20400e14 -20401098: 00050713 mv a4,a0 -2040109c: fe842783 lw a5,-24(s0) -204010a0: 40f70733 sub a4,a4,a5 -204010a4: 00300793 li a5,3 -204010a8: fee7f6e3 bleu a4,a5,20401094 -204010ac: 00000013 nop -204010b0: 100087b7 lui a5,0x10008 -204010b4: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -204010b8: 0007a783 lw a5,0(a5) -204010bc: fe07dae3 bgez a5,204010b0 -204010c0: 100087b7 lui a5,0x10008 -204010c4: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -204010c8: 0007a683 lw a3,0(a5) -204010cc: 100087b7 lui a5,0x10008 -204010d0: 00878793 addi a5,a5,8 # 10008008 <__stack_size+0x10007808> -204010d4: 00010737 lui a4,0x10 -204010d8: 00e6e733 or a4,a3,a4 -204010dc: 00e7a023 sw a4,0(a5) -204010e0: 00000013 nop -204010e4: 03c12083 lw ra,60(sp) -204010e8: 03812403 lw s0,56(sp) -204010ec: 04010113 addi sp,sp,64 -204010f0: 00008067 ret - -204010f4 : -204010f4: ff010113 addi sp,sp,-16 -204010f8: 00112623 sw ra,12(sp) -204010fc: 00812423 sw s0,8(sp) -20401100: 01010413 addi s0,sp,16 -20401104: 100007b7 lui a5,0x10000 -20401108: 07078793 addi a5,a5,112 # 10000070 <__stack_size+0xffff870> -2040110c: 0007a683 lw a3,0(a5) -20401110: 100007b7 lui a5,0x10000 -20401114: 07078793 addi a5,a5,112 # 10000070 <__stack_size+0xffff870> -20401118: c0000737 lui a4,0xc0000 -2040111c: fff70713 addi a4,a4,-1 # bfffffff <_sp+0x3fffbfff> -20401120: 00e6f733 and a4,a3,a4 -20401124: 00e7a023 sw a4,0(a5) -20401128: 01000593 li a1,16 -2040112c: 00400513 li a0,4 -20401130: d7dff0ef jal ra,20400eac -20401134: 00000013 nop -20401138: 00c12083 lw ra,12(sp) -2040113c: 00812403 lw s0,8(sp) -20401140: 01010113 addi sp,sp,16 -20401144: 00008067 ret - -20401148 : -20401148: fc010113 addi sp,sp,-64 -2040114c: 02112e23 sw ra,60(sp) -20401150: 02812c23 sw s0,56(sp) -20401154: 02912a23 sw s1,52(sp) -20401158: 04010413 addi s0,sp,64 -2040115c: fca42623 sw a0,-52(s0) -20401160: d2dff0ef jal ra,20400e8c -20401164: fea42623 sw a0,-20(s0) -20401168: cadff0ef jal ra,20400e14 -2040116c: fea42423 sw a0,-24(s0) -20401170: ca5ff0ef jal ra,20400e14 -20401174: fea42223 sw a0,-28(s0) -20401178: fe442703 lw a4,-28(s0) -2040117c: fe842783 lw a5,-24(s0) -20401180: fef708e3 beq a4,a5,20401170 -20401184: b00027f3 csrr a5,mcycle -20401188: fef42023 sw a5,-32(s0) -2040118c: fe042783 lw a5,-32(s0) -20401190: fcf42e23 sw a5,-36(s0) -20401194: c81ff0ef jal ra,20400e14 -20401198: 00050713 mv a4,a0 -2040119c: fe442783 lw a5,-28(s0) -204011a0: 40f707b3 sub a5,a4,a5 -204011a4: fcf42c23 sw a5,-40(s0) -204011a8: fd842703 lw a4,-40(s0) -204011ac: fcc42783 lw a5,-52(s0) -204011b0: fef762e3 bltu a4,a5,20401194 -204011b4: b00027f3 csrr a5,mcycle -204011b8: fcf42a23 sw a5,-44(s0) -204011bc: fd442703 lw a4,-44(s0) -204011c0: fdc42783 lw a5,-36(s0) -204011c4: 40f707b3 sub a5,a4,a5 -204011c8: fcf42823 sw a5,-48(s0) -204011cc: fd842583 lw a1,-40(s0) -204011d0: fd042503 lw a0,-48(s0) -204011d4: 6e5000ef jal ra,204020b8 <__udivsi3> -204011d8: 00050793 mv a5,a0 -204011dc: fec42583 lw a1,-20(s0) -204011e0: 00078513 mv a0,a5 -204011e4: 6a9000ef jal ra,2040208c <__mulsi3> -204011e8: 00050793 mv a5,a0 -204011ec: 00078493 mv s1,a5 -204011f0: fd042783 lw a5,-48(s0) -204011f4: fd842583 lw a1,-40(s0) -204011f8: 00078513 mv a0,a5 -204011fc: 705000ef jal ra,20402100 <__umodsi3> -20401200: 00050793 mv a5,a0 -20401204: fec42583 lw a1,-20(s0) -20401208: 00078513 mv a0,a5 -2040120c: 681000ef jal ra,2040208c <__mulsi3> -20401210: 00050793 mv a5,a0 -20401214: fd842583 lw a1,-40(s0) -20401218: 00078513 mv a0,a5 -2040121c: 69d000ef jal ra,204020b8 <__udivsi3> -20401220: 00050793 mv a5,a0 -20401224: 00f487b3 add a5,s1,a5 -20401228: 00078513 mv a0,a5 -2040122c: 03c12083 lw ra,60(sp) -20401230: 03812403 lw s0,56(sp) -20401234: 03412483 lw s1,52(sp) -20401238: 04010113 addi sp,sp,64 -2040123c: 00008067 ret - -20401240 : -20401240: ff010113 addi sp,sp,-16 -20401244: 00112623 sw ra,12(sp) -20401248: 00812423 sw s0,8(sp) -2040124c: 01010413 addi s0,sp,16 -20401250: 800007b7 lui a5,0x80000 -20401254: 4307a783 lw a5,1072(a5) # 80000430 <_sp+0xffffc430> -20401258: 02079063 bnez a5,20401278 -2040125c: 00100513 li a0,1 -20401260: ee9ff0ef jal ra,20401148 -20401264: 00a00513 li a0,10 -20401268: ee1ff0ef jal ra,20401148 -2040126c: 00050713 mv a4,a0 -20401270: 800007b7 lui a5,0x80000 -20401274: 42e7a823 sw a4,1072(a5) # 80000430 <_sp+0xffffc430> -20401278: 800007b7 lui a5,0x80000 -2040127c: 4307a783 lw a5,1072(a5) # 80000430 <_sp+0xffffc430> -20401280: 00078513 mv a0,a5 -20401284: 00c12083 lw ra,12(sp) -20401288: 00812403 lw s0,8(sp) -2040128c: 01010113 addi sp,sp,16 -20401290: 00008067 ret - -20401294 : -20401294: fe010113 addi sp,sp,-32 -20401298: 00112e23 sw ra,28(sp) -2040129c: 00812c23 sw s0,24(sp) -204012a0: 02010413 addi s0,sp,32 -204012a4: fea42623 sw a0,-20(s0) -204012a8: 100127b7 lui a5,0x10012 -204012ac: 03c78793 addi a5,a5,60 # 1001203c <__stack_size+0x1001183c> -204012b0: 0007a683 lw a3,0(a5) -204012b4: 100127b7 lui a5,0x10012 -204012b8: 03c78793 addi a5,a5,60 # 1001203c <__stack_size+0x1001183c> -204012bc: fffd0737 lui a4,0xfffd0 -204012c0: fff70713 addi a4,a4,-1 # fffcffff <_sp+0x7ffcbfff> -204012c4: 00e6f733 and a4,a3,a4 -204012c8: 00e7a023 sw a4,0(a5) -204012cc: 100127b7 lui a5,0x10012 -204012d0: 03878793 addi a5,a5,56 # 10012038 <__stack_size+0x10011838> -204012d4: 0007a683 lw a3,0(a5) -204012d8: 100127b7 lui a5,0x10012 -204012dc: 03878793 addi a5,a5,56 # 10012038 <__stack_size+0x10011838> -204012e0: 00030737 lui a4,0x30 -204012e4: 00e6e733 or a4,a3,a4 -204012e8: 00e7a023 sw a4,0(a5) -204012ec: f55ff0ef jal ra,20401240 -204012f0: 00050793 mv a5,a0 -204012f4: fec42583 lw a1,-20(s0) -204012f8: 00078513 mv a0,a5 -204012fc: 5bd000ef jal ra,204020b8 <__udivsi3> -20401300: 00050793 mv a5,a0 -20401304: 00078713 mv a4,a5 -20401308: 100137b7 lui a5,0x10013 -2040130c: 01878793 addi a5,a5,24 # 10013018 <__stack_size+0x10012818> -20401310: fff70713 addi a4,a4,-1 # 2ffff <__stack_size+0x2f7ff> -20401314: 00e7a023 sw a4,0(a5) -20401318: 100137b7 lui a5,0x10013 -2040131c: 00878793 addi a5,a5,8 # 10013008 <__stack_size+0x10012808> -20401320: 0007a703 lw a4,0(a5) -20401324: 100137b7 lui a5,0x10013 -20401328: 00878793 addi a5,a5,8 # 10013008 <__stack_size+0x10012808> -2040132c: 00176713 ori a4,a4,1 -20401330: 00e7a023 sw a4,0(a5) -20401334: 00000013 nop -20401338: 01c12083 lw ra,28(sp) -2040133c: 01812403 lw s0,24(sp) -20401340: 02010113 addi sp,sp,32 -20401344: 00008067 ret - -20401348 : -20401348: fe010113 addi sp,sp,-32 -2040134c: 00112e23 sw ra,28(sp) -20401350: 00812c23 sw s0,24(sp) -20401354: 02010413 addi s0,sp,32 -20401358: fea42623 sw a0,-20(s0) -2040135c: feb42423 sw a1,-24(s0) -20401360: 00500613 li a2,5 -20401364: 204027b7 lui a5,0x20402 -20401368: 36078593 addi a1,a5,864 # 20402360 <__clzsi2+0x1fc> -2040136c: 00100513 li a0,1 -20401370: 0e4000ef jal ra,20401454 <__wrap_write> -20401374: fec42783 lw a5,-20(s0) -20401378: 00178793 addi a5,a5,1 -2040137c: 00078513 mv a0,a5 -20401380: 1f0000ef jal ra,20401570 <__wrap__exit> - -20401384 <_init>: -20401384: fe010113 addi sp,sp,-32 -20401388: 00112e23 sw ra,28(sp) -2040138c: 00812c23 sw s0,24(sp) -20401390: 02010413 addi s0,sp,32 -20401394: d61ff0ef jal ra,204010f4 -20401398: 00100713 li a4,1 -2040139c: 01f00693 li a3,31 -204013a0: 00100613 li a2,1 -204013a4: 00000593 li a1,0 -204013a8: 00000513 li a0,0 -204013ac: b85ff0ef jal ra,20400f30 -204013b0: 0001c7b7 lui a5,0x1c -204013b4: 20078513 addi a0,a5,512 # 1c200 <__stack_size+0x1ba00> -204013b8: eddff0ef jal ra,20401294 -204013bc: e85ff0ef jal ra,20401240 -204013c0: 00050793 mv a5,a0 -204013c4: 00078593 mv a1,a5 -204013c8: 204027b7 lui a5,0x20402 -204013cc: 36878513 addi a0,a5,872 # 20402368 <__clzsi2+0x204> -204013d0: 945ff0ef jal ra,20400d14 <__wrap_printf> -204013d4: 204007b7 lui a5,0x20400 -204013d8: 08078793 addi a5,a5,128 # 20400080 -204013dc: 30579073 csrw mtvec,a5 -204013e0: 301027f3 csrr a5,misa -204013e4: fef42623 sw a5,-20(s0) -204013e8: fec42783 lw a5,-20(s0) -204013ec: 0207f793 andi a5,a5,32 -204013f0: 00078863 beqz a5,20401400 <_init+0x7c> -204013f4: 000067b7 lui a5,0x6 -204013f8: 30079073 csrw mstatus,a5 -204013fc: 00305073 csrwi fcsr,0 -20401400: 00000013 nop -20401404: 01c12083 lw ra,28(sp) -20401408: 01812403 lw s0,24(sp) -2040140c: 02010113 addi sp,sp,32 -20401410: 00008067 ret - -20401414 <_fini>: -20401414: ff010113 addi sp,sp,-16 -20401418: 00812623 sw s0,12(sp) -2040141c: 01010413 addi s0,sp,16 -20401420: 00000013 nop -20401424: 00c12403 lw s0,12(sp) -20401428: 01010113 addi sp,sp,16 -2040142c: 00008067 ret - -20401430 <_stub>: -20401430: fe010113 addi sp,sp,-32 -20401434: 00812e23 sw s0,28(sp) -20401438: 02010413 addi s0,sp,32 -2040143c: fea42623 sw a0,-20(s0) -20401440: fff00793 li a5,-1 -20401444: 00078513 mv a0,a5 -20401448: 01c12403 lw s0,28(sp) -2040144c: 02010113 addi sp,sp,32 -20401450: 00008067 ret - -20401454 <__wrap_write>: -20401454: fd010113 addi sp,sp,-48 -20401458: 02112623 sw ra,44(sp) -2040145c: 02812423 sw s0,40(sp) -20401460: 03010413 addi s0,sp,48 -20401464: fca42e23 sw a0,-36(s0) -20401468: fcb42c23 sw a1,-40(s0) -2040146c: fcc42a23 sw a2,-44(s0) -20401470: fd842783 lw a5,-40(s0) -20401474: fef42423 sw a5,-24(s0) -20401478: fdc42503 lw a0,-36(s0) -2040147c: 0b0000ef jal ra,2040152c <__wrap_isatty> -20401480: 00050793 mv a5,a0 -20401484: 08078463 beqz a5,2040150c <__wrap_write+0xb8> -20401488: fe042623 sw zero,-20(s0) -2040148c: 06c0006f j 204014f8 <__wrap_write+0xa4> -20401490: 00000013 nop -20401494: 100137b7 lui a5,0x10013 -20401498: 0007a783 lw a5,0(a5) # 10013000 <__stack_size+0x10012800> -2040149c: fe07cce3 bltz a5,20401494 <__wrap_write+0x40> -204014a0: fe842703 lw a4,-24(s0) -204014a4: fec42783 lw a5,-20(s0) -204014a8: 00f707b3 add a5,a4,a5 -204014ac: 0007c703 lbu a4,0(a5) -204014b0: 100137b7 lui a5,0x10013 -204014b4: 00e7a023 sw a4,0(a5) # 10013000 <__stack_size+0x10012800> -204014b8: fe842703 lw a4,-24(s0) -204014bc: fec42783 lw a5,-20(s0) -204014c0: 00f707b3 add a5,a4,a5 -204014c4: 0007c703 lbu a4,0(a5) -204014c8: 00a00793 li a5,10 -204014cc: 02f71063 bne a4,a5,204014ec <__wrap_write+0x98> -204014d0: 00000013 nop -204014d4: 100137b7 lui a5,0x10013 -204014d8: 0007a783 lw a5,0(a5) # 10013000 <__stack_size+0x10012800> -204014dc: fe07cce3 bltz a5,204014d4 <__wrap_write+0x80> -204014e0: 100137b7 lui a5,0x10013 -204014e4: 00d00713 li a4,13 -204014e8: 00e7a023 sw a4,0(a5) # 10013000 <__stack_size+0x10012800> -204014ec: fec42783 lw a5,-20(s0) -204014f0: 00178793 addi a5,a5,1 -204014f4: fef42623 sw a5,-20(s0) -204014f8: fec42703 lw a4,-20(s0) -204014fc: fd442783 lw a5,-44(s0) -20401500: f8f768e3 bltu a4,a5,20401490 <__wrap_write+0x3c> -20401504: fd442783 lw a5,-44(s0) -20401508: 0100006f j 20401518 <__wrap_write+0xc4> -2040150c: 00900513 li a0,9 -20401510: f21ff0ef jal ra,20401430 <_stub> -20401514: 00050793 mv a5,a0 -20401518: 00078513 mv a0,a5 -2040151c: 02c12083 lw ra,44(sp) -20401520: 02812403 lw s0,40(sp) -20401524: 03010113 addi sp,sp,48 -20401528: 00008067 ret - -2040152c <__wrap_isatty>: -2040152c: fe010113 addi sp,sp,-32 -20401530: 00812e23 sw s0,28(sp) -20401534: 02010413 addi s0,sp,32 -20401538: fea42623 sw a0,-20(s0) -2040153c: fec42703 lw a4,-20(s0) -20401540: 00100793 li a5,1 -20401544: 00f70863 beq a4,a5,20401554 <__wrap_isatty+0x28> -20401548: fec42703 lw a4,-20(s0) -2040154c: 00200793 li a5,2 -20401550: 00f71663 bne a4,a5,2040155c <__wrap_isatty+0x30> -20401554: 00100793 li a5,1 -20401558: 0080006f j 20401560 <__wrap_isatty+0x34> -2040155c: 00000793 li a5,0 -20401560: 00078513 mv a0,a5 -20401564: 01c12403 lw s0,28(sp) -20401568: 02010113 addi sp,sp,32 -2040156c: 00008067 ret - -20401570 <__wrap__exit>: -20401570: fc010113 addi sp,sp,-64 -20401574: 02112e23 sw ra,60(sp) -20401578: 02812c23 sw s0,56(sp) -2040157c: 04010413 addi s0,sp,64 -20401580: fca42623 sw a0,-52(s0) -20401584: 204027b7 lui a5,0x20402 -20401588: 3807a883 lw a7,896(a5) # 20402380 <__clzsi2+0x21c> -2040158c: 38078713 addi a4,a5,896 -20401590: 00472803 lw a6,4(a4) -20401594: 38078713 addi a4,a5,896 -20401598: 00872503 lw a0,8(a4) -2040159c: 38078713 addi a4,a5,896 -204015a0: 00c72583 lw a1,12(a4) -204015a4: 38078713 addi a4,a5,896 -204015a8: 01072603 lw a2,16(a4) -204015ac: 38078713 addi a4,a5,896 -204015b0: 01472683 lw a3,20(a4) -204015b4: 38078713 addi a4,a5,896 -204015b8: 01872703 lw a4,24(a4) -204015bc: fd142823 sw a7,-48(s0) -204015c0: fd042a23 sw a6,-44(s0) -204015c4: fca42c23 sw a0,-40(s0) -204015c8: fcb42e23 sw a1,-36(s0) -204015cc: fec42023 sw a2,-32(s0) -204015d0: fed42223 sw a3,-28(s0) -204015d4: fee42423 sw a4,-24(s0) -204015d8: 38078793 addi a5,a5,896 -204015dc: 01c7d783 lhu a5,28(a5) -204015e0: fef41623 sh a5,-20(s0) -204015e4: fd040793 addi a5,s0,-48 -204015e8: 01d00613 li a2,29 -204015ec: 00078593 mv a1,a5 -204015f0: 00200513 li a0,2 -204015f4: e61ff0ef jal ra,20401454 <__wrap_write> -204015f8: 00100613 li a2,1 -204015fc: 204027b7 lui a5,0x20402 -20401600: 37c78593 addi a1,a5,892 # 2040237c <__clzsi2+0x218> -20401604: 00200513 li a0,2 -20401608: e4dff0ef jal ra,20401454 <__wrap_write> -2040160c: 0000006f j 2040160c <__wrap__exit+0x9c> - -20401610 : -20401610: 00050593 mv a1,a0 -20401614: 00000693 li a3,0 -20401618: 00000613 li a2,0 -2040161c: 00000513 li a0,0 -20401620: 1680006f j 20401788 <__register_exitproc> - -20401624 : -20401624: ff010113 addi sp,sp,-16 -20401628: 00000593 li a1,0 -2040162c: 00812423 sw s0,8(sp) -20401630: 00112623 sw ra,12(sp) -20401634: 00050413 mv s0,a0 -20401638: 1d4000ef jal ra,2040180c <__call_exitprocs> -2040163c: 5fbff797 auipc a5,0x5fbff -20401640: dec78793 addi a5,a5,-532 # 80000428 <_global_impure_ptr> -20401644: 0007a503 lw a0,0(a5) -20401648: 03c52783 lw a5,60(a0) -2040164c: 00078463 beqz a5,20401654 -20401650: 000780e7 jalr a5 -20401654: 00040513 mv a0,s0 -20401658: f19ff0ef jal ra,20401570 <__wrap__exit> - -2040165c <__libc_fini_array>: -2040165c: ff010113 addi sp,sp,-16 -20401660: 00001797 auipc a5,0x1 -20401664: e7c78793 addi a5,a5,-388 # 204024dc <__fini_array_end> -20401668: 00812423 sw s0,8(sp) -2040166c: 00001417 auipc s0,0x1 -20401670: e7040413 addi s0,s0,-400 # 204024dc <__fini_array_end> -20401674: 40878433 sub s0,a5,s0 -20401678: 00912223 sw s1,4(sp) -2040167c: 01212023 sw s2,0(sp) -20401680: 00112623 sw ra,12(sp) -20401684: 40245413 srai s0,s0,0x2 -20401688: 00000493 li s1,0 -2040168c: 00078913 mv s2,a5 -20401690: 00941e63 bne s0,s1,204016ac <__libc_fini_array+0x50> -20401694: 00812403 lw s0,8(sp) -20401698: 00c12083 lw ra,12(sp) -2040169c: 00412483 lw s1,4(sp) -204016a0: 00012903 lw s2,0(sp) -204016a4: 01010113 addi sp,sp,16 -204016a8: d6dff06f j 20401414 <_fini> -204016ac: ffc00593 li a1,-4 -204016b0: 00048513 mv a0,s1 -204016b4: 1d9000ef jal ra,2040208c <__mulsi3> -204016b8: 00a90533 add a0,s2,a0 -204016bc: ffc52783 lw a5,-4(a0) -204016c0: 00148493 addi s1,s1,1 -204016c4: 000780e7 jalr a5 -204016c8: fc9ff06f j 20401690 <__libc_fini_array+0x34> - -204016cc <__libc_init_array>: -204016cc: ff010113 addi sp,sp,-16 -204016d0: 00812423 sw s0,8(sp) -204016d4: 00912223 sw s1,4(sp) -204016d8: 00001417 auipc s0,0x1 -204016dc: e0440413 addi s0,s0,-508 # 204024dc <__fini_array_end> -204016e0: 00001497 auipc s1,0x1 -204016e4: dfc48493 addi s1,s1,-516 # 204024dc <__fini_array_end> -204016e8: 408484b3 sub s1,s1,s0 -204016ec: 01212023 sw s2,0(sp) -204016f0: 00112623 sw ra,12(sp) -204016f4: 4024d493 srai s1,s1,0x2 -204016f8: 00000913 li s2,0 -204016fc: 04991063 bne s2,s1,2040173c <__libc_init_array+0x70> -20401700: 00001417 auipc s0,0x1 -20401704: ddc40413 addi s0,s0,-548 # 204024dc <__fini_array_end> -20401708: 00001497 auipc s1,0x1 -2040170c: dd448493 addi s1,s1,-556 # 204024dc <__fini_array_end> -20401710: 408484b3 sub s1,s1,s0 -20401714: c71ff0ef jal ra,20401384 <_init> -20401718: 4024d493 srai s1,s1,0x2 -2040171c: 00000913 li s2,0 -20401720: 02991863 bne s2,s1,20401750 <__libc_init_array+0x84> -20401724: 00c12083 lw ra,12(sp) -20401728: 00812403 lw s0,8(sp) -2040172c: 00412483 lw s1,4(sp) -20401730: 00012903 lw s2,0(sp) -20401734: 01010113 addi sp,sp,16 -20401738: 00008067 ret -2040173c: 00042783 lw a5,0(s0) -20401740: 00190913 addi s2,s2,1 -20401744: 00440413 addi s0,s0,4 -20401748: 000780e7 jalr a5 -2040174c: fb1ff06f j 204016fc <__libc_init_array+0x30> -20401750: 00042783 lw a5,0(s0) -20401754: 00190913 addi s2,s2,1 -20401758: 00440413 addi s0,s0,4 -2040175c: 000780e7 jalr a5 -20401760: fc1ff06f j 20401720 <__libc_init_array+0x54> - -20401764 : -20401764: 00b505b3 add a1,a0,a1 -20401768: 00050793 mv a5,a0 -2040176c: 00b78663 beq a5,a1,20401778 -20401770: 0007c703 lbu a4,0(a5) -20401774: 00071663 bnez a4,20401780 -20401778: 40a78533 sub a0,a5,a0 -2040177c: 00008067 ret -20401780: 00178793 addi a5,a5,1 -20401784: fe9ff06f j 2040176c - -20401788 <__register_exitproc>: -20401788: 5fbff797 auipc a5,0x5fbff -2040178c: ca078793 addi a5,a5,-864 # 80000428 <_global_impure_ptr> -20401790: 0007a703 lw a4,0(a5) -20401794: 00050313 mv t1,a0 -20401798: 14872783 lw a5,328(a4) -2040179c: 00079663 bnez a5,204017a8 <__register_exitproc+0x20> -204017a0: 14c70793 addi a5,a4,332 -204017a4: 14f72423 sw a5,328(a4) -204017a8: 0047a703 lw a4,4(a5) -204017ac: 01f00813 li a6,31 -204017b0: fff00513 li a0,-1 -204017b4: 04e84a63 blt a6,a4,20401808 <__register_exitproc+0x80> -204017b8: 00271893 slli a7,a4,0x2 -204017bc: 02030c63 beqz t1,204017f4 <__register_exitproc+0x6c> -204017c0: 01178533 add a0,a5,a7 -204017c4: 08c52423 sw a2,136(a0) -204017c8: 1887a803 lw a6,392(a5) -204017cc: 00100613 li a2,1 -204017d0: 00e61633 sll a2,a2,a4 -204017d4: 00c86833 or a6,a6,a2 -204017d8: 1907a423 sw a6,392(a5) -204017dc: 10d52423 sw a3,264(a0) -204017e0: 00200693 li a3,2 -204017e4: 00d31863 bne t1,a3,204017f4 <__register_exitproc+0x6c> -204017e8: 18c7a683 lw a3,396(a5) -204017ec: 00c6e633 or a2,a3,a2 -204017f0: 18c7a623 sw a2,396(a5) -204017f4: 00170713 addi a4,a4,1 -204017f8: 00e7a223 sw a4,4(a5) -204017fc: 011787b3 add a5,a5,a7 -20401800: 00b7a423 sw a1,8(a5) -20401804: 00000513 li a0,0 -20401808: 00008067 ret - -2040180c <__call_exitprocs>: -2040180c: fd010113 addi sp,sp,-48 -20401810: 5fbff797 auipc a5,0x5fbff -20401814: c1878793 addi a5,a5,-1000 # 80000428 <_global_impure_ptr> -20401818: 01312e23 sw s3,28(sp) -2040181c: 0007a983 lw s3,0(a5) -20401820: 01412c23 sw s4,24(sp) -20401824: 01512a23 sw s5,20(sp) -20401828: 01612823 sw s6,16(sp) -2040182c: 02112623 sw ra,44(sp) -20401830: 02812423 sw s0,40(sp) -20401834: 02912223 sw s1,36(sp) -20401838: 03212023 sw s2,32(sp) -2040183c: 01712623 sw s7,12(sp) -20401840: 00050a93 mv s5,a0 -20401844: 00058a13 mv s4,a1 -20401848: 00100b13 li s6,1 -2040184c: 1489a483 lw s1,328(s3) -20401850: 00048c63 beqz s1,20401868 <__call_exitprocs+0x5c> -20401854: 0044a403 lw s0,4(s1) -20401858: fff40913 addi s2,s0,-1 -2040185c: 00241413 slli s0,s0,0x2 -20401860: 00848433 add s0,s1,s0 -20401864: 02095863 bgez s2,20401894 <__call_exitprocs+0x88> -20401868: 02c12083 lw ra,44(sp) -2040186c: 02812403 lw s0,40(sp) -20401870: 02412483 lw s1,36(sp) -20401874: 02012903 lw s2,32(sp) -20401878: 01c12983 lw s3,28(sp) -2040187c: 01812a03 lw s4,24(sp) -20401880: 01412a83 lw s5,20(sp) -20401884: 01012b03 lw s6,16(sp) -20401888: 00c12b83 lw s7,12(sp) -2040188c: 03010113 addi sp,sp,48 -20401890: 00008067 ret -20401894: 000a0c63 beqz s4,204018ac <__call_exitprocs+0xa0> -20401898: 10442783 lw a5,260(s0) -2040189c: 01478863 beq a5,s4,204018ac <__call_exitprocs+0xa0> -204018a0: fff90913 addi s2,s2,-1 -204018a4: ffc40413 addi s0,s0,-4 -204018a8: fbdff06f j 20401864 <__call_exitprocs+0x58> -204018ac: 0044a703 lw a4,4(s1) -204018b0: 00442783 lw a5,4(s0) -204018b4: fff70713 addi a4,a4,-1 -204018b8: 03271c63 bne a4,s2,204018f0 <__call_exitprocs+0xe4> -204018bc: 0124a223 sw s2,4(s1) -204018c0: fe0780e3 beqz a5,204018a0 <__call_exitprocs+0x94> -204018c4: 1884a683 lw a3,392(s1) -204018c8: 012b1733 sll a4,s6,s2 -204018cc: 0044ab83 lw s7,4(s1) -204018d0: 00d776b3 and a3,a4,a3 -204018d4: 02069263 bnez a3,204018f8 <__call_exitprocs+0xec> -204018d8: 000780e7 jalr a5 -204018dc: 0044a703 lw a4,4(s1) -204018e0: 1489a783 lw a5,328(s3) -204018e4: f77714e3 bne a4,s7,2040184c <__call_exitprocs+0x40> -204018e8: faf48ce3 beq s1,a5,204018a0 <__call_exitprocs+0x94> -204018ec: f61ff06f j 2040184c <__call_exitprocs+0x40> -204018f0: 00042223 sw zero,4(s0) -204018f4: fcdff06f j 204018c0 <__call_exitprocs+0xb4> -204018f8: 18c4a683 lw a3,396(s1) -204018fc: 08442583 lw a1,132(s0) -20401900: 00d77733 and a4,a4,a3 -20401904: 00071863 bnez a4,20401914 <__call_exitprocs+0x108> -20401908: 000a8513 mv a0,s5 -2040190c: 000780e7 jalr a5 -20401910: fcdff06f j 204018dc <__call_exitprocs+0xd0> -20401914: 00058513 mv a0,a1 -20401918: 000780e7 jalr a5 -2040191c: fc1ff06f j 204018dc <__call_exitprocs+0xd0> - -20401920 <__muldf3>: -20401920: fa010113 addi sp,sp,-96 -20401924: 04812c23 sw s0,88(sp) -20401928: 05312623 sw s3,76(sp) -2040192c: 00100437 lui s0,0x100 -20401930: 0145d993 srli s3,a1,0x14 -20401934: 04912a23 sw s1,84(sp) -20401938: 05612023 sw s6,64(sp) -2040193c: 03712e23 sw s7,60(sp) -20401940: 03812c23 sw s8,56(sp) -20401944: fff40413 addi s0,s0,-1 # fffff <__stack_size+0xff7ff> -20401948: 04112e23 sw ra,92(sp) -2040194c: 05212823 sw s2,80(sp) -20401950: 05412423 sw s4,72(sp) -20401954: 05512223 sw s5,68(sp) -20401958: 03912a23 sw s9,52(sp) -2040195c: 03a12823 sw s10,48(sp) -20401960: 03b12623 sw s11,44(sp) -20401964: 7ff9f993 andi s3,s3,2047 -20401968: 00050493 mv s1,a0 -2040196c: 00060b93 mv s7,a2 -20401970: 00068c13 mv s8,a3 -20401974: 00b47433 and s0,s0,a1 -20401978: 01f5db13 srli s6,a1,0x1f -2040197c: 0a098863 beqz s3,20401a2c <__muldf3+0x10c> -20401980: 7ff00793 li a5,2047 -20401984: 10f98663 beq s3,a5,20401a90 <__muldf3+0x170> -20401988: 00800937 lui s2,0x800 -2040198c: 00341413 slli s0,s0,0x3 -20401990: 01246433 or s0,s0,s2 -20401994: 01d55913 srli s2,a0,0x1d -20401998: 00896933 or s2,s2,s0 -2040199c: 00351d13 slli s10,a0,0x3 -204019a0: c0198993 addi s3,s3,-1023 -204019a4: 00000c93 li s9,0 -204019a8: 014c5513 srli a0,s8,0x14 -204019ac: 00100a37 lui s4,0x100 -204019b0: fffa0a13 addi s4,s4,-1 # fffff <__stack_size+0xff7ff> -204019b4: 7ff57513 andi a0,a0,2047 -204019b8: 018a7a33 and s4,s4,s8 -204019bc: 000b8493 mv s1,s7 -204019c0: 01fc5c13 srli s8,s8,0x1f -204019c4: 10050463 beqz a0,20401acc <__muldf3+0x1ac> -204019c8: 7ff00793 li a5,2047 -204019cc: 16f50463 beq a0,a5,20401b34 <__muldf3+0x214> -204019d0: 00800437 lui s0,0x800 -204019d4: 003a1a13 slli s4,s4,0x3 -204019d8: 008a6a33 or s4,s4,s0 -204019dc: 01dbd413 srli s0,s7,0x1d -204019e0: 01446433 or s0,s0,s4 -204019e4: 003b9493 slli s1,s7,0x3 -204019e8: c0150513 addi a0,a0,-1023 -204019ec: 00000793 li a5,0 -204019f0: 002c9713 slli a4,s9,0x2 -204019f4: 00f76733 or a4,a4,a5 -204019f8: 00a989b3 add s3,s3,a0 -204019fc: fff70713 addi a4,a4,-1 -20401a00: 00e00693 li a3,14 -20401a04: 018b4bb3 xor s7,s6,s8 -20401a08: 00198a93 addi s5,s3,1 -20401a0c: 16e6e063 bltu a3,a4,20401b6c <__muldf3+0x24c> -20401a10: 00001697 auipc a3,0x1 -20401a14: 99068693 addi a3,a3,-1648 # 204023a0 <__clzsi2+0x23c> -20401a18: 00271713 slli a4,a4,0x2 -20401a1c: 00d70733 add a4,a4,a3 -20401a20: 00072703 lw a4,0(a4) -20401a24: 00d70733 add a4,a4,a3 -20401a28: 00070067 jr a4 -20401a2c: 00a46933 or s2,s0,a0 -20401a30: 06090e63 beqz s2,20401aac <__muldf3+0x18c> -20401a34: 04040063 beqz s0,20401a74 <__muldf3+0x154> -20401a38: 00040513 mv a0,s0 -20401a3c: 728000ef jal ra,20402164 <__clzsi2> -20401a40: ff550793 addi a5,a0,-11 -20401a44: 01c00713 li a4,28 -20401a48: 02f74c63 blt a4,a5,20401a80 <__muldf3+0x160> -20401a4c: 01d00913 li s2,29 -20401a50: ff850d13 addi s10,a0,-8 -20401a54: 40f90933 sub s2,s2,a5 -20401a58: 01a41433 sll s0,s0,s10 -20401a5c: 0124d933 srl s2,s1,s2 -20401a60: 00896933 or s2,s2,s0 -20401a64: 01a49d33 sll s10,s1,s10 -20401a68: c0d00993 li s3,-1011 -20401a6c: 40a989b3 sub s3,s3,a0 -20401a70: f35ff06f j 204019a4 <__muldf3+0x84> -20401a74: 6f0000ef jal ra,20402164 <__clzsi2> -20401a78: 02050513 addi a0,a0,32 -20401a7c: fc5ff06f j 20401a40 <__muldf3+0x120> -20401a80: fd850913 addi s2,a0,-40 -20401a84: 01249933 sll s2,s1,s2 -20401a88: 00000d13 li s10,0 -20401a8c: fddff06f j 20401a68 <__muldf3+0x148> -20401a90: 00a46933 or s2,s0,a0 -20401a94: 02090463 beqz s2,20401abc <__muldf3+0x19c> -20401a98: 00050d13 mv s10,a0 -20401a9c: 00040913 mv s2,s0 -20401aa0: 7ff00993 li s3,2047 -20401aa4: 00300c93 li s9,3 -20401aa8: f01ff06f j 204019a8 <__muldf3+0x88> -20401aac: 00000d13 li s10,0 -20401ab0: 00000993 li s3,0 -20401ab4: 00100c93 li s9,1 -20401ab8: ef1ff06f j 204019a8 <__muldf3+0x88> -20401abc: 00000d13 li s10,0 -20401ac0: 7ff00993 li s3,2047 -20401ac4: 00200c93 li s9,2 -20401ac8: ee1ff06f j 204019a8 <__muldf3+0x88> -20401acc: 017a6433 or s0,s4,s7 -20401ad0: 06040e63 beqz s0,20401b4c <__muldf3+0x22c> -20401ad4: 040a0063 beqz s4,20401b14 <__muldf3+0x1f4> -20401ad8: 000a0513 mv a0,s4 -20401adc: 688000ef jal ra,20402164 <__clzsi2> -20401ae0: ff550793 addi a5,a0,-11 -20401ae4: 01c00713 li a4,28 -20401ae8: 02f74e63 blt a4,a5,20401b24 <__muldf3+0x204> -20401aec: 01d00413 li s0,29 -20401af0: ff850493 addi s1,a0,-8 -20401af4: 40f40433 sub s0,s0,a5 -20401af8: 009a1a33 sll s4,s4,s1 -20401afc: 008bd433 srl s0,s7,s0 -20401b00: 01446433 or s0,s0,s4 -20401b04: 009b94b3 sll s1,s7,s1 -20401b08: c0d00793 li a5,-1011 -20401b0c: 40a78533 sub a0,a5,a0 -20401b10: eddff06f j 204019ec <__muldf3+0xcc> -20401b14: 000b8513 mv a0,s7 -20401b18: 64c000ef jal ra,20402164 <__clzsi2> -20401b1c: 02050513 addi a0,a0,32 -20401b20: fc1ff06f j 20401ae0 <__muldf3+0x1c0> -20401b24: fd850413 addi s0,a0,-40 -20401b28: 008b9433 sll s0,s7,s0 -20401b2c: 00000493 li s1,0 -20401b30: fd9ff06f j 20401b08 <__muldf3+0x1e8> -20401b34: 017a6433 or s0,s4,s7 -20401b38: 02040263 beqz s0,20401b5c <__muldf3+0x23c> -20401b3c: 000a0413 mv s0,s4 -20401b40: 7ff00513 li a0,2047 -20401b44: 00300793 li a5,3 -20401b48: ea9ff06f j 204019f0 <__muldf3+0xd0> -20401b4c: 00000493 li s1,0 -20401b50: 00000513 li a0,0 -20401b54: 00100793 li a5,1 -20401b58: e99ff06f j 204019f0 <__muldf3+0xd0> -20401b5c: 00000493 li s1,0 -20401b60: 7ff00513 li a0,2047 -20401b64: 00200793 li a5,2 -20401b68: e89ff06f j 204019f0 <__muldf3+0xd0> -20401b6c: 00010737 lui a4,0x10 -20401b70: fff70a13 addi s4,a4,-1 # ffff <__stack_size+0xf7ff> -20401b74: 010d5c13 srli s8,s10,0x10 -20401b78: 0104dd93 srli s11,s1,0x10 -20401b7c: 014d7d33 and s10,s10,s4 -20401b80: 0144f4b3 and s1,s1,s4 -20401b84: 000d0593 mv a1,s10 -20401b88: 00048513 mv a0,s1 -20401b8c: 00e12823 sw a4,16(sp) -20401b90: 4fc000ef jal ra,2040208c <__mulsi3> -20401b94: 00050c93 mv s9,a0 -20401b98: 00048593 mv a1,s1 -20401b9c: 000c0513 mv a0,s8 -20401ba0: 4ec000ef jal ra,2040208c <__mulsi3> -20401ba4: 00a12623 sw a0,12(sp) -20401ba8: 000d8593 mv a1,s11 -20401bac: 000c0513 mv a0,s8 -20401bb0: 4dc000ef jal ra,2040208c <__mulsi3> -20401bb4: 00050b13 mv s6,a0 -20401bb8: 000d0593 mv a1,s10 -20401bbc: 000d8513 mv a0,s11 -20401bc0: 4cc000ef jal ra,2040208c <__mulsi3> -20401bc4: 00c12683 lw a3,12(sp) -20401bc8: 010cd793 srli a5,s9,0x10 -20401bcc: 00d50533 add a0,a0,a3 -20401bd0: 00a78533 add a0,a5,a0 -20401bd4: 00d57663 bleu a3,a0,20401be0 <__muldf3+0x2c0> -20401bd8: 01012703 lw a4,16(sp) -20401bdc: 00eb0b33 add s6,s6,a4 -20401be0: 01055693 srli a3,a0,0x10 -20401be4: 01457533 and a0,a0,s4 -20401be8: 014cfcb3 and s9,s9,s4 -20401bec: 01051513 slli a0,a0,0x10 -20401bf0: 019507b3 add a5,a0,s9 -20401bf4: 01045c93 srli s9,s0,0x10 -20401bf8: 01447433 and s0,s0,s4 -20401bfc: 000d0593 mv a1,s10 -20401c00: 00040513 mv a0,s0 -20401c04: 00d12a23 sw a3,20(sp) -20401c08: 00f12623 sw a5,12(sp) -20401c0c: 480000ef jal ra,2040208c <__mulsi3> -20401c10: 00a12823 sw a0,16(sp) -20401c14: 00040593 mv a1,s0 -20401c18: 000c0513 mv a0,s8 -20401c1c: 470000ef jal ra,2040208c <__mulsi3> -20401c20: 00050a13 mv s4,a0 -20401c24: 000c8593 mv a1,s9 -20401c28: 000c0513 mv a0,s8 -20401c2c: 460000ef jal ra,2040208c <__mulsi3> -20401c30: 00050c13 mv s8,a0 -20401c34: 000d0593 mv a1,s10 -20401c38: 000c8513 mv a0,s9 -20401c3c: 450000ef jal ra,2040208c <__mulsi3> -20401c40: 01012703 lw a4,16(sp) -20401c44: 01450533 add a0,a0,s4 -20401c48: 01412683 lw a3,20(sp) -20401c4c: 01075793 srli a5,a4,0x10 -20401c50: 00a78533 add a0,a5,a0 -20401c54: 01457663 bleu s4,a0,20401c60 <__muldf3+0x340> -20401c58: 000107b7 lui a5,0x10 -20401c5c: 00fc0c33 add s8,s8,a5 -20401c60: 00010637 lui a2,0x10 -20401c64: 01055793 srli a5,a0,0x10 -20401c68: 01878c33 add s8,a5,s8 -20401c6c: fff60793 addi a5,a2,-1 # ffff <__stack_size+0xf7ff> -20401c70: 00f57a33 and s4,a0,a5 -20401c74: 00f77733 and a4,a4,a5 -20401c78: 010a1a13 slli s4,s4,0x10 -20401c7c: 01095d13 srli s10,s2,0x10 -20401c80: 00ea0a33 add s4,s4,a4 -20401c84: 00f97933 and s2,s2,a5 -20401c88: 01468733 add a4,a3,s4 -20401c8c: 00090593 mv a1,s2 -20401c90: 00048513 mv a0,s1 -20401c94: 00e12823 sw a4,16(sp) -20401c98: 00c12e23 sw a2,28(sp) -20401c9c: 3f0000ef jal ra,2040208c <__mulsi3> -20401ca0: 00048593 mv a1,s1 -20401ca4: 00a12c23 sw a0,24(sp) -20401ca8: 000d0513 mv a0,s10 -20401cac: 3e0000ef jal ra,2040208c <__mulsi3> -20401cb0: 00a12a23 sw a0,20(sp) -20401cb4: 000d0593 mv a1,s10 -20401cb8: 000d8513 mv a0,s11 -20401cbc: 3d0000ef jal ra,2040208c <__mulsi3> -20401cc0: 00050493 mv s1,a0 -20401cc4: 00090593 mv a1,s2 -20401cc8: 000d8513 mv a0,s11 -20401ccc: 3c0000ef jal ra,2040208c <__mulsi3> -20401cd0: 01412683 lw a3,20(sp) -20401cd4: 01812703 lw a4,24(sp) -20401cd8: 00d50533 add a0,a0,a3 -20401cdc: 01075793 srli a5,a4,0x10 -20401ce0: 00a78533 add a0,a5,a0 -20401ce4: 00d57663 bleu a3,a0,20401cf0 <__muldf3+0x3d0> -20401ce8: 01c12603 lw a2,28(sp) -20401cec: 00c484b3 add s1,s1,a2 -20401cf0: 000106b7 lui a3,0x10 -20401cf4: fff68793 addi a5,a3,-1 # ffff <__stack_size+0xf7ff> -20401cf8: 01055d93 srli s11,a0,0x10 -20401cfc: 009d84b3 add s1,s11,s1 -20401d00: 00f57db3 and s11,a0,a5 -20401d04: 00f77733 and a4,a4,a5 -20401d08: 00090593 mv a1,s2 -20401d0c: 00040513 mv a0,s0 -20401d10: 010d9d93 slli s11,s11,0x10 -20401d14: 00ed8db3 add s11,s11,a4 -20401d18: 00d12c23 sw a3,24(sp) -20401d1c: 370000ef jal ra,2040208c <__mulsi3> -20401d20: 00040593 mv a1,s0 -20401d24: 00a12a23 sw a0,20(sp) -20401d28: 000d0513 mv a0,s10 -20401d2c: 360000ef jal ra,2040208c <__mulsi3> -20401d30: 000d0593 mv a1,s10 -20401d34: 00050413 mv s0,a0 -20401d38: 000c8513 mv a0,s9 -20401d3c: 350000ef jal ra,2040208c <__mulsi3> -20401d40: 00050d13 mv s10,a0 -20401d44: 00090593 mv a1,s2 -20401d48: 000c8513 mv a0,s9 -20401d4c: 340000ef jal ra,2040208c <__mulsi3> -20401d50: 01412703 lw a4,20(sp) -20401d54: 00850533 add a0,a0,s0 -20401d58: 01075793 srli a5,a4,0x10 -20401d5c: 00a78533 add a0,a5,a0 -20401d60: 00857663 bleu s0,a0,20401d6c <__muldf3+0x44c> -20401d64: 01812683 lw a3,24(sp) -20401d68: 00dd0d33 add s10,s10,a3 -20401d6c: 01012783 lw a5,16(sp) -20401d70: 000106b7 lui a3,0x10 -20401d74: fff68693 addi a3,a3,-1 # ffff <__stack_size+0xf7ff> -20401d78: 00fb0b33 add s6,s6,a5 -20401d7c: 00d577b3 and a5,a0,a3 -20401d80: 00d77733 and a4,a4,a3 -20401d84: 01079793 slli a5,a5,0x10 -20401d88: 00e787b3 add a5,a5,a4 -20401d8c: 014b3a33 sltu s4,s6,s4 -20401d90: 018787b3 add a5,a5,s8 -20401d94: 01478433 add s0,a5,s4 -20401d98: 01bb0b33 add s6,s6,s11 -20401d9c: 00940733 add a4,s0,s1 -20401da0: 01bb3db3 sltu s11,s6,s11 -20401da4: 01b706b3 add a3,a4,s11 -20401da8: 0187bc33 sltu s8,a5,s8 -20401dac: 01443433 sltu s0,s0,s4 -20401db0: 01055793 srli a5,a0,0x10 -20401db4: 00973733 sltu a4,a4,s1 -20401db8: 008c6433 or s0,s8,s0 -20401dbc: 01b6bdb3 sltu s11,a3,s11 -20401dc0: 00f40433 add s0,s0,a5 -20401dc4: 01b76db3 or s11,a4,s11 -20401dc8: 01b40433 add s0,s0,s11 -20401dcc: 01a40433 add s0,s0,s10 -20401dd0: 0176d793 srli a5,a3,0x17 -20401dd4: 00941413 slli s0,s0,0x9 -20401dd8: 00f46433 or s0,s0,a5 -20401ddc: 00c12783 lw a5,12(sp) -20401de0: 009b1493 slli s1,s6,0x9 -20401de4: 017b5b13 srli s6,s6,0x17 -20401de8: 00f4e4b3 or s1,s1,a5 -20401dec: 009034b3 snez s1,s1 -20401df0: 00969793 slli a5,a3,0x9 -20401df4: 0164e4b3 or s1,s1,s6 -20401df8: 00f4e4b3 or s1,s1,a5 -20401dfc: 00741793 slli a5,s0,0x7 -20401e00: 1207d263 bgez a5,20401f24 <__muldf3+0x604> -20401e04: 0014d793 srli a5,s1,0x1 -20401e08: 0014f493 andi s1,s1,1 -20401e0c: 0097e4b3 or s1,a5,s1 -20401e10: 01f41793 slli a5,s0,0x1f -20401e14: 00f4e4b3 or s1,s1,a5 -20401e18: 00145413 srli s0,s0,0x1 -20401e1c: 3ffa8713 addi a4,s5,1023 -20401e20: 10e05663 blez a4,20401f2c <__muldf3+0x60c> -20401e24: 0074f793 andi a5,s1,7 -20401e28: 02078063 beqz a5,20401e48 <__muldf3+0x528> -20401e2c: 00f4f793 andi a5,s1,15 -20401e30: 00400693 li a3,4 -20401e34: 00d78a63 beq a5,a3,20401e48 <__muldf3+0x528> -20401e38: 00448793 addi a5,s1,4 -20401e3c: 0097b4b3 sltu s1,a5,s1 -20401e40: 00940433 add s0,s0,s1 -20401e44: 00078493 mv s1,a5 -20401e48: 00741793 slli a5,s0,0x7 -20401e4c: 0007da63 bgez a5,20401e60 <__muldf3+0x540> -20401e50: ff0007b7 lui a5,0xff000 -20401e54: fff78793 addi a5,a5,-1 # feffffff <_sp+0x7effbfff> -20401e58: 00f47433 and s0,s0,a5 -20401e5c: 400a8713 addi a4,s5,1024 -20401e60: 7fe00793 li a5,2046 -20401e64: 18e7c663 blt a5,a4,20401ff0 <__muldf3+0x6d0> -20401e68: 0034da93 srli s5,s1,0x3 -20401e6c: 01d41493 slli s1,s0,0x1d -20401e70: 0154e4b3 or s1,s1,s5 -20401e74: 00345413 srli s0,s0,0x3 -20401e78: 001007b7 lui a5,0x100 -20401e7c: fff78793 addi a5,a5,-1 # fffff <__stack_size+0xff7ff> -20401e80: 00f47433 and s0,s0,a5 -20401e84: 7ff77793 andi a5,a4,2047 -20401e88: 80100737 lui a4,0x80100 -20401e8c: fff70713 addi a4,a4,-1 # 800fffff <_sp+0xfbfff> -20401e90: 01479793 slli a5,a5,0x14 -20401e94: 00e47433 and s0,s0,a4 -20401e98: 01fb9b93 slli s7,s7,0x1f -20401e9c: 00f46433 or s0,s0,a5 -20401ea0: 017467b3 or a5,s0,s7 -20401ea4: 05c12083 lw ra,92(sp) -20401ea8: 05812403 lw s0,88(sp) -20401eac: 00048513 mv a0,s1 -20401eb0: 05012903 lw s2,80(sp) -20401eb4: 05412483 lw s1,84(sp) -20401eb8: 04c12983 lw s3,76(sp) -20401ebc: 04812a03 lw s4,72(sp) -20401ec0: 04412a83 lw s5,68(sp) -20401ec4: 04012b03 lw s6,64(sp) -20401ec8: 03c12b83 lw s7,60(sp) -20401ecc: 03812c03 lw s8,56(sp) -20401ed0: 03412c83 lw s9,52(sp) -20401ed4: 03012d03 lw s10,48(sp) -20401ed8: 02c12d83 lw s11,44(sp) -20401edc: 00078593 mv a1,a5 -20401ee0: 06010113 addi sp,sp,96 -20401ee4: 00008067 ret -20401ee8: 000b0b93 mv s7,s6 -20401eec: 00090413 mv s0,s2 -20401ef0: 000d0493 mv s1,s10 -20401ef4: 000c8793 mv a5,s9 -20401ef8: 00200713 li a4,2 -20401efc: 0ee78a63 beq a5,a4,20401ff0 <__muldf3+0x6d0> -20401f00: 00300713 li a4,3 -20401f04: 0ce78c63 beq a5,a4,20401fdc <__muldf3+0x6bc> -20401f08: 00100713 li a4,1 -20401f0c: f0e798e3 bne a5,a4,20401e1c <__muldf3+0x4fc> -20401f10: 00000413 li s0,0 -20401f14: 00000493 li s1,0 -20401f18: 0880006f j 20401fa0 <__muldf3+0x680> -20401f1c: 000c0b93 mv s7,s8 -20401f20: fd9ff06f j 20401ef8 <__muldf3+0x5d8> -20401f24: 00098a93 mv s5,s3 -20401f28: ef5ff06f j 20401e1c <__muldf3+0x4fc> -20401f2c: 00100693 li a3,1 -20401f30: 40e686b3 sub a3,a3,a4 -20401f34: 03800793 li a5,56 -20401f38: fcd7cce3 blt a5,a3,20401f10 <__muldf3+0x5f0> -20401f3c: 01f00793 li a5,31 -20401f40: 06d7c463 blt a5,a3,20401fa8 <__muldf3+0x688> -20401f44: 41ea8a93 addi s5,s5,1054 -20401f48: 015417b3 sll a5,s0,s5 -20401f4c: 00d4d733 srl a4,s1,a3 -20401f50: 015494b3 sll s1,s1,s5 -20401f54: 00e7e7b3 or a5,a5,a4 -20401f58: 009034b3 snez s1,s1 -20401f5c: 0097e4b3 or s1,a5,s1 -20401f60: 00d45433 srl s0,s0,a3 -20401f64: 0074f793 andi a5,s1,7 -20401f68: 02078063 beqz a5,20401f88 <__muldf3+0x668> -20401f6c: 00f4f793 andi a5,s1,15 -20401f70: 00400713 li a4,4 -20401f74: 00e78a63 beq a5,a4,20401f88 <__muldf3+0x668> -20401f78: 00448793 addi a5,s1,4 -20401f7c: 0097b4b3 sltu s1,a5,s1 -20401f80: 00940433 add s0,s0,s1 -20401f84: 00078493 mv s1,a5 -20401f88: 00841793 slli a5,s0,0x8 -20401f8c: 0607ca63 bltz a5,20402000 <__muldf3+0x6e0> -20401f90: 01d41793 slli a5,s0,0x1d -20401f94: 0034d493 srli s1,s1,0x3 -20401f98: 0097e4b3 or s1,a5,s1 -20401f9c: 00345413 srli s0,s0,0x3 -20401fa0: 00000713 li a4,0 -20401fa4: ed5ff06f j 20401e78 <__muldf3+0x558> -20401fa8: fe100793 li a5,-31 -20401fac: 40e787b3 sub a5,a5,a4 -20401fb0: 02000613 li a2,32 -20401fb4: 00f457b3 srl a5,s0,a5 -20401fb8: 00000713 li a4,0 -20401fbc: 00c68663 beq a3,a2,20401fc8 <__muldf3+0x6a8> -20401fc0: 43ea8a93 addi s5,s5,1086 -20401fc4: 01541733 sll a4,s0,s5 -20401fc8: 009764b3 or s1,a4,s1 -20401fcc: 009034b3 snez s1,s1 -20401fd0: 0097e4b3 or s1,a5,s1 -20401fd4: 00000413 li s0,0 -20401fd8: f8dff06f j 20401f64 <__muldf3+0x644> -20401fdc: 00080437 lui s0,0x80 -20401fe0: 00000493 li s1,0 -20401fe4: 7ff00713 li a4,2047 -20401fe8: 00000b93 li s7,0 -20401fec: e8dff06f j 20401e78 <__muldf3+0x558> -20401ff0: 00000413 li s0,0 -20401ff4: 00000493 li s1,0 -20401ff8: 7ff00713 li a4,2047 -20401ffc: e7dff06f j 20401e78 <__muldf3+0x558> -20402000: 00000413 li s0,0 -20402004: 00000493 li s1,0 -20402008: 00100713 li a4,1 -2040200c: e6dff06f j 20401e78 <__muldf3+0x558> - -20402010 <__fixunsdfsi>: -20402010: 0145d713 srli a4,a1,0x14 -20402014: 001006b7 lui a3,0x100 -20402018: 00050613 mv a2,a0 -2040201c: fff68793 addi a5,a3,-1 # fffff <__stack_size+0xff7ff> -20402020: 7ff77713 andi a4,a4,2047 -20402024: 3fe00513 li a0,1022 -20402028: 00b7f7b3 and a5,a5,a1 -2040202c: 01f5d593 srli a1,a1,0x1f -20402030: 04e55a63 ble a4,a0,20402084 <__fixunsdfsi+0x74> -20402034: 00000513 li a0,0 -20402038: 00059863 bnez a1,20402048 <__fixunsdfsi+0x38> -2040203c: 41e00593 li a1,1054 -20402040: fff00513 li a0,-1 -20402044: 00e5d463 ble a4,a1,2040204c <__fixunsdfsi+0x3c> -20402048: 00008067 ret -2040204c: 00d7e7b3 or a5,a5,a3 -20402050: 43300693 li a3,1075 -20402054: 40e686b3 sub a3,a3,a4 -20402058: 01f00593 li a1,31 -2040205c: 00d5cc63 blt a1,a3,20402074 <__fixunsdfsi+0x64> -20402060: bed70713 addi a4,a4,-1043 -20402064: 00e797b3 sll a5,a5,a4 -20402068: 00d65533 srl a0,a2,a3 -2040206c: 00a7e533 or a0,a5,a0 -20402070: 00008067 ret -20402074: 41300513 li a0,1043 -20402078: 40e50533 sub a0,a0,a4 -2040207c: 00a7d533 srl a0,a5,a0 -20402080: 00008067 ret -20402084: 00000513 li a0,0 -20402088: 00008067 ret - -2040208c <__mulsi3>: -2040208c: 00050613 mv a2,a0 -20402090: 00000513 li a0,0 -20402094: 0015f693 andi a3,a1,1 -20402098: 00068463 beqz a3,204020a0 <__mulsi3+0x14> -2040209c: 00c50533 add a0,a0,a2 -204020a0: 0015d593 srli a1,a1,0x1 -204020a4: 00161613 slli a2,a2,0x1 -204020a8: fe0596e3 bnez a1,20402094 <__mulsi3+0x8> -204020ac: 00008067 ret - -204020b0 <__divsi3>: -204020b0: 06054063 bltz a0,20402110 <__umodsi3+0x10> -204020b4: 0605c663 bltz a1,20402120 <__umodsi3+0x20> - -204020b8 <__udivsi3>: -204020b8: 00058613 mv a2,a1 -204020bc: 00050593 mv a1,a0 -204020c0: fff00513 li a0,-1 -204020c4: 02060c63 beqz a2,204020fc <__udivsi3+0x44> -204020c8: 00100693 li a3,1 -204020cc: 00b67a63 bleu a1,a2,204020e0 <__udivsi3+0x28> -204020d0: 00c05863 blez a2,204020e0 <__udivsi3+0x28> -204020d4: 00161613 slli a2,a2,0x1 -204020d8: 00169693 slli a3,a3,0x1 -204020dc: feb66ae3 bltu a2,a1,204020d0 <__udivsi3+0x18> -204020e0: 00000513 li a0,0 -204020e4: 00c5e663 bltu a1,a2,204020f0 <__udivsi3+0x38> -204020e8: 40c585b3 sub a1,a1,a2 -204020ec: 00d56533 or a0,a0,a3 -204020f0: 0016d693 srli a3,a3,0x1 -204020f4: 00165613 srli a2,a2,0x1 -204020f8: fe0696e3 bnez a3,204020e4 <__udivsi3+0x2c> -204020fc: 00008067 ret - -20402100 <__umodsi3>: -20402100: 00008293 mv t0,ra -20402104: fb5ff0ef jal ra,204020b8 <__udivsi3> -20402108: 00058513 mv a0,a1 -2040210c: 00028067 jr t0 -20402110: 40a00533 neg a0,a0 -20402114: 0005d863 bgez a1,20402124 <__umodsi3+0x24> -20402118: 40b005b3 neg a1,a1 -2040211c: f9dff06f j 204020b8 <__udivsi3> -20402120: 40b005b3 neg a1,a1 -20402124: 00008293 mv t0,ra -20402128: f91ff0ef jal ra,204020b8 <__udivsi3> -2040212c: 40a00533 neg a0,a0 -20402130: 00028067 jr t0 - -20402134 <__modsi3>: -20402134: 00008293 mv t0,ra -20402138: 0005ca63 bltz a1,2040214c <__modsi3+0x18> -2040213c: 00054c63 bltz a0,20402154 <__modsi3+0x20> -20402140: f79ff0ef jal ra,204020b8 <__udivsi3> -20402144: 00058513 mv a0,a1 -20402148: 00028067 jr t0 -2040214c: 40b005b3 neg a1,a1 -20402150: fe0558e3 bgez a0,20402140 <__modsi3+0xc> -20402154: 40a00533 neg a0,a0 -20402158: f61ff0ef jal ra,204020b8 <__udivsi3> -2040215c: 40b00533 neg a0,a1 -20402160: 00028067 jr t0 - -20402164 <__clzsi2>: -20402164: 000107b7 lui a5,0x10 -20402168: 02f57a63 bleu a5,a0,2040219c <__clzsi2+0x38> -2040216c: 0ff00793 li a5,255 -20402170: 00a7b7b3 sltu a5,a5,a0 -20402174: 00379793 slli a5,a5,0x3 -20402178: 02000713 li a4,32 -2040217c: 40f70733 sub a4,a4,a5 -20402180: 00f557b3 srl a5,a0,a5 -20402184: 00000517 auipc a0,0x0 -20402188: 25850513 addi a0,a0,600 # 204023dc <__clz_tab> -2040218c: 00f507b3 add a5,a0,a5 -20402190: 0007c503 lbu a0,0(a5) # 10000 <__stack_size+0xf800> -20402194: 40a70533 sub a0,a4,a0 -20402198: 00008067 ret -2040219c: 01000737 lui a4,0x1000 -204021a0: 01000793 li a5,16 -204021a4: fce56ae3 bltu a0,a4,20402178 <__clzsi2+0x14> -204021a8: 01800793 li a5,24 -204021ac: fcdff06f j 20402178 <__clzsi2+0x14> diff --git a/hifive1-vp/hello/wrap_printf.c b/hifive1-vp/hello/wrap_printf.c deleted file mode 100644 index 025d231..0000000 --- a/hifive1-vp/hello/wrap_printf.c +++ /dev/null @@ -1,271 +0,0 @@ -/* The functions in this file are only meant to support Dhrystone on an - * embedded RV32 system and are obviously incorrect in general. */ - -#include -#include -#include -#include -#include -#include - -#undef putchar -int putchar(int ch) -{ - return write(1, &ch, 1) == 1 ? ch : -1; -} - -static void sprintf_putch(int ch, void** data) -{ - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; -} - -static unsigned long getuint(va_list *ap, int lflag) -{ - if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long getint(va_list *ap, int lflag) -{ - if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*8]; - 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 inline void print_double(void (*putch)(int, void**), void **putdat, - double num, int width, int prec) -{ - union { - double d; - uint64_t u; - } u; - u.d = num; - - if (u.u & (1ULL << 63)) { - putch('-', putdat); - u.u &= ~(1ULL << 63); - } - - for (int i = 0; i < prec; i++) - u.d *= 10; - - char buf[32], *pbuf = buf; - printnum(sprintf_putch, (void**)&pbuf, (unsigned long)u.d, 10, 0, 0); - if (prec > 0) { - for (int i = 0; i < prec; i++) { - pbuf[-i] = pbuf[-i-1]; - } - pbuf[-prec] = '.'; - pbuf++; - } - - for (char* p = buf; p < pbuf; p++) - putch(*p, putdat); -} - -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 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 - case 'l': - if (lflag) - goto bad; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // double - case 'f': - print_double(putch, putdat, va_arg(ap, double), width, precision); - 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) num < 0) { - putch('-', putdat); - num = -(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': - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - 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: - bad: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} - -int __wrap_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 __wrap_sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/.gitignore b/hifive1-vp/riscv-bldc-forced-commutation/.gitignore deleted file mode 100644 index aadb4fb..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/riscv-bldc.dump diff --git a/hifive1-vp/riscv-bldc-forced-commutation/.project b/hifive1-vp/riscv-bldc-forced-commutation/.project deleted file mode 100644 index fe384e6..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - bldc-forced-commutation - - - bsp - - - - org.eclipse.cdt.managedbuilder.core.genmakebuilder - clean,full,incremental, - - - - - org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder - full,incremental, - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.core.ccnature - org.eclipse.cdt.managedbuilder.core.managedBuildNature - org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - - diff --git a/hifive1-vp/riscv-bldc-forced-commutation/Makefile b/hifive1-vp/riscv-bldc-forced-commutation/Makefile deleted file mode 100644 index efccd86..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/Makefile +++ /dev/null @@ -1,27 +0,0 @@ - -TARGET = riscv-bldc -C_SRCS = $(wildcard src/*.c) $(BSP_BASE)/drivers/fe300prci/fe300prci_driver.c $(BSP_BASE)/drivers/plic/plic_driver.c -CXX_SRCS = $(wildcard src/*.cpp) -HEADERS = $(wildcard src/*.h) -CFLAGS = -g -fno-builtin-printf -DUSE_PLIC -DUSE_M_TIME -DNO_INIT -I./src -CXXFLAGS = -fno-use-cxa-atexit -LDFLAGS = -Wl,--wrap=printf -LDFLAGS += -g -lstdc++ -fno-use-cxa-atexit -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) -mcmodel=medany - - -BOARD=freedom-e300-hifive1 -LINK_TARGET=flash -RISCV_ARCH=rv32imac -RISCV_ABI=ilp32 - -TOOL_DIR?=/opt/riscv/FreedomStudio/20180122/SiFive/riscv64-unknown-elf-gcc-20171231-x86_64-linux-centos6/bin -BSP_BASE = ./bsp -include $(BSP_BASE)/env/common.mk - -.PHONY: all -all: $(TARGET).dump - -$(TARGET).dump: $(TARGET) - $(TOOL_DIR)/$(TRIPLET)-objdump -d -S -C $< > $@ - - \ No newline at end of file diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.c deleted file mode 100644 index 0612e58..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.c +++ /dev/null @@ -1,163 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/clic.h" -#include "clic/clic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -void volatile_memzero(uint8_t * base, unsigned int size) { - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init ( - clic_instance_t * this_clic, - uintptr_t hart_addr, - interrupt_function_ptr_t* vect_table, - interrupt_function_ptr_t default_handler, - uint32_t num_irq, - uint32_t num_config_bits - ) -{ - this_clic->hart_addr= hart_addr; - this_clic->vect_table= vect_table; - this_clic->num_config_bits= num_config_bits; - - //initialize vector table - for(int i=0;i++;ivect_table[i] = default_handler; - } - - //set base vectors - write_csr(mtvt, vect_table); - - - //clear all interrupt enables and pending - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIE), num_irq); - volatile_memzero((uint8_t*)(this_clic->hart_addr+CLIC_INTIP), num_irq); - - //clear nlbits and nvbits; all interrupts trap to level 15 - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG)=0; - -} - -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler) { - this_clic->vect_table[source] = handler; -} - -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source) { - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 1; -} - -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIE+source) = 0; -} - -void clic_set_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 1; -} - -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTIP+source) = 0; -} - -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source) = intcfg; -} - -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_INTCFG+source); -} - -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg){ - *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG) = cfg; -} - -uint8_t clic_get_cliccfg (clic_instance_t * this_clic){ - return *(volatile uint8_t*)(this_clic->hart_addr+CLIC_CFG); -} - -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level) { - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level right to mask off unused bits - level = level>>((this_clic->num_config_bits)-nlbits); //plus this_clic->nmbits which is always 0 for now. - //shift level into correct bit position - level = level << (8-this_clic->num_config_bits) + (this_clic->num_config_bits - nlbits); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | level)); - - return level; -} - -//gets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source) { - uint8_t level; - level = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift level - level = level >> (8-(this_clic->num_config_bits)); - - //shift level right to mask off priority bits - level = level>>(this_clic->num_config_bits-nlbits); //this_clic->nmbits which is always 0 for now. - - return level; -} - -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority) { - //priority bits = num_config_bits - nlbits - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - uint8_t priority_bits = this_clic->num_config_bits-nlbits; - if(priority_bits = 0) { - //no bits to set - return 0; - } - //mask off unused bits - priority = priority >> (8-priority_bits); - //shift into the correct bit position - priority = priority << (8-(this_clic->num_config_bits)); - - //write to clicintcfg - uint8_t current_intcfg = clic_get_intcfg(this_clic, source); - clic_set_intcfg(this_clic, source, (current_intcfg | priority)); - return current_intcfg; -} - -//gets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source) { - uint8_t priority; - priority = clic_get_intcfg(this_clic, source); - - //extract nlbits - uint8_t nlbits = clic_get_cliccfg(this_clic); - nlbits = (nlbits >>1) & 0x7; - - //shift left to mask off level bits - priority = priority << nlbits; - - //shift priority - priority = priority >> (8-((this_clic->num_config_bits)+nlbits)); - - return priority; -} - - diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.h deleted file mode 100644 index 27c34c2..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/clic/clic_driver.h +++ /dev/null @@ -1,44 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef void (*interrupt_function_ptr_t) (void); - -typedef struct __clic_instance_t -{ - uintptr_t hart_addr; - interrupt_function_ptr_t* vect_table; - uint32_t num_config_bits; - uint32_t num_sources; -} clic_instance_t; - -// Note that there are no assertions or bounds checking on these -// parameter values. -void clic_init (clic_instance_t * this_clic, uintptr_t hart_addr, interrupt_function_ptr_t* vect_table, interrupt_function_ptr_t default_handler, uint32_t num_irq,uint32_t num_config_bits); -void clic_install_handler (clic_instance_t * this_clic, uint32_t source, interrupt_function_ptr_t handler); -void clic_enable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_disable_interrupt (clic_instance_t * this_clic, uint32_t source); -void clic_set_pending(clic_instance_t * this_clic, uint32_t source); -void clic_clear_pending(clic_instance_t * this_clic, uint32_t source); -void clic_set_intcfg (clic_instance_t * this_clic, uint32_t source, uint32_t intcfg); -uint8_t clic_get_intcfg (clic_instance_t * this_clic, uint32_t source); -void clic_set_cliccfg (clic_instance_t * this_clic, uint32_t cfg); -uint8_t clic_get_cliccfg (clic_instance_t * this_clic); -//sets an interrupt level based encoding of nmbits, nlbits -uint8_t clic_set_int_level( clic_instance_t * this_clic, uint32_t source, uint8_t level); -//get an interrupt level based encoding of nmbits, nlbits -uint8_t clic_get_int_level( clic_instance_t * this_clic, uint32_t source); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_set_int_priority( clic_instance_t * this_clic, uint32_t source, uint8_t priority); -//sets an interrupt priority based encoding of nmbits, nlbits -uint8_t clic_get_int_priority( clic_instance_t * this_clic, uint32_t source); - -__END_DECLS - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.c deleted file mode 100644 index 8eeaafc..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.c +++ /dev/null @@ -1,252 +0,0 @@ -// See LICENSE file for license details - -#include "platform.h" - -#ifdef PRCI_CTRL_ADDR -#include "fe300prci/fe300prci_driver.h" -#include - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) -{ - - uint32_t start_mtime = CLINT_REG(CLINT_MTIME); - uint32_t end_mtime = start_mtime + mtime_ticks + 1; - - // Make sure we won't get rollover. - while (end_mtime < start_mtime){ - start_mtime = CLINT_REG(CLINT_MTIME); - end_mtime = start_mtime + mtime_ticks + 1; - } - - // Don't start measuring until mtime edge. - uint32_t tmp = start_mtime; - do { - start_mtime = CLINT_REG(CLINT_MTIME); - } while (start_mtime == tmp); - - uint64_t start_mcycle; - rdmcycle(&start_mcycle); - - while (CLINT_REG(CLINT_MTIME) < end_mtime) ; - - uint64_t end_mcycle; - rdmcycle(&end_mcycle); - uint32_t difference = (uint32_t) (end_mcycle - start_mcycle); - - uint64_t freq = ((uint64_t) difference * mtime_freq) / mtime_ticks; - return (uint32_t) freq & 0xFFFFFFFF; - -} - - -void PRCI_use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - // It is OK to change this even if we are running off of it. - - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0); - - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - PRCI_use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if desired. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - - // To overclock, use the hfrosc - if (hfrosctrim >= 0 && hfroscdiv >= 0) { - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - } - - // Set DIV Settings for PLL - - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - if (finaldiv == 1){ - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV(finaldiv-1)); - } - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = CLINT_REG(CLINT_MTIME); - while (CLINT_REG(CLINT_MTIME) - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0); - - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); - - // If we're running off HFXOSC, turn off the HFROSC to - // save power. - if (refsel) { - PRCI_REG(PRCI_HFROSCCFG) &= ~ROSC_EN(1); - } - -} - -void PRCI_use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - PRCI_use_hfrosc(4, 16); -} - -void PRCI_use_hfxosc(uint32_t finaldiv) -{ - - PRCI_use_pll(1, // Use HFXTAL - 1, // Bypass = 1 - 0, // PLL settings don't matter - 0, // PLL settings don't matter - 0, // PLL settings don't matter - finaldiv, - -1, - -1); -} - -// This is a generic function, which -// doesn't span the entire range of HFROSC settings. -// It only adjusts the trim, which can span a hundred MHz or so. -// This function does not check the legality of the PLL settings -// at all, and it is quite possible to configure invalid PLL settings -// this way. -// It returns the actual measured CPU frequency. - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target ) -{ - - uint32_t hfrosctrim = 0; - uint32_t hfroscdiv = 4; - uint32_t prev_trim = 0; - - // In this function we use PLL settings which - // will give us a 32x multiplier from the output - // of the HFROSC source to the output of the - // PLL. We first measure our HFROSC to get the - // right trim, then finally use it as the PLL source. - // We should really check here that the f_cpu - // requested is something in the limit of the PLL. For - // now that is up to the user. - - // This will undershoot for frequencies not divisible by 16. - uint32_t desired_hfrosc_freq = (f_cpu/ 16); - - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - - // Ignore the first run (for icache reasons) - uint32_t cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - uint32_t prev_freq = cpu_freq; - - while ((cpu_freq < desired_hfrosc_freq) && (hfrosctrim < 0x1F)){ - prev_trim = hfrosctrim; - prev_freq = cpu_freq; - hfrosctrim ++; - PRCI_use_hfrosc(hfroscdiv, hfrosctrim); - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - } - - // We couldn't go low enough - if (prev_freq > desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // We couldn't go high enough - if (cpu_freq < desired_hfrosc_freq){ - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - } - - // Check for over/undershoot - switch(target) { - case(PRCI_FREQ_CLOSEST): - if ((desired_hfrosc_freq - prev_freq) < (cpu_freq - desired_hfrosc_freq)) { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - } else { - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - break; - case(PRCI_FREQ_UNDERSHOOT): - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, prev_trim); - break; - default: - PRCI_use_pll(0, 0, 1, 31, 1, 1, hfroscdiv, hfrosctrim); - } - - cpu_freq = PRCI_measure_mcycle_freq(1000, RTC_FREQ); - return cpu_freq; - -} - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.h deleted file mode 100644 index 7100f46..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/fe300prci/fe300prci_driver.h +++ /dev/null @@ -1,79 +0,0 @@ -// See LICENSE file for license details - -#ifndef _FE300PRCI_DRIVER_H_ -#define _FE300PRCI_DRIVER_H_ - -__BEGIN_DECLS - -#include - -typedef enum prci_freq_target { - - PRCI_FREQ_OVERSHOOT, - PRCI_FREQ_CLOSEST, - PRCI_FREQ_UNDERSHOOT - -} PRCI_freq_target; - -/* Measure and return the approximate frequency of the - * CPU, as given by measuring the mcycle counter against - * the mtime ticks. - */ -uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq); - -/* Safely switch over to the HFROSC using the given div - * and trim settings. - */ -void PRCI_use_hfrosc(int div, int trim); - -/* Safely switch over to the 16MHz HFXOSC, - * applying the finaldiv clock divider (1 is the lowest - * legal value). - */ -void PRCI_use_hfxosc(uint32_t finaldiv); - -/* Safely switch over to the PLL using the given - * settings. - * - * Note that not all combinations of the inputs are actually - * legal, and this function does not check for their - * legality ("safely" means that this function won't turn off - * or glitch the clock the CPU is actually running off, but - * doesn't protect against you making it too fast or slow.) - */ - -void PRCI_use_pll(int refsel, int bypass, - int r, int f, int q, int finaldiv, - int hfroscdiv, int hfrosctrim); - -/* Use the default clocks configured at reset. - * This is ~16Mhz HFROSC and turns off the LFROSC - * (on the current FE310 Dev Platforms, an external LFROSC is - * used as it is more power efficient). - */ -void PRCI_use_default_clocks(); - -/* This routine will adjust the HFROSC trim - * while using HFROSC as the clock source, - * measure the resulting frequency, then - * use it as the PLL clock source, - * in an attempt to get over, under, or close to the - * requested frequency. It returns the actual measured - * frequency. - * - * Note that the requested frequency must be within the - * range supported by the PLL so not all values are - * achievable with this function, and not all - * are guaranteed to actually work. The PLL - * is rated higher than the hardware. - * - * There is no check on the desired f_cpu frequency, it - * is up to the user to specify something reasonable. - */ - -uint32_t PRCI_set_hfrosctrim_for_f_cpu(uint32_t f_cpu, PRCI_freq_target target); - -__END_DECLS - -#endif - diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.c deleted file mode 100644 index b27d7a5..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.c +++ /dev/null @@ -1,127 +0,0 @@ -// See LICENSE for license details. - -#include "sifive/devices/plic.h" -#include "plic/plic_driver.h" -#include "platform.h" -#include "encoding.h" -#include - - -// Note that there are no assertions or bounds checking on these -// parameter values. - -void volatile_memzero(uint8_t * base, unsigned int size) -{ - volatile uint8_t * ptr; - for (ptr = base; ptr < (base + size); ptr++){ - *ptr = 0; - } -} - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities - ) -{ - - this_plic->base_addr = base_addr; - this_plic->num_sources = num_sources; - this_plic->num_priorities = num_priorities; - - // Disable all interrupts (don't assume that these registers are reset). - unsigned long hart_id = read_csr(mhartid); - volatile_memzero((uint8_t*) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET)), - (num_sources + 8) / 8); - - // Set all priorities to 0 (equal priority -- don't assume that these are reset). - volatile_memzero ((uint8_t *)(this_plic->base_addr + - PLIC_PRIORITY_OFFSET), - (num_sources + 1) << PLIC_PRIORITY_SHIFT_PER_SOURCE); - - // Set the threshold to 0. - volatile plic_threshold* threshold = (plic_threshold*) - (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold = 0; - -} - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold){ - - unsigned long hart_id = read_csr(mhartid); - volatile plic_threshold* threshold_ptr = (plic_threshold*) (this_plic->base_addr + - PLIC_THRESHOLD_OFFSET + - (hart_id << PLIC_THRESHOLD_SHIFT_PER_TARGET)); - - *threshold_ptr = threshold; - -} - - -void PLIC_enable_interrupt (plic_instance_t * this_plic, plic_source source){ - - unsigned long hart_id = read_csr(mhartid); - volatile uint8_t * current_ptr = (volatile uint8_t *)(this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current | ( 1 << (source & 0x7)); - *current_ptr = current; - -} - -void PLIC_disable_interrupt (plic_instance_t * this_plic, plic_source source){ - - unsigned long hart_id = read_csr(mhartid); - volatile uint8_t * current_ptr = (volatile uint8_t *) (this_plic->base_addr + - PLIC_ENABLE_OFFSET + - (hart_id << PLIC_ENABLE_SHIFT_PER_TARGET) + - (source >> 3)); - uint8_t current = *current_ptr; - current = current & ~(( 1 << (source & 0x7))); - *current_ptr = current; - -} - -void PLIC_set_priority (plic_instance_t * this_plic, plic_source source, plic_priority priority){ - - if (this_plic->num_priorities > 0) { - volatile plic_priority * priority_ptr = (volatile plic_priority *) - (this_plic->base_addr + - PLIC_PRIORITY_OFFSET + - (source << PLIC_PRIORITY_SHIFT_PER_SOURCE)); - *priority_ptr = priority; - } -} - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic){ - - unsigned long hart_id = read_csr(mhartid); - - volatile plic_source * claim_addr = (volatile plic_source * ) - (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET)); - - return *claim_addr; - -} - -void PLIC_complete_interrupt(plic_instance_t * this_plic, plic_source source){ - - unsigned long hart_id = read_csr(mhartid); - volatile plic_source * claim_addr = (volatile plic_source *) (this_plic->base_addr + - PLIC_CLAIM_OFFSET + - (hart_id << PLIC_CLAIM_SHIFT_PER_TARGET)); - *claim_addr = source; - -} - diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.h deleted file mode 100644 index e7d609b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/drivers/plic/plic_driver.h +++ /dev/null @@ -1,51 +0,0 @@ -// See LICENSE file for licence details - -#ifndef PLIC_DRIVER_H -#define PLIC_DRIVER_H - - -__BEGIN_DECLS - -#include "platform.h" - -typedef struct __plic_instance_t -{ - uintptr_t base_addr; - - uint32_t num_sources; - uint32_t num_priorities; - -} plic_instance_t; - -typedef uint32_t plic_source; -typedef uint32_t plic_priority; -typedef uint32_t plic_threshold; - -void PLIC_init ( - plic_instance_t * this_plic, - uintptr_t base_addr, - uint32_t num_sources, - uint32_t num_priorities - ); - -void PLIC_set_threshold (plic_instance_t * this_plic, - plic_threshold threshold); - -void PLIC_enable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_disable_interrupt (plic_instance_t * this_plic, - plic_source source); - -void PLIC_set_priority (plic_instance_t * this_plic, - plic_source source, - plic_priority priority); - -plic_source PLIC_claim_interrupt(plic_instance_t * this_plic); - -void PLIC_complete_interrupt(plic_instance_t * this_plic, - plic_source source); - -__END_DECLS - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/common.mk b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/common.mk deleted file mode 100644 index 0ca2c70..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/common.mk +++ /dev/null @@ -1,66 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_COMMON -_SIFIVE_MK_COMMON := # defined - -.PHONY: all -all: $(TARGET) - -include $(BSP_BASE)/libwrap/libwrap.mk - -ENV_DIR = $(BSP_BASE)/env -PLATFORM_DIR = $(ENV_DIR)/$(BOARD) - -ASM_SRCS += $(ENV_DIR)/start.S -ASM_SRCS += $(ENV_DIR)/entry.S -C_SRCS += $(PLATFORM_DIR)/init.c - -LINKER_SCRIPT := $(PLATFORM_DIR)/$(LINK_TARGET).lds - -INCLUDES += -I$(BSP_BASE)/include -INCLUDES += -I$(BSP_BASE)/drivers/ -INCLUDES += -I$(ENV_DIR) -INCLUDES += -I$(PLATFORM_DIR) - -TOOL_DIR ?= $(BSP_BASE)/../toolchain/bin - -LDFLAGS += -T $(LINKER_SCRIPT) -nostartfiles -LDFLAGS += -L$(ENV_DIR) --specs=nano.specs - -ASM_OBJS := $(ASM_SRCS:.S=.o) -C_OBJS := $(C_SRCS:.c=.o) -CXX_OBJS := $(CXX_SRCS:.cpp=.o) - -LINK_OBJS += $(ASM_OBJS) $(C_OBJS) $(CXX_OBJS) -LINK_DEPS += $(LINKER_SCRIPT) - -CLEAN_OBJS += $(TARGET) $(LINK_OBJS) - -CFLAGS += -march=$(RISCV_ARCH) -CFLAGS += -mabi=$(RISCV_ABI) -CFLAGS += -mcmodel=medany - -TRIPLET?=riscv64-unknown-elf -CXX=$(TOOL_DIR)/$(TRIPLET)-c++ -CC=$(TOOL_DIR)/$(TRIPLET)-gcc -LD=$(TOOL_DIR)/$(TRIPLET)-gcc -AR=$(TOOL_DIR)/$(TRIPLET)-ar - - -$(TARGET): $(LINK_OBJS) $(LINK_DEPS) - $(LD) $(LINK_OBJS) $(LDFLAGS) $(LIBWRAP) -o $@ - -$(ASM_OBJS): %.o: %.S $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(C_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -$(CXX_OBJS): %.o: %.cpp $(HEADERS) - $(CXX) $(CFLAGS) $(CXXFLAGS) $(INCLUDES) -include sys/cdefs.h -c -o $@ $< - -.PHONY: clean -clean: - rm -f $(CLEAN_OBJS) $(LIBWRAP) - -endif # _SIFIVE_MK_COMMON diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/flash.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/flash.lds deleted file mode 100644 index 2d5eb01..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/init.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/init.c deleted file mode 100644 index 3a4c77c..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/init.c +++ /dev/null @@ -1,98 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 32000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -extern int main(int argc, char** argv); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() ) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -typedef void (*interrupt_function_ptr_t) (void); -interrupt_function_ptr_t localISR[CLIC_NUM_INTERRUPTS] __attribute__((aligned(64))); - - -void trap_entry(void) __attribute__((interrupt, aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); - } else { - while(1); - } -} - -#ifdef CLIC_DIRECT -#else -void default_handler(void)__attribute__((interrupt));; -#endif -void default_handler(void) -{ - puts("default handler\n"); - while(1); -} - -void _init() -{ -#ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -//initialize vector table - int i=0; - while(iflash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/tim.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/tim.lds deleted file mode 100644 index 7dfb36b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreip-e2-arty/tim.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 64K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-arty.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-arty.h deleted file mode 100644 index eedcaa5..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-arty.h +++ /dev/null @@ -1,102 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_COREPLEXIP_ARTY_H -#define _SIFIVE_COREPLEXIP_ARTY_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the directly driven -// RGB LEDs on the Freedom Exx Coreplex IP Evaluation Arty FPGA Dev Kit. -// Additional RGB LEDs are driven by the 3 PWM outputs. - -#define RED_LED_OFFSET 0 -#define GREEN_LED_OFFSET 1 -#define BLUE_LED_OFFSET 2 - -// Switch 3 is used as a GPIO input. (Switch 0 is used to set -// the reset vector, the other switches are unused). - -#define SW_3_OFFSET 3 - -// These are the buttons which are mapped as inputs. - -#define HAS_BOARD_BUTTONS - -#define BUTTON_0_OFFSET 4 -#define BUTTON_1_OFFSET 5 -#define BUTTON_2_OFFSET 6 -#define BUTTON_3_OFFSET 7 - -// These are the bit offsets for the different GPIO pins -// mapped onto the PMOD A header. - -#define JA_0_OFFSET 8 -#define JA_1_OFFSET 9 -#define JA_2_OFFSET 10 -#define JA_3_OFFSET 11 -#define JA_4_OFFSET 12 -#define JA_5_OFFSET 13 -#define JA_6_OFFSET 14 -#define JA_7_OFFSET 15 - -// The below gives a mapping between global interrupt -// sources and their number. Note that on the coreplex -// deliverable, the io_global_interrupts go directly into -// the PLIC. The evaluation image on the FPGA mimics a -// system with peripheral devices which are driving the -// global interrupt lines. -// So, on this image, in order to get an interrupt from -// e.g. pressing BUTTON_0: -// 1) Steps which are external to the delivery coreplex: -// a) The corresponding GPIO pin must be configured as in input -// b) The "interrupt on fall" bit must be set for the GPIO pin -// 2) Steps which would also need to be performed for the delivery coreplex: -// a) The corresponding global interrupt, priority, and threshold must be configured in the PLIC. -// b) The external interrupt bit must be enabled in MSTATUS -// c) Interrupts must be enabled globally in the core. - -// Any of the above GPIO pins can be used as global interrupt -// sources by adding their offset to the INT_GPIO_BASE. -// For example, the buttons are shown here: - -#define INT_DEVICE_BUTTON_0 (GPIO_INT_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (GPIO_INT_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (GPIO_INT_BASE + BUTTON_2_OFFSET) -#define INT_DEVICE_BUTTON_3 (GPIO_INT_BASE + BUTTON_3_OFFSET) - -// In addition, the Switches are mapped directly to -// the PLIC (without going through the GPIO Peripheral). - -#define INT_EXT_DEVICE_SW_0 (EXTERNAL_INT_BASE + 0) -#define INT_EXT_DEVICE_SW_1 (EXTERNAL_INT_BASE + 1) -#define INT_EXT_DEVICE_SW_2 (EXTERNAL_INT_BASE + 2) -#define INT_EXT_DEVICE_SW_3 (EXTERNAL_INT_BASE + 3) - -// This gives the mapping from inputs to LOCAL interrupts. - -#define LOCAL_INT_SW_0 0 -#define LOCAL_INT_SW_1 1 -#define LOCAL_INT_SW_2 2 -#define LOCAL_INT_SW_3 3 -#define LOCAL_INT_BTN_0 4 -#define LOCAL_INT_BTN_1 5 -#define LOCAL_INT_BTN_2 6 -#define LOCAL_INT_BTN_3 7 -#define LOCAL_INT_JA_0 8 -#define LOCAL_INT_JA_1 9 -#define LOCAL_INT_JA_2 10 -#define LOCAL_INT_JA_3 11 -#define LOCAL_INT_JA_4 12 -#define LOCAL_INT_JA_5 13 -#define LOCAL_INT_JA_6 14 -#define LOCAL_INT_JA_7 15 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_COREPLEXIP_ARTY_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/dhrystone.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/flash.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/init.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/openocd.cfg b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/platform.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/scratchpad.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/settings.mk b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e31-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/dhrystone.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/dhrystone.lds deleted file mode 100644 index 8f6527b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/flash.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/flash.lds deleted file mode 100644 index 590c5b6..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/init.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/init.c deleted file mode 100644 index 1f8b679..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/init.c +++ /dev/null @@ -1,122 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -#define CPU_FREQ 65000000 -#define XSTR(x) #x -#define STR(x) XSTR(x) - -#ifndef VECT_IRQ - #define TRAP_ENTRY trap_entry -#else - #define TRAP_ENTRY vtrap_entry -#endif - -extern int main(int argc, char** argv); -extern void TRAP_ENTRY(); - -unsigned long get_cpu_freq() -{ - return CPU_FREQ; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - UART0_REG(UART_REG_DIV) = (get_cpu_freq() / 2) / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -#ifdef USE_LOCAL_ISR -typedef void (*my_interrupt_function_ptr_t) (void); -extern my_interrupt_function_ptr_t localISR[]; -#endif - -#ifndef VECT_IRQ -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) __attribute__((noinline)); -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif -#ifdef USE_LOCAL_ISR - } else if (mcause & MCAUSE_INT) { - localISR[mcause & MCAUSE_CAUSE] (); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} -#endif - -#ifdef USE_CLIC -void trap_entry(void) __attribute__((interrupt("SiFive-CLIC-preemptible"), aligned(64))); -void trap_entry(void) -{ - unsigned long mcause = read_csr(mcause); - unsigned long mepc = read_csr(mepc); - handle_trap(mcause, mepc); -} -#endif - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - puts("core freq at " STR(CPU_FREQ) " Hz\n"); - -#ifdef USE_CLIC - write_csr(mtvec, ((unsigned long)&trap_entry | MTVEC_CLIC)); -#else - write_csr(mtvec, ((unsigned long)&TRAP_ENTRY | MTVEC_VECTORED)); -#endif - - #endif -} - -void _fini() -{ -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/openocd.cfg b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/openocd.cfg deleted file mode 100644 index 0481a72..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/openocd.cfg +++ /dev/null @@ -1,31 +0,0 @@ -# JTAG adapter setup -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -#ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000001 - -set _TARGETNAME $_CHIPNAME.cpu - -target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -# Un-comment these two flash lines if you have a SPI flash and want to write -# it. -flash bank spi0 fespi 0x40000000 0 0 0 $_TARGETNAME.0 0x20004000 -init -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off -echo "Ready for Remote Connections" diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/platform.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/platform.h deleted file mode 100644 index 6fa79ea..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/platform.h +++ /dev/null @@ -1,100 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h - -#if __riscv_xlen == 32 -#define MCAUSE_INT 0x80000000UL -#define MCAUSE_CAUSE 0x000003FFUL -#else -#define MCAUSE_INT 0x8000000000000000UL -#define MCAUSE_CAUSE 0x00000000000003FFUL -#endif - -#ifdef VECT_IRQ - #define MTVEC_VECTORED 0x01 -#else - #define MTVEC_VECTORED 0x00 -#endif -#define MTVEC_CLIC 0x02 -#define IRQ_M_LOCAL 16 -#define MIP_MLIP(x) (1 << (IRQ_M_LOCAL + x)) - -#include "sifive/const.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define GPIO_CTRL_ADDR _AC(0x20002000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define PWM0_CTRL_ADDR _AC(0x20005000,UL) -#define RAM_MEM_ADDR _AC(0x80000000,UL) -#define RAM_MEM_SIZE _AC(0x10000,UL) -#define SPI0_CTRL_ADDR _AC(0x20004000,UL) -#define SPI0_MEM_ADDR _AC(0x40000000,UL) -#define SPI0_MEM_SIZE _AC(0x20000000,UL) -#define TESTBENCH_MEM_ADDR _AC(0x20000000,UL) -#define TESTBENCH_MEM_SIZE _AC(0x10000000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define UART0_CTRL_ADDR _AC(0x20000000,UL) - -// IOF masks - -// Interrupt numbers -#define RESERVED_INT_BASE 0 -#define UART0_INT_BASE 1 -#define EXTERNAL_INT_BASE 2 -#define SPI0_INT_BASE 6 -#define GPIO_INT_BASE 7 -#define PWM0_INT_BASE 23 - -// Helper functions -#define _REG64(p, i) (*(volatile uint64_t *)((p) + (i))) -#define _REG32(p, i) (*(volatile uint32_t *)((p) + (i))) -#define _REG16(p, i) (*(volatile uint16_t *)((p) + (i))) -// Bulk set bits in `reg` to either 0 or 1. -// E.g. SET_BITS(MY_REG, 0x00000007, 0) would generate MY_REG &= ~0x7 -// E.g. SET_BITS(MY_REG, 0x00000007, 1) would generate MY_REG |= 0x7 -#define SET_BITS(reg, mask, value) if ((value) == 0) { (reg) &= ~(mask); } else { (reg) |= (mask); } -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG(offset) _REG32(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define CLINT_REG64(offset) _REG64(CLINT_CTRL_ADDR, offset) -#define GPIO_REG64(offset) _REG64(GPIO_CTRL_ADDR, offset) -#define PLIC_REG64(offset) _REG64(PLIC_CTRL_ADDR, offset) -#define PWM0_REG64(offset) _REG64(PWM0_CTRL_ADDR, offset) -#define SPI0_REG64(offset) _REG64(SPI0_CTRL_ADDR, offset) -#define TRAPVEC_TABLE_REG64(offset) _REG64(TRAPVEC_TABLE_CTRL_ADDR, offset) -#define UART0_REG64(offset) _REG64(UART0_CTRL_ADDR, offset) - -// Misc - -#define NUM_GPIO 16 - -#define PLIC_NUM_INTERRUPTS 28 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS - -#include "coreplexip-arty.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/scratchpad.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/scratchpad.lds deleted file mode 100644 index 7887c13..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/scratchpad.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - ram PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >ram AT>ram :ram - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >ram AT>ram :ram - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >ram AT>ram :ram - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >ram AT>ram :ram - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >ram AT>ram :ram - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >ram AT>ram :ram - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >ram AT>ram :ram - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >ram AT>ram :ram - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >ram AT>ram :ram - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >ram AT>ram :ram - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>ram :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>ram :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack : - { - . = ALIGN(8); - . += __stack_size; - PROVIDE( _sp = . ); - PROVIDE( _heap_end = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/settings.mk b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/settings.mk deleted file mode 100644 index 96aea84..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/coreplexip-e51-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv64imac -RISCV_ABI := lp64 diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/encoding.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/encoding.h deleted file mode 100644 index 35e0f9f..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/encoding.h +++ /dev/null @@ -1,1313 +0,0 @@ -// 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_PUM 0x00040000 -#define MSTATUS_MXR 0x00080000 -#define MSTATUS_VM 0x1F000000 -#define MSTATUS32_SD 0x80000000 -#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_PUM 0x00040000 -#define SSTATUS32_SD 0x80000000 -#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 VM_MBARE 0 -#define VM_MBB 1 -#define VM_MBBID 2 -#define VM_SV32 8 -#define VM_SV39 9 -#define VM_SV48 10 - -#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 DEFAULT_NMIVEC 0x00001004 -#define DEFAULT_MTVEC 0x00001010 -#define CONFIG_STRING_ADDR 0x0000100C -#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 - -#ifdef __riscv64 -# define MSTATUS_SD MSTATUS64_SD -# define SSTATUS_SD SSTATUS64_SD -# define RISCV_PGLEVEL_BITS 9 -#else -# define MSTATUS_SD MSTATUS32_SD -# define SSTATUS_SD SSTATUS32_SD -# define RISCV_PGLEVEL_BITS 10 -#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) ({ \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrw " #reg ", %0" :: "i"(val)); \ - else \ - asm volatile ("csrw " #reg ", %0" :: "r"(val)); }) - -#define swap_csr(reg, val) ({ unsigned long __tmp; \ - if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \ - else \ - asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \ - __tmp; }) - -#define set_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ - __tmp; }) - -#define clear_csr(reg, bit) ({ unsigned long __tmp; \ - if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ - else \ - asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(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_HRET 0x20200073 -#define MASK_HRET 0xffffffff -#define MATCH_MRET 0x30200073 -#define MASK_MRET 0xffffffff -#define MATCH_DRET 0x7b200073 -#define MASK_DRET 0xffffffff -#define MATCH_SFENCE_VM 0x10400073 -#define MASK_SFENCE_VM 0xfff07fff -#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_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_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_S 0xe0000053 -#define MASK_FMV_X_S 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_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_S_X 0xf0000053 -#define MASK_FMV_S_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_FLW 0x2007 -#define MASK_FLW 0x707f -#define MATCH_FLD 0x3007 -#define MASK_FLD 0x707f -#define MATCH_FSW 0x2027 -#define MASK_FSW 0x707f -#define MATCH_FSD 0x3027 -#define MASK_FSD 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_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_SSCRATCH 0x140 -#define CSR_SEPC 0x141 -#define CSR_SCAUSE 0x142 -#define CSR_SBADADDR 0x143 -#define CSR_SIP 0x144 -#define CSR_SPTBR 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_MSCRATCH 0x340 -#define CSR_MEPC 0x341 -#define CSR_MCAUSE 0x342 -#define CSR_MBADADDR 0x343 -#define CSR_MIP 0x344 -#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_MUCOUNTEREN 0x320 -#define CSR_MSCOUNTEREN 0x321 -#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_FAULT_FETCH 0x1 -#define CAUSE_ILLEGAL_INSTRUCTION 0x2 -#define CAUSE_BREAKPOINT 0x3 -#define CAUSE_MISALIGNED_LOAD 0x4 -#define CAUSE_FAULT_LOAD 0x5 -#define CAUSE_MISALIGNED_STORE 0x6 -#define CAUSE_FAULT_STORE 0x7 -#define CAUSE_USER_ECALL 0x8 -#define CAUSE_SUPERVISOR_ECALL 0x9 -#define CAUSE_HYPERVISOR_ECALL 0xa -#define CAUSE_MACHINE_ECALL 0xb -#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(hret, MATCH_HRET, MASK_HRET) -DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) -DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) -DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) -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(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(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_s, MATCH_FMV_X_S, MASK_FMV_X_S) -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_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_s_x, MATCH_FMV_S_X, MASK_FMV_S_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(flw, MATCH_FLW, MASK_FLW) -DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) -DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) -DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) -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(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(sscratch, CSR_SSCRATCH) -DECLARE_CSR(sepc, CSR_SEPC) -DECLARE_CSR(scause, CSR_SCAUSE) -DECLARE_CSR(sbadaddr, CSR_SBADADDR) -DECLARE_CSR(sip, CSR_SIP) -DECLARE_CSR(sptbr, CSR_SPTBR) -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(mscratch, CSR_MSCRATCH) -DECLARE_CSR(mepc, CSR_MEPC) -DECLARE_CSR(mcause, CSR_MCAUSE) -DECLARE_CSR(mbadaddr, CSR_MBADADDR) -DECLARE_CSR(mip, CSR_MIP) -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(mucounteren, CSR_MUCOUNTEREN) -DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) -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("fault fetch", CAUSE_FAULT_FETCH) -DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) -DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) -DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) -DECLARE_CAUSE("fault load", CAUSE_FAULT_LOAD) -DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) -DECLARE_CAUSE("fault store", CAUSE_FAULT_STORE) -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) -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/entry.S b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/entry.S deleted file mode 100644 index 261b2a4..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/entry.S +++ /dev/null @@ -1,98 +0,0 @@ -// See LICENSE for license details - -#ifndef ENTRY_S -#define ENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - - .section .text.entry - .align 2 - .weak trap_entry - .global trap_entry -trap_entry: - addi sp, sp, -32*REGBYTES - - STORE x1, 1*REGBYTES(sp) - STORE x2, 2*REGBYTES(sp) - STORE x3, 3*REGBYTES(sp) - STORE x4, 4*REGBYTES(sp) - STORE x5, 5*REGBYTES(sp) - STORE x6, 6*REGBYTES(sp) - STORE x7, 7*REGBYTES(sp) - STORE x8, 8*REGBYTES(sp) - STORE x9, 9*REGBYTES(sp) - STORE x10, 10*REGBYTES(sp) - STORE x11, 11*REGBYTES(sp) - STORE x12, 12*REGBYTES(sp) - STORE x13, 13*REGBYTES(sp) - STORE x14, 14*REGBYTES(sp) - STORE x15, 15*REGBYTES(sp) - STORE x16, 16*REGBYTES(sp) - STORE x17, 17*REGBYTES(sp) - STORE x18, 18*REGBYTES(sp) - STORE x19, 19*REGBYTES(sp) - STORE x20, 20*REGBYTES(sp) - STORE x21, 21*REGBYTES(sp) - STORE x22, 22*REGBYTES(sp) - STORE x23, 23*REGBYTES(sp) - STORE x24, 24*REGBYTES(sp) - STORE x25, 25*REGBYTES(sp) - STORE x26, 26*REGBYTES(sp) - STORE x27, 27*REGBYTES(sp) - STORE x28, 28*REGBYTES(sp) - STORE x29, 29*REGBYTES(sp) - STORE x30, 30*REGBYTES(sp) - STORE x31, 31*REGBYTES(sp) - - csrr a0, mcause - csrr a1, mepc - mv a2, sp - call handle_trap - csrw mepc, a0 - - # Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 1*REGBYTES(sp) - LOAD x2, 2*REGBYTES(sp) - LOAD x3, 3*REGBYTES(sp) - LOAD x4, 4*REGBYTES(sp) - LOAD x5, 5*REGBYTES(sp) - LOAD x6, 6*REGBYTES(sp) - LOAD x7, 7*REGBYTES(sp) - LOAD x8, 8*REGBYTES(sp) - LOAD x9, 9*REGBYTES(sp) - LOAD x10, 10*REGBYTES(sp) - LOAD x11, 11*REGBYTES(sp) - LOAD x12, 12*REGBYTES(sp) - LOAD x13, 13*REGBYTES(sp) - LOAD x14, 14*REGBYTES(sp) - LOAD x15, 15*REGBYTES(sp) - LOAD x16, 16*REGBYTES(sp) - LOAD x17, 17*REGBYTES(sp) - LOAD x18, 18*REGBYTES(sp) - LOAD x19, 19*REGBYTES(sp) - LOAD x20, 20*REGBYTES(sp) - LOAD x21, 21*REGBYTES(sp) - LOAD x22, 22*REGBYTES(sp) - LOAD x23, 23*REGBYTES(sp) - LOAD x24, 24*REGBYTES(sp) - LOAD x25, 25*REGBYTES(sp) - LOAD x26, 26*REGBYTES(sp) - LOAD x27, 27*REGBYTES(sp) - LOAD x28, 28*REGBYTES(sp) - LOAD x29, 29*REGBYTES(sp) - LOAD x30, 30*REGBYTES(sp) - LOAD x31, 31*REGBYTES(sp) - - addi sp, sp, 32*REGBYTES - mret - -.weak handle_trap -handle_trap: -1: - j 1b - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/flash.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/flash.lds deleted file mode 100644 index 6b37141..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/init.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/init.c deleted file mode 100644 index a6f4b39..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/init.c +++ /dev/null @@ -1,87 +0,0 @@ -//See LICENSE for license details. -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long get_cpu_freq() -{ - return 65000000; -} - -unsigned long get_timer_freq() -{ - return get_cpu_freq(); -} - -uint64_t get_timer_value() -{ -#if __riscv_xlen == 32 - while (1) { - uint32_t hi = read_csr(mcycleh); - uint32_t lo = read_csr(mcycle); - if (hi == read_csr(mcycleh)) - return ((uint64_t)hi << 32) | lo; - } -#else - return read_csr(mcycle); -#endif -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "Unhandled Trap:\n", 16); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - #ifndef NO_INIT - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - #endif -} - -void _fini() -{ -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/openocd.cfg b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/openocd.cfg deleted file mode 100644 index f4b28ed..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/openocd.cfg +++ /dev/null @@ -1,30 +0,0 @@ -adapter_khz 10000 - -#source [find interface/ftdi/olimex-arm-usb-tiny-h.cfg] - -interface ftdi -ftdi_device_desc "Olimex OpenOCD JTAG ARM-USB-TINY-H" -ftdi_vid_pid 0x15ba 0x002a - -ftdi_layout_init 0x0808 0x0a1b -ftdi_layout_signal nSRST -oe 0x0200 -ftdi_layout_signal nTRST -data 0x0100 -oe 0x0100 -ftdi_layout_signal LED -data 0x0800 -# - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank my_first_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z -} -halt -#flash protect 0 64 last off diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/platform.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/platform.h deleted file mode 100644 index 8ff7ae6..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/platform.h +++ /dev/null @@ -1,124 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MMAP_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF Mappings -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt Numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#define HAS_BOARD_BUTTONS -#include "hifive1.h" - -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/settings.mk b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-arty/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/dhrystone.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/dhrystone.lds deleted file mode 100644 index cc9cd9b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/dhrystone.lds +++ /dev/null @@ -1,157 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/flash.lds b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/flash.lds deleted file mode 100644 index 6b37141..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/flash.lds +++ /dev/null @@ -1,161 +0,0 @@ -OUTPUT_ARCH( "riscv" ) - -ENTRY( _start ) - -MEMORY -{ - flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 512M - ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 16K -} - -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; -} - -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init : - { - KEEP (*(SORT_NONE(.init))) - } >flash AT>flash :flash - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >flash AT>flash :flash - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >flash AT>flash :flash - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >flash AT>flash :flash - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >flash AT>flash :flash - - .init_array : - { - PROVIDE_HIDDEN (__init_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) - KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) - PROVIDE_HIDDEN (__init_array_end = .); - } >flash AT>flash :flash - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* gcc uses crtbegin.o to find the start of - the constructors, so we make sure it is - first. Because this is a wildcard, it - doesn't matter if the user does not - actually link against crtbegin.o; the - linker won't look for a file to match a - wildcard. The wildcard also means that it - doesn't matter which directory crtbegin.o - is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. - The .ctor section from the crtend file contains the - end of ctors marker and it must be last */ - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - } >flash AT>flash :flash - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >flash AT>flash :flash - - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - *(.data .data.*) - *(.gnu.linkonce.d.*) - . = ALIGN(8); - PROVIDE( __global_pointer$ = . + 0x800 ); - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - . = ALIGN(8); - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/init.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/init.c deleted file mode 100644 index 621a6e2..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/init.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -#include "platform.h" -#include "encoding.h" - -extern int main(int argc, char** argv); -extern void trap_entry(); - -static unsigned long mtime_lo(void) -{ - return *(volatile unsigned long *)(CLINT_CTRL_ADDR + CLINT_MTIME); -} - -#ifdef __riscv32 - -static uint32_t mtime_hi(void) -{ - return *(volatile uint32_t *)(CLINT_CTRL_ADDR + CLINT_MTIME + 4); -} - -uint64_t get_timer_value() -{ - while (1) { - uint32_t hi = mtime_hi(); - uint32_t lo = mtime_lo(); - if (hi == mtime_hi()) - return ((uint64_t)hi << 32) | lo; - } -} - -#else /* __riscv32 */ - -uint64_t get_timer_value() -{ - return mtime_lo(); -} - -#endif - -unsigned long get_timer_freq() -{ - return 32768; -} - -static void use_hfrosc(int div, int trim) -{ - // Make sure the HFROSC is running at its default setting - PRCI_REG(PRCI_HFROSCCFG) = (ROSC_DIV(div) | ROSC_TRIM(trim) | ROSC_EN(1)); - while ((PRCI_REG(PRCI_HFROSCCFG) & ROSC_RDY(1)) == 0) ; - PRCI_REG(PRCI_PLLCFG) &= ~PLL_SEL(1); -} - -static void use_pll(int refsel, int bypass, int r, int f, int q) -{ - // Ensure that we aren't running off the PLL before we mess with it. - if (PRCI_REG(PRCI_PLLCFG) & PLL_SEL(1)) { - // Make sure the HFROSC is running at its default setting - use_hfrosc(4, 16); - } - - // Set PLL Source to be HFXOSC if available. - uint32_t config_value = 0; - - config_value |= PLL_REFSEL(refsel); - - if (bypass) { - // Bypass - config_value |= PLL_BYPASS(1); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // If we don't have an HFXTAL, this doesn't really matter. - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - } else { - // In case we are executing from QSPI, - // (which is quite likely) we need to - // set the QSPI clock divider appropriately - // before boosting the clock frequency. - - // Div = f_sck/2 - SPI0_REG(SPI_REG_SCKDIV) = 8; - - // Set DIV Settings for PLL - // Both HFROSC and HFXOSC are modeled as ideal - // 16MHz sources (assuming dividers are set properly for - // HFROSC). - // (Legal values of f_REF are 6-48MHz) - - // Set DIVR to divide-by-2 to get 8MHz frequency - // (legal values of f_R are 6-12 MHz) - - config_value |= PLL_BYPASS(1); - config_value |= PLL_R(r); - - // Set DIVF to get 512Mhz frequncy - // There is an implied multiply-by-2, 16Mhz. - // So need to write 32-1 - // (legal values of f_F are 384-768 MHz) - config_value |= PLL_F(f); - - // Set DIVQ to divide-by-2 to get 256 MHz frequency - // (legal values of f_Q are 50-400Mhz) - config_value |= PLL_Q(q); - - // Set our Final output divide to divide-by-1: - PRCI_REG(PRCI_PLLDIV) = (PLL_FINAL_DIV_BY_1(1) | PLL_FINAL_DIV(0)); - - PRCI_REG(PRCI_PLLCFG) = config_value; - - // Un-Bypass the PLL. - PRCI_REG(PRCI_PLLCFG) &= ~PLL_BYPASS(1); - - // Wait for PLL Lock - // Note that the Lock signal can be glitchy. - // Need to wait 100 us - // RTC is running at 32kHz. - // So wait 4 ticks of RTC. - uint32_t now = mtime_lo(); - while (mtime_lo() - now < 4) ; - - // Now it is safe to check for PLL Lock - while ((PRCI_REG(PRCI_PLLCFG) & PLL_LOCK(1)) == 0) ; - } - - // Switch over to PLL Clock source - PRCI_REG(PRCI_PLLCFG) |= PLL_SEL(1); -} - -static void use_default_clocks() -{ - // Turn off the LFROSC - AON_REG(AON_LFROSC) &= ~ROSC_EN(1); - - // Use HFROSC - use_hfrosc(4, 16); -} - -static unsigned long __attribute__((noinline)) measure_cpu_freq(size_t n) -{ - unsigned long start_mtime, delta_mtime; - unsigned long mtime_freq = get_timer_freq(); - - // Don't start measuruing until we see an mtime tick - unsigned long tmp = mtime_lo(); - do { - start_mtime = mtime_lo(); - } while (start_mtime == tmp); - - unsigned long start_mcycle = read_csr(mcycle); - - do { - delta_mtime = mtime_lo() - start_mtime; - } while (delta_mtime < n); - - unsigned long delta_mcycle = read_csr(mcycle) - start_mcycle; - - return (delta_mcycle / delta_mtime) * mtime_freq - + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; -} - -unsigned long get_cpu_freq() -{ - static uint32_t cpu_freq; - - if (!cpu_freq) { - // warm up I$ - measure_cpu_freq(1); - // measure for real - cpu_freq = measure_cpu_freq(10); - } - - return cpu_freq; -} - -static void uart_init(size_t baud_rate) -{ - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; -} - - - -#ifdef USE_PLIC -extern void handle_m_ext_interrupt(); -#endif - -#ifdef USE_M_TIME -extern void handle_m_time_interrupt(); -#endif - -uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc) -{ - if (0){ -#ifdef USE_PLIC - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) { - handle_m_ext_interrupt(); -#endif -#ifdef USE_M_TIME - // External Machine-Level interrupt from PLIC - } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){ - handle_m_time_interrupt(); -#endif - } - else { - write(1, "trap\n", 5); - _exit(1 + mcause); - } - return epc; -} - -void _init() -{ - - #ifndef NO_INIT - use_default_clocks(); - use_pll(0, 0, 1, 31, 1); - uart_init(115200); - - printf("core freq at %d Hz\n", get_cpu_freq()); - - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - #endif - -} - -void _fini() -{ -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/openocd.cfg b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/openocd.cfg deleted file mode 100644 index b531e9c..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/openocd.cfg +++ /dev/null @@ -1,34 +0,0 @@ -adapter_khz 10000 - -interface ftdi -ftdi_device_desc "Dual RS232-HS" -ftdi_vid_pid 0x0403 0x6010 - -ftdi_layout_init 0x0008 0x001b -ftdi_layout_signal nSRST -oe 0x0020 -data 0x0020 - -#Reset Stretcher logic on FE310 is ~1 second long -#This doesn't apply if you use -# ftdi_set_signal, but still good to document -#adapter_nsrst_delay 1500 - -set _CHIPNAME riscv -jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913 - -set _TARGETNAME $_CHIPNAME.cpu -target create $_TARGETNAME riscv -chain-position $_TARGETNAME -$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1 - -flash bank onboard_spi_flash fespi 0x20000000 0 0 0 $_TARGETNAME -init -#reset -- This type of reset is not implemented yet -if {[ info exists pulse_srst]} { - ftdi_set_signal nSRST 0 - ftdi_set_signal nSRST z - #Wait for the reset stretcher - #It will work without this, but - #will incur lots of delays for later commands. - sleep 1500 -} -halt -#flash protect 0 64 last off diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/platform.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/platform.h deleted file mode 100644 index 806fcfc..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/platform.h +++ /dev/null @@ -1,133 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PLATFORM_H -#define _SIFIVE_PLATFORM_H - -// Some things missing from the official encoding.h -#define MCAUSE_INT 0x80000000 -#define MCAUSE_CAUSE 0x7FFFFFFF - -#include "sifive/const.h" -#include "sifive/devices/aon.h" -#include "sifive/devices/clint.h" -#include "sifive/devices/gpio.h" -#include "sifive/devices/otp.h" -#include "sifive/devices/plic.h" -#include "sifive/devices/prci.h" -#include "sifive/devices/pwm.h" -#include "sifive/devices/spi.h" -#include "sifive/devices/uart.h" - -/**************************************************************************** - * Platform definitions - *****************************************************************************/ - -// Memory map -#define MASKROM_MEM_ADDR _AC(0x00001000,UL) -#define TRAPVEC_TABLE_CTRL_ADDR _AC(0x00001010,UL) -#define OTP_MEM_ADDR _AC(0x00020000,UL) -#define CLINT_CTRL_ADDR _AC(0x02000000,UL) -#define PLIC_CTRL_ADDR _AC(0x0C000000,UL) -#define AON_CTRL_ADDR _AC(0x10000000,UL) -#define PRCI_CTRL_ADDR _AC(0x10008000,UL) -#define OTP_CTRL_ADDR _AC(0x10010000,UL) -#define GPIO_CTRL_ADDR _AC(0x10012000,UL) -#define UART0_CTRL_ADDR _AC(0x10013000,UL) -#define SPI0_CTRL_ADDR _AC(0x10014000,UL) -#define PWM0_CTRL_ADDR _AC(0x10015000,UL) -#define UART1_CTRL_ADDR _AC(0x10023000,UL) -#define SPI1_CTRL_ADDR _AC(0x10024000,UL) -#define PWM1_CTRL_ADDR _AC(0x10025000,UL) -#define SPI2_CTRL_ADDR _AC(0x10034000,UL) -#define PWM2_CTRL_ADDR _AC(0x10035000,UL) -#define SPI0_MEM_ADDR _AC(0x20000000,UL) -#define MEM_CTRL_ADDR _AC(0x80000000,UL) - -// IOF masks -#define IOF0_SPI1_MASK _AC(0x000007FC,UL) -#define SPI11_NUM_SS (4) -#define IOF_SPI1_SS0 (2u) -#define IOF_SPI1_SS1 (8u) -#define IOF_SPI1_SS2 (9u) -#define IOF_SPI1_SS3 (10u) -#define IOF_SPI1_MOSI (3u) -#define IOF_SPI1_MISO (4u) -#define IOF_SPI1_SCK (5u) -#define IOF_SPI1_DQ0 (3u) -#define IOF_SPI1_DQ1 (4u) -#define IOF_SPI1_DQ2 (6u) -#define IOF_SPI1_DQ3 (7u) - -#define IOF0_SPI2_MASK _AC(0xFC000000,UL) -#define SPI2_NUM_SS (1) -#define IOF_SPI2_SS0 (26u) -#define IOF_SPI2_MOSI (27u) -#define IOF_SPI2_MISO (28u) -#define IOF_SPI2_SCK (29u) -#define IOF_SPI2_DQ0 (27u) -#define IOF_SPI2_DQ1 (28u) -#define IOF_SPI2_DQ2 (30u) -#define IOF_SPI2_DQ3 (31u) - -//#define IOF0_I2C_MASK _AC(0x00003000,UL) - -#define IOF0_UART0_MASK _AC(0x00030000, UL) -#define IOF_UART0_RX (16u) -#define IOF_UART0_TX (17u) - -#define IOF0_UART1_MASK _AC(0x03000000, UL) -#define IOF_UART1_RX (24u) -#define IOF_UART1_TX (25u) - -#define IOF1_PWM0_MASK _AC(0x0000000F, UL) -#define IOF1_PWM1_MASK _AC(0x00780000, UL) -#define IOF1_PWM2_MASK _AC(0x00003C00, UL) - -// Interrupt numbers -#define INT_RESERVED 0 -#define INT_WDOGCMP 1 -#define INT_RTCCMP 2 -#define INT_UART0_BASE 3 -#define INT_UART1_BASE 4 -#define INT_SPI0_BASE 5 -#define INT_SPI1_BASE 6 -#define INT_SPI2_BASE 7 -#define INT_GPIO_BASE 8 -#define INT_PWM0_BASE 40 -#define INT_PWM1_BASE 44 -#define INT_PWM2_BASE 48 - -// Helper functions -#define _REG32(p, i) (*(volatile uint32_t *) ((p) + (i))) -#define _REG32P(p, i) ((volatile uint32_t *) ((p) + (i))) -#define AON_REG(offset) _REG32(AON_CTRL_ADDR, offset) -#define CLINT_REG(offset) _REG32(CLINT_CTRL_ADDR, offset) -#define GPIO_REG(offset) _REG32(GPIO_CTRL_ADDR, offset) -#define OTP_REG(offset) _REG32(OTP_CTRL_ADDR, offset) -#define PLIC_REG(offset) _REG32(PLIC_CTRL_ADDR, offset) -#define PRCI_REG(offset) _REG32(PRCI_CTRL_ADDR, offset) -#define PWM0_REG(offset) _REG32(PWM0_CTRL_ADDR, offset) -#define PWM1_REG(offset) _REG32(PWM1_CTRL_ADDR, offset) -#define PWM2_REG(offset) _REG32(PWM2_CTRL_ADDR, offset) -#define SPI0_REG(offset) _REG32(SPI0_CTRL_ADDR, offset) -#define SPI1_REG(offset) _REG32(SPI1_CTRL_ADDR, offset) -#define SPI2_REG(offset) _REG32(SPI2_CTRL_ADDR, offset) -#define UART0_REG(offset) _REG32(UART0_CTRL_ADDR, offset) -#define UART1_REG(offset) _REG32(UART1_CTRL_ADDR, offset) - -// Misc - -#include - -#define NUM_GPIO 32 - -#define PLIC_NUM_INTERRUPTS 52 -#define PLIC_NUM_PRIORITIES 7 - -#include "hifive1.h" - -unsigned long get_cpu_freq(void); -unsigned long get_timer_freq(void); -uint64_t get_timer_value(void); - -#endif /* _SIFIVE_PLATFORM_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/settings.mk b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/settings.mk deleted file mode 100644 index 230fccc..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/freedom-e300-hifive1/settings.mk +++ /dev/null @@ -1,3 +0,0 @@ -# Describes the CPU on this board to the rest of the SDK. -RISCV_ARCH := rv32imac -RISCV_ABI := ilp32 diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/hifive1.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/hifive1.h deleted file mode 100644 index 0db2f0f..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/hifive1.h +++ /dev/null @@ -1,81 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_HIFIVE1_H -#define _SIFIVE_HIFIVE1_H - -#include - -/**************************************************************************** - * GPIO Connections - *****************************************************************************/ - -// These are the GPIO bit offsets for the RGB LED on HiFive1 Board. -// These are also mapped to RGB LEDs on the Freedom E300 Arty -// FPGA -// Dev Kit. - -#define RED_LED_OFFSET 22 -#define GREEN_LED_OFFSET 19 -#define BLUE_LED_OFFSET 21 - -// These are the GPIO bit offsets for the differen digital pins -// on the headers for both the HiFive1 Board and the Freedom E300 Arty FPGA Dev Kit. -#define PIN_0_OFFSET 16 -#define PIN_1_OFFSET 17 -#define PIN_2_OFFSET 18 -#define PIN_3_OFFSET 19 -#define PIN_4_OFFSET 20 -#define PIN_5_OFFSET 21 -#define PIN_6_OFFSET 22 -#define PIN_7_OFFSET 23 -#define PIN_8_OFFSET 0 -#define PIN_9_OFFSET 1 -#define PIN_10_OFFSET 2 -#define PIN_11_OFFSET 3 -#define PIN_12_OFFSET 4 -#define PIN_13_OFFSET 5 -//#define PIN_14_OFFSET 8 //This pin is not connected on either board. -#define PIN_15_OFFSET 9 -#define PIN_16_OFFSET 10 -#define PIN_17_OFFSET 11 -#define PIN_18_OFFSET 12 -#define PIN_19_OFFSET 13 - -// These are *PIN* numbers, not -// GPIO Offset Numbers. -#define PIN_SPI1_SCK (13u) -#define PIN_SPI1_MISO (12u) -#define PIN_SPI1_MOSI (11u) -#define PIN_SPI1_SS0 (10u) -#define PIN_SPI1_SS1 (14u) -#define PIN_SPI1_SS2 (15u) -#define PIN_SPI1_SS3 (16u) - -#define SS_PIN_TO_CS_ID(x) \ - ((x==PIN_SPI1_SS0 ? 0 : \ - (x==PIN_SPI1_SS1 ? 1 : \ - (x==PIN_SPI1_SS2 ? 2 : \ - (x==PIN_SPI1_SS3 ? 3 : \ - -1))))) - - -// These buttons are present only on the Freedom E300 Arty Dev Kit. -#ifdef HAS_BOARD_BUTTONS -#define BUTTON_0_OFFSET 15 -#define BUTTON_1_OFFSET 30 -#define BUTTON_2_OFFSET 31 - -#define INT_DEVICE_BUTTON_0 (INT_GPIO_BASE + BUTTON_0_OFFSET) -#define INT_DEVICE_BUTTON_1 (INT_GPIO_BASE + BUTTON_1_OFFSET) -#define INT_DEVICE_BUTTON_2 (INT_GPIO_BASE + BUTTON_2_OFFSET) - -#endif - -#define HAS_HFXOSC 1 -#define HAS_LFROSC_BYPASS 1 - -#define RTC_FREQ 32768 - -void write_hex(int fd, unsigned long int hex); - -#endif /* _SIFIVE_HIFIVE1_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/start.S b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/start.S deleted file mode 100644 index 4e9f665..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/start.S +++ /dev/null @@ -1,111 +0,0 @@ -// See LICENSE for license details. -#include - -/* This is defined in sifive/platform.h, but that can't be included from - * assembly. */ -#define CLINT_CTRL_ADDR 0x02000000 - - .section .init - .globl _start - .type _start,@function - -_start: - .cfi_startproc - .cfi_undefined ra -.option push -.option norelax - la gp, __global_pointer$ -.option pop - la sp, _sp - -#if defined(ENABLE_SMP) - smp_pause(t0, t1) -#endif - - /* Load data section */ - la a0, _data_lma - la a1, _data - la a2, _edata - bgeu a1, a2, 2f -1: - lw t0, (a0) - sw t0, (a1) - addi a0, a0, 4 - addi a1, a1, 4 - bltu a1, a2, 1b -2: - - /* Clear bss section */ - la a0, __bss_start - la a1, _end - bgeu a0, a1, 2f -1: - sw zero, (a0) - addi a0, a0, 4 - bltu a0, a1, 1b -2: - - /* Call global constructors */ - la a0, __libc_fini_array - call atexit - call __libc_init_array - -#ifndef __riscv_float_abi_soft - /* Enable FPU */ - li t0, MSTATUS_FS - csrs mstatus, t0 - csrr t1, mstatus - and t1, t1, t0 - beqz t1, 1f - fssr x0 -1: -#endif - -#if defined(ENABLE_SMP) - smp_resume(t0, t1) - - csrr a0, mhartid - bnez a0, 2f -#endif - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - /* argc = argv = 0 */ - li a0, 0 - li a1, 0 - call main - tail exit -1: - j 1b - -#if defined(ENABLE_SMP) -2: - la t0, trap_entry - csrw mtvec, t0 - - csrr a0, mhartid - la t1, _sp - slli t0, a0, 10 - sub sp, t1, t0 - - auipc ra, 0 - addi sp, sp, -16 -#if __riscv_xlen == 32 - sw ra, 8(sp) -#else - sd ra, 8(sp) -#endif - - call secondary_main - tail exit - -1: - j 1b -#endif - .cfi_endproc diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/ventry.S b/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/ventry.S deleted file mode 100644 index 5c82c48..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/env/ventry.S +++ /dev/null @@ -1,288 +0,0 @@ -// See LICENSE for license details - -#ifndef VENTRY_S -#define VENTRY_S - -#include "encoding.h" -#include "sifive/bits.h" - -#only save caller registers -.macro TRAP_ENTRY - addi sp, sp, -16*REGBYTES - - STORE x1, 0*REGBYTES(sp) - STORE x5, 1*REGBYTES(sp) - STORE x6, 2*REGBYTES(sp) - STORE x7, 3*REGBYTES(sp) - STORE x10, 4*REGBYTES(sp) - STORE x11, 5*REGBYTES(sp) - STORE x12, 6*REGBYTES(sp) - STORE x13, 7*REGBYTES(sp) - STORE x14, 8*REGBYTES(sp) - STORE x15, 9*REGBYTES(sp) - STORE x16, 10*REGBYTES(sp) - STORE x17, 11*REGBYTES(sp) - STORE x28, 12*REGBYTES(sp) - STORE x29, 13*REGBYTES(sp) - STORE x30, 14*REGBYTES(sp) - STORE x31, 15*REGBYTES(sp) -.endm - -#restore caller registers -.macro TRAP_EXIT -# Remain in M-mode after mret - li t0, MSTATUS_MPP - csrs mstatus, t0 - - LOAD x1, 0*REGBYTES(sp) - LOAD x5, 1*REGBYTES(sp) - LOAD x6, 2*REGBYTES(sp) - LOAD x7, 3*REGBYTES(sp) - LOAD x10, 4*REGBYTES(sp) - LOAD x11, 5*REGBYTES(sp) - LOAD x12, 6*REGBYTES(sp) - LOAD x13, 7*REGBYTES(sp) - LOAD x14, 8*REGBYTES(sp) - LOAD x15, 9*REGBYTES(sp) - LOAD x16, 10*REGBYTES(sp) - LOAD x17, 11*REGBYTES(sp) - LOAD x28, 12*REGBYTES(sp) - LOAD x29, 13*REGBYTES(sp) - LOAD x30, 14*REGBYTES(sp) - LOAD x31, 15*REGBYTES(sp) - - addi sp, sp, 16*REGBYTES - mret -.endm - - - -#Vector table for E31/E51 - - .section .text.entry - .align 8 - .global vtrap_entry -vtrap_entry: - j sync_trap - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmsi_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmti_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vmei_Handler - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j reserved - .align 2 - j vlip_Handler0 - .align 2 - j vlip_Handler1 - .align 2 - j vlip_Handler2 - .align 2 - j vlip_Handler3 - .align 2 - j vlip_Handler4 - .align 2 - j vlip_Handler5 - .align 2 - j vlip_Handler6 - .align 2 - j vlip_Handler7 - .align 2 - j vlip_Handler8 - .align 2 - j vlip_Handler9 - .align 2 - j vlip_Handler10 - .align 2 - j vlip_Handler11 - .align 2 - j vlip_Handler12 - .align 2 - j vlip_Handler13 - .align 2 - j vlip_Handler14 - .align 2 - j vlip_Handler15 - -#synchronous trap -sync_trap: - TRAP_ENTRY - jal handle_sync_trap - TRAP_EXIT - -#Machine Software Interrupt -vmsi_Handler: - TRAP_ENTRY - jal reserved - TRAP_EXIT - -#Machine Timer Interrupt -vmti_Handler: - TRAP_ENTRY - jal handle_m_time_interrupt - TRAP_EXIT - -#Machine External Interrupt -vmei_Handler: - TRAP_ENTRY - jal handle_m_external_interrupt - TRAP_EXIT - -#LIP0 -vlip_Handler0: - TRAP_ENTRY - jal handle_local_interrupt0 - TRAP_EXIT - -#LIP1 -vlip_Handler1: - TRAP_ENTRY - jal handle_local_interrupt1 - TRAP_EXIT - -#LIP2 -vlip_Handler2: - TRAP_ENTRY - jal handle_local_interrupt2 - TRAP_EXIT - -#LIP3 -vlip_Handler3: - TRAP_ENTRY - jal handle_local_interrupt3 - TRAP_EXIT - -#LIP4 -vlip_Handler4: - TRAP_ENTRY - jal handle_local_interrupt4 - TRAP_EXIT - -#LIP5 -vlip_Handler5: - TRAP_ENTRY - jal handle_local_interrupt5 - TRAP_EXIT - -#LIP6 -vlip_Handler6: - TRAP_ENTRY - jal handle_local_interrupt6 - TRAP_EXIT - -#LIP7 -vlip_Handler7: - TRAP_ENTRY - jal handle_local_interrupt7 - TRAP_EXIT - -#LIP8 -vlip_Handler8: - TRAP_ENTRY - jal handle_local_interrupt8 - TRAP_EXIT - -#LIP9 -vlip_Handler9: - TRAP_ENTRY - jal handle_local_interrupt9 - TRAP_EXIT - -#LIP10 -vlip_Handler10: - TRAP_ENTRY - jal handle_local_interrupt10 - TRAP_EXIT - -#LIP11 -vlip_Handler11: - TRAP_ENTRY - jal handle_local_interrupt11 - TRAP_EXIT - -#LIP12 -vlip_Handler12: - TRAP_ENTRY - jal handle_local_interrupt12 - TRAP_EXIT - -#LIP13 -vlip_Handler13: - TRAP_ENTRY - jal handle_local_interrupt13 - TRAP_EXIT - -#LIP14 -vlip_Handler14: - TRAP_ENTRY - jal handle_local_interrupt14 - TRAP_EXIT - -#LIP15 -vlip_Handler15: - TRAP_ENTRY - jal handle_local_interrupt15 - TRAP_EXIT - -#unimplemented ISRs trap here -.weak reserved -reserved: -.weak handle_local_interrupt0 -handle_local_interrupt0: -.weak handle_local_interrupt1 -handle_local_interrupt1: -.weak handle_local_interrupt2 -handle_local_interrupt2: -.weak handle_local_interrupt3 -handle_local_interrupt3: -.weak handle_local_interrupt4 -handle_local_interrupt4: -.weak handle_local_interrupt5 -handle_local_interrupt5: -.weak handle_local_interrupt6 -handle_local_interrupt6: -.weak handle_local_interrupt7 -handle_local_interrupt7: -.weak handle_local_interrupt8 -handle_local_interrupt8: -.weak handle_local_interrupt9 -handle_local_interrupt9: -.weak handle_local_interrupt10 -handle_local_interrupt10: -.weak handle_local_interrupt11 -handle_local_interrupt11: -.weak handle_local_interrupt12 -handle_local_interrupt12: -.weak handle_local_interrupt13 -handle_local_interrupt13: -.weak handle_local_interrupt14 -handle_local_interrupt14: -.weak handle_local_interrupt15 -handle_local_interrupt15: -1: - j 1b - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/bits.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/bits.h deleted file mode 100644 index bfe656f..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/bits.h +++ /dev/null @@ -1,36 +0,0 @@ -// See LICENSE for license details. -#ifndef _RISCV_BITS_H -#define _RISCV_BITS_H - -#define likely(x) __builtin_expect((x), 1) -#define unlikely(x) __builtin_expect((x), 0) - -#define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) -#define ROUNDDOWN(a, b) ((a)/(b)*(b)) - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) - -#define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) -#define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) - -#define STR(x) XSTR(x) -#define XSTR(x) #x - -#if __riscv_xlen == 64 -# define SLL32 sllw -# define STORE sd -# define LOAD ld -# define LWU lwu -# define LOG_REGBYTES 3 -#else -# define SLL32 sll -# define STORE sw -# define LOAD lw -# define LWU lw -# define LOG_REGBYTES 2 -#endif -#define REGBYTES (1 << LOG_REGBYTES) - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/const.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/const.h deleted file mode 100644 index 8dcffbb..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/const.h +++ /dev/null @@ -1,18 +0,0 @@ -// See LICENSE for license details. -/* Derived from */ - -#ifndef _SIFIVE_CONST_H -#define _SIFIVE_CONST_H - -#ifdef __ASSEMBLER__ -#define _AC(X,Y) X -#define _AT(T,X) X -#else -#define _AC(X,Y) (X##Y) -#define _AT(T,X) ((T)(X)) -#endif /* !__ASSEMBLER__*/ - -#define _BITUL(x) (_AC(1,UL) << (x)) -#define _BITULL(x) (_AC(1,ULL) << (x)) - -#endif /* _SIFIVE_CONST_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/aon.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/aon.h deleted file mode 100644 index 63f1db3..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/aon.h +++ /dev/null @@ -1,88 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_AON_H -#define _SIFIVE_AON_H - -/* Register offsets */ - -#define AON_WDOGCFG 0x000 -#define AON_WDOGCOUNT 0x008 -#define AON_WDOGS 0x010 -#define AON_WDOGFEED 0x018 -#define AON_WDOGKEY 0x01C -#define AON_WDOGCMP 0x020 - -#define AON_RTCCFG 0x040 -#define AON_RTCLO 0x048 -#define AON_RTCHI 0x04C -#define AON_RTCS 0x050 -#define AON_RTCCMP 0x060 - -#define AON_BACKUP0 0x080 -#define AON_BACKUP1 0x084 -#define AON_BACKUP2 0x088 -#define AON_BACKUP3 0x08C -#define AON_BACKUP4 0x090 -#define AON_BACKUP5 0x094 -#define AON_BACKUP6 0x098 -#define AON_BACKUP7 0x09C -#define AON_BACKUP8 0x0A0 -#define AON_BACKUP9 0x0A4 -#define AON_BACKUP10 0x0A8 -#define AON_BACKUP11 0x0AC -#define AON_BACKUP12 0x0B0 -#define AON_BACKUP13 0x0B4 -#define AON_BACKUP14 0x0B8 -#define AON_BACKUP15 0x0BC - -#define AON_PMUWAKEUPI0 0x100 -#define AON_PMUWAKEUPI1 0x104 -#define AON_PMUWAKEUPI2 0x108 -#define AON_PMUWAKEUPI3 0x10C -#define AON_PMUWAKEUPI4 0x110 -#define AON_PMUWAKEUPI5 0x114 -#define AON_PMUWAKEUPI6 0x118 -#define AON_PMUWAKEUPI7 0x11C -#define AON_PMUSLEEPI0 0x120 -#define AON_PMUSLEEPI1 0x124 -#define AON_PMUSLEEPI2 0x128 -#define AON_PMUSLEEPI3 0x12C -#define AON_PMUSLEEPI4 0x130 -#define AON_PMUSLEEPI5 0x134 -#define AON_PMUSLEEPI6 0x138 -#define AON_PMUSLEEPI7 0x13C -#define AON_PMUIE 0x140 -#define AON_PMUCAUSE 0x144 -#define AON_PMUSLEEP 0x148 -#define AON_PMUKEY 0x14C - -#define AON_LFROSC 0x070 -/* Constants */ - -#define AON_WDOGKEY_VALUE 0x51F15E -#define AON_WDOGFEED_VALUE 0xD09F00D - -#define AON_WDOGCFG_SCALE 0x0000000F -#define AON_WDOGCFG_RSTEN 0x00000100 -#define AON_WDOGCFG_ZEROCMP 0x00000200 -#define AON_WDOGCFG_ENALWAYS 0x00001000 -#define AON_WDOGCFG_ENCOREAWAKE 0x00002000 -#define AON_WDOGCFG_CMPIP 0x10000000 - -#define AON_RTCCFG_SCALE 0x0000000F -#define AON_RTCCFG_ENALWAYS 0x00001000 -#define AON_RTCCFG_CMPIP 0x10000000 - -#define AON_WAKEUPCAUSE_RESET 0x00 -#define AON_WAKEUPCAUSE_RTC 0x01 -#define AON_WAKEUPCAUSE_DWAKEUP 0x02 -#define AON_WAKEUPCAUSE_AWAKEUP 0x03 - -#define AON_RESETCAUSE_POWERON 0x0000 -#define AON_RESETCAUSE_EXTERNAL 0x0100 -#define AON_RESETCAUSE_WATCHDOG 0x0200 - -#define AON_PMUCAUSE_WAKEUPCAUSE 0x00FF -#define AON_PMUCAUSE_RESETCAUSE 0xFF00 - -#endif /* _SIFIVE_AON_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clic.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clic.h deleted file mode 100644 index e8dc2df..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clic.h +++ /dev/null @@ -1,30 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_CLIC_H -#define _SIFIVE_CLIC_H - -#define CLIC_HART0 0x00800000 -#define CLIC_MSIP 0x0000 -#define CLIC_MSIP_size 0x4 -#define CLIC_MTIMECMP 0x4000 -#define CLIC_MTIMECMP_size 0x8 -#define CLIC_MTIME 0xBFF8 -#define CLIC_MTIME_size 0x8 - -#define CLIC_INTIP 0x000 -#define CLIC_INTIE 0x400 -#define CLIC_INTCFG 0x800 -#define CLIC_CFG 0xc00 - -// These interrupt IDs are consistent across old and new mtvec modes -#define SSIPID 1 -#define MSIPID 3 -#define STIPID 5 -#define MTIPID 7 -#define SEIPID 9 -#define MEIPID 11 -#define CSIPID 12 -#define LOCALINTIDBASE 16 - - -#endif /* _SIFIVE_CLIC_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clint.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clint.h deleted file mode 100644 index cd3e0c7..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/clint.h +++ /dev/null @@ -1,14 +0,0 @@ -// See LICENSE for license details - -#ifndef _SIFIVE_CLINT_H -#define _SIFIVE_CLINT_H - - -#define CLINT_MSIP 0x0000 -#define CLINT_MSIP_size 0x4 -#define CLINT_MTIMECMP 0x4000 -#define CLINT_MTIMECMP_size 0x8 -#define CLINT_MTIME 0xBFF8 -#define CLINT_MTIME_size 0x8 - -#endif /* _SIFIVE_CLINT_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/gpio.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/gpio.h deleted file mode 100644 index f7f0acb..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/gpio.h +++ /dev/null @@ -1,24 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_GPIO_H -#define _SIFIVE_GPIO_H - -#define GPIO_INPUT_VAL (0x00) -#define GPIO_INPUT_EN (0x04) -#define GPIO_OUTPUT_EN (0x08) -#define GPIO_OUTPUT_VAL (0x0C) -#define GPIO_PULLUP_EN (0x10) -#define GPIO_DRIVE (0x14) -#define GPIO_RISE_IE (0x18) -#define GPIO_RISE_IP (0x1C) -#define GPIO_FALL_IE (0x20) -#define GPIO_FALL_IP (0x24) -#define GPIO_HIGH_IE (0x28) -#define GPIO_HIGH_IP (0x2C) -#define GPIO_LOW_IE (0x30) -#define GPIO_LOW_IP (0x34) -#define GPIO_IOF_EN (0x38) -#define GPIO_IOF_SEL (0x3C) -#define GPIO_OUTPUT_XOR (0x40) - -#endif /* _SIFIVE_GPIO_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/otp.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/otp.h deleted file mode 100644 index 93833e2..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/otp.h +++ /dev/null @@ -1,23 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_OTP_H -#define _SIFIVE_OTP_H - -/* Register offsets */ - -#define OTP_LOCK 0x00 -#define OTP_CK 0x04 -#define OTP_OE 0x08 -#define OTP_SEL 0x0C -#define OTP_WE 0x10 -#define OTP_MR 0x14 -#define OTP_MRR 0x18 -#define OTP_MPP 0x1C -#define OTP_VRREN 0x20 -#define OTP_VPPEN 0x24 -#define OTP_A 0x28 -#define OTP_D 0x2C -#define OTP_Q 0x30 -#define OTP_READ_TIMINGS 0x34 - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/plic.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/plic.h deleted file mode 100644 index e1ca5d6..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/plic.h +++ /dev/null @@ -1,31 +0,0 @@ -// See LICENSE for license details. - -#ifndef PLIC_H -#define PLIC_H - -#include - -// 32 bits per source -#define PLIC_PRIORITY_OFFSET _AC(0x0000,UL) -#define PLIC_PRIORITY_SHIFT_PER_SOURCE 2 -// 1 bit per source (1 address) -#define PLIC_PENDING_OFFSET _AC(0x1000,UL) -#define PLIC_PENDING_SHIFT_PER_SOURCE 0 - -//0x80 per target -#define PLIC_ENABLE_OFFSET _AC(0x2000,UL) -#define PLIC_ENABLE_SHIFT_PER_TARGET 7 - - -#define PLIC_THRESHOLD_OFFSET _AC(0x200000,UL) -#define PLIC_CLAIM_OFFSET _AC(0x200004,UL) -#define PLIC_THRESHOLD_SHIFT_PER_TARGET 12 -#define PLIC_CLAIM_SHIFT_PER_TARGET 12 - -#define PLIC_MAX_SOURCE 1023 -#define PLIC_SOURCE_MASK 0x3FF - -#define PLIC_MAX_TARGET 15871 -#define PLIC_TARGET_MASK 0x3FFF - -#endif /* PLIC_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/prci.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/prci.h deleted file mode 100644 index 1a3de58..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/prci.h +++ /dev/null @@ -1,56 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PRCI_H -#define _SIFIVE_PRCI_H - -/* Register offsets */ - -#define PRCI_HFROSCCFG (0x0000) -#define PRCI_HFXOSCCFG (0x0004) -#define PRCI_PLLCFG (0x0008) -#define PRCI_PLLDIV (0x000C) -#define PRCI_PROCMONCFG (0x00F0) - -/* Fields */ -#define ROSC_DIV(x) (((x) & 0x2F) << 0 ) -#define ROSC_TRIM(x) (((x) & 0x1F) << 16) -#define ROSC_EN(x) (((x) & 0x1 ) << 30) -#define ROSC_RDY(x) (((x) & 0x1 ) << 31) - -#define XOSC_EN(x) (((x) & 0x1) << 30) -#define XOSC_RDY(x) (((x) & 0x1) << 31) - -#define PLL_R(x) (((x) & 0x7) << 0) -// single reserved bit for F LSB. -#define PLL_F(x) (((x) & 0x3F) << 4) -#define PLL_Q(x) (((x) & 0x3) << 10) -#define PLL_SEL(x) (((x) & 0x1) << 16) -#define PLL_REFSEL(x) (((x) & 0x1) << 17) -#define PLL_BYPASS(x) (((x) & 0x1) << 18) -#define PLL_LOCK(x) (((x) & 0x1) << 31) - -#define PLL_R_default 0x1 -#define PLL_F_default 0x1F -#define PLL_Q_default 0x3 - -#define PLL_REFSEL_HFROSC 0x0 -#define PLL_REFSEL_HFXOSC 0x1 - -#define PLL_SEL_HFROSC 0x0 -#define PLL_SEL_PLL 0x1 - -#define PLL_FINAL_DIV(x) (((x) & 0x3F) << 0) -#define PLL_FINAL_DIV_BY_1(x) (((x) & 0x1 ) << 8) - -#define PROCMON_DIV(x) (((x) & 0x1F) << 0) -#define PROCMON_TRIM(x) (((x) & 0x1F) << 8) -#define PROCMON_EN(x) (((x) & 0x1) << 16) -#define PROCMON_SEL(x) (((x) & 0x3) << 24) -#define PROCMON_NT_EN(x) (((x) & 0x1) << 28) - -#define PROCMON_SEL_HFCLK 0 -#define PROCMON_SEL_HFXOSCIN 1 -#define PROCMON_SEL_PLLOUTDIV 2 -#define PROCMON_SEL_PROCMON 3 - -#endif // _SIFIVE_PRCI_H diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/pwm.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/pwm.h deleted file mode 100644 index 067889a..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/pwm.h +++ /dev/null @@ -1,37 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_PWM_H -#define _SIFIVE_PWM_H - -/* Register offsets */ - -#define PWM_CFG 0x00 -#define PWM_COUNT 0x08 -#define PWM_S 0x10 -#define PWM_CMP0 0x20 -#define PWM_CMP1 0x24 -#define PWM_CMP2 0x28 -#define PWM_CMP3 0x2C - -/* Constants */ - -#define PWM_CFG_SCALE 0x0000000F -#define PWM_CFG_STICKY 0x00000100 -#define PWM_CFG_ZEROCMP 0x00000200 -#define PWM_CFG_DEGLITCH 0x00000400 -#define PWM_CFG_ENALWAYS 0x00001000 -#define PWM_CFG_ONESHOT 0x00002000 -#define PWM_CFG_CMP0CENTER 0x00010000 -#define PWM_CFG_CMP1CENTER 0x00020000 -#define PWM_CFG_CMP2CENTER 0x00040000 -#define PWM_CFG_CMP3CENTER 0x00080000 -#define PWM_CFG_CMP0GANG 0x01000000 -#define PWM_CFG_CMP1GANG 0x02000000 -#define PWM_CFG_CMP2GANG 0x04000000 -#define PWM_CFG_CMP3GANG 0x08000000 -#define PWM_CFG_CMP0IP 0x10000000 -#define PWM_CFG_CMP1IP 0x20000000 -#define PWM_CFG_CMP2IP 0x40000000 -#define PWM_CFG_CMP3IP 0x80000000 - -#endif /* _SIFIVE_PWM_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/spi.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/spi.h deleted file mode 100644 index 80ef345..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/spi.h +++ /dev/null @@ -1,80 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_SPI_H -#define _SIFIVE_SPI_H - -/* Register offsets */ - -#define SPI_REG_SCKDIV 0x00 -#define SPI_REG_SCKMODE 0x04 -#define SPI_REG_CSID 0x10 -#define SPI_REG_CSDEF 0x14 -#define SPI_REG_CSMODE 0x18 - -#define SPI_REG_DCSSCK 0x28 -#define SPI_REG_DSCKCS 0x2a -#define SPI_REG_DINTERCS 0x2c -#define SPI_REG_DINTERXFR 0x2e - -#define SPI_REG_FMT 0x40 -#define SPI_REG_TXFIFO 0x48 -#define SPI_REG_RXFIFO 0x4c -#define SPI_REG_TXCTRL 0x50 -#define SPI_REG_RXCTRL 0x54 - -#define SPI_REG_FCTRL 0x60 -#define SPI_REG_FFMT 0x64 - -#define SPI_REG_IE 0x70 -#define SPI_REG_IP 0x74 - -/* Fields */ - -#define SPI_SCK_PHA 0x1 -#define SPI_SCK_POL 0x2 - -#define SPI_FMT_PROTO(x) ((x) & 0x3) -#define SPI_FMT_ENDIAN(x) (((x) & 0x1) << 2) -#define SPI_FMT_DIR(x) (((x) & 0x1) << 3) -#define SPI_FMT_LEN(x) (((x) & 0xf) << 16) - -/* TXCTRL register */ -#define SPI_TXWM(x) ((x) & 0xffff) -/* RXCTRL register */ -#define SPI_RXWM(x) ((x) & 0xffff) - -#define SPI_IP_TXWM 0x1 -#define SPI_IP_RXWM 0x2 - -#define SPI_FCTRL_EN 0x1 - -#define SPI_INSN_CMD_EN 0x1 -#define SPI_INSN_ADDR_LEN(x) (((x) & 0x7) << 1) -#define SPI_INSN_PAD_CNT(x) (((x) & 0xf) << 4) -#define SPI_INSN_CMD_PROTO(x) (((x) & 0x3) << 8) -#define SPI_INSN_ADDR_PROTO(x) (((x) & 0x3) << 10) -#define SPI_INSN_DATA_PROTO(x) (((x) & 0x3) << 12) -#define SPI_INSN_CMD_CODE(x) (((x) & 0xff) << 16) -#define SPI_INSN_PAD_CODE(x) (((x) & 0xff) << 24) - -#define SPI_TXFIFO_FULL (1 << 31) -#define SPI_RXFIFO_EMPTY (1 << 31) - -/* Values */ - -#define SPI_CSMODE_AUTO 0 -#define SPI_CSMODE_HOLD 2 -#define SPI_CSMODE_OFF 3 - -#define SPI_DIR_RX 0 -#define SPI_DIR_TX 1 - -#define SPI_PROTO_S 0 -#define SPI_PROTO_D 1 -#define SPI_PROTO_Q 2 - -#define SPI_ENDIAN_MSB 0 -#define SPI_ENDIAN_LSB 1 - - -#endif /* _SIFIVE_SPI_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/uart.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/uart.h deleted file mode 100644 index 71bea6f..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/devices/uart.h +++ /dev/null @@ -1,27 +0,0 @@ -// See LICENSE for license details. - -#ifndef _SIFIVE_UART_H -#define _SIFIVE_UART_H - -/* Register offsets */ -#define UART_REG_TXFIFO 0x00 -#define UART_REG_RXFIFO 0x04 -#define UART_REG_TXCTRL 0x08 -#define UART_REG_RXCTRL 0x0c -#define UART_REG_IE 0x10 -#define UART_REG_IP 0x14 -#define UART_REG_DIV 0x18 - -/* TXCTRL register */ -#define UART_TXEN 0x1 -#define UART_TXWM(x) (((x) & 0xffff) << 16) - -/* RXCTRL register */ -#define UART_RXEN 0x1 -#define UART_RXWM(x) (((x) & 0xffff) << 16) - -/* IP register */ -#define UART_IP_TXWM 0x1 -#define UART_IP_RXWM 0x2 - -#endif /* _SIFIVE_UART_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/sections.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/sections.h deleted file mode 100644 index 6e1f051..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/sections.h +++ /dev/null @@ -1,17 +0,0 @@ -// See LICENSE for license details. -#ifndef _SECTIONS_H -#define _SECTIONS_H - -extern unsigned char _rom[]; -extern unsigned char _rom_end[]; - -extern unsigned char _ram[]; -extern unsigned char _ram_end[]; - -extern unsigned char _ftext[]; -extern unsigned char _etext[]; -extern unsigned char _fbss[]; -extern unsigned char _ebss[]; -extern unsigned char _end[]; - -#endif /* _SECTIONS_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/smp.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/smp.h deleted file mode 100644 index 8e34388..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/include/sifive/smp.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef SIFIVE_SMP -#define SIFIVE_SMP - -// The maximum number of HARTs this code supports -#ifndef MAX_HARTS -#define MAX_HARTS 32 -#endif -#define CLINT_END_HART_IPI CLINT_CTRL_ADDR + (MAX_HARTS*4) - -// The hart that non-SMP tests should run on -#ifndef NONSMP_HART -#define NONSMP_HART 0 -#endif - -/* If your test cannot handle multiple-threads, use this: - * smp_disable(reg1) - */ -#define smp_disable(reg1, reg2) \ - csrr reg1, mhartid ;\ - li reg2, NONSMP_HART ;\ - beq reg1, reg2, hart0_entry ;\ -42: ;\ - wfi ;\ - j 42b ;\ -hart0_entry: - -/* If your test needs to temporarily block multiple-threads, do this: - * smp_pause(reg1, reg2) - * ... single-threaded work ... - * smp_resume(reg1, reg2) - * ... multi-threaded work ... - */ - -#define smp_pause(reg1, reg2) \ - li reg2, 0x8 ;\ - csrw mie, reg2 ;\ - csrr reg2, mhartid ;\ - bnez reg2, 42f - -#define smp_resume(reg1, reg2) \ - li reg1, CLINT_CTRL_ADDR ;\ -41: ;\ - li reg2, 1 ;\ - sw reg2, 0(reg1) ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b ;\ -42: ;\ - wfi ;\ - csrr reg2, mip ;\ - andi reg2, reg2, 0x8 ;\ - beqz reg2, 42b ;\ - li reg1, CLINT_CTRL_ADDR ;\ - csrr reg2, mhartid ;\ - slli reg2, reg2, 2 ;\ - add reg2, reg2, reg1 ;\ - sw zero, 0(reg2) ;\ -41: ;\ - lw reg2, 0(reg1) ;\ - bnez reg2, 41b ;\ - addi reg1, reg1, 4 ;\ - li reg2, CLINT_END_HART_IPI ;\ - blt reg1, reg2, 41b - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/libwrap.mk b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/libwrap.mk deleted file mode 100644 index 71bba3d..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/libwrap.mk +++ /dev/null @@ -1,56 +0,0 @@ -# See LICENSE for license details. - -ifndef _SIFIVE_MK_LIBWRAP -_SIFIVE_MK_LIBWRAP := # defined - -LIBWRAP_DIR := $(dir $(lastword $(MAKEFILE_LIST))) -LIBWRAP_DIR := $(LIBWRAP_DIR:/=) - -LIBWRAP_SRCS := \ - stdlib/malloc.c \ - sys/open.c \ - sys/lseek.c \ - sys/read.c \ - sys/write.c \ - sys/fstat.c \ - sys/stat.c \ - sys/close.c \ - sys/link.c \ - sys/unlink.c \ - sys/execve.c \ - sys/fork.c \ - sys/getpid.c \ - sys/kill.c \ - sys/wait.c \ - sys/isatty.c \ - sys/times.c \ - sys/sbrk.c \ - sys/_exit.c \ - sys/puts.c \ - misc/write_hex.c - -LIBWRAP_SRCS := $(foreach f,$(LIBWRAP_SRCS),$(LIBWRAP_DIR)/$(f)) -LIBWRAP_OBJS := $(LIBWRAP_SRCS:.c=.o) - -LIBWRAP_SYMS := malloc free \ - open lseek read write fstat stat close link unlink \ - execve fork getpid kill wait \ - isatty times sbrk _exit puts - -LIBWRAP := libwrap.a - -LINK_DEPS += $(LIBWRAP) - -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=$(s)) -LDFLAGS += $(foreach s,$(LIBWRAP_SYMS),-Wl,--wrap=_$(s)) -LDFLAGS += -L. -Wl,--start-group -lwrap -lc -Wl,--end-group - -CLEAN_OBJS += $(LIBWRAP_OBJS) - -$(LIBWRAP_OBJS): %.o: %.c $(HEADERS) - $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< - -$(LIBWRAP): $(LIBWRAP_OBJS) - $(AR) rcs $@ $^ - -endif # _SIFIVE_MK_LIBWRAP diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/misc/write_hex.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/misc/write_hex.c deleted file mode 100644 index a35ad7a..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/misc/write_hex.c +++ /dev/null @@ -1,19 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "platform.h" - -void write_hex(int fd, unsigned long int hex) -{ - uint8_t ii; - uint8_t jj; - char towrite; - write(fd , "0x", 2); - for (ii = sizeof(unsigned long int) * 2 ; ii > 0; ii--) { - jj = ii - 1; - uint8_t digit = ((hex & (0xF << (jj*4))) >> (jj*4)); - towrite = digit < 0xA ? ('0' + digit) : ('A' + (digit - 0xA)); - write(fd, &towrite, 1); - } -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/stdlib/malloc.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/stdlib/malloc.c deleted file mode 100644 index 8f4f432..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/stdlib/malloc.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE for license details. */ - -/* These functions are intended for embedded RV32 systems and are - obviously incorrect in general. */ - -void* __wrap_malloc(unsigned long sz) -{ - extern void* sbrk(long); - void* res = sbrk(sz); - if ((long)res == -1) - return 0; - return res; -} - -void __wrap_free(void* ptr) -{ -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/_exit.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/_exit.c deleted file mode 100644 index 011464f..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/_exit.c +++ /dev/null @@ -1,17 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "platform.h" -#include "weak_under_alias.h" - -void __wrap_exit(int code) -{ - const char message[] = "\nProgam has exited with code:"; - - write(STDERR_FILENO, message, sizeof(message) - 1); - write_hex(STDERR_FILENO, code); - write(STDERR_FILENO, "\n", 1); - - for (;;); -} -weak_under_alias(exit); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/close.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/close.c deleted file mode 100644 index 199fe51..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/close.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_close(int fd) -{ - return _stub(EBADF); -} -weak_under_alias(close); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/execve.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/execve.c deleted file mode 100644 index f7be25a..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/execve.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_execve(const char* name, char* const argv[], char* const env[]) -{ - return _stub(ENOMEM); -} -weak_under_alias(execve); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fork.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fork.c deleted file mode 100644 index 13a3e65..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fork.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int fork(void) -{ - return _stub(EAGAIN); -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fstat.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fstat.c deleted file mode 100644 index ff82bf9..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/fstat.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_fstat(int fd, struct stat* st) -{ - if (isatty(fd)) { - st->st_mode = S_IFCHR; - return 0; - } - - return _stub(EBADF); -} -weak_under_alias(fstat); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/getpid.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/getpid.c deleted file mode 100644 index 195fbec..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/getpid.c +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE of license details. */ -#include "weak_under_alias.h" - -int __wrap_getpid(void) -{ - return 1; -} -weak_under_alias(getpid); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/isatty.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/isatty.c deleted file mode 100644 index 7bb82ab..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/isatty.c +++ /dev/null @@ -1,13 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -int __wrap_isatty(int fd) -{ - if (fd == STDOUT_FILENO || fd == STDERR_FILENO) - return 1; - - return 0; -} -weak_under_alias(isatty); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/kill.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/kill.c deleted file mode 100644 index 18b9bd4..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/kill.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_kill(int pid, int sig) -{ - return _stub(EINVAL); -} -weak_under_alias(kill); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/link.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/link.c deleted file mode 100644 index 0cad551..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/link.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_link(const char *old_name, const char *new_name) -{ - return _stub(EMLINK); -} -weak_under_alias(link); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/lseek.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/lseek.c deleted file mode 100644 index 4131449..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/lseek.c +++ /dev/null @@ -1,16 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -off_t __wrap_lseek(int fd, off_t ptr, int dir) -{ - if (isatty(fd)) - return 0; - - return _stub(EBADF); -} -weak_under_alias(lseek); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/open.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/open.c deleted file mode 100644 index c61415a..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/open.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_open(const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(open); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/openat.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/openat.c deleted file mode 100644 index 227c956..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/openat.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_openat(int dirfd, const char* name, int flags, int mode) -{ - return _stub(ENOENT); -} -weak_under_alias(openat); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/puts.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/puts.c deleted file mode 100644 index 50d6437..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/puts.c +++ /dev/null @@ -1,28 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_puts(const char *s) -{ - while (*s != '\0') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = *s; - - if (*s == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - - ++s; - } - - return 0; -} -weak_under_alias(puts); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/read.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/read.c deleted file mode 100644 index 3226cdb..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/read.c +++ /dev/null @@ -1,32 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_read(int fd, void* ptr, size_t len) -{ - uint8_t * current = (uint8_t *)ptr; - volatile uint32_t * uart_rx = (uint32_t *)(UART0_CTRL_ADDR + UART_REG_RXFIFO); - volatile uint8_t * uart_rx_cnt = (uint8_t *)(UART0_CTRL_ADDR + UART_REG_RXCTRL + 2); - - ssize_t result = 0; - - if (isatty(fd)) { - for (current = (uint8_t *)ptr; - (current < ((uint8_t *)ptr) + len) && (*uart_rx_cnt > 0); - current ++) { - *current = *uart_rx; - result++; - } - return result; - } - - return _stub(EBADF); -} -weak_under_alias(read); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/sbrk.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/sbrk.c deleted file mode 100644 index 12170b4..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/sbrk.c +++ /dev/null @@ -1,18 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "weak_under_alias.h" - -void *__wrap_sbrk(ptrdiff_t incr) -{ - extern char _end[]; - extern char _heap_end[]; - static char *curbrk = _end; - - if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) - return NULL - 1; - - curbrk += incr; - return curbrk - incr; -} -weak_under_alias(sbrk); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stat.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stat.c deleted file mode 100644 index 1576ca1..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stat.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_stat(const char* file, struct stat* st) -{ - return _stub(EACCES); -} -weak_under_alias(stat); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stub.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stub.h deleted file mode 100644 index fb5e5be..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/stub.h +++ /dev/null @@ -1,10 +0,0 @@ -/* See LICENSE of license details. */ -#ifndef _SIFIVE_SYS_STUB_H -#define _SIFIVE_SYS_STUB_H - -static inline int _stub(int err) -{ - return -1; -} - -#endif /* _SIFIVE_SYS_STUB_H */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/times.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/times.c deleted file mode 100644 index 55969a7..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/times.c +++ /dev/null @@ -1,12 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include "stub.h" -#include "weak_under_alias.h" - -clock_t __wrap_times(struct tms* buf) -{ - return _stub(EACCES); -} -weak_under_alias(times); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/unlink.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/unlink.c deleted file mode 100644 index 09f4da7..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/unlink.c +++ /dev/null @@ -1,11 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" -#include "weak_under_alias.h" - -int __wrap_unlink(const char* name) -{ - return _stub(ENOENT); -} -weak_under_alias(unlink); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/wait.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/wait.c deleted file mode 100644 index ea3225b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/wait.c +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include "stub.h" - -int wait(int* status) -{ - return _stub(ECHILD); -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/weak_under_alias.h b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/weak_under_alias.h deleted file mode 100644 index 7629353..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/weak_under_alias.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H -#define _BSP_LIBWRAP_WEAK_UNDER_ALIAS_H - -#define weak_under_alias(name) \ - extern __typeof (__wrap_##name) __wrap__##name __attribute__ ((weak, alias ("__wrap_"#name))) - -#endif diff --git a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/write.c b/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/write.c deleted file mode 100644 index b1e9a7e..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/bsp/libwrap/sys/write.c +++ /dev/null @@ -1,31 +0,0 @@ -/* See LICENSE of license details. */ - -#include -#include -#include -#include - -#include "platform.h" -#include "stub.h" -#include "weak_under_alias.h" - -ssize_t __wrap_write(int fd, const void* ptr, size_t len) -{ - const uint8_t * current = (const char *)ptr; - - if (isatty(fd)) { - for (size_t jj = 0; jj < len; jj++) { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = current[jj]; - - if (current[jj] == '\n') { - while (UART0_REG(UART_REG_TXFIFO) & 0x80000000) ; - UART0_REG(UART_REG_TXFIFO) = '\r'; - } - } - return len; - } - - return _stub(EBADF); -} -weak_under_alias(write); diff --git a/hifive1-vp/riscv-bldc-forced-commutation/riscv-bldc b/hifive1-vp/riscv-bldc-forced-commutation/riscv-bldc deleted file mode 100755 index 38c4673e486820565572fe67963fd65e3e4db9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171836 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�-&>@sDWhfTA?!w5U1ukmF#WG^b9K=~C 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 diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/bsp.h b/hifive1-vp/riscv-bldc-forced-commutation/src/bsp.h deleted file mode 100644 index f04f4f4..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/bsp.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * bsp.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef BSP_H_ -#define BSP_H_ - -#ifdef __cplusplus -extern "C" { -#endif -#include -#include -#include -extern void trap_entry(); -#ifdef __cplusplus -} -#endif - -#endif /* BSP_H_ */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/delay.c b/hifive1-vp/riscv-bldc-forced-commutation/src/delay.c deleted file mode 100644 index 24070b4..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/delay.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * delay.c - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#include "delay.h" - -#define rdmcycle(x) { \ - uint32_t lo, hi, hi2; \ - __asm__ __volatile__ ("1:\n\t" \ - "csrr %0, mcycleh\n\t" \ - "csrr %1, mcycle\n\t" \ - "csrr %2, mcycleh\n\t" \ - "bne %0, %2, 1b\n\t" \ - : "=r" (hi), "=r" (lo), "=r" (hi2)) ; \ - *(x) = lo | ((uint64_t) hi << 32); \ - } - -typedef struct { - uint32_t n; - uint32_t mult; - uint32_t shift; -} int_inverse ; - -int_inverse f_cpu_1000_inv; -int_inverse f_cpu_1000000_inv; - -uint32_t F_CPU=1000000; - -void calc_inv(uint32_t n, int_inverse * res){ - uint32_t one = ~0; - uint32_t d = one/n; - uint32_t r = one%n + 1; - if (r >= n) ++d; - if (d == 0) --d; - uint32_t shift = 0; - while ((d & 0x80000000) == 0){ - d <<= 1; - ++shift; - } - res->n = n; - res->mult = d; - res->shift = shift; -} - -uint32_t divide32_using_inverse(uint32_t n, int_inverse *inv){ - uint32_t d = (uint32_t)(((uint64_t)n * inv->mult) >> 32); - d >>= inv->shift; - if (n - d*inv->n >= inv->n) ++d; - return d; -} - -// Almost full-range 64/32 divide. -// If divisor-1 has i bits, then the answer is exact for n of up to 64-i bits -// e.g. for divisors up to a million, n can have up to 45 bits -// On RV32IM with divide32_using_inverse inlines this uses 5 multiplies, -// 33 instructions, zero branches, 3 loads, 0 stores. -uint64_t divide64_using_inverse(uint64_t n, int_inverse *inv){ - uint32_t preshift = (31 - inv->shift) & 31; - uint64_t d = (uint64_t)divide32_using_inverse(n >> preshift, inv) << preshift; - uint32_t r = n - d * inv->n; - d += divide32_using_inverse(r, inv); - return d; -} - - -uint32_t millis(){ - uint64_t x; - rdmcycle(&x); - x = divide64_using_inverse(x, &f_cpu_1000_inv); - return((uint32_t) (x & 0xFFFFFFFF)); -} - -uint32_t micros(void){ - uint64_t x; - rdmcycle(&x); - // For Power-of-two MHz F_CPU, - // this compiles into a simple shift, - // and is faster than the general solution. -#if F_CPU==16000000 - x = x / (F_CPU / 1000000); -#else -#if F_CPU==256000000 - x = x / (F_CPU / 1000000); -#else - x = divide64_using_inverse(x, &f_cpu_1000000_inv); -#endif -#endif - return((uint32_t) (x & 0xFFFFFFFF)); -} - - -void delayMS(uint32_t dwMs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwMs * (F_CPU/1000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else { // wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} - -void delayUS(uint32_t dwUs){ - uint64_t current, later; - rdmcycle(¤t); - later = current + dwUs * (F_CPU/1000000); - if (later > current){ // usual case - while (later > current) - rdmcycle(¤t); - } else {// wrap. Though this is unlikely to be hit w/ 64-bit mcycle - while (later < current) - rdmcycle(¤t); - while (current < later) - rdmcycle(¤t); - } -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/delay.h b/hifive1-vp/riscv-bldc-forced-commutation/src/delay.h deleted file mode 100644 index 36ce098..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/delay.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * delay.h - * - * Created on: 30.07.2018 - * Author: eyck - */ - -#ifndef DELAY_H_ -#define DELAY_H_ - -#include - -#ifdef __cplusplus -extern "C" { -#endif -extern uint32_t F_CPU; - -void delayMS(uint32_t dwMs); -void delayUS(uint32_t dwUs); - -#ifdef __cplusplus -} -#endif - -#endif /* DELAY_H_ */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.cpp b/hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.cpp deleted file mode 100644 index 2822762..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/* - * peripherals.c - * - * Created on: 10.09.2018 - * Author: eyck - */ - -#include "hifive1_io.h" - -template<> volatile bool qspi0::spi_active=false; -template<> volatile bool qspi1::spi_active=false; -template<> volatile bool qspi2::spi_active=false; -template<> volatile bool pwm0::pwm_active=false; -template<> volatile bool pwm1::pwm_active=false; -template<> volatile bool pwm2::pwm_active=false; - diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.h b/hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.h deleted file mode 100644 index 9dc4325..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/hifive1_io.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * peripherals.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef HIFIVE1_IO_H_ -#define HIFIVE1_IO_H_ - -#include "io/gpio.h" -#include "io/spi.h" -#include "io/pwm.h" -#include "io/uart.h" - -using gpio0=gpio_regs<0x10012000>; -using uart0=uart_regs<0x10013000>; -using uart1=uart_regs<0x10023000>; -using qspi0=spi_regs<0x10014000>; -using qspi1=spi_regs<0x10024000>; -using qspi2=spi_regs<0x10034000>; -using pwm0 =pwm_regs<0x10015000>; -using pwm1 =pwm_regs<0x10025000>; -using pwm2 =pwm_regs<0x10035000>; - -#endif /* HIFIVE1_IO_H_ */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/io/gpio.h b/hifive1-vp/riscv-bldc-forced-commutation/src/io/gpio.h deleted file mode 100644 index 466f2d2..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/io/gpio.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * gpio.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef GPIO_H_ -#define GPIO_H_ - -#include -#include - -template -class gpio_regs { -public: - static inline uint32_t& value_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_VAL); - } - - static inline uint32_t& input_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_INPUT_EN); - } - - static inline uint32_t& output_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_EN); - } - - static inline uint32_t& port_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_VAL); - } - - static inline uint32_t& pue_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_PULLUP_EN); - } - - static inline uint32_t& ds_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_DRIVE); - } - - static inline uint32_t& rise_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IE); - } - - static inline uint32_t& rise_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_RISE_IP); - } - - static inline uint32_t& fall_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IE); - } - - static inline uint32_t& fall_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_FALL_IP); - } - - static inline uint32_t& high_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IE); - } - - static inline uint32_t& high_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_HIGH_IP); - } - - static inline uint32_t& low_ie_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IE); - } - - static inline uint32_t& low_ip_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_LOW_IP); - } - - static inline uint32_t& iof_en_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_EN); - } - - static inline uint32_t& iof_sel_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_IOF_SEL); - } - - static inline uint32_t& out_xor_reg(){ - return *reinterpret_cast(BASE_ADDR+GPIO_OUTPUT_XOR); - } - -}; - - - -#endif /* GPIO_H_ */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/io/pwm.h b/hifive1-vp/riscv-bldc-forced-commutation/src/io/pwm.h deleted file mode 100644 index 2aab61b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/io/pwm.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * pwm.h - * - * Created on: 29.07.2018 - * Author: eyck - */ - -#ifndef PWM_H_ -#define PWM_H_ - -#include -#include "util/bit_field.h" -#include -#include - -template -class pwm_regs { -public: - BEGIN_BF_DECL(pwmcfg_t, uint32_t); - BF_FIELD(scale, 0, 4); - BF_FIELD(sticky, 8, 1); - BF_FIELD(zerocmp, 9, 1); - BF_FIELD(deglitch, 10, 1); - BF_FIELD(enalways, 12, 1); - BF_FIELD(enoneshot, 13, 1); - BF_FIELD(cmp0center, 16, 1); - BF_FIELD(cmp1center, 17, 1); - BF_FIELD(cmp2center, 18, 1); - BF_FIELD(cmp3center, 19, 1); - BF_FIELD(cmp0gang, 24, 1); - BF_FIELD(cmp1gang, 25, 1); - BF_FIELD(cmp2gang, 26, 1); - BF_FIELD(cmp3gang, 27, 1); - BF_FIELD(cmp0ip, 28, 1); - BF_FIELD(cmp1ip, 29, 1); - BF_FIELD(cmp2ip, 30, 1); - BF_FIELD(cmp3ip, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(pwms_t, uint32_t); - BF_FIELD(s, 0, 16); - END_BF_DECL() r_pwms; - - BEGIN_BF_DECL(pwmcmp0_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp0; - - BEGIN_BF_DECL(pwmcmp1_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp1; - - BEGIN_BF_DECL(pwmcmp2_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp2; - - BEGIN_BF_DECL(pwmcmp3_t, uint32_t); - BF_FIELD(cmp0, 0, 16); - END_BF_DECL() r_pwmcmp3; - - static inline pwmcfg_t& cfg_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CFG); - } - - static inline uint32_t& count_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_COUNT); - } - - static inline pwms_t& s_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_S); - } - - static inline pwmcmp0_t& cmp0_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP0); - } - - static inline pwmcmp1_t& cmp1_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP1); - } - - static inline pwmcmp2_t& cmp2_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP2); - } - - static inline pwmcmp3_t& cmp3_reg(){ - return *reinterpret_cast(BASE_ADDR+PWM_CMP3); - } - - static inline bool oneshot_delay(long delay_us){ - auto scaling_factor=0; - while(delay_us/(1< std::numeric_limits::max()){ - scaling_factor++; - } - cfg_reg()=0; - count_reg()=0; - cfg_reg().scale=4+scaling_factor; // divide by 16 so we get 1us per pwm clock - cmp0_reg().cmp0 = delay_us/(1< -#include "util/bit_field.h" -#include -#include - -template -class spi_regs { -public: - // storage declarations - BEGIN_BF_DECL(sckdiv_t, uint32_t); - BF_FIELD(div, 0, 12); - END_BF_DECL(); - - BEGIN_BF_DECL(sckmode_t, uint32_t); - BF_FIELD(pha, 0, 1); - BF_FIELD(pol, 1, 1); - END_BF_DECL(); - - uint32_t r_csid; - - uint32_t r_csdef; - - BEGIN_BF_DECL(csmode_t, uint32_t); - BF_FIELD(mode, 0, 2); - END_BF_DECL(); - - BEGIN_BF_DECL(delay0_t, uint32_t); - BF_FIELD(cssck, 0, 8); - BF_FIELD(sckcs, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(delay1_t, uint32_t); - BF_FIELD(intercs, 0, 16); - BF_FIELD(interxfr, 16, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(fmt_t, uint32_t); - BF_FIELD(proto, 0, 2); - BF_FIELD(endian, 2, 1); - BF_FIELD(dir, 3, 1); - BF_FIELD(len, 16, 4); - END_BF_DECL(); - - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() r_txdata; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txmark_t, uint32_t); - BF_FIELD(txmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxmark_t, uint32_t); - BF_FIELD(rxmark, 0, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(fctrl_t, uint32_t); - BF_FIELD(en, 0, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ffmt_t, uint32_t); - BF_FIELD(cmd_en, 0, 1); - BF_FIELD(addr_len, 1, 2); - BF_FIELD(pad_cnt, 3, 4); - BF_FIELD(cmd_proto, 7, 2); - BF_FIELD(addr_proto, 9, 2); - BF_FIELD(data_proto, 11, 2); - BF_FIELD(cmd_code, 16, 8); - BF_FIELD(pad_code, 24, 8); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - static inline sckdiv_t& sckdiv_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKDIV); - } - - static inline sckmode_t& sckmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_SCKMODE); - } - - static inline uint32_t& csid_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSID); - } - - static inline uint32_t& csdef_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSDEF); - } - - static inline csmode_t& csmode_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_CSMODE); - } - - static inline delay0_t& dcssck_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DCSSCK); - } - - static inline uint32_t& dsckcs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DSCKCS); - } - - static inline delay1_t& dintercs_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERCS); - } - - static inline uint32_t& dinterxfr_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_DINTERXFR); - } - - static inline fmt_t& fmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FMT); - } - - static inline txdata_t& txfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXFIFO); - } - - static inline rxdata_t& rxfifo_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXFIFO); - } - - static inline txmark_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_TXCTRL); - } - - static inline rxmark_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_RXCTRL); - } - - static inline fctrl_t& fctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FCTRL); - } - - static inline ffmt_t& ffmt_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_FFMT); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+SPI_REG_IP); - } - - template - static bool transfer(std::array& bytes){ - csmode_reg().mode=2; // HOLD mode - rxctrl_reg().rxmark=bytes.size()-1; // trigger irq if more than 2 bytes are received; - ie_reg().rxwm=1; - // write data bytes - for(size_t i=0; i -#include "util/bit_field.h" -#include - -template -class uart_regs { -public: - BEGIN_BF_DECL(txdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(full, 31, 1); - END_BF_DECL() ; - - BEGIN_BF_DECL(rxdata_t, uint32_t); - BF_FIELD(data, 0, 8); - BF_FIELD(empty, 31, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(txctrl_t, uint32_t); - BF_FIELD(txen, 0, 1); - BF_FIELD(nstop, 1, 1); - BF_FIELD(txcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(rxctrl_t, uint32_t); - BF_FIELD(rxen, 0, 1); - BF_FIELD(rxcnt, 16, 3); - END_BF_DECL(); - - BEGIN_BF_DECL(ie_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(ip_t, uint32_t); - BF_FIELD(txwm, 0, 1); - BF_FIELD(rxwm, 1, 1); - END_BF_DECL(); - - BEGIN_BF_DECL(div_t, uint32_t); - BF_FIELD(div, 0, 16); - END_BF_DECL(); - - static inline txdata_t& txdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXFIFO); - } - - static inline rxdata_t& rxdata_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXFIFO); - } - - static inline txctrl_t& txctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_TXCTRL); - } - - static inline rxctrl_t& rxctrl_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_RXCTRL); - } - - static inline ie_t& ie_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IE); - } - - static inline ip_t& ip_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_IP); - } - - static inline div_t& div_reg(){ - return *reinterpret_cast(BASE_ADDR+UART_REG_DIV); - } - -}; - -#endif /* SPI_H_ */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.cpp b/hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.cpp deleted file mode 100644 index 7e6ec2c..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.cpp +++ /dev/null @@ -1,250 +0,0 @@ -//============================================================================ -// Name : riscv-bldc.cpp -// Author : Eyck Jentzsch -// Version : -// Copyright : Your copyright notice -// Description : Hello World in C++, Ansi-style -//============================================================================ - -#include "riscv-bldc.h" -#include "delay.h" -#include "bsp.h" -#include "plic/plic_driver.h" - -#include -#include - -#include "hifive1_io.h" - -volatile uint32_t nextCommutationStep=0; - -/* commutation blocks - * 1 2 3 4 5 6 - * U 0 z +1 +1 z 0 - * V +1 +1 z 0 0 z - * W z 0 0 z +1 +1 - */ - -std::array driveTable { //! Drive pattern for commutation, CW rotation - ((1 << VH) | (1 << UL)), //1 - ((1 << VH) | (1 << WL)), //2 - ((1 << UH) | (1 << WL)), //3 - ((1 << UH) | (1 << VL)), //4 - ((1 << WH) | (1 << VL)), //5 - ((1 << WH) | (1 << UL)) //6 -}; - -std::array senseTable { //! channels to sense during the applied pattern - SENSW_N, //1 - SENSU_P, //2 - SENSV_N, //3 - SENSW_P, //4 - SENSU_N, //5 - SENSV_P //6 -}; - -bool ccw=false; - -typedef void (*function_ptr_t) (void); -//! Instance data for the PLIC. -plic_instance_t g_plic; -std::array g_ext_interrupt_handlers; -/*! \brief external interrupt handler - * - * routes the peripheral interrupts to the the respective handler - * - */ -extern "C" void handle_m_ext_interrupt() { - plic_source int_num = PLIC_claim_interrupt(&g_plic); - if ((int_num >=1 ) && (int_num < PLIC_NUM_INTERRUPTS)) - g_ext_interrupt_handlers[int_num](); - //else - // exit(1 + (uintptr_t) int_num); - PLIC_complete_interrupt(&g_plic, int_num); -} -/*! \brief mtime interval interrupt - * - */ -extern "C" void handle_m_time_interrupt(){ - clear_csr(mie, MIP_MTIP); - // Reset the timer for 3s in the future. - // This also clears the existing timer interrupt. - volatile uint64_t * mtime = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME); - volatile uint64_t * mtimecmp = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); - uint64_t now = *mtime; - uint64_t then = now + RTC_FREQ; - *mtimecmp = then; - // Re-enable the timer interrupt. - set_csr(mie, MIP_MTIP); -} -/*! \brief dummy interrupt handler - * - */ -void no_interrupt_handler (void) {}; -/*! \brief configure the per-interrupt handler - * - */ -void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) { - g_ext_interrupt_handlers[irq_num] = handler; - // Priority must be set > 0 to trigger the interrupt. - PLIC_set_priority(&g_plic, irq_num, prio); - // Have to enable the interrupt both at the GPIO level, and at the PLIC level. - PLIC_enable_interrupt(&g_plic, irq_num); -} -/*!\brief initializes platform - * - */ -void platform_init(){ - // configure clocks - PRCI_use_hfxosc(1); // is equivalent to - // init UART0 at 115200 baud - auto baud_rate=115200; - gpio0::output_en_reg()=0xffffffff; - gpio0::iof_sel_reg()&=~IOF0_UART0_MASK; - gpio0::iof_en_reg()|= IOF0_UART0_MASK; - uart0::div_reg()=get_cpu_freq() / baud_rate - 1; - uart0::txctrl_reg().txen=1; - // init SPI - gpio0::iof_sel_reg()&=~IOF0_SPI1_MASK; - gpio0::iof_en_reg()|= IOF0_SPI1_MASK; - qspi1::sckdiv_reg() = 8; - - F_CPU=PRCI_measure_mcycle_freq(20, RTC_FREQ); - printf("core freq at %d Hz\n", F_CPU); - // initialie interupt & trap handling - write_csr(mtvec, &trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } - - PLIC_init(&g_plic, PLIC_CTRL_ADDR, PLIC_NUM_INTERRUPTS, PLIC_NUM_PRIORITIES); - // Disable the machine & timer interrupts until setup is done. - clear_csr(mie, MIP_MEIP); - clear_csr(mie, MIP_MTIP); - for (auto& h:g_ext_interrupt_handlers) h=no_interrupt_handler; - configure_irq(40, pwm0::pwm_interrupt_handler); - configure_irq(6, qspi1::spi_rx_interrupt_handler); - // Set the machine timer to go off in 1 second. - volatile uint64_t * mtime = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME); - volatile uint64_t * mtimecmp = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIMECMP); - uint64_t now = *mtime; - uint64_t then = now + RTC_FREQ; - *mtimecmp = then; - // Enable the Machine-External bit in MIE - set_csr(mie, MIP_MEIP); - // Enable the Machine-Timer bit in MIE - set_csr(mie, MIP_MTIP); - // Enable interrupts in general. - set_csr(mstatus, MSTATUS_MIE); -} -/*! \brief reads adc channel and returns measured value - * - */ -unsigned read_adc(unsigned channel){ - std::array bytes{ - uint8_t(0x06 | (channel>>2 & 0x1)), /* start bit, single ended measurement, channel[2] */ - uint8_t((channel&0x3)<<6), /* channel[1:0], fill*/ - 0x0 /* fill */ - }; - // set CS of target - qspi1::csid_reg()=0; - qspi1::transfer(bytes); - return (bytes[1]&0xf)*256+bytes[2]; -} -/*! \brief waits for zero crossing and measures time until - * - */ -unsigned short measured_zc_time(unsigned short max_delay){ - long delay_us = max_delay; - auto scaling_factor=0; - while(delay_us/(1< std::numeric_limits::max()){ - scaling_factor++; - } - pwm0::cfg_reg()=0; - pwm0::count_reg()=0; - pwm0::cfg_reg().scale = 4+scaling_factor; // divide by 16 so we get 1us per pwm clock - pwm0::cmp0_reg().cmp0 = delay_us/(1<3; - uint32_t adc_res=0; - do{ - adc_res=read_adc(channel); - if((zc_neg && adc_res<2048) || (!zc_neg && adc_res>2047)) - break; - } while(pwm0::is_active()); - uint32_t sreg = pwm0::s_reg(); - pwm0::cfg_reg().enoneshot=false; - return sreg*(1< multiplier={0.83, 1.0}; - nextCommutationStep = 0; - //Preposition. - gpio0::port_reg() = (gpio0::port_reg() & ~DRIVE_MASK) | driveTable[nextCommutationStep]; - //fixed_delay(STARTUP_LOCK_DELAY); - pwm0::oneshot_delay(STARTUP_DELAY); - next_commutation_step(); - auto nextDrivePattern = driveTable[nextCommutationStep]; - for (size_t i = 0; i < 12; i++){ - setDrivePattern(nextDrivePattern); - auto channel=senseTable[nextCommutationStep]&0x3; - auto zcPolRise = senseTable[nextCommutationStep]<4; - auto bemf_0=read_adc(channel); - delay*=multiplier[(i/6)%multiplier.size()]; - pwm0::oneshot_delay(delay); - auto bemf_1=read_adc(channel); - auto bemf = bemf_1>bemf_0?bemf_1-bemf_0:bemf_0-bemf_1; - next_commutation_step(); - nextDrivePattern = driveTable[nextCommutationStep]; - } -} -/*! \brief closed-loop commutation to run the motor - * - */ -void run_closed_loop(void){ - auto count=0; - auto zc_delay=0U; - auto tmp=0U; - auto nextDrivePattern = driveTable[nextCommutationStep]; - for(;;){ - setDrivePattern(nextDrivePattern); - zc_delay=measured_zc_time(50000); - next_commutation_step(); - nextDrivePattern = driveTable[nextCommutationStep]; - } -} -/*! \brief main function - * - */ -int main() { - platform_init(); - printf("Starting motor\n"); - start_open_loop(); - printf("done...\n"); - // Switch to sensor-less closed-loop commutation. - run_closed_loop(); - return 0; -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.h b/hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.h deleted file mode 100644 index 0a05ca8..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/riscv-bldc.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * riscv-bldc.h - * - * Created on: 28.07.2018 - * Author: eyck - */ - -#ifndef RISCV_BLDC_H_ -#define RISCV_BLDC_H_ - -#include - -extern uint32_t pwm; -extern uint32_t DRIVE_PORT; - -enum { - UL=1, //! Port pin connected to phase U, low side enable switch. - UH=0, //! Port pin connected to phase U, high side enable switch. - VL=11, //! Port pin connected to phase V, low side enable switch. - VH=10, //! Port pin connected to phase V, high side enable switch. - WL=19, //! Port pin connected to phase W, low side enable switch. - WH=20, //! Port pin connected to phase W, high side enable switch. - SENSU_P=0, //! Phase U voltage to sense positive zero cross - SENSV_P=1, //! Phase V voltage to sense positive zero cross - SENSW_P=2, //! Phase W voltage to sense positive zero cross - SENSU_N=4, //! Phase U voltage to sense negative zero cross - SENSV_N=5, //! Phase V voltage to sense negative zero cross - SENSW_N=6, //! Phase W voltage to sense negative zero cross - DRIVE_MASK=(1< - -//--------------------------------------------------------- -// BitFieldMember<>: Used internally by ADD_BITFIELD_MEMBER macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template struct BitFieldMember { - T value; - - static_assert(Offset + Bits <= (int)sizeof(T) * 8, "Member exceeds bitfield boundaries"); - static_assert(Bits < (int)sizeof(T) * 8, "Can't fill entire bitfield with one member"); - - static const T Maximum = (T(1) << Bits) - 1; - static const T Mask = Maximum << Offset; - T maximum() const { return Maximum; } - T one() const { return T(1) << Offset; } - - operator T() const { return (value >> Offset) & Maximum; } - - BitFieldMember &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~Mask) | (v << Offset); - return *this; - } - - BitFieldMember &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << Offset; - return *this; - } - - BitFieldMember &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << Offset; - return *this; - } - - BitFieldMember &operator++() { return *this += 1; } - BitFieldMember operator++(int) { // postfix form - BitFieldMember tmp(*this); - operator++(); - return tmp; - } - BitFieldMember &operator--() { return *this -= 1; } - BitFieldMember operator--(int) { // postfix form - BitFieldMember tmp(*this); - operator--(); - return tmp; - } -}; - -//--------------------------------------------------------- -// BitFieldArray<>: Used internally by ADD_BITFIELD_ARRAY macro. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -template class BitFieldArray { -public: - T value; - - static_assert(BaseOffset + BitsPerItem * NumItems <= (int)sizeof(T) * 8, "Array exceeds bitfield boundaries"); - static_assert(BitsPerItem < (int)sizeof(T) * 8, "Can't fill entire bitfield with one array element"); - - static const T Maximum = (T(1) << BitsPerItem) - 1; - T maximum() const { return Maximum; } - int numItems() const { return NumItems; } - - class Element { - private: - T &value; - int offset; - - public: - Element(T &value, int offset) - : value(value) - , offset(offset) {} - T mask() const { return Maximum << offset; } - - operator T() const { return (value >> offset) & Maximum; } - - Element &operator=(T v) { - assert(v <= Maximum); // v must fit inside the bitfield member - value = (value & ~mask()) | (v << offset); - return *this; - } - - Element &operator+=(T v) { - assert(T(*this) + v <= Maximum); // result must fit inside the bitfield member - value += v << offset; - return *this; - } - - Element &operator-=(T v) { - assert(T(*this) >= v); // result must not underflow - value -= v << offset; - return *this; - } - - Element &operator++() { return *this += 1; } - Element operator++(int) { // postfix form - Element tmp(*this); - operator++(); - return tmp; - } - Element &operator--() { return *this -= 1; } - Element operator--(int) { // postfix form - Element tmp(*this); - operator--(); - return tmp; - } - }; - - Element operator[](int i) { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } - - const Element operator[](int i) const { - assert(i >= 0 && i < NumItems); // array index must be in range - return Element(value, BaseOffset + BitsPerItem * i); - } -}; - -//--------------------------------------------------------- -// Bitfield definition macros. -// All members are public to simplify compliance with sections 9.0.7 and -// 9.5.1 of the C++11 standard, thereby avoiding undefined behavior. -//--------------------------------------------------------- -#define BEGIN_BF_DECL(typeName, T) \ - union typeName { \ - struct Wrapper { \ - T value; \ - }; \ - Wrapper flat; \ - typeName(T v = 0) { flat.value = v; } \ - typeName &operator=(T v) { \ - flat.value = v; \ - return *this; \ - } \ - operator T &() { return flat.value; } \ - operator T() const { return flat.value; } \ - using StorageType = T; - -#define BF_FIELD(memberName, offset, bits) BitFieldMember memberName; - -#define BF_ARRAY(memberName, offset, bits, numItems) BitFieldArray memberName; - -#define END_BF_DECL() } - -#endif // __CPP11OM_BITFIELD_H__ - -#endif /* BIT_FIELD_H_ */ diff --git a/hifive1-vp/riscv-bldc-forced-commutation/src/wrap_printf.c b/hifive1-vp/riscv-bldc-forced-commutation/src/wrap_printf.c deleted file mode 100644 index af23b1a..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/src/wrap_printf.c +++ /dev/null @@ -1,271 +0,0 @@ -/* The functions in this file are only meant to support Dhrystone on an - * embedded RV32 system and are obviously incorrect in general. */ - -#include -#include -#include -#include -#include -#include - -#undef putchar -int putchar(int ch) -{ - return write(STDOUT_FILENO, &ch, 1) == 1 ? ch : -1; -} - -static void sprintf_putch(int ch, void** data) -{ - char** pstr = (char**)data; - **pstr = ch; - (*pstr)++; -} - -static unsigned long getuint(va_list *ap, int lflag) -{ - if (lflag) - return va_arg(*ap, unsigned long); - else - return va_arg(*ap, unsigned int); -} - -static long getint(va_list *ap, int lflag) -{ - if (lflag) - return va_arg(*ap, long); - else - return va_arg(*ap, int); -} - -static inline void printnum(void (*putch)(int, void**), void **putdat, - unsigned long num, unsigned base, int width, int padc) -{ - unsigned digs[sizeof(num)*8]; - 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 inline void print_double(void (*putch)(int, void**), void **putdat, - double num, int width, int prec) -{ - union { - double d; - uint64_t u; - } u; - u.d = num; - - if (u.u & (1ULL << 63)) { - putch('-', putdat); - u.u &= ~(1ULL << 63); - } - - for (int i = 0; i < prec; i++) - u.d *= 10; - - char buf[32], *pbuf = buf; - printnum(sprintf_putch, (void**)&pbuf, (unsigned long)u.d, 10, 0, 0); - if (prec > 0) { - for (int i = 0; i < prec; i++) { - pbuf[-i] = pbuf[-i-1]; - } - pbuf[-prec] = '.'; - pbuf++; - } - - for (char* p = buf; p < pbuf; p++) - putch(*p, putdat); -} - -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 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 - case 'l': - if (lflag) - goto bad; - goto reswitch; - - // character - case 'c': - putch(va_arg(ap, int), putdat); - break; - - // double - case 'f': - print_double(putch, putdat, va_arg(ap, double), width, precision); - 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) num < 0) { - putch('-', putdat); - num = -(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': - lflag = 1; - putch('0', putdat); - putch('x', putdat); - /* fall through to 'x' */ - - // (unsigned) hexadecimal - 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: - bad: - putch('%', putdat); - fmt = last_fmt; - break; - } - } -} - -int __wrap_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 __wrap_sprintf(char* str, const char* fmt, ...) -{ - va_list ap; - char* str0 = str; - va_start(ap, fmt); - - vprintfmt(sprintf_putch, (void**)&str, fmt, ap); - *str = 0; - - va_end(ap); - return str - str0; -} diff --git a/hifive1-vp/riscv-bldc-forced-commutation/toolchain-rv32.cmake b/hifive1-vp/riscv-bldc-forced-commutation/toolchain-rv32.cmake deleted file mode 100644 index bd5ee3b..0000000 --- a/hifive1-vp/riscv-bldc-forced-commutation/toolchain-rv32.cmake +++ /dev/null @@ -1,33 +0,0 @@ -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_VERSION 1) -set(CMAKE_SYSTEM_PROCESSOR riscv) - -set(TOOLCHAIN_DIR /opt/riscv/tools) -set(ARCHITECTURE riscv64-unknown-elf) - -set(CMAKE_C_COMPILER ${ARCHITECTURE}-gcc -set(CMAKE_CXX_COMPILER ${ARCHITECTURE}-g++ -set(RISCV_LINUX_SYSROOT /opt/riscv/tools CACHE PATH "RISC-V cross compilation system root") # search path for the cross compile toolchain - -set(CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags") -set(CMAKE_C_FLAGS "" CACHE STRING "c flags") -set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags") -set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags") -set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "executable linker flags") - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv32imac -mabi=ilp32") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv32imac -mabi=ilp32") -#set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") -#set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -march=rv32imac -mabi=ilp32") - -set(COMPILER_IS_RV32 "1") #flags for the CMakeList.txt -#add_definitions(-D_ARM_TEGRA3) # C/C++ preprocessor macro, which will be used in many many files - -set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR}/${ARCHITECTURE}) - -include_directories(${TOOLCHAIN_DIR}/${ARCHITECTURE}/include) - -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) \ No newline at end of file diff --git a/bare-metal-bsp/include/rtl/bits.h b/include/rtl/bits.h similarity index 100% rename from bare-metal-bsp/include/rtl/bits.h rename to include/rtl/bits.h diff --git a/bare-metal-bsp/include/rtl/const.h b/include/rtl/const.h similarity index 100% rename from bare-metal-bsp/include/rtl/const.h rename to include/rtl/const.h diff --git a/bare-metal-bsp/include/rtl/sections.h b/include/rtl/sections.h similarity index 100% rename from bare-metal-bsp/include/rtl/sections.h rename to include/rtl/sections.h diff --git a/bare-metal-bsp/include/sifive/bits.h b/include/sifive/bits.h similarity index 100% rename from bare-metal-bsp/include/sifive/bits.h rename to include/sifive/bits.h diff --git a/bare-metal-bsp/include/sifive/const.h b/include/sifive/const.h similarity index 100% rename from bare-metal-bsp/include/sifive/const.h rename to include/sifive/const.h diff --git a/bare-metal-bsp/include/sifive/devices/aon.h b/include/sifive/devices/aon.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/aon.h rename to include/sifive/devices/aon.h diff --git a/bare-metal-bsp/include/sifive/devices/clic.h b/include/sifive/devices/clic.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/clic.h rename to include/sifive/devices/clic.h diff --git a/bare-metal-bsp/include/sifive/devices/clint.h b/include/sifive/devices/clint.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/clint.h rename to include/sifive/devices/clint.h diff --git a/bare-metal-bsp/include/sifive/devices/gpio.h b/include/sifive/devices/gpio.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/gpio.h rename to include/sifive/devices/gpio.h diff --git a/bare-metal-bsp/include/sifive/devices/otp.h b/include/sifive/devices/otp.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/otp.h rename to include/sifive/devices/otp.h diff --git a/bare-metal-bsp/include/sifive/devices/plic.h b/include/sifive/devices/plic.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/plic.h rename to include/sifive/devices/plic.h diff --git a/bare-metal-bsp/include/sifive/devices/prci.h b/include/sifive/devices/prci.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/prci.h rename to include/sifive/devices/prci.h diff --git a/bare-metal-bsp/include/sifive/devices/pwm.h b/include/sifive/devices/pwm.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/pwm.h rename to include/sifive/devices/pwm.h diff --git a/bare-metal-bsp/include/sifive/devices/spi.h b/include/sifive/devices/spi.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/spi.h rename to include/sifive/devices/spi.h diff --git a/bare-metal-bsp/include/sifive/devices/uart.h b/include/sifive/devices/uart.h similarity index 100% rename from bare-metal-bsp/include/sifive/devices/uart.h rename to include/sifive/devices/uart.h diff --git a/bare-metal-bsp/include/sifive/sections.h b/include/sifive/sections.h similarity index 100% rename from bare-metal-bsp/include/sifive/sections.h rename to include/sifive/sections.h diff --git a/bare-metal-bsp/include/sifive/smp.h b/include/sifive/smp.h similarity index 100% rename from bare-metal-bsp/include/sifive/smp.h rename to include/sifive/smp.h diff --git a/bare-metal-bsp/include/tgc-vp/bits.h b/include/tgc-vp/bits.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/bits.h rename to include/tgc-vp/bits.h diff --git a/bare-metal-bsp/include/tgc-vp/const.h b/include/tgc-vp/const.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/const.h rename to include/tgc-vp/const.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/aon.h b/include/tgc-vp/devices/aon.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/aon.h rename to include/tgc-vp/devices/aon.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/clint.h b/include/tgc-vp/devices/clint.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/clint.h rename to include/tgc-vp/devices/clint.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/gpio.h b/include/tgc-vp/devices/gpio.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/gpio.h rename to include/tgc-vp/devices/gpio.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/otp.h b/include/tgc-vp/devices/otp.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/otp.h rename to include/tgc-vp/devices/otp.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/plic.h b/include/tgc-vp/devices/plic.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/plic.h rename to include/tgc-vp/devices/plic.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/prci.h b/include/tgc-vp/devices/prci.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/prci.h rename to include/tgc-vp/devices/prci.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/pwm.h b/include/tgc-vp/devices/pwm.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/pwm.h rename to include/tgc-vp/devices/pwm.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/spi.h b/include/tgc-vp/devices/spi.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/spi.h rename to include/tgc-vp/devices/spi.h diff --git a/bare-metal-bsp/include/tgc-vp/devices/uart.h b/include/tgc-vp/devices/uart.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/devices/uart.h rename to include/tgc-vp/devices/uart.h diff --git a/bare-metal-bsp/include/tgc-vp/sections.h b/include/tgc-vp/sections.h similarity index 100% rename from bare-metal-bsp/include/tgc-vp/sections.h rename to include/tgc-vp/sections.h diff --git a/bare-metal-bsp/libwrap/libwrap.mk b/libwrap/libwrap.mk similarity index 100% rename from bare-metal-bsp/libwrap/libwrap.mk rename to libwrap/libwrap.mk diff --git a/bare-metal-bsp/libwrap/misc/.gitignore b/libwrap/misc/.gitignore similarity index 100% rename from bare-metal-bsp/libwrap/misc/.gitignore rename to libwrap/misc/.gitignore diff --git a/bare-metal-bsp/libwrap/misc/write_hex.c b/libwrap/misc/write_hex.c similarity index 100% rename from bare-metal-bsp/libwrap/misc/write_hex.c rename to libwrap/misc/write_hex.c diff --git a/bare-metal-bsp/libwrap/stdlib/.gitignore b/libwrap/stdlib/.gitignore similarity index 100% rename from bare-metal-bsp/libwrap/stdlib/.gitignore rename to libwrap/stdlib/.gitignore diff --git a/bare-metal-bsp/libwrap/stdlib/malloc.c b/libwrap/stdlib/malloc.c similarity index 100% rename from bare-metal-bsp/libwrap/stdlib/malloc.c rename to libwrap/stdlib/malloc.c diff --git a/bare-metal-bsp/libwrap/sys/.gitignore b/libwrap/sys/.gitignore similarity index 100% rename from bare-metal-bsp/libwrap/sys/.gitignore rename to libwrap/sys/.gitignore diff --git a/bare-metal-bsp/libwrap/sys/_exit.c b/libwrap/sys/_exit.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/_exit.c rename to libwrap/sys/_exit.c diff --git a/bare-metal-bsp/libwrap/sys/close.c b/libwrap/sys/close.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/close.c rename to libwrap/sys/close.c diff --git a/bare-metal-bsp/libwrap/sys/execve.c b/libwrap/sys/execve.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/execve.c rename to libwrap/sys/execve.c diff --git a/bare-metal-bsp/libwrap/sys/fork.c b/libwrap/sys/fork.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/fork.c rename to libwrap/sys/fork.c diff --git a/bare-metal-bsp/libwrap/sys/fstat.c b/libwrap/sys/fstat.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/fstat.c rename to libwrap/sys/fstat.c diff --git a/bare-metal-bsp/libwrap/sys/getpid.c b/libwrap/sys/getpid.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/getpid.c rename to libwrap/sys/getpid.c diff --git a/bare-metal-bsp/libwrap/sys/isatty.c b/libwrap/sys/isatty.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/isatty.c rename to libwrap/sys/isatty.c diff --git a/bare-metal-bsp/libwrap/sys/kill.c b/libwrap/sys/kill.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/kill.c rename to libwrap/sys/kill.c diff --git a/bare-metal-bsp/libwrap/sys/link.c b/libwrap/sys/link.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/link.c rename to libwrap/sys/link.c diff --git a/bare-metal-bsp/libwrap/sys/lseek.c b/libwrap/sys/lseek.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/lseek.c rename to libwrap/sys/lseek.c diff --git a/bare-metal-bsp/libwrap/sys/open.c b/libwrap/sys/open.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/open.c rename to libwrap/sys/open.c diff --git a/bare-metal-bsp/libwrap/sys/openat.c b/libwrap/sys/openat.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/openat.c rename to libwrap/sys/openat.c diff --git a/bare-metal-bsp/libwrap/sys/printf.c b/libwrap/sys/printf.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/printf.c rename to libwrap/sys/printf.c diff --git a/bare-metal-bsp/libwrap/sys/puts.c b/libwrap/sys/puts.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/puts.c rename to libwrap/sys/puts.c diff --git a/bare-metal-bsp/libwrap/sys/read.c b/libwrap/sys/read.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/read.c rename to libwrap/sys/read.c diff --git a/bare-metal-bsp/libwrap/sys/sbrk.c b/libwrap/sys/sbrk.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/sbrk.c rename to libwrap/sys/sbrk.c diff --git a/bare-metal-bsp/libwrap/sys/stat.c b/libwrap/sys/stat.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/stat.c rename to libwrap/sys/stat.c diff --git a/bare-metal-bsp/libwrap/sys/stub.h b/libwrap/sys/stub.h similarity index 100% rename from bare-metal-bsp/libwrap/sys/stub.h rename to libwrap/sys/stub.h diff --git a/bare-metal-bsp/libwrap/sys/times.c b/libwrap/sys/times.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/times.c rename to libwrap/sys/times.c diff --git a/bare-metal-bsp/libwrap/sys/unlink.c b/libwrap/sys/unlink.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/unlink.c rename to libwrap/sys/unlink.c diff --git a/bare-metal-bsp/libwrap/sys/wait.c b/libwrap/sys/wait.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/wait.c rename to libwrap/sys/wait.c diff --git a/bare-metal-bsp/libwrap/sys/weak_under_alias.h b/libwrap/sys/weak_under_alias.h similarity index 100% rename from bare-metal-bsp/libwrap/sys/weak_under_alias.h rename to libwrap/sys/weak_under_alias.h diff --git a/bare-metal-bsp/libwrap/sys/write.c b/libwrap/sys/write.c similarity index 100% rename from bare-metal-bsp/libwrap/sys/write.c rename to libwrap/sys/write.c