[PATCH] openrisc: migrate to the generic rule for built-in DTB

2024-12-21 Thread Masahiro Yamada
Commit 654102df2ac2 ("kbuild: add generic support for built-in boot
DTBs") introduced generic support for built-in DTBs.

Select GENERIC_BUILTIN_DTB to use the generic rule.

To keep consistency across architectures, this commit also renames
CONFIG_OPENRISC_BUILTIN_DTB_NAME to CONFIG_BUILTIN_DTB_NAME.

Signed-off-by: Masahiro Yamada 
---

 arch/openrisc/Kbuild   | 1 -
 arch/openrisc/Kconfig  | 3 ++-
 arch/openrisc/boot/dts/Makefile| 2 +-
 arch/openrisc/configs/or1klitex_defconfig  | 2 +-
 arch/openrisc/configs/or1ksim_defconfig| 2 +-
 arch/openrisc/configs/simple_smp_defconfig | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/openrisc/Kbuild b/arch/openrisc/Kbuild
index b0b0f2b03f87..70bdb24ff204 100644
--- a/arch/openrisc/Kbuild
+++ b/arch/openrisc/Kbuild
@@ -1,6 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 obj-y += lib/ kernel/ mm/
-obj-y += boot/dts/
 
 # for cleaning
 subdir- += boot
diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
index 3279ef457c57..3d053e0b59f4 100644
--- a/arch/openrisc/Kconfig
+++ b/arch/openrisc/Kconfig
@@ -10,6 +10,7 @@ config OPENRISC
select ARCH_HAS_DMA_SET_UNCACHED
select ARCH_HAS_DMA_CLEAR_UNCACHED
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
+   select GENERIC_BUILTIN_DTB
select COMMON_CLK
select OF
select OF_EARLY_FLATTREE
@@ -92,7 +93,7 @@ config DCACHE_WRITETHROUGH
 
  If unsure say N here
 
-config OPENRISC_BUILTIN_DTB
+config BUILTIN_DTB_NAME
string "Builtin DTB"
default ""
 
diff --git a/arch/openrisc/boot/dts/Makefile b/arch/openrisc/boot/dts/Makefile
index 13db5a2aab52..3a66e0ef3985 100644
--- a/arch/openrisc/boot/dts/Makefile
+++ b/arch/openrisc/boot/dts/Makefile
@@ -1,4 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-obj-y += $(addsuffix .dtb.o, $(CONFIG_OPENRISC_BUILTIN_DTB))
+dtb-y += $(addsuffix .dtb, $(CONFIG_BUILTIN_DTB_NAME))
 
 #DTC_FLAGS ?= -p 1024
diff --git a/arch/openrisc/configs/or1klitex_defconfig 
b/arch/openrisc/configs/or1klitex_defconfig
index 466f31a091be..3e849d25838a 100644
--- a/arch/openrisc/configs/or1klitex_defconfig
+++ b/arch/openrisc/configs/or1klitex_defconfig
@@ -7,7 +7,7 @@ CONFIG_BLK_DEV_INITRD=y
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SGETMASK_SYSCALL=y
 CONFIG_EXPERT=y
-CONFIG_OPENRISC_BUILTIN_DTB="or1klitex"
+CONFIG_BUILTIN_DTB_NAME="or1klitex"
 CONFIG_HZ_100=y
 CONFIG_OPENRISC_HAVE_SHADOW_GPRS=y
 CONFIG_NET=y
diff --git a/arch/openrisc/configs/or1ksim_defconfig 
b/arch/openrisc/configs/or1ksim_defconfig
index 0116e465238f..59fe33cefba2 100644
--- a/arch/openrisc/configs/or1ksim_defconfig
+++ b/arch/openrisc/configs/or1ksim_defconfig
@@ -14,7 +14,7 @@ CONFIG_SLUB=y
 CONFIG_SLUB_TINY=y
 CONFIG_MODULES=y
 # CONFIG_BLOCK is not set
-CONFIG_OPENRISC_BUILTIN_DTB="or1ksim"
+CONFIG_BUILTIN_DTB_NAME="or1ksim"
 CONFIG_HZ_100=y
 CONFIG_NET=y
 CONFIG_PACKET=y
diff --git a/arch/openrisc/configs/simple_smp_defconfig 
b/arch/openrisc/configs/simple_smp_defconfig
index b990cb6c9309..6008e824d31c 100644
--- a/arch/openrisc/configs/simple_smp_defconfig
+++ b/arch/openrisc/configs/simple_smp_defconfig
@@ -20,7 +20,7 @@ CONFIG_SLUB=y
 CONFIG_SLUB_TINY=y
 CONFIG_MODULES=y
 # CONFIG_BLOCK is not set
-CONFIG_OPENRISC_BUILTIN_DTB="simple_smp"
+CONFIG_BUILTIN_DTB_NAME="simple_smp"
 CONFIG_SMP=y
 CONFIG_HZ_100=y
 CONFIG_OPENRISC_HAVE_SHADOW_GPRS=y
-- 
2.43.0




Re: [PATCH 1/6] tools/nolibc: add support for waitid()

2024-12-21 Thread Willy Tarreau
Hi Thomas!

On Sat, Dec 21, 2024 at 03:44:28PM +0100, Thomas Weißschuh wrote:
> waitid() is the modern variant of the family of wait-like syscalls.
> Some architectures have dropped support for wait(), wait4() and waitpid()
> but all of them support waitid().
> It is more flexible and easier to use than the older ones.

I'm generally fine with the series, but I'm starting to get concerned
that some simple applications that used to rely on wait() or waitpid()
will not work on this architecture. Just like we did for some early
syscalls that got replaced (e.g. open->openat etc), I think we'll have
to implement a default wrapper relying on waitid() for all these calls
in this case, and maybe as well for lseek->llseek() btw, what do you
think ?

The single fact that you've had to modify some of the nolibc-test code
(which is supposed to be the application here) indicates that we're
progressively going away from what applications need on certain archs.
Ideally an application relying on long-established calls should continue
to work unmodified.

Maybe it will be time for us to run an overall audit of arch-dependent
syscalls we currently have, to make sure that the common ones continue
to work fine there (and waitpid() definitely is as common a syscall as
open() since it's the good old and portable one).

Cheers,
Willy



[PATCH 3/6] selftests/nolibc: use a pipe to in vfprintf tests

2024-12-21 Thread Thomas Weißschuh
Not all architectures implement lseek(), for example riscv32 only
implements llseek() which is not equivalent to normal lseek().
Remove the need for lseek() by using a pipe instead.

Signed-off-by: Thomas Weißschuh 
---
 tools/testing/selftests/nolibc/nolibc-test.c | 20 +---
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/tools/testing/selftests/nolibc/nolibc-test.c 
b/tools/testing/selftests/nolibc/nolibc-test.c
index 
60c50968d3630e4909a5ecb2400770baaf7c2add..3685c13a9a6b8fd5110715b95ff323cdcb29481a
 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -1229,19 +1229,20 @@ int run_stdlib(int min, int max)
 
 static int expect_vfprintf(int llen, int c, const char *expected, const char 
*fmt, ...)
 {
-   int ret, fd;
+   int ret, pipefd[2];
ssize_t w, r;
char buf[100];
FILE *memfile;
va_list args;
 
-   fd = open("/tmp", O_TMPFILE | O_EXCL | O_RDWR, 0600);
-   if (fd == -1) {
-   result(llen, SKIPPED);
-   return 0;
+   ret = pipe(pipefd);
+   if (ret == -1) {
+   llen += printf(" pipe() != %s", strerror(errno));
+   result(llen, FAIL);
+   return 1;
}
 
-   memfile = fdopen(fd, "w+");
+   memfile = fdopen(pipefd[1], "w");
if (!memfile) {
result(llen, FAIL);
return 1;
@@ -1257,13 +1258,10 @@ static int expect_vfprintf(int llen, int c, const char 
*expected, const char *fm
return 1;
}
 
-   fflush(memfile);
-   lseek(fd, 0, SEEK_SET);
-
-   r = read(fd, buf, sizeof(buf) - 1);
-
fclose(memfile);
 
+   r = read(pipefd[0], buf, sizeof(buf) - 1);
+
if (r != w) {
llen += printf(" written(%d) != read(%d)", (int)w, (int)r);
result(llen, FAIL);

-- 
2.47.1




[PATCH 2/6] selftests/nolibc: use waitid() over waitpid()

2024-12-21 Thread Thomas Weißschuh
Newer archs like riscv32 don't provide waitpid() anymore.
Switch to waitid() which is available everywhere.

Signed-off-by: Thomas Weißschuh 
---
 tools/testing/selftests/nolibc/nolibc-test.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/nolibc/nolibc-test.c 
b/tools/testing/selftests/nolibc/nolibc-test.c
index 
6fba7025c5e3c002085862fdf6fa950da6000d6c..60c50968d3630e4909a5ecb2400770baaf7c2add
 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -1323,7 +1323,8 @@ static int run_protection(int min __attribute__((unused)),
  int max __attribute__((unused)))
 {
pid_t pid;
-   int llen = 0, status;
+   int llen = 0, ret;
+   siginfo_t siginfo = {};
struct rlimit rlimit = { 0, 0 };
 
llen += printf("0 -fstackprotector ");
@@ -1361,10 +1362,11 @@ static int run_protection(int min 
__attribute__((unused)),
return 1;
 
default:
-   pid = waitpid(pid, &status, 0);
+   ret = waitid(P_PID, pid, &siginfo, WEXITED);
 
-   if (pid == -1 || !WIFSIGNALED(status) || WTERMSIG(status) != 
SIGABRT) {
-   llen += printf("waitpid()");
+   if (ret != 0 || siginfo.si_signo != SIGCHLD ||
+   siginfo.si_code != CLD_KILLED || siginfo.si_status != 
SIGABRT) {
+   llen += printf("waitid()");
result(llen, FAIL);
return 1;
}

-- 
2.47.1




[PATCH 5/6] selftests/nolibc: rename riscv to riscv64

2024-12-21 Thread Thomas Weißschuh
riscv32 support is about the be added. To keep the naming clear and
consistent with other architectures rename riscv to riscv64, as that is
what it actually represents.

Signed-off-by: Thomas Weißschuh 
---
 tools/testing/selftests/nolibc/Makefile | 6 ++
 tools/testing/selftests/nolibc/run-tests.sh | 2 +-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/nolibc/Makefile 
b/tools/testing/selftests/nolibc/Makefile
index 
e92e0b88586111072a0e043cb15f3b59cf42c3a6..78f47e85b389ac229ac13f3e7c8299fb3ec92197
 100644
--- a/tools/testing/selftests/nolibc/Makefile
+++ b/tools/testing/selftests/nolibc/Makefile
@@ -43,6 +43,7 @@ cc-option = $(call __cc-option, 
$(CC),$(CLANG_CROSS_FLAGS),$(1),$(2))
 # configure default variants for target kernel supported architectures
 XARCH_powerpc= ppc
 XARCH_mips   = mips32le
+XARCH_riscv  = riscv64
 XARCH= $(or $(XARCH_$(ARCH)),$(ARCH))
 
 # map from user input variants to their kernel supported architectures
@@ -51,6 +52,7 @@ ARCH_ppc64   = powerpc
 ARCH_ppc64le = powerpc
 ARCH_mips32le= mips
 ARCH_mips32be= mips
+ARCH_riscv64 = riscv
 ARCH:= $(or $(ARCH_$(XARCH)),$(XARCH))
 
 # kernel image names by architecture
@@ -65,6 +67,7 @@ IMAGE_ppc= vmlinux
 IMAGE_ppc64  = vmlinux
 IMAGE_ppc64le= arch/powerpc/boot/zImage
 IMAGE_riscv  = arch/riscv/boot/Image
+IMAGE_riscv64= arch/riscv/boot/Image
 IMAGE_s390   = arch/s390/boot/bzImage
 IMAGE_loongarch  = arch/loongarch/boot/vmlinuz.efi
 IMAGE= $(objtree)/$(IMAGE_$(XARCH))
@@ -82,6 +85,7 @@ DEFCONFIG_ppc= pmac32_defconfig
 DEFCONFIG_ppc64  = powernv_be_defconfig
 DEFCONFIG_ppc64le= powernv_defconfig
 DEFCONFIG_riscv  = defconfig
+DEFCONFIG_riscv64= defconfig
 DEFCONFIG_s390   = defconfig
 DEFCONFIG_loongarch  = defconfig
 DEFCONFIG= $(DEFCONFIG_$(XARCH))
@@ -104,6 +108,7 @@ QEMU_ARCH_ppc= ppc
 QEMU_ARCH_ppc64  = ppc64
 QEMU_ARCH_ppc64le= ppc64
 QEMU_ARCH_riscv  = riscv64
+QEMU_ARCH_riscv64= riscv64
 QEMU_ARCH_s390   = s390x
 QEMU_ARCH_loongarch  = loongarch64
 QEMU_ARCH= $(QEMU_ARCH_$(XARCH))
@@ -130,6 +135,7 @@ QEMU_ARGS_ppc= -M g3beige -append "console=ttyS0 
panic=-1 $(TEST:%=NOLIB
 QEMU_ARGS_ppc64  = -M powernv -append "console=hvc0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_ppc64le= -M powernv -append "console=hvc0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_riscv  = -M virt -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_riscv64= -M virt -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_s390   = -M s390-ccw-virtio -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_loongarch  = -M virt -append "console=ttyS0,115200 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS= -m 1G $(QEMU_ARGS_$(XARCH)) $(QEMU_ARGS_BIOS) 
$(QEMU_ARGS_EXTRA)
diff --git a/tools/testing/selftests/nolibc/run-tests.sh 
b/tools/testing/selftests/nolibc/run-tests.sh
index 
e7ecda4ae796fbf0d389f20144511e66ce4f0b30..caa1ae40fe9a2faf8931c299aacd19716227e2b8
 100755
--- a/tools/testing/selftests/nolibc/run-tests.sh
+++ b/tools/testing/selftests/nolibc/run-tests.sh
@@ -17,7 +17,7 @@ perform_download=0
 test_mode=system
 werror=1
 llvm=
-archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv s390 
loongarch"
+archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv64 s390 
loongarch"
 
 TEMP=$(getopt -o 'j:d:c:b:a:m:pelh' -n "$0" -- "$@")
 

-- 
2.47.1




[PATCH 4/6] selftests/nolibc: skip tests for unimplemented syscalls

2024-12-21 Thread Thomas Weißschuh
The riscv32 architecture is missing many of the older syscalls.
Instead of providing wrappers for everything at once, introducing a lot
of complexity, skip the tests for those syscalls for now.

Signed-off-by: Thomas Weißschuh 
---
 tools/testing/selftests/nolibc/nolibc-test.c | 14 +++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/nolibc/nolibc-test.c 
b/tools/testing/selftests/nolibc/nolibc-test.c
index 
3685c13a9a6b8fd5110715b95ff323cdcb29481a..0e0e3b48a8c3a6802c6989954b6f3a7c7258db43
 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -302,7 +302,10 @@ int expect_syszr(int expr, int llen)
 {
int ret = 0;
 
-   if (expr) {
+   if (errno == ENOSYS) {
+   llen += printf(" = ENOSYS");
+   result(llen, SKIPPED);
+   } else if (expr) {
ret = 1;
llen += printf(" = %d %s ", expr, errorname(errno));
result(llen, FAIL);
@@ -342,7 +345,10 @@ int expect_sysne(int expr, int llen, int val)
 {
int ret = 0;
 
-   if (expr == val) {
+   if (errno == ENOSYS) {
+   llen += printf(" = ENOSYS");
+   result(llen, SKIPPED);
+   } else if (expr == val) {
ret = 1;
llen += printf(" = %d %s ", expr, errorname(errno));
result(llen, FAIL);
@@ -367,7 +373,9 @@ int expect_syserr2(int expr, int expret, int experr1, int 
experr2, int llen)
int _errno = errno;
 
llen += printf(" = %d %s ", expr, errorname(_errno));
-   if (expr != expret || (_errno != experr1 && _errno != experr2)) {
+   if (errno == ENOSYS) {
+   result(llen, SKIPPED);
+   } else if (expr != expret || (_errno != experr1 && _errno != experr2)) {
ret = 1;
if (experr2 == 0)
llen += printf(" != (%d %s) ", expret, 
errorname(experr1));

-- 
2.47.1




[PATCH 6/6] selftests/nolibc: add configurations for riscv32

2024-12-21 Thread Thomas Weißschuh
nolibc already supports riscv32. Wire it up in the testsuite.

Signed-off-by: Thomas Weißschuh 
---
 tools/testing/selftests/nolibc/Makefile | 5 +
 tools/testing/selftests/nolibc/run-tests.sh | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/nolibc/Makefile 
b/tools/testing/selftests/nolibc/Makefile
index 
78f47e85b389ac229ac13f3e7c8299fb3ec92197..7d14a7c0cb62608f328b251495264517d333db2e
 100644
--- a/tools/testing/selftests/nolibc/Makefile
+++ b/tools/testing/selftests/nolibc/Makefile
@@ -52,6 +52,7 @@ ARCH_ppc64   = powerpc
 ARCH_ppc64le = powerpc
 ARCH_mips32le= mips
 ARCH_mips32be= mips
+ARCH_riscv32 = riscv
 ARCH_riscv64 = riscv
 ARCH:= $(or $(ARCH_$(XARCH)),$(XARCH))
 
@@ -67,6 +68,7 @@ IMAGE_ppc= vmlinux
 IMAGE_ppc64  = vmlinux
 IMAGE_ppc64le= arch/powerpc/boot/zImage
 IMAGE_riscv  = arch/riscv/boot/Image
+IMAGE_riscv32= arch/riscv/boot/Image
 IMAGE_riscv64= arch/riscv/boot/Image
 IMAGE_s390   = arch/s390/boot/bzImage
 IMAGE_loongarch  = arch/loongarch/boot/vmlinuz.efi
@@ -85,6 +87,7 @@ DEFCONFIG_ppc= pmac32_defconfig
 DEFCONFIG_ppc64  = powernv_be_defconfig
 DEFCONFIG_ppc64le= powernv_defconfig
 DEFCONFIG_riscv  = defconfig
+DEFCONFIG_riscv32= rv32_defconfig
 DEFCONFIG_riscv64= defconfig
 DEFCONFIG_s390   = defconfig
 DEFCONFIG_loongarch  = defconfig
@@ -108,6 +111,7 @@ QEMU_ARCH_ppc= ppc
 QEMU_ARCH_ppc64  = ppc64
 QEMU_ARCH_ppc64le= ppc64
 QEMU_ARCH_riscv  = riscv64
+QEMU_ARCH_riscv32= riscv32
 QEMU_ARCH_riscv64= riscv64
 QEMU_ARCH_s390   = s390x
 QEMU_ARCH_loongarch  = loongarch64
@@ -135,6 +139,7 @@ QEMU_ARGS_ppc= -M g3beige -append "console=ttyS0 
panic=-1 $(TEST:%=NOLIB
 QEMU_ARGS_ppc64  = -M powernv -append "console=hvc0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_ppc64le= -M powernv -append "console=hvc0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_riscv  = -M virt -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_riscv32= -M virt -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_riscv64= -M virt -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_s390   = -M s390-ccw-virtio -append "console=ttyS0 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_loongarch  = -M virt -append "console=ttyS0,115200 panic=-1 
$(TEST:%=NOLIBC_TEST=%)"
diff --git a/tools/testing/selftests/nolibc/run-tests.sh 
b/tools/testing/selftests/nolibc/run-tests.sh
index 
caa1ae40fe9a2faf8931c299aacd19716227e2b8..67fefc847d77165f817c3befa578cfa27e6f93d8
 100755
--- a/tools/testing/selftests/nolibc/run-tests.sh
+++ b/tools/testing/selftests/nolibc/run-tests.sh
@@ -17,7 +17,7 @@ perform_download=0
 test_mode=system
 werror=1
 llvm=
-archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv64 s390 
loongarch"
+archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv32 
riscv64 s390 loongarch"
 
 TEMP=$(getopt -o 'j:d:c:b:a:m:pelh' -n "$0" -- "$@")
 

-- 
2.47.1




[PATCH 0/6] selftests/nolibc: wire up riscv32

2024-12-21 Thread Thomas Weißschuh
Nolibc has support for riscv32. But the testsuite did not allow to test
it so far. Add a test configuration.

Signed-off-by: Thomas Weißschuh 
---
Thomas Weißschuh (6):
  tools/nolibc: add support for waitid()
  selftests/nolibc: use waitid() over waitpid()
  selftests/nolibc: use a pipe to in vfprintf tests
  selftests/nolibc: skip tests for unimplemented syscalls
  selftests/nolibc: rename riscv to riscv64
  selftests/nolibc: add configurations for riscv32

 tools/include/nolibc/sys.h   | 18 
 tools/testing/selftests/nolibc/Makefile  | 11 +++
 tools/testing/selftests/nolibc/nolibc-test.c | 44 
 tools/testing/selftests/nolibc/run-tests.sh  |  2 +-
 4 files changed, 56 insertions(+), 19 deletions(-)
---
base-commit: 499551201b5f4fd3c0618a3e95e3d0d15ea18f31
change-id: 20241219-nolibc-rv32-cff8a3e22394

Best regards,
-- 
Thomas Weißschuh 




[PATCH 1/6] tools/nolibc: add support for waitid()

2024-12-21 Thread Thomas Weißschuh
waitid() is the modern variant of the family of wait-like syscalls.
Some architectures have dropped support for wait(), wait4() and waitpid()
but all of them support waitid().
It is more flexible and easier to use than the older ones.

Signed-off-by: Thomas Weißschuh 
---
 tools/include/nolibc/sys.h | 18 ++
 1 file changed, 18 insertions(+)

diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
index 
7b82bc3cf107439a3f09f98b99d4d540ffb9ba2a..d4a5c2399a66b200ebf7ab249569cce2285481a5
 100644
--- a/tools/include/nolibc/sys.h
+++ b/tools/include/nolibc/sys.h
@@ -23,6 +23,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "arch.h"
 #include "errno.h"
@@ -1225,6 +1226,23 @@ pid_t waitpid(pid_t pid, int *status, int options)
 }
 
 
+/*
+ * int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
+ */
+
+static __attribute__((unused))
+int sys_waitid(int which, pid_t pid, siginfo_t *infop, int options, struct 
rusage *rusage)
+{
+   return my_syscall5(__NR_waitid, which, pid, infop, options, rusage);
+}
+
+static __attribute__((unused))
+int waitid(int which, pid_t pid, siginfo_t *infop, int options)
+{
+   return __sysret(sys_waitid(which, pid, infop, options, NULL));
+}
+
+
 /*
  * ssize_t write(int fd, const void *buf, size_t count);
  */

-- 
2.47.1