Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

config.nims: Support Nim Apps for RISC-V 32-bit and 64-bit #6

Closed
wants to merge 1 commit into from

Conversation

lupyuen
Copy link

@lupyuen lupyuen commented Jan 3, 2024

Summary

NuttX Build fails when it compiles examples/hello_nim for RISC-V (32-bit and 64-bit). That's because the Nim Config Script config.nims couldn't identify the Nim Target Platform: riscv32 or riscv64.

This PR fixes config.nims so that Nim Compiler correctly derives the Nim Target Platform (riscv32 or riscv64), by searching NuttX .config for CONFIG_ARCH_FAMILY=rv32 or rv64.

This logic is slightly different from the Nim Targets arm and arm64, which are currently derived from CONFIG_ARCH=arm and arm64.

config.nims is explained in this article.

Impact

With this PR, Nim Apps will build correctly for 32-bit and 64-bit RISC-V.

There is no impact on other platforms, like Arm and Arm64.

Testing

We tested by building QEMU NuttX with examples/hello_nim enabled for RISC-V 32-bit, RISC-V 64-bit and Arm64 (for regression testing).

RISC-V 32-bit

Before Fixing: NuttX Build fails for hello_nim because arch and cpu in Nim Compiler are empty:

$ tools/configure.sh rv-virt:nsh
$ kconfig-tweak --enable CONFIG_EXAMPLES_HELLO_NIM
$ make
* arch:    
/workspaces/bookworm/apps/config.nims(1, 2)
Error: argument for command line option expected: '--cpu'

(Failed Build Log for 32-bit RISC-V)

After Fixing: NuttX Build succeeds with the correct arch and cpu in Nim Compiler:

$ make
* arch:    riscv32
Hint: used config file '/workspaces/bookworm/apps/config.nims' [Conf]

(Fixed Build Log for 32-bit RISC-V)

RISC-V 64-bit

NuttX Build succeeds with the correct arch and cpu in Nim Compiler:

$ tools/configure.sh rv-virt:nsh64
$ kconfig-tweak --enable CONFIG_EXAMPLES_HELLO_NIM
$ make
* arch:    riscv64
Hint: used config file '/workspaces/bookworm/apps/config.nims' [Conf]

(Fixed Build Log for 64-bit RISC-V)

Arm64

For Regression Testing: NuttX Build succeeds with the correct arch and cpu in Nim Compiler:

$ tools/configure.sh qemu-armv8a:nsh
$ kconfig-tweak --enable CONFIG_EXAMPLES_HELLO_NIM
$ make
* arch:    arm64
Hint: used config file '/workspaces/bookworm/apps/config.nims' [Conf]

(Build Log for Arm64)

Nim Exception

For Arm64: hello_nim runs correctly on Arm64 QEMU:

nsh> hello_nim
Hello from task 1! loops: 0
Hello from task 2! loops: 0
...
Hello from task 3! loops: 2

(NuttX Log for Arm64)

For RISC-V 32-bit and 64-bit: hello_nim halts with a Load Access Fault for 32-bit RISC-V:

nsh> hello_nim
Hello from task 1! loops: 0
riscv_exception: EXCEPTION: Load access fault. MCAUSE: 00000005, EPC: 8000dd10, MTVAL: 00000038

Load Access Fault at nuttx/fs/inode/fs_files.c:607
  /* if f_inode is NULL, fd was closed */
  if ((*filep)->f_inode == NULL)
8000dd10:	451c                	lw	a5,8(a0)

(NuttX Exception for 32-bit RISC-V)

hello_nim also halts with a Load Access Fault for 64-bit RISC-V:

nsh> hello_nim
Hello from task 1! loops: 0
riscv_exception: EXCEPTION: Load access fault. MCAUSE: 0000000000000005, EPC: 0000000080002432, MTVAL: d0ef000555638482

Load Access Fault at nuttx/sched/semaphore/sem_wait.c:93
nxsem_wait():
  /* Make sure we were supplied with a valid semaphore. */
  /* Check if the lock is available */
  if (sem->semcount > 0)
    80002432:	00055783          	lhu	a5,0(a0)

(NuttX Exception for 64-bit RISC-V)

This will be fixed later. For now, we tested a Simple Nim Function that runs correctly on 32-bit and 64-bit RISC-V:

## Simple Nim Function that prints something
$ cat ../apps/examples/hello_nim/hello_nim_async.nim
proc hello_nim() {.exportc, cdecl.} =
  echo "Hello Nim!"
  GC_runOrc()

$ make
$ qemu-system-riscv32 \
  -M virt,aclint=on \
  -cpu rv32 \
  -smp 8 \
  -bios none \
  -kernel nuttx \
  -nographic

NuttShell (NSH) NuttX-12.0.3
nsh> hello_nim
Hello Nim!

(Simple Nim Log for 32-bit RISC-V)

(Simple Nim Log for 64-bit RISC-V)

NuttX Build fails when it compiles `examples/hello_nim` for RISC-V (32-bit and 64-bit). That's because the Nim Config Script `config.nims` couldn't identify the Nim Target Platform: `riscv32` or `riscv64`.

This PR fixes `config.nims` so that Nim Compiler correctly derives the Nim Target Platform (`riscv32` or `riscv64`), by searching NuttX `.config` for `CONFIG_ARCH_FAMILY=rv32` or `rv64`.

This logic is slightly different from the Nim Targets `arm` and `arm64`, which are currently derived from `CONFIG_ARCH=arm` and `arm64`.

`config.nims` is explained in this article: https://lupyuen.github.io/articles/nim#inside-nim-on-nuttx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant