OpenXiangShan / XiangShan-doc

Documentation for XiangShan
https://xiangshan-doc.readthedocs.io
Creative Commons Attribution 4.0 International
346 stars 133 forks source link

关于编译Linux Kernel时Assembler messages报错 invalid -march= option: `rv64imac' / Error: unrecognized opcode, extension `zicsr' required #46

Closed Bwoah-Kimi closed 1 year ago

Bwoah-Kimi commented 1 year ago

跟着https://xiangshan-doc.readthedocs.io/zh_CN/latest/tools/linux-kernel-for-xs/#5-linux-kernal的流程编译Linux Kernel 在“构建BBL并链接Kernel”的步骤,运行make -j出现如下报错:

zhantong@ubuntu:~/XiangShan/riscv-pk$ make clean rm -rf build zhantong@ubuntu:~/XiangShan/riscv-pk$ make -j RISCV_ROOTFS_HOME=/home/zhantong/XiangShan/riscv-rootfs make -C /home/zhantong/XiangShan/riscv-rootfs mkdir -p build mkdir -p build dtc -O dtb -I dts -o build/system.dtb dts/system.dts make[1]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs” cd build && /home/zhantong/XiangShan/riscv-pk/configure --host=riscv64-unknown-elf --with-payload=/home/zhantong/XiangShan/riscv-linux/vmlinux --with-arch=rv64gc --enable-logo make -s -C apps/hello install dts/platform.dtsi:19.16-22.7: Warning (unit_address_vs_reg): /soc/mmc: node has a reg or ranges property, but no unit name dts/platform.dtsi:5.21-11.5: Warning (simple_bus_reg): /soc/clint@2000000: simple-bus unit address format error, expected "38000000" dts/platform.dtsi:12.24-18.5: Warning (simple_bus_reg): /soc/serial@60000000: simple-bus unit address format error, expected "40600000" dts/platform.dtsi:19.16-22.7: Warning (simple_bus_reg): /soc/mmc: simple-bus unit address format error, expected "40002000" dts/platform.dtsi:12.24-18.5: Warning (interrupts_property): /soc/serial@60000000: Missing interrupt-parent make -s -C apps/stream install make -s -C apps/busybox install make -s -C apps/redis install make -s -C apps/dwarf/md5 install make -s -C apps/dwarf/sort install make -s -C apps/dwarf/wordcount install make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/hello” make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/stream” make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/dwarf/md5” make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/busybox” make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/dwarf/sort” make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/redis” make[2]: 进入目录“/home/zhantong/XiangShan/riscv-rootfs/apps/dwarf/wordcount” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/redis” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/busybox” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/stream” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/dwarf/md5” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/dwarf/sort” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/dwarf/wordcount” make[2]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs/apps/hello” make[1]: 离开目录“/home/zhantong/XiangShan/riscv-rootfs” RISCV_ROOTFS_HOME=/home/zhantong/XiangShan/riscv-rootfs make -C /home/zhantong/XiangShan/riscv-linux CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv vmlinux make[1]: 进入目录“/home/zhantong/XiangShan/riscv-linux” checking build system type... x86_64-pc-linux-gnu checking host system type... riscv64-unknown-elf checking for riscv64-unknown-elf-gcc... riscv64-unknown-elf-gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... yes checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether riscv64-unknown-elf-gcc accepts -g... yes checking for riscv64-unknown-elf-gcc option to accept ISO C89... none needed checking for riscv64-unknown-elf-g++... riscv64-unknown-elf-g++ checking whether we are using the GNU C++ compiler... yes checking whether riscv64-unknown-elf-g++ accepts -g... yes checking for riscv64-unknown-elf-ar... riscv64-unknown-elf-ar checking for riscv64-unknown-elf-ranlib... riscv64-unknown-elf-ranlib checking for riscv64-unknown-elf-readelf... riscv64-unknown-elf-readelf checking for riscv64-unknown-elf-objcopy... riscv64-unknown-elf-objcopy checking for a BSD-compatible install... /usr/bin/install -c checking how to run the C preprocessor... riscv64-unknown-elf-gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes configure: configuring default subproject : pk configure: configuring default subproject : bbl configure: configuring default subproject : softfloat configure: configuring default subproject : dummy_payload configure: configuring default subproject : machine configure: configuring default subproject : util configure: creating ./config.status config.status: creating pk.mk scripts/kconfig/conf --syncconfig Kconfig config.status: creating bbl.mk config.status: creating softfloat.mk config.status: creating dummy_payload.mk config.status: creating machine.mk config.status: creating util.mk config.status: creating Makefile config.status: creating config.h #

configuration written to .config

# WRAP arch/riscv/include/generated/uapi/asm/setup.h WRAP arch/riscv/include/generated/uapi/asm/unistd.h WRAP arch/riscv/include/generated/uapi/asm/bpf_perf_event.h WRAP arch/riscv/include/generated/uapi/asm/errno.h WRAP arch/riscv/include/generated/uapi/asm/fcntl.h WRAP arch/riscv/include/generated/uapi/asm/ioctl.h WRAP arch/riscv/include/generated/uapi/asm/ioctls.h WRAP arch/riscv/include/generated/uapi/asm/ipcbuf.h WRAP arch/riscv/include/generated/uapi/asm/mman.h WRAP arch/riscv/include/generated/uapi/asm/msgbuf.h WRAP arch/riscv/include/generated/uapi/asm/param.h WRAP arch/riscv/include/generated/uapi/asm/poll.h WRAP arch/riscv/include/generated/uapi/asm/posix_types.h WRAP arch/riscv/include/generated/uapi/asm/resource.h WRAP arch/riscv/include/generated/uapi/asm/sembuf.h UPD include/generated/uapi/linux/version.h WRAP arch/riscv/include/generated/uapi/asm/shmbuf.h WRAP arch/riscv/include/generated/uapi/asm/signal.h WRAP arch/riscv/include/generated/uapi/asm/socket.h WRAP arch/riscv/include/generated/uapi/asm/sockios.h WRAP arch/riscv/include/generated/uapi/asm/stat.h WRAP arch/riscv/include/generated/uapi/asm/statfs.h WRAP arch/riscv/include/generated/uapi/asm/swab.h WRAP arch/riscv/include/generated/uapi/asm/termbits.h WRAP arch/riscv/include/generated/uapi/asm/termios.h WRAP arch/riscv/include/generated/uapi/asm/types.h WRAP arch/riscv/include/generated/asm/bugs.h WRAP arch/riscv/include/generated/asm/cacheflush.h WRAP arch/riscv/include/generated/asm/checksum.h WRAP arch/riscv/include/generated/asm/compat.h WRAP arch/riscv/include/generated/asm/cputime.h WRAP arch/riscv/include/generated/asm/device.h WRAP arch/riscv/include/generated/asm/div64.h WRAP arch/riscv/include/generated/asm/dma.h WRAP arch/riscv/include/generated/asm/dma-contiguous.h WRAP arch/riscv/include/generated/asm/dma-mapping.h WRAP arch/riscv/include/generated/asm/emergency-restart.h WRAP arch/riscv/include/generated/asm/errno.h WRAP arch/riscv/include/generated/asm/exec.h WRAP arch/riscv/include/generated/asm/fb.h WRAP arch/riscv/include/generated/asm/fcntl.h WRAP arch/riscv/include/generated/asm/futex.h WRAP arch/riscv/include/generated/asm/hardirq.h WRAP arch/riscv/include/generated/asm/hash.h WRAP arch/riscv/include/generated/asm/hw_irq.h WRAP arch/riscv/include/generated/asm/ioctl.h WRAP arch/riscv/include/generated/asm/ioctls.h WRAP arch/riscv/include/generated/asm/ipcbuf.h WRAP arch/riscv/include/generated/asm/irq_regs.h WRAP arch/riscv/include/generated/asm/irq_work.h WRAP arch/riscv/include/generated/asm/kdebug.h WRAP arch/riscv/include/generated/asm/kmap_types.h WRAP arch/riscv/include/generated/asm/kvm_para.h WRAP arch/riscv/include/generated/asm/local.h WRAP arch/riscv/include/generated/asm/local64.h WRAP arch/riscv/include/generated/asm/mm-arch-hooks.h WRAP arch/riscv/include/generated/asm/mman.h WRAP arch/riscv/include/generated/asm/module.h WRAP arch/riscv/include/generated/asm/msgbuf.h WRAP arch/riscv/include/generated/asm/mutex.h WRAP arch/riscv/include/generated/asm/param.h WRAP arch/riscv/include/generated/asm/percpu.h WRAP arch/riscv/include/generated/asm/poll.h WRAP arch/riscv/include/generated/asm/posix_types.h WRAP arch/riscv/include/generated/asm/preempt.h WRAP arch/riscv/include/generated/asm/resource.h WRAP arch/riscv/include/generated/asm/scatterlist.h WRAP arch/riscv/include/generated/asm/sections.h WRAP arch/riscv/include/generated/asm/sembuf.h WRAP arch/riscv/include/generated/asm/serial.h WRAP arch/riscv/include/generated/asm/setup.h WRAP arch/riscv/include/generated/asm/shmbuf.h WRAP arch/riscv/include/generated/asm/shmparam.h WRAP arch/riscv/include/generated/asm/signal.h WRAP arch/riscv/include/generated/asm/socket.h WRAP arch/riscv/include/generated/asm/sockios.h WRAP arch/riscv/include/generated/asm/stat.h WRAP arch/riscv/include/generated/asm/statfs.h WRAP arch/riscv/include/generated/asm/swab.h WRAP arch/riscv/include/generated/asm/termbits.h WRAP arch/riscv/include/generated/asm/termios.h WRAP arch/riscv/include/generated/asm/topology.h WRAP arch/riscv/include/generated/asm/trace_clock.h WRAP arch/riscv/include/generated/asm/types.h WRAP arch/riscv/include/generated/asm/unaligned.h WRAP arch/riscv/include/generated/asm/user.h WRAP arch/riscv/include/generated/asm/vga.h WRAP arch/riscv/include/generated/asm/vmlinux.lds.h WRAP arch/riscv/include/generated/asm/xor.h HOSTCC scripts/dtc/dtc.o CC scripts/mod/empty.o HOSTCC scripts/dtc/flattree.o HOSTCC scripts/mod/mk_elfconfig HOSTCC scripts/dtc/fstree.o CC scripts/mod/devicetable-offsets.s HOSTCC scripts/dtc/livetree.o HOSTCC scripts/dtc/treesource.o HOSTCC scripts/dtc/srcpos.o HOSTCC scripts/dtc/checks.o HOSTCC scripts/dtc/data.o HOSTCC scripts/dtc/util.o LEX scripts/dtc/dtc-lexer.lex.c Assembler messages: 致命错误: invalid -march= option: `rv64imac' make[3]: [scripts/Makefile.build:318:scripts/mod/empty.o] 错误 1 make[3]: 正在等待未完成的任务.... YACC scripts/dtc/dtc-parser.tab.h YACC scripts/dtc/dtc-parser.tab.c HOSTCC scripts/dtc/dtc-parser.tab.o HOSTCC scripts/dtc/dtc-lexer.lex.o make[2]: [scripts/Makefile.build:558:scripts/mod] 错误 2 make[2]: 正在等待未完成的任务.... HOSTLD scripts/dtc/dtc make[1]: [Makefile:1045:scripts] 错误 2 make[1]: 正在等待未完成的任务.... UPD include/config/kernel.release make[1]: 离开目录“/home/zhantong/XiangShan/riscv-linux” make: *** [Makefile:90:/home/zhantong/XiangShan/riscv-linux/vmlinux] 错误 2

目前配置的riscv64交叉编译器配置如下: zhantong@ubuntu:~$ export PATH=$PATH:/opt/riscv/bin zhantong@ubuntu:~$ riscv64-unknown-linux-gnu-gcc -v Using built-in specs. COLLECT_GCC=riscv64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv64-unknown-linux-gnu/10.2.0/lto-wrapper Target: riscv64-unknown-linux-gnu Configured with: /home/zhantong/XiangShan/riscv-gnu-toolchain/riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv --with-sysroot=/opt/riscv/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=.././riscv-gcc --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' Thread model: single Supported LTO compression algorithms: zlib gcc version 10.2.0 (GCC) zhantong@ubuntu:~$ export PATH=$PATH:/home/zhantong/my_riscv/bin zhantong@ubuntu:~$ riscv64-unknown-elf-gcc -v Using built-in specs. COLLECT_GCC=riscv64-unknown-elf-gcc COLLECT_LTO_WRAPPER=/home/zhantong/my_riscv/libexec/gcc/riscv64-unknown-elf/12.2.0/lto-wrapper Target: riscv64-unknown-elf Configured with: /home/zhantong/riscv-gnu-toolchain/build/../gcc/configure --target=riscv64-unknown-elf --prefix=/home/zhantong/my_riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-pkgversion=g2ee5e430018 --with-system-zlib --enable-tls --with-newlib --with-sysroot=/home/zhantong/my_riscv/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-tm-clone-registry --src=../../gcc --disable-multilib --with-abi=lp64d --with-arch=rv64gc --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow' Thread model: single Supported LTO compression algorithms: zlib gcc version 12.2.0 (g2ee5e430018) zhantong@ubuntu:~$

应当足以涵盖指令集,为什么交叉编译器无法识别rv64imac的选项? 恳求解答!

shinezyy commented 1 year ago

我注意到riscv64-unknown-linux-gnu-gcc是10.2.0,而riscv64-unknown-elf-gcc是12.2.0。前者的编译参数是--with-arch=rv64imafdc,后者则是--with-arch=rv64gc。不确定这是否会有影响?

Bwoah-Kimi commented 1 year ago

重新用WSL平台编译了riscv-gnu-toolchain,两种工具链的配置如下:

root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-linux# riscv64-unknown-elf-gcc -v Using built-in specs. COLLECT_GCC=riscv64-unknown-elf-gcc COLLECT_LTO_WRAPPER=/home/bwoah/my-riscv-newlib/libexec/gcc/riscv64-unknown-elf/12.2.0/lto-wrapper Target: riscv64-unknown-elf Configured with: /home/bwoah/XiangShan/riscv-gnu-toolchain/build/../gcc/configure --target=riscv64-unknown-elf --prefix=/home/bwoah/my-riscv-newlib --disable-shared --disable-threads --enable-languages=c,c++ --with-pkgversion=g2ee5e430018 --with-system-zlib --enable-tls --with-newlib --with-sysroot=/home/bwoah/my-riscv-newlib/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-tm-clone-registry --src=../../gcc --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc_zicsr_zifencei_zba_zbb_zbc_zbs --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow' Thread model: single Supported LTO compression algorithms: zlib gcc version 12.2.0 (g2ee5e430018)

root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-linux# riscv64-unknown-linux-gnu-gcc -v Using built-in specs. COLLECT_GCC=riscv64-unknown-linux-gnu-gcc COLLECT_LTO_WRAPPER=/home/bwoah/my-riscv-linux/libexec/gcc/riscv64-unknown-linux-gnu/12.2.0/lto-wrapper Target: riscv64-unknown-linux-gnu Configured with: /home/bwoah/XiangShan/riscv-gnu-toolchain/build/../gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/home/bwoah/my-riscv-linux --with-sysroot=/home/bwoah/my-riscv-linux/sysroot --with-pkgversion=g2ee5e430018 --with-system-zlib --enable-shared --enable-tls --enable-languages=c,c++,fortran --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libsanitizer --disable-nls --disable-bootstrap --src=../../gcc --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc_zicsr_zifencei_zba_zbb_zbc_zbs --with-tune=rocket --with-isa-spec=20191213 'CFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2 -mcmodel=medlow' Thread model: posix Supported LTO compression algorithms: zlib gcc version 12.2.0 (g2ee5e430018)

在riscv-pk目录下make -j得到如下结果:

root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-pk# make clean rm -rf build root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-pk# make -j 8 RISCV_ROOTFS_HOME=/home/bwoah/XiangShan/riscv-rootfs make -C /home/bwoah/XiangShan/riscv-rootfs mkdir -p build mkdir -p build make[1]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs' dtc -O dtb -I dts -o build/system.dtb dts/system.dts cd build && /home/bwoah/XiangShan/riscv-pk/configure --host=riscv64-unknown-elf --with-payload=/home/bwoah/XiangShan/riscv-linux/vmlinux --with-arch=rv64imac --enable-logo dts/platform.dtsi:19.16-22.7: Warning (unit_address_vs_reg): /soc/mmc: node has a reg or ranges property, but no unit name dts/platform.dtsi:5.21-11.5: Warning (simple_bus_reg): /soc/clint@2000000: simple-bus unit address format error, expected "38000000" dts/platform.dtsi:12.24-18.5: Warning (simple_bus_reg): /soc/serial@60000000: simple-bus unit address format error, expected "40600000" dts/platform.dtsi:19.16-22.7: Warning (simple_bus_reg): /soc/mmc: simple-bus unit address format error, expected "40002000" dts/platform.dtsi:12.24-18.5: Warning (interrupts_property): /soc/serial@60000000: Missing interrupt-parent make -s -C apps/hello install dts/system.dts:34.29-38.6: Warning (interrupt_provider): /cpus/cpu@0/interrupt-controller: Missing #address-cells in interrupt provider make -s -C apps/stream install make -s -C apps/busybox install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/hello' make -s -C apps/redis install make -s -C apps/dwarf/md5 install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/stream' make -s -C apps/dwarf/sort install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/busybox' make -s -C apps/dwarf/wordcount install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/redis' make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/md5' make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/sort' make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/wordcount' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/busybox' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/redis' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/hello' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/stream' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/md5' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/sort' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/wordcount' make[1]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs' RISCV_ROOTFS_HOME=/home/bwoah/XiangShan/riscv-rootfs make -C /home/bwoah/XiangShan/riscv-linux CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv vmlinux make[1]: Entering directory '/home/bwoah/XiangShan/riscv-linux' checking build system type... x86_64-pc-linux-gnu checking host system type... riscv64-unknown-elf checking for riscv64-unknown-elf-gcc... riscv64-unknown-elf-gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... yes checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether riscv64-unknown-elf-gcc accepts -g... yes checking for riscv64-unknown-elf-gcc option to accept ISO C89... none needed checking for riscv64-unknown-elf-g++... riscv64-unknown-elf-g++ checking whether we are using the GNU C++ compiler... yes checking whether riscv64-unknown-elf-g++ accepts -g... yes checking for riscv64-unknown-elf-ar... riscv64-unknown-elf-ar checking for riscv64-unknown-elf-ranlib... riscv64-unknown-elf-ranlib checking for riscv64-unknown-elf-readelf... riscv64-unknown-elf-readelf checking for riscv64-unknown-elf-objcopy... riscv64-unknown-elf-objcopy checking for a BSD-compatible install... /usr/bin/install -c checking how to run the C preprocessor... riscv64-unknown-elf-gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes configure: configuring default subproject : pk configure: configuring default subproject : bbl configure: configuring default subproject : softfloat configure: configuring default subproject : dummy_payload configure: configuring default subproject : machine configure: configuring default subproject : util configure: creating ./config.status config.status: creating pk.mk config.status: creating bbl.mk config.status: creating softfloat.mk config.status: creating dummy_payload.mk config.status: creating machine.mk config.status: creating util.mk config.status: creating Makefile config.status: creating config.h CALL scripts/checksyscalls.sh

:1335:2: warning: #warning syscall rseq not implemented [-Wcpp] CC init/main.o CHK include/generated/compile.h AS arch/riscv/kernel/vdso/flush_icache.o CC arch/riscv/kernel/process.o CC arch/riscv/kernel/signal.o CC arch/riscv/kernel/sys_riscv.o CC arch/riscv/kernel/traps.o arch/riscv/kernel/vdso/flush_icache.S: Assembler messages: arch/riscv/kernel/vdso/flush_icache.S:25: Error: unrecognized opcode `fence.i', extension `zifencei' required make[3]: *** [scripts/Makefile.build:417: arch/riscv/kernel/vdso/flush_icache.o] Error 1 make[2]: *** [scripts/Makefile.build:558: arch/riscv/kernel/vdso] Error 2 make[2]: *** Waiting for unfinished jobs.... CC arch/riscv/mm/fault.o CC arch/riscv/mm/cacheflush.o ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:36: Error: unrecognized opcode `csrc sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:24: Error: unrecognized opcode `csrr a5,sstatus', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:36: Error: unrecognized opcode `csrc sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:24: Error: unrecognized opcode `csrr a5,sstatus', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:24: Error: unrecognized opcode `csrr a5,sstatus', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: init/main.o] Error 1 make[1]: *** [Makefile:1029: init] Error 2 make[1]: *** Waiting for unfinished jobs.... ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/process.o] Error 1 ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:36: Error: unrecognized opcode `csrc sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required arch/riscv/kernel/traps.c:162: Error: unrecognized opcode `csrw sscratch,0', extension `zicsr' required arch/riscv/kernel/traps.c:164: Error: unrecognized opcode `csrw stvec,a5', extension `zicsr' required arch/riscv/kernel/traps.c:166: Error: unrecognized opcode `csrw sie,a5', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/traps.o] Error 1 ./arch/riscv/include/asm/cacheflush.h: Assembler messages: ./arch/riscv/include/asm/cacheflush.h:25: Error: unrecognized opcode `fence.i', extension `zifencei' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/sys_riscv.o] Error 1 ./arch/riscv/include/asm/cacheflush.h: Assembler messages: ./arch/riscv/include/asm/cacheflush.h:25: Error: unrecognized opcode `fence.i', extension `zifencei' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/mm/cacheflush.o] Error 1 make[2]: *** Waiting for unfinished jobs.... arch/riscv/mm/fault.c: In function 'do_page_fault': arch/riscv/mm/fault.c:40:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] 40 | struct task_struct *tsk; | ^~~~~~ arch/riscv/kernel/signal.c: Assembler messages: arch/riscv/kernel/signal.c:175: Error: unrecognized opcode `csrs sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:175: Error: unrecognized opcode `csrc sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:176: Error: unrecognized opcode `csrs sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:176: Error: unrecognized opcode `csrc sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:134: Error: unrecognized opcode `csrs sstatus,a2', extension `zicsr' required arch/riscv/kernel/signal.c:134: Error: unrecognized opcode `csrc sstatus,a2', extension `zicsr' required arch/riscv/kernel/signal.c:73: Error: unrecognized opcode `csrs sstatus,a2', extension `zicsr' required arch/riscv/kernel/signal.c:73: Error: unrecognized opcode `csrc sstatus,a2', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/signal.o] Error 1 make[1]: *** [Makefile:1029: arch/riscv/kernel] Error 2 ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required arch/riscv/mm/fault.c:249: Error: unrecognized opcode `csrr a2,sptbr', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/mm/fault.o] Error 1 make[1]: *** [Makefile:1029: arch/riscv/mm] Error 2 make[1]: Leaving directory '/home/bwoah/XiangShan/riscv-linux' make: *** [Makefile:90: /home/bwoah/XiangShan/riscv-linux/vmlinux] Error 2 root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-pk# cd ../riscv-linux root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-linux# make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- emu_defconfig # # configuration written to .config # root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-linux# make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- emu_de fconfig # # configuration written to .config # root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-linux# cd ../riscv-pk root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-pk# make clean rm -rf build root@ROG-Zephyrus-G15:/home/bwoah/XiangShan/riscv-pk# make -j RISCV_ROOTFS_HOME=/home/bwoah/XiangShan/riscv-rootfs make -C /home/bwoah/XiangShan/riscv-rootfs mkdir -p build mkdir -p build make[1]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs' dtc -O dtb -I dts -o build/system.dtb dts/system.dts cd build && /home/bwoah/XiangShan/riscv-pk/configure --host=riscv64-unknown-elf --with-payload=/home/bwoah/XiangShan/riscv-linux/vmlinux --with-arch=rv64imac --enable-logo dts/platform.dtsi:19.16-22.7: Warning (unit_address_vs_reg): /soc/mmc: node has a reg or ranges property, but no unit name dts/platform.dtsi:5.21-11.5: Warning (simple_bus_reg): /soc/clint@2000000: simple-bus unit address format error, expected "38000000" dts/platform.dtsi:12.24-18.5: Warning (simple_bus_reg): /soc/serial@60000000: simple-bus unit address format error, expected "40600000" dts/platform.dtsi:19.16-22.7: Warning (simple_bus_reg): /soc/mmc: simple-bus unit address format error, expected "40002000" dts/platform.dtsi:12.24-18.5: Warning (interrupts_property): /soc/serial@60000000: Missing interrupt-parent dts/system.dts:34.29-38.6: Warning (interrupt_provider): /cpus/cpu@0/interrupt-controller: Missing #address-cells in interrupt provider make -s -C apps/hello install make -s -C apps/stream install make -s -C apps/busybox install make -s -C apps/redis install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/hello' make -s -C apps/dwarf/md5 install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/stream' make -s -C apps/dwarf/sort install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/busybox' make -s -C apps/dwarf/wordcount install make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/redis' make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/md5' make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/wordcount' make[2]: Entering directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/sort' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/redis' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/busybox' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/hello' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/stream' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/wordcount' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/md5' make[2]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs/apps/dwarf/sort' make[1]: Leaving directory '/home/bwoah/XiangShan/riscv-rootfs' RISCV_ROOTFS_HOME=/home/bwoah/XiangShan/riscv-rootfs make -C /home/bwoah/XiangShan/riscv-linux CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv vmlinux make[1]: Entering directory '/home/bwoah/XiangShan/riscv-linux' checking build system type... x86_64-pc-linux-gnu checking host system type... riscv64-unknown-elf checking for riscv64-unknown-elf-gcc... riscv64-unknown-elf-gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... yes checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether riscv64-unknown-elf-gcc accepts -g... yes checking for riscv64-unknown-elf-gcc option to accept ISO C89... none needed checking for riscv64-unknown-elf-g++... riscv64-unknown-elf-g++ checking whether we are using the GNU C++ compiler... yes checking whether riscv64-unknown-elf-g++ accepts -g... yes checking for riscv64-unknown-elf-ar... riscv64-unknown-elf-ar checking for riscv64-unknown-elf-ranlib... riscv64-unknown-elf-ranlib checking for riscv64-unknown-elf-readelf... riscv64-unknown-elf-readelf checking for riscv64-unknown-elf-objcopy... riscv64-unknown-elf-objcopy checking for a BSD-compatible install... /usr/bin/install -c checking how to run the C preprocessor... riscv64-unknown-elf-gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes configure: configuring default subproject : pk configure: configuring default subproject : bbl configure: configuring default subproject : softfloat configure: configuring default subproject : dummy_payload configure: configuring default subproject : machine configure: configuring default subproject : util configure: creating ./config.status config.status: creating pk.mk config.status: creating bbl.mk config.status: creating softfloat.mk config.status: creating dummy_payload.mk config.status: creating machine.mk config.status: creating util.mk config.status: creating Makefile config.status: creating config.h scripts/kconfig/conf --syncconfig Kconfig CALL scripts/checksyscalls.sh :1335:2: warning: #warning syscall rseq not implemented [-Wcpp] CC init/main.o CHK include/generated/compile.h AS arch/riscv/kernel/vdso/flush_icache.o CC arch/riscv/kernel/process.o CC arch/riscv/kernel/signal.o CC arch/riscv/kernel/traps.o CC arch/riscv/kernel/sys_riscv.o arch/riscv/kernel/vdso/flush_icache.S: Assembler messages: arch/riscv/kernel/vdso/flush_icache.S:25: Error: unrecognized opcode `fence.i', extension `zifencei' required make[3]: *** [scripts/Makefile.build:417: arch/riscv/kernel/vdso/flush_icache.o] Error 1 make[2]: *** [scripts/Makefile.build:558: arch/riscv/kernel/vdso] Error 2 make[2]: *** Waiting for unfinished jobs.... CC arch/riscv/mm/fault.o CC arch/riscv/mm/cacheflush.o ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:36: Error: unrecognized opcode `csrc sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:24: Error: unrecognized opcode `csrr a5,sstatus', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:36: Error: unrecognized opcode `csrc sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:24: Error: unrecognized opcode `csrr a5,sstatus', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:24: Error: unrecognized opcode `csrr a5,sstatus', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: init/main.o] Error 1 make[1]: *** [Makefile:1029: init] Error 2 make[1]: *** Waiting for unfinished jobs.... ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/process.o] Error 1 ./arch/riscv/include/asm/cacheflush.h: Assembler messages: ./arch/riscv/include/asm/cacheflush.h:25: Error: unrecognized opcode `fence.i', extension `zifencei' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/sys_riscv.o] Error 1 ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:36: Error: unrecognized opcode `csrc sstatus,2', extension `zicsr' required ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required arch/riscv/kernel/traps.c:162: Error: unrecognized opcode `csrw sscratch,0', extension `zicsr' required arch/riscv/kernel/traps.c:164: Error: unrecognized opcode `csrw stvec,a5', extension `zicsr' required arch/riscv/kernel/traps.c:166: Error: unrecognized opcode `csrw sie,a5', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/traps.o] Error 1 arch/riscv/kernel/signal.c: Assembler messages: arch/riscv/kernel/signal.c:175: Error: unrecognized opcode `csrs sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:175: Error: unrecognized opcode `csrc sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:176: Error: unrecognized opcode `csrs sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:176: Error: unrecognized opcode `csrc sstatus,a3', extension `zicsr' required arch/riscv/kernel/signal.c:134: Error: unrecognized opcode `csrs sstatus,a2', extension `zicsr' required arch/riscv/kernel/signal.c:134: Error: unrecognized opcode `csrc sstatus,a2', extension `zicsr' required arch/riscv/kernel/signal.c:73: Error: unrecognized opcode `csrs sstatus,a2', extension `zicsr' required arch/riscv/kernel/signal.c:73: Error: unrecognized opcode `csrc sstatus,a2', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/kernel/signal.o] Error 1 make[1]: *** [Makefile:1029: arch/riscv/kernel] Error 2 ./arch/riscv/include/asm/cacheflush.h: Assembler messages: ./arch/riscv/include/asm/cacheflush.h:25: Error: unrecognized opcode `fence.i', extension `zifencei' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/mm/cacheflush.o] Error 1 make[2]: *** Waiting for unfinished jobs.... arch/riscv/mm/fault.c: In function 'do_page_fault': arch/riscv/mm/fault.c:40:9: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] 40 | struct task_struct *tsk; | ^~~~~~ ./arch/riscv/include/asm/irqflags.h: Assembler messages: ./arch/riscv/include/asm/irqflags.h:30: Error: unrecognized opcode `csrs sstatus,2', extension `zicsr' required arch/riscv/mm/fault.c:249: Error: unrecognized opcode `csrr a2,sptbr', extension `zicsr' required make[2]: *** [scripts/Makefile.build:317: arch/riscv/mm/fault.o] Error 1 make[1]: *** [Makefile:1029: arch/riscv/mm] Error 2 make[1]: Leaving directory '/home/bwoah/XiangShan/riscv-linux' make: *** [Makefile:90: /home/bwoah/XiangShan/riscv-linux/vmlinux] Error 2 上述两个扩展指令集应该已经被涵盖,为何会有报错? 恳求解答!
shinezyy commented 1 year ago

看起来是as出错,你可以贴一下AS的信息(比如路径、 版本)

Bwoah-Kimi commented 1 year ago

root@ROG-Zephyrus-G15:~# as --version Copyright (C) 2022 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or later. This program has absolutely no warranty. This assembler was configured for a target of `x86_64-linux-gnu'.

root@ROG-Zephyrus-G15:~# riscv64-unknown-linux-gnu-as --version GNU assembler (GNU Binutils) 2.40.0.20230214 Copyright (C) 2023 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or later. This program has absolutely no warranty. This assembler was configured for a target of `riscv64-unknown-linux-gnu'.

root@ROG-Zephyrus-G15:/home/bwoah/my-riscv-linux/bin# ls riscv64-unknown-linux-gnu-addr2line riscv64-unknown-linux-gnu-gcc-nm riscv64-unknown-linux-gnu-lto-dump riscv64-unknown-linux-gnu-ar riscv64-unknown-linux-gnu-gcc-ranlib riscv64-unknown-linux-gnu-nm riscv64-unknown-linux-gnu-as riscv64-unknown-linux-gnu-gcov riscv64-unknown-linux-gnu-objcopy riscv64-unknown-linux-gnu-c++ riscv64-unknown-linux-gnu-gcov-dump riscv64-unknown-linux-gnu-objdump riscv64-unknown-linux-gnu-c++filt riscv64-unknown-linux-gnu-gcov-tool riscv64-unknown-linux-gnu-ranlib riscv64-unknown-linux-gnu-cpp riscv64-unknown-linux-gnu-gdb riscv64-unknown-linux-gnu-readelf riscv64-unknown-linux-gnu-elfedit riscv64-unknown-linux-gnu-gdb-add-index riscv64-unknown-linux-gnu-run riscv64-unknown-linux-gnu-g++ riscv64-unknown-linux-gnu-gfortran riscv64-unknown-linux-gnu-size riscv64-unknown-linux-gnu-gcc riscv64-unknown-linux-gnu-gprof riscv64-unknown-linux-gnu-strings riscv64-unknown-linux-gnu-gcc-12.2.0 riscv64-unknown-linux-gnu-ld riscv64-unknown-linux-gnu-strip riscv64-unknown-linux-gnu-gcc-ar riscv64-unknown-linux-gnu-ld.bfd

chenguokai commented 1 year ago

根据Reddit讨论,近期的GCC工具链默认没有包括Zicsr支持,上文gcc版本为12,应当受到了该问题影响,可以参考讨论中给出的解决方法尝试下。我们开发时通常使用gcc 10,不受该更改影响,应该是之前没有发现该问题的原因。

Bwoah-Kimi commented 1 year ago

根据Reddit讨论,近期的GCC工具链默认没有包括Zicsr支持,上文gcc版本为12,应当受到了该问题影响,可以参考讨论中给出的解决方法尝试下。我们开发时通常使用gcc 10,不受该更改影响,应该是之前没有发现该问题的原因。

感谢回复,我看到这个issue里有提到类似的问题,但是我的toolchain应该是清晰指明了ziscr和zifencei的,理论上不会出现这样的问题?

poemonsense commented 1 year ago

实际编译用的march是编译时命令行传进去的,不是工具链编译时候完全确定的。工具链编译时候的march只影响lib和默认的march

如果要使用香山的环境,切换到gcc 10.2.0

如果要用新版工具链,需要在编译环境中march加入zicsr,参考https://github.com/OpenXiangShan/riscv-pk/commit/8927a5f30e0e11db81f4dc2a1d24b796360501ef对riscv-pk编译选项的改动

Bwoah-Kimi commented 1 year ago

目前问题得到解决,工具链编译时需指明ziscr zifencei,此外riscv-pk的Makefile中需要将BBL_CONFIG中--with-arch选项增加_ziscr_zifencei,可以成功编译。