[PATCH 00/13] tools/nolibc: riscv: Add full rv32 support

Zhangjin Wu falcon at tinylab.org
Wed May 24 10:33:14 PDT 2023


Hi, Willy

Thanks very mush for your kindly review, discuss and suggestion, now we
get full rv32 support ;-)

In the first series [1], we have fixed up the compile errors about
_start and __NR_llseek for rv32, but left compile errors about tons of
time32 syscalls (removed after kernel commit d4c08b9776b3 ("riscv: Use
latest system call ABI")) and the missing fstat in nolibc-test.c [2],
now we have fixed up all of them.

Introduction
============

This series is based on the 20230524-nolibc-rv32+stkp4 branch of [3], it
includes 3 parts, they work together to add full rv32 support:

* Reverts two old out-of-day patches
  * Revert "tools/nolibc: riscv: Support __NR_llseek for rv32"
  * Revert "selftests/nolibc: Fix up compile error for rv32"

  (these two and the reverted ones:

    * commit 606343b7478c ("selftests/nolibc: Fix up compile error for rv32") 
    * commit d2c3acba6d66 ("tools/nolibc: riscv: Support __NR_llseek for rv32")

  can be removed from the git repo completely, there are two new ones to replace
  them)

* Compile and test support patches
  * selftests/nolibc: print name instead of number for EOVERFLOW
  * selftests/nolibc: syscall_args: use __NR_statx for rv32
    * --> replace the old one 606343b7478, use statx instead of read
  * selftests/nolibc: riscv: customize makefile for rv32
  * selftests/nolibc: allow specify a bios for qemu
  * selftests/nolibc: remove the duplicated gettimeofday_bad2

* Fix up some missing syscalls, mainly time32 syscalls
  * tools/nolibc: sys_lseek: riscv: use __NR_llseek for rv32
    * --> replace the old one d2c3acba6d66, cleaned up 
  * tools/nolibc: sys_poll: riscv: use __NR_ppoll_time64 for rv32
  * tools/nolibc: ppoll/ppoll_time64: Add a missing argument
  * tools/nolibc: sys_select: riscv: use __NR_pselect6_time64 for rv32
  * tools/nolibc: sys_wait4: riscv: use __NR_waitid for rv32
  * tools/nolibc: sys_gettimeofday: riscv: use __NR_clock_gettime64 for rv32

Compile
=======

For rv64:

    $ make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- nolibc-test
    $ file nolibc-test
    nolibc-test: ELF 64-bit LSB executable, UCB RISC-V ...

    $ make ARCH=riscv64 CROSS_COMPILE=riscv64-linux-gnu- nolibc-test
    $ file nolibc-test
    nolibc-test: ELF 64-bit LSB executable, UCB RISC-V ...

For rv32:

    $ make ARCH=riscv CONFIG_32BIT=1 CROSS_COMPILE=riscv64-linux-gnu- nolibc-test
    $ file nolibc-test
    nolibc-test: ELF 32-bit LSB executable, UCB RISC-V ...

    $ make ARCH=riscv32 CROSS_COMPILE=riscv64-linux-gnu- nolibc-test
    $ file nolibc-test
    nolibc-test: ELF 32-bit LSB executable, UCB RISC-V ...

Testing
=======

Environment:

    // gcc toolchain
    $ riscv64-linux-gnu-gcc --version
    riscv64-linux-gnu-gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    // glibc >= 2.33 required, for older glibc, must upgrade include/bits/wordsize.h
    $ dpkg -l | grep libc6-dev | grep riscv
    ii  libc6-dev-riscv64-cross                  2.31-0ubuntu7cross1

    // glibc include/bits/wordsize.h: manually upgraded to >= 2.33
    // without this, can not build tools/testing/selftests/nolibc/nolibc-test.c
    $ cat /usr/riscv64-linux-gnu/include/bits/wordsize.h
    #if __riscv_xlen == (__SIZEOF_POINTER__ * 8)
    # define __WORDSIZE __riscv_xlen
    #else
    # error unsupported ABI
    #endif

    # define __WORDSIZE_TIME64_COMPAT32 1

    #if __WORDSIZE == 32
    # define __WORDSIZE32_SIZE_ULONG    0
    # define __WORDSIZE32_PTRDIFF_LONG  0
    #endif

    // higher qemu version is better, latest version is v8.0.0+
    $ qemu-system-riscv64  --version
    QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.18)
    Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

    // opensbi version, higher is better, must match kernel version and qemu version
    // rv64: used version is 1.2, latest is 1.2
    $ head -2 /labs/linux-lab/src/linux-stable/tools/testing/selftests/nolibc/run.out | tail -1
    OpenSBI v1.2-116-g7919530
    // rv32: used version is v0.9, latest is 1.2
    $ head -2 /labs/linux-lab/src/linux-stable/tools/testing/selftests/nolibc/run.out | tail -1
    OpenSBI v0.9-152-g754d511

For rv64:

    $ pwd
    /labs/linux-lab/src/linux-stable/tools/testing/selftests/nolibc
    $ make ARCH=riscv64 CROSS_COMPILE=riscv64-linux-gnu- defconfig
    $ make ARCH=riscv64 CROSS_COMPILE=riscv64-linux-gnu- BIOS=/labs/linux-lab/boards/riscv64/virt/bsp/bios/opensbi/generic/fw_jump.elf run
        MKDIR   sysroot/riscv/include
      make[1]: Entering directory '/labs/linux-lab/src/linux-stable/tools/include/nolibc'
      make[2]: Entering directory '/labs/linux-lab/src/linux-stable'
      make[2]: Leaving directory '/labs/linux-lab/src/linux-stable'
      make[2]: Entering directory '/labs/linux-lab/src/linux-stable'
        INSTALL /labs/linux-lab/src/linux-stable/tools/testing/selftests/nolibc/sysroot/sysroot/include
      make[2]: Leaving directory '/labs/linux-lab/src/linux-stable'
      make[1]: Leaving directory '/labs/linux-lab/src/linux-stable/tools/include/nolibc'
        CC      nolibc-test
        MKDIR   initramfs
        INSTALL initramfs/init
      make[1]: Entering directory '/labs/linux-lab/src/linux-stable'
        ...
        LD      vmlinux
        NM      System.map
        SORTTAB vmlinux
        OBJCOPY arch/riscv/boot/Image
        Kernel: arch/riscv/boot/Image is ready
      make[1]: Leaving directory '/labs/linux-lab/src/linux-stable'
      135 test(s) passed.
    $ file ../../../../vmlinux
    ../../../../vmlinux: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, BuildID[sha1]=b8e1cea5122b04bce540b4022f0d6f171ffe615a, not stripped

For rv32:

    $ pwd
    /labs/linux-lab/src/linux-stable/tools/testing/selftests/nolibc
    $ make ARCH=riscv32 CROSS_COMPILE=riscv64-linux-gnu- defconfig
    $ make ARCH=riscv32 CROSS_COMPILE=riscv64-linux-gnu- BIOS=/labs/linux-lab/boards/riscv32/virt/bsp/bios/opensbi/generic/fw_jump.elf run
          MKDIR   sysroot/riscv/include
    make[1]: Entering directory '/labs/linux-lab/src/linux-stable/tools/include/nolibc'
    make[2]: Entering directory '/labs/linux-lab/src/linux-stable'
    make[2]: Leaving directory '/labs/linux-lab/src/linux-stable'
    make[2]: Entering directory '/labs/linux-lab/src/linux-stable'
      INSTALL /labs/linux-lab/src/linux-stable/tools/testing/selftests/nolibc/sysroot/sysroot/include
    make[2]: Leaving directory '/labs/linux-lab/src/linux-stable'
    make[1]: Leaving directory '/labs/linux-lab/src/linux-stable/tools/include/nolibc'
      CC      nolibc-test
      MKDIR   initramfs
      INSTALL initramfs/init
    make[1]: Entering directory '/labs/linux-lab/src/linux-stable'
      CALL    scripts/checksyscalls.sh
      GEN     usr/initramfs_data.cpio
      COPY    usr/initramfs_inc_data
      AS      usr/initramfs_data.o
      AR      usr/built-in.a
      GEN     security/selinux/flask.h security/selinux/av_permissions.h
      CC      security/selinux/avc.o
      CC      security/selinux/hooks.o
      CC      security/selinux/selinuxfs.o
      CC      security/selinux/nlmsgtab.o
      CC      security/selinux/netif.o
      CC      security/selinux/netnode.o
      CC      security/selinux/netport.o
      CC      security/selinux/status.o
      CC      security/selinux/ss/services.o
      AR      security/selinux/built-in.a
      AR      security/built-in.a
      AR      built-in.a
      AR      vmlinux.a
      LD      vmlinux.o
      OBJCOPY modules.builtin.modinfo
      GEN     modules.builtin
      MODPOST vmlinux.symvers
      UPD     include/generated/utsversion.h
      CC      init/version-timestamp.o
      LD      .tmp_vmlinux.kallsyms1
      NM      .tmp_vmlinux.kallsyms1.syms
      KSYMS   .tmp_vmlinux.kallsyms1.S
      AS      .tmp_vmlinux.kallsyms1.S
      LD      .tmp_vmlinux.kallsyms2
      NM      .tmp_vmlinux.kallsyms2.syms
      KSYMS   .tmp_vmlinux.kallsyms2.S
      AS      .tmp_vmlinux.kallsyms2.S
      LD      vmlinux
      NM      System.map
      SORTTAB vmlinux
      OBJCOPY arch/riscv/boot/Image
      Kernel: arch/riscv/boot/Image is ready
    make[1]: Leaving directory '/labs/linux-lab/src/linux-stable'
    135 test(s) passed.
    $ file ../../../../vmlinux
    ../../../../vmlinux: ELF 32-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, BuildID[sha1]=bad4c1f3899f47355d2a2010bade56972fd94b9d, not stripped
 
The full rv64 testing result (run.out) is uploaded at [4].
The full rv32 testing result (run.out) is uploaded at [5].

That's all, thanks!

Best regards,
Zhangjin Wu
---

[1]: https://lore.kernel.org/linux-riscv/20230520143154.68663-1-falcon@tinylab.org/T/#mf0e54ee19bd3f94dadbb4420ed9dffa316d1719d
[2]: https://lore.kernel.org/linux-riscv/20230520135235.68155-1-falcon@tinylab.org/T/#u
[3]: https://git.kernel.org/pub/scm/linux/kernel/git/wtarreau/nolibc.git
[4]: https://pastebin.com/3L0nV78u
[5]: https://pastebin.com/RadrXdta 



Zhangjin Wu (13):
  Revert "tools/nolibc: riscv: Support __NR_llseek for rv32"
  Revert "selftests/nolibc: Fix up compile error for rv32"
  selftests/nolibc: print name instead of number for EOVERFLOW
  selftests/nolibc: syscall_args: use __NR_statx for rv32
  selftests/nolibc: riscv: customize makefile for rv32
  selftests/nolibc: allow specify a bios for qemu
  selftests/nolibc: remove the duplicated gettimeofday_bad2
  tools/nolibc: sys_lseek: riscv: use __NR_llseek for rv32
  tools/nolibc: sys_poll: riscv: use __NR_ppoll_time64 for rv32
  tools/nolibc: ppoll/ppoll_time64: Add a missing argument
  tools/nolibc: sys_select: riscv: use __NR_pselect6_time64 for rv32
  tools/nolibc: sys_wait4: riscv: use __NR_waitid for rv32
  tools/nolibc: sys_gettimeofday: riscv: use __NR_clock_gettime64 for
    rv32

 tools/include/nolibc/std.h                   |   1 +
 tools/include/nolibc/sys.h                   | 135 +++++++++++++++++--
 tools/include/nolibc/types.h                 |  21 ++-
 tools/testing/selftests/nolibc/Makefile      |  14 +-
 tools/testing/selftests/nolibc/nolibc-test.c |  15 ++-
 5 files changed, 167 insertions(+), 19 deletions(-)

-- 
2.25.1




More information about the linux-riscv mailing list