Skip to content

Commit

Permalink
tools/[Rust|D]: Fix the Rust and D Builds for QEMU RISC-V
Browse files Browse the repository at this point in the history
This PR fixes the build for Rust Apps on QEMU RISC-V 64-bit. Previously the Rust Build selected the [incorrect Rust Target riscv64i-unknown-none-elf](https://lupyuen.github.io/articles/rust5#rust-target-is-incorrect). Now the Rust Build selects the correct Rust Target: riscv64gc-unknown-none-elf.

To validate the fix, we create a new NuttX Config `rv-virt:leds64_rust` that builds the `leds_rust` example for QEMU RISC-V 64-bit. `leds_rust` will be compiled for every run of NuttX CI.

Note that Rust Apps won't build correctly for QEMU RISC-V 32-bit. This requires a [Rust Custom Target for riscv32gc](https://lupyuen.github.io/articles/rust4#custom-target-for-rust), which will make the NuttX Makefiles much more complicated.

This PR also fixes the 32-bit RISC-V Target for D Apps. D Targets ("riscv32") are named differently from Rust Targets ("riscv32gc"), this PR restores the correct Target Names.

Modified Files:

`tools/Rust.defs`: Rename the RISC-V ISA `imafdc` to `gc` for Rust Targets

`tools/D.defs`: Exclude the RISC-V ISA for D Targets

`tools/ci/docker/linux/Dockerfile`, `tools/ci/platforms/ubuntu.sh`, `tools/ci/platforms/msys2.sh`: Add Rust Target `riscv64gc-unknown-none-elf` for CI

New Files:

`boards/risc-v/qemu-rv/rv-virt/configs/leds64_rust/defconfig`: Add new NuttX Config `rv-virt:leds64_rust`

Updated Docs:

`applications/examples/leds_rust/index.rst`: Add `leds_rust` example app

`platforms/risc-v/qemu-rv/boards/rv-virt/index.rst`: Add `rv-virt:leds64_rust` config
  • Loading branch information
lupyuen committed Aug 6, 2024
1 parent 439b9e9 commit 71bd5f8
Show file tree
Hide file tree
Showing 8 changed files with 122 additions and 37 deletions.
6 changes: 6 additions & 0 deletions Documentation/applications/examples/leds_rust/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
=================================
``leds_rust`` Toggle LEDs in Rust
=================================

This is a simple test in Rust of the board LED driver at
``nuttx/drivers/leds/userled_*.c``.
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,11 @@ leds64

Similar to the `nsh64`_ configuration, but with User LEDs support for 64-bit RISC-V.

leds64_rust
-----------

Similar to the `leds64`_ configuration, but with ``leds_rust`` example enabled.

netnsh
------

Expand Down
76 changes: 76 additions & 0 deletions boards/risc-v/qemu-rv/rv-virt/configs/leds64_rust/defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#
# This file is autogenerated: PLEASE DO NOT EDIT IT.
#
# You can use "make menuconfig" to make any modifications to the installed .config file.
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
# modifications.
#
# CONFIG_DISABLE_OS_API is not set
# CONFIG_NSH_DISABLE_LOSMART is not set
CONFIG_16550_ADDRWIDTH=0
CONFIG_16550_UART0=y
CONFIG_16550_UART0_BASE=0x10000000
CONFIG_16550_UART0_CLOCK=3686400
CONFIG_16550_UART0_IRQ=37
CONFIG_16550_UART0_SERIAL_CONSOLE=y
CONFIG_16550_UART=y
CONFIG_ARCH="risc-v"
CONFIG_ARCH_BOARD="rv-virt"
CONFIG_ARCH_BOARD_QEMU_RV_VIRT=y
CONFIG_ARCH_CHIP="qemu-rv"
CONFIG_ARCH_CHIP_QEMU_RV64=y
CONFIG_ARCH_CHIP_QEMU_RV=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_A=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_C=y
CONFIG_ARCH_CHIP_QEMU_RV_ISA_M=y
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_BCH=y
CONFIG_BOARDCTL_POWEROFF=y
CONFIG_BOARD_LATE_INITIALIZE=y
CONFIG_BOARD_LOOPSPERMSEC=6366
CONFIG_BUILTIN=y
CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEVICE_TREE=y
CONFIG_DEV_ZERO=y
CONFIG_ELF=y
CONFIG_EXAMPLES_HELLO=y
CONFIG_EXAMPLES_LEDS=y
CONFIG_EXAMPLES_LEDS_RUST=y
CONFIG_FS_HOSTFS=y
CONFIG_FS_PROCFS=y
CONFIG_IDLETHREAD_STACKSIZE=2048
CONFIG_INIT_ENTRYPOINT="nsh_main"
CONFIG_INIT_STACKSIZE=3072
CONFIG_LIBC_ENVPATH=y
CONFIG_LIBC_EXECFUNCS=y
CONFIG_LIBC_PERROR_STDOUT=y
CONFIG_LIBC_STRERROR=y
CONFIG_LIBM=y
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_READLINE=y
CONFIG_PATH_INITIAL="/system/bin"
CONFIG_RAM_SIZE=33554432
CONFIG_RAM_START=0x80000000
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_RISCV_SEMIHOSTING_HOSTFS=y
CONFIG_RR_INTERVAL=200
CONFIG_SCHED_WAITPID=y
CONFIG_SERIAL_UART_ARCH_MMIO=y
CONFIG_STACK_COLORATION=y
CONFIG_START_MONTH=12
CONFIG_START_YEAR=2021
CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_NSH_STACKSIZE=3072
CONFIG_TESTING_GETPRIME=y
CONFIG_TESTING_OSTEST=y
CONFIG_USEC_PER_TICK=1000
CONFIG_USERLED=y
CONFIG_USERLED_LOWER=y
30 changes: 10 additions & 20 deletions tools/D.defs
Original file line number Diff line number Diff line change
Expand Up @@ -46,28 +46,18 @@ ifeq ($(CONFIG_ARCH_SIM),y)
DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-apple-$(LLVM_ABITYPE)
endif
else ifeq ($(CONFIG_ARCH_RISCV),y)
# Traget triple is riscv[32|64][isa]-unknown-none-elf
# Target triple is riscv[32|64]-unknown-none-elf
DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-unknown-none-elf
DFLAGS += -mattr=+m,+a,+f,+d,+c

D_ARCHTYPE = $(LLVM_ARCHTYPE)i
ifeq ($(CONFIG_ARCH_RV_ISA_M),y)
D_ARCHTYPE := $(D_ARCHTYPE)m
# Handle ABI and CPU
ifeq ($(CONFIG_ARCH_RV32),y)
DFLAGS += -mcpu=generic-rv32
DFLAGS += -mabi=ilp32d
else ifeq ($(CONFIG_ARCH_RV64),y)
DFLAGS += -mcpu=generic-rv64
DFLAGS += -mabi=lp64d
endif
ifeq ($(CONFIG_ARCH_RV_ISA_A),y)
D_ARCHTYPE := $(D_ARCHTYPE)a
endif
ifeq ($(CONFIG_ARCH_RV_ISA_F),y)
D_ARCHTYPE := $(D_ARCHTYPE)f
endif
ifeq ($(CONFIG_ARCH_RV_ISA_D),y)
D_ARCHTYPE := $(D_ARCHTYPE)d
endif
ifeq ($(CONFIG_ARCH_RV_ISA_C),y)
D_ARCHTYPE := $(D_ARCHTYPE)c
endif

DFLAGS += -mtriple=$(D_ARCHTYPE)-unknown-none-elf
DFLAGS += -mattr=+m,+a,+f,+d,+c -mabi=ilp32d
DFLAGS += -mcpu=generic-rv32
else
# For arm, but there are some other archs not support yet,
# such as xtensa, x86 bare metal, etc.
Expand Down
37 changes: 21 additions & 16 deletions tools/Rust.defs
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,28 @@ ifeq ($(CONFIG_ARCH_SIM),y)
RUSTFLAGS += --target $(LLVM_ARCHTYPE)-apple-$(LLVM_ABITYPE)
endif
else ifeq ($(CONFIG_ARCH_RISCV),y)
# Traget triple is riscv[32|64][isa]-unknown-none-elf
# Target triple is riscv[32|64][isa]-unknown-none-elf
# "imafdc" becomes "gc"

RUST_ARCHTYPE = $(LLVM_ARCHTYPE)i
ifeq ($(CONFIG_ARCH_RV_ISA_M),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)m
endif
ifeq ($(CONFIG_ARCH_RV_ISA_A),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)a
endif
ifeq ($(CONFIG_ARCH_RV_ISA_F),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)f
endif
ifeq ($(CONFIG_ARCH_RV_ISA_D),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)d
endif
ifeq ($(CONFIG_ARCH_RV_ISA_C),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)c
ifeq ($(CONFIG_ARCH_RV_ISA_M)$(CONFIG_ARCH_RV_ISA_A)$(CONFIG_ARCH_FPU)$(CONFIG_ARCH_DPFPU)$(CONFIG_ARCH_RV_ISA_C),yyyyy)
RUST_ARCHTYPE = $(LLVM_ARCHTYPE)gc
else
RUST_ARCHTYPE = $(LLVM_ARCHTYPE)i
ifeq ($(CONFIG_ARCH_RV_ISA_M),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)m
endif
ifeq ($(CONFIG_ARCH_RV_ISA_A),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)a
endif
ifeq ($(CONFIG_ARCH_FPU),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)f
endif
ifeq ($(CONFIG_ARCH_DPFPU),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)d
endif
ifeq ($(CONFIG_ARCH_RV_ISA_C),y)
RUST_ARCHTYPE := $(RUST_ARCHTYPE)c
endif
endif

RUSTFLAGS += --target $(RUST_ARCHTYPE)-unknown-none-elf
Expand Down
3 changes: 2 additions & 1 deletion tools/ci/docker/linux/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ ENV RUSTUP_HOME=$RUST_HOME/rustup
RUN mkdir -p $CARGO_HOME \
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
&& $CARGO_HOME/bin/rustup target add thumbv6m-none-eabi \
&& $CARGO_HOME/bin/rustup target add thumbv7m-none-eabi
&& $CARGO_HOME/bin/rustup target add thumbv7m-none-eabi \
&& $CARGO_HOME/bin/rustup target add riscv64gc-unknown-none-elf

RUN mkdir /tools/gn -p \
&& cd /tools/gn \
Expand Down
1 change: 1 addition & 0 deletions tools/ci/platforms/msys2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ rust() {
# Install targets supported from NuttX
"$CARGO_HOME"/bin/rustup target add thumbv6m-none-eabi
"$CARGO_HOME"/bin/rustup target add thumbv7m-none-eabi
"$CARGO_HOME"/bin/rustup target add riscv64gc-unknown-none-elf
rm rustup-init.exe
fi
command rustc --version
Expand Down
1 change: 1 addition & 0 deletions tools/ci/platforms/ubuntu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ rust() {
# Install targets supported from NuttX
rustup target add thumbv6m-none-eabi
rustup target add thumbv7m-none-eabi
rustup target add riscv64gc-unknown-none-elf
fi

command rustc --version
Expand Down

0 comments on commit 71bd5f8

Please sign in to comment.