linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/5] Add LoongArch support to nolibc
@ 2023-02-09  3:24 chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 1/5] tools/nolibc: Include linux/fcntl.h and remove duplicate code chris.chenfeiyang
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: chris.chenfeiyang @ 2023-02-09  3:24 UTC (permalink / raw)
  To: w, paulmck
  Cc: Feiyang Chen, arnd, chenhuacai, jiaxun.yang, chris.chenfeiyang,
	loongarch, linux-kernel

From: Feiyang Chen <chenfeiyang@loongson.cn>

Add statx() and make stat() rely on statx() if necessary.
Add support for LoongArch (32 and 64 bit) to nolibc.
It was tested on LoongArch64 only.

The latest QEMU support full-system emulation of a LoongArch64
machine, but for the moment we need to specify the firmware manually.
https://github.com/loongson/Firmware/tree/main/LoongArchVirtMachine

QEMU_ARGS_loongarch  = -M virt -bios edk2-loongarch64-code.fd ...

v2:
- Mention that statx() will also benefit other architectures.
- Make stat() rely on statx() when available.
- Put the whitespace changes into one commit.

v3:
- Add #if defined(__NR_statx) guard.
- Keep the check for statx() from the first version.
- Mention that we may use statx() everywhere in the future.
- struct statx stat -> struct statx statx.

Feiyang Chen (5):
  tools/nolibc: Include linux/fcntl.h and remove duplicate code
  tools/nolibc: Add statx() and make stat() rely on statx() if necessary
  tools/nolibc: Add support for LoongArch
  selftests/nolibc: Add support for LoongArch
  selftests/nolibc: Adjust indentation for Makefile

 tools/include/nolibc/arch-loongarch.h   | 200 ++++++++++++++++++++++++
 tools/include/nolibc/arch.h             |   2 +
 tools/include/nolibc/sys.h              |  58 ++++++-
 tools/include/nolibc/types.h            |   5 -
 tools/testing/selftests/nolibc/Makefile |  78 ++++-----
 5 files changed, 300 insertions(+), 43 deletions(-)
 create mode 100644 tools/include/nolibc/arch-loongarch.h

-- 
2.39.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 1/5] tools/nolibc: Include linux/fcntl.h and remove duplicate code
  2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
@ 2023-02-09  3:24 ` chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary chris.chenfeiyang
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: chris.chenfeiyang @ 2023-02-09  3:24 UTC (permalink / raw)
  To: w, paulmck
  Cc: Feiyang Chen, arnd, chenhuacai, jiaxun.yang, chris.chenfeiyang,
	loongarch, linux-kernel

From: Feiyang Chen <chenfeiyang@loongson.cn>

Include linux/fcntl.h for O_* and AT_*. asm/fcntl.h is included
by linux/fcntl.h, so it can be safely removed.

Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
---
 tools/include/nolibc/sys.h   | 2 +-
 tools/include/nolibc/types.h | 5 -----
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
index b5f8cd35c03b..c4818a9c8823 100644
--- a/tools/include/nolibc/sys.h
+++ b/tools/include/nolibc/sys.h
@@ -11,7 +11,6 @@
 #include "std.h"
 
 /* system includes */
-#include <asm/fcntl.h>   // for O_*
 #include <asm/unistd.h>
 #include <asm/signal.h>  // for SIGCHLD
 #include <asm/ioctls.h>
@@ -20,6 +19,7 @@
 #include <linux/loop.h>
 #include <linux/time.h>
 #include <linux/auxvec.h>
+#include <linux/fcntl.h> // for O_* and AT_*
 
 #include "arch.h"
 #include "errno.h"
diff --git a/tools/include/nolibc/types.h b/tools/include/nolibc/types.h
index fbbc0e68c001..a3651c514e2f 100644
--- a/tools/include/nolibc/types.h
+++ b/tools/include/nolibc/types.h
@@ -60,11 +60,6 @@
 #define MAXPATHLEN     (PATH_MAX)
 #endif
 
-/* Special FD used by all the *at functions */
-#ifndef AT_FDCWD
-#define AT_FDCWD       (-100)
-#endif
-
 /* whence values for lseek() */
 #define SEEK_SET       0
 #define SEEK_CUR       1
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary
  2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 1/5] tools/nolibc: Include linux/fcntl.h and remove duplicate code chris.chenfeiyang
@ 2023-02-09  3:24 ` chris.chenfeiyang
  2023-02-12 21:12   ` Willy Tarreau
  2023-02-09  3:24 ` [PATCH v3 3/5] tools/nolibc: Add support for LoongArch chris.chenfeiyang
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: chris.chenfeiyang @ 2023-02-09  3:24 UTC (permalink / raw)
  To: w, paulmck
  Cc: Feiyang Chen, arnd, chenhuacai, jiaxun.yang, chris.chenfeiyang,
	loongarch, linux-kernel

From: Feiyang Chen <chenfeiyang@loongson.cn>

LoongArch and RISC-V 32-bit only have statx(). ARC, Hexagon, Nios2 and
OpenRISC have statx() and stat64() but not stat() or newstat(). Add
statx() and make stat() rely on statx() if necessary to make them happy.
We may just use statx() for all architectures in the future.

Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
---
 tools/include/nolibc/sys.h | 56 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
index c4818a9c8823..70c30d457952 100644
--- a/tools/include/nolibc/sys.h
+++ b/tools/include/nolibc/sys.h
@@ -20,6 +20,7 @@
 #include <linux/time.h>
 #include <linux/auxvec.h>
 #include <linux/fcntl.h> // for O_* and AT_*
+#include <linux/stat.h>  // for statx()
 
 #include "arch.h"
 #include "errno.h"
@@ -1048,12 +1049,66 @@ pid_t setsid(void)
 	return ret;
 }
 
+#if defined(__NR_statx)
+/*
+ * int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf);
+ */
+
+static __attribute__((unused))
+int sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
+{
+	return my_syscall5(__NR_statx, fd, path, flags, mask, buf);
+}
+
+static __attribute__((unused))
+int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
+{
+	int ret = sys_statx(fd, path, flags, mask, buf);
+
+	if (ret < 0) {
+		SET_ERRNO(-ret);
+		ret = -1;
+	}
+	return ret;
+}
+#endif
 
 /*
  * int stat(const char *path, struct stat *buf);
  * Warning: the struct stat's layout is arch-dependent.
  */
 
+#if defined(__NR_statx) && !defined(__NR_newfstatat) && !defined(__NR_stat)
+/*
+ * Maybe we can just use statx() when available for all architectures?
+ */
+static __attribute__((unused))
+int sys_stat(const char *path, struct stat *buf)
+{
+	struct statx statx;
+	long ret;
+
+	ret = sys_statx(AT_FDCWD, path, AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx);
+	buf->st_dev     = ((statx.stx_dev_minor & 0xff)
+			  | (statx.stx_dev_major << 8)
+			  | ((statx.stx_dev_minor & ~0xff) << 12));
+	buf->st_ino     = statx.stx_ino;
+	buf->st_mode    = statx.stx_mode;
+	buf->st_nlink   = statx.stx_nlink;
+	buf->st_uid     = statx.stx_uid;
+	buf->st_gid     = statx.stx_gid;
+	buf->st_rdev    = ((statx.stx_rdev_minor & 0xff)
+			  | (statx.stx_rdev_major << 8)
+			  | ((statx.stx_rdev_minor & ~0xff) << 12));
+	buf->st_size    = statx.stx_size;
+	buf->st_blksize = statx.stx_blksize;
+	buf->st_blocks  = statx.stx_blocks;
+	buf->st_atime   = statx.stx_atime.tv_sec;
+	buf->st_mtime   = statx.stx_mtime.tv_sec;
+	buf->st_ctime   = statx.stx_ctime.tv_sec;
+	return ret;
+}
+#else
 static __attribute__((unused))
 int sys_stat(const char *path, struct stat *buf)
 {
@@ -1083,6 +1138,7 @@ int sys_stat(const char *path, struct stat *buf)
 	buf->st_ctime   = stat.st_ctime;
 	return ret;
 }
+#endif
 
 static __attribute__((unused))
 int stat(const char *path, struct stat *buf)
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 3/5] tools/nolibc: Add support for LoongArch
  2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 1/5] tools/nolibc: Include linux/fcntl.h and remove duplicate code chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary chris.chenfeiyang
@ 2023-02-09  3:24 ` chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 4/5] selftests/nolibc: " chris.chenfeiyang
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: chris.chenfeiyang @ 2023-02-09  3:24 UTC (permalink / raw)
  To: w, paulmck
  Cc: Feiyang Chen, arnd, chenhuacai, jiaxun.yang, chris.chenfeiyang,
	loongarch, linux-kernel

From: Feiyang Chen <chenfeiyang@loongson.cn>

Add support for LoongArch (32 and 64 bit) to nolibc.

Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
---
 tools/include/nolibc/arch-loongarch.h | 200 ++++++++++++++++++++++++++
 tools/include/nolibc/arch.h           |   2 +
 2 files changed, 202 insertions(+)
 create mode 100644 tools/include/nolibc/arch-loongarch.h

diff --git a/tools/include/nolibc/arch-loongarch.h b/tools/include/nolibc/arch-loongarch.h
new file mode 100644
index 000000000000..029ee3cd6baf
--- /dev/null
+++ b/tools/include/nolibc/arch-loongarch.h
@@ -0,0 +1,200 @@
+/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
+/*
+ * LoongArch specific definitions for NOLIBC
+ * Copyright (C) 2023 Loongson Technology Corporation Limited
+ */
+
+#ifndef _NOLIBC_ARCH_LOONGARCH_H
+#define _NOLIBC_ARCH_LOONGARCH_H
+
+/* Syscalls for LoongArch :
+ *   - stack is 16-byte aligned
+ *   - syscall number is passed in a7
+ *   - arguments are in a0, a1, a2, a3, a4, a5
+ *   - the system call is performed by calling "syscall 0"
+ *   - syscall return comes in a0
+ *   - the arguments are cast to long and assigned into the target
+ *     registers which are then simply passed as registers to the asm code,
+ *     so that we don't have to experience issues with register constraints.
+ *
+ * On LoongArch, select() is not implemented so we have to use pselect6().
+ */
+#define __ARCH_WANT_SYS_PSELECT6
+
+#define my_syscall0(num)                                                      \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0");                                   \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "=r"(_arg1)                                                 \
+		: "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+#define my_syscall1(num, arg1)                                                \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0") = (long)(arg1);		      \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "+r"(_arg1)                                                 \
+		: "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+#define my_syscall2(num, arg1, arg2)                                          \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0") = (long)(arg1);                    \
+	register long _arg2 __asm__ ("a1") = (long)(arg2);                    \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "+r"(_arg1)                                                 \
+		: "r"(_arg2),                                                 \
+		  "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+#define my_syscall3(num, arg1, arg2, arg3)                                    \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0") = (long)(arg1);                    \
+	register long _arg2 __asm__ ("a1") = (long)(arg2);                    \
+	register long _arg3 __asm__ ("a2") = (long)(arg3);                    \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "+r"(_arg1)                                                 \
+		: "r"(_arg2), "r"(_arg3),                                     \
+		  "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+#define my_syscall4(num, arg1, arg2, arg3, arg4)                              \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0") = (long)(arg1);                    \
+	register long _arg2 __asm__ ("a1") = (long)(arg2);                    \
+	register long _arg3 __asm__ ("a2") = (long)(arg3);                    \
+	register long _arg4 __asm__ ("a3") = (long)(arg4);                    \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "+r"(_arg1)                                                 \
+		: "r"(_arg2), "r"(_arg3), "r"(_arg4),                         \
+		  "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+#define my_syscall5(num, arg1, arg2, arg3, arg4, arg5)                        \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0") = (long)(arg1);                    \
+	register long _arg2 __asm__ ("a1") = (long)(arg2);                    \
+	register long _arg3 __asm__ ("a2") = (long)(arg3);                    \
+	register long _arg4 __asm__ ("a3") = (long)(arg4);                    \
+	register long _arg5 __asm__ ("a4") = (long)(arg5);                    \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "+r"(_arg1)                                                 \
+		: "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5),             \
+		  "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+#define my_syscall6(num, arg1, arg2, arg3, arg4, arg5, arg6)                  \
+({                                                                            \
+	register long _num  __asm__ ("a7") = (num);                           \
+	register long _arg1 __asm__ ("a0") = (long)(arg1);                    \
+	register long _arg2 __asm__ ("a1") = (long)(arg2);                    \
+	register long _arg3 __asm__ ("a2") = (long)(arg3);                    \
+	register long _arg4 __asm__ ("a3") = (long)(arg4);                    \
+	register long _arg5 __asm__ ("a4") = (long)(arg5);                    \
+	register long _arg6 __asm__ ("a5") = (long)(arg6);                    \
+									      \
+	__asm__  volatile (                                                   \
+		"syscall 0\n"                                                 \
+		: "+r"(_arg1)                                                 \
+		: "r"(_arg2), "r"(_arg3), "r"(_arg4), "r"(_arg5), "r"(_arg6), \
+		  "r"(_num)                                                   \
+		: "memory", "$t0", "$t1", "$t2", "$t3",                       \
+		  "$t4", "$t5", "$t6", "$t7", "$t8"                           \
+	);                                                                    \
+	_arg1;                                                                \
+})
+
+char **environ __attribute__((weak));
+const unsigned long *_auxv __attribute__((weak));
+
+#if __loongarch_grlen == 32
+#define LONGLOG      "2"
+#define SZREG        "4"
+#define REG_L        "ld.w"
+#define LONG_S       "st.w"
+#define LONG_ADD     "add.w"
+#define LONG_ADDI    "addi.w"
+#define LONG_SLL     "slli.w"
+#define LONG_BSTRINS "bstrins.w"
+#else // __loongarch_grlen == 64
+#define LONGLOG      "3"
+#define SZREG        "8"
+#define REG_L        "ld.d"
+#define LONG_S       "st.d"
+#define LONG_ADD     "add.d"
+#define LONG_ADDI    "addi.d"
+#define LONG_SLL     "slli.d"
+#define LONG_BSTRINS "bstrins.d"
+#endif
+
+/* startup code */
+void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) _start(void)
+{
+	__asm__ volatile (
+		REG_L        " $a0, $sp, 0\n"         // argc (a0) was in the stack
+		LONG_ADDI    " $a1, $sp, "SZREG"\n"   // argv (a1) = sp + SZREG
+		LONG_SLL     " $a2, $a0, "LONGLOG"\n" // envp (a2) = SZREG*argc ...
+		LONG_ADDI    " $a2, $a2, "SZREG"\n"   //             + SZREG (skip null)
+		LONG_ADD     " $a2, $a2, $a1\n"       //             + argv
+
+		"move          $a3, $a2\n"            // iterate a3 over envp to find auxv (after NULL)
+		"0:\n"                                // do {
+		REG_L        " $a4, $a3, 0\n"         //   a4 = *a3;
+		LONG_ADDI    " $a3, $a3, "SZREG"\n"   //   a3 += sizeof(void*);
+		"bne           $a4, $zero, 0b\n"      // } while (a4);
+		"la.pcrel      $a4, _auxv\n"          // a4 = &_auxv
+		LONG_S       " $a3, $a4, 0\n"         // store a3 into _auxv
+
+		"la.pcrel      $a3, environ\n"        // a3 = &environ
+		LONG_S       " $a2, $a3, 0\n"         // store envp(a2) into environ
+		LONG_BSTRINS " $sp, $zero, 3, 0\n"    // sp must be 16-byte aligned
+		"bl            main\n"                // main() returns the status code, we'll exit with it.
+		"li.w          $a7, 93\n"             // NR_exit == 93
+		"syscall       0\n"
+	);
+	__builtin_unreachable();
+}
+
+#endif // _NOLIBC_ARCH_LOONGARCH_H
diff --git a/tools/include/nolibc/arch.h b/tools/include/nolibc/arch.h
index 78b067a4fa47..2d5386a8d6aa 100644
--- a/tools/include/nolibc/arch.h
+++ b/tools/include/nolibc/arch.h
@@ -29,6 +29,8 @@
 #include "arch-riscv.h"
 #elif defined(__s390x__)
 #include "arch-s390.h"
+#elif defined(__loongarch__)
+#include "arch-loongarch.h"
 #endif
 
 #endif /* _NOLIBC_ARCH_H */
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 4/5] selftests/nolibc: Add support for LoongArch
  2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
                   ` (2 preceding siblings ...)
  2023-02-09  3:24 ` [PATCH v3 3/5] tools/nolibc: Add support for LoongArch chris.chenfeiyang
@ 2023-02-09  3:24 ` chris.chenfeiyang
  2023-02-09  3:24 ` [PATCH v3 5/5] selftests/nolibc: Adjust indentation for Makefile chris.chenfeiyang
  2023-02-09  3:35 ` [PATCH v3 0/5] Add LoongArch support to nolibc Willy Tarreau
  5 siblings, 0 replies; 12+ messages in thread
From: chris.chenfeiyang @ 2023-02-09  3:24 UTC (permalink / raw)
  To: w, paulmck
  Cc: Feiyang Chen, arnd, chenhuacai, jiaxun.yang, chris.chenfeiyang,
	loongarch, linux-kernel

From: Feiyang Chen <chenfeiyang@loongson.cn>

Add support for LoongArch (64 bit) to nolibc selftest.

Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
---
 tools/testing/selftests/nolibc/Makefile | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tools/testing/selftests/nolibc/Makefile b/tools/testing/selftests/nolibc/Makefile
index 8fe61d3e3cce..e9c4a9d011a0 100644
--- a/tools/testing/selftests/nolibc/Makefile
+++ b/tools/testing/selftests/nolibc/Makefile
@@ -21,6 +21,7 @@ IMAGE_arm     = arch/arm/boot/zImage
 IMAGE_mips    = vmlinuz
 IMAGE_riscv   = arch/riscv/boot/Image
 IMAGE_s390    = arch/s390/boot/bzImage
+IMAGE_loongarch  = arch/loongarch/boot/vmlinuz.efi
 IMAGE         = $(IMAGE_$(ARCH))
 IMAGE_NAME    = $(notdir $(IMAGE))
 
@@ -33,6 +34,7 @@ DEFCONFIG_arm     = multi_v7_defconfig
 DEFCONFIG_mips    = malta_defconfig
 DEFCONFIG_riscv   = defconfig
 DEFCONFIG_s390    = defconfig
+DEFCONFIG_loongarch  = defconfig
 DEFCONFIG         = $(DEFCONFIG_$(ARCH))
 
 # optional tests to run (default = all)
@@ -47,6 +49,7 @@ QEMU_ARCH_arm     = arm
 QEMU_ARCH_mips    = mipsel  # works with malta_defconfig
 QEMU_ARCH_riscv   = riscv64
 QEMU_ARCH_s390    = s390x
+QEMU_ARCH_loongarch  = loongarch64
 QEMU_ARCH         = $(QEMU_ARCH_$(ARCH))
 
 # QEMU_ARGS : some arch-specific args to pass to qemu
@@ -58,6 +61,7 @@ QEMU_ARGS_arm     = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_mips    = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_riscv   = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_s390    = -M s390-ccw-virtio -m 1G -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_loongarch  = -M virt -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS         = $(QEMU_ARGS_$(ARCH))
 
 # OUTPUT is only set when run from the main makefile, otherwise
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 5/5] selftests/nolibc: Adjust indentation for Makefile
  2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
                   ` (3 preceding siblings ...)
  2023-02-09  3:24 ` [PATCH v3 4/5] selftests/nolibc: " chris.chenfeiyang
@ 2023-02-09  3:24 ` chris.chenfeiyang
  2023-02-09  3:35 ` [PATCH v3 0/5] Add LoongArch support to nolibc Willy Tarreau
  5 siblings, 0 replies; 12+ messages in thread
From: chris.chenfeiyang @ 2023-02-09  3:24 UTC (permalink / raw)
  To: w, paulmck
  Cc: Feiyang Chen, arnd, chenhuacai, jiaxun.yang, chris.chenfeiyang,
	loongarch, linux-kernel

From: Feiyang Chen <chenfeiyang@loongson.cn>

Reindent only, no functional changes.

Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
---
 tools/testing/selftests/nolibc/Makefile | 74 ++++++++++++-------------
 1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/tools/testing/selftests/nolibc/Makefile b/tools/testing/selftests/nolibc/Makefile
index e9c4a9d011a0..ea2b82a3cd86 100644
--- a/tools/testing/selftests/nolibc/Makefile
+++ b/tools/testing/selftests/nolibc/Makefile
@@ -13,56 +13,56 @@ ARCH = $(SUBARCH)
 endif
 
 # kernel image names by architecture
-IMAGE_i386    = arch/x86/boot/bzImage
-IMAGE_x86_64  = arch/x86/boot/bzImage
-IMAGE_x86     = arch/x86/boot/bzImage
-IMAGE_arm64   = arch/arm64/boot/Image
-IMAGE_arm     = arch/arm/boot/zImage
-IMAGE_mips    = vmlinuz
-IMAGE_riscv   = arch/riscv/boot/Image
-IMAGE_s390    = arch/s390/boot/bzImage
+IMAGE_i386       = arch/x86/boot/bzImage
+IMAGE_x86_64     = arch/x86/boot/bzImage
+IMAGE_x86        = arch/x86/boot/bzImage
+IMAGE_arm64      = arch/arm64/boot/Image
+IMAGE_arm        = arch/arm/boot/zImage
+IMAGE_mips       = vmlinuz
+IMAGE_riscv      = arch/riscv/boot/Image
+IMAGE_s390       = arch/s390/boot/bzImage
 IMAGE_loongarch  = arch/loongarch/boot/vmlinuz.efi
-IMAGE         = $(IMAGE_$(ARCH))
-IMAGE_NAME    = $(notdir $(IMAGE))
+IMAGE            = $(IMAGE_$(ARCH))
+IMAGE_NAME       = $(notdir $(IMAGE))
 
 # default kernel configurations that appear to be usable
-DEFCONFIG_i386    = defconfig
-DEFCONFIG_x86_64  = defconfig
-DEFCONFIG_x86     = defconfig
-DEFCONFIG_arm64   = defconfig
-DEFCONFIG_arm     = multi_v7_defconfig
-DEFCONFIG_mips    = malta_defconfig
-DEFCONFIG_riscv   = defconfig
-DEFCONFIG_s390    = defconfig
+DEFCONFIG_i386       = defconfig
+DEFCONFIG_x86_64     = defconfig
+DEFCONFIG_x86        = defconfig
+DEFCONFIG_arm64      = defconfig
+DEFCONFIG_arm        = multi_v7_defconfig
+DEFCONFIG_mips       = malta_defconfig
+DEFCONFIG_riscv      = defconfig
+DEFCONFIG_s390       = defconfig
 DEFCONFIG_loongarch  = defconfig
-DEFCONFIG         = $(DEFCONFIG_$(ARCH))
+DEFCONFIG            = $(DEFCONFIG_$(ARCH))
 
 # optional tests to run (default = all)
 TEST =
 
 # QEMU_ARCH: arch names used by qemu
-QEMU_ARCH_i386    = i386
-QEMU_ARCH_x86_64  = x86_64
-QEMU_ARCH_x86     = x86_64
-QEMU_ARCH_arm64   = aarch64
-QEMU_ARCH_arm     = arm
-QEMU_ARCH_mips    = mipsel  # works with malta_defconfig
-QEMU_ARCH_riscv   = riscv64
-QEMU_ARCH_s390    = s390x
+QEMU_ARCH_i386       = i386
+QEMU_ARCH_x86_64     = x86_64
+QEMU_ARCH_x86        = x86_64
+QEMU_ARCH_arm64      = aarch64
+QEMU_ARCH_arm        = arm
+QEMU_ARCH_mips       = mipsel  # works with malta_defconfig
+QEMU_ARCH_riscv      = riscv64
+QEMU_ARCH_s390       = s390x
 QEMU_ARCH_loongarch  = loongarch64
-QEMU_ARCH         = $(QEMU_ARCH_$(ARCH))
+QEMU_ARCH            = $(QEMU_ARCH_$(ARCH))
 
 # QEMU_ARGS : some arch-specific args to pass to qemu
-QEMU_ARGS_i386    = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_x86_64  = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_x86     = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_arm64   = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_arm     = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_mips    = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_riscv   = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS_s390    = -M s390-ccw-virtio -m 1G -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_i386       = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_x86_64     = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_x86        = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_arm64      = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_arm        = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_mips       = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_riscv      = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
+QEMU_ARGS_s390       = -M s390-ccw-virtio -m 1G -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
 QEMU_ARGS_loongarch  = -M virt -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
-QEMU_ARGS         = $(QEMU_ARGS_$(ARCH))
+QEMU_ARGS            = $(QEMU_ARGS_$(ARCH))
 
 # OUTPUT is only set when run from the main makefile, otherwise
 # it defaults to this nolibc directory.
-- 
2.39.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 0/5] Add LoongArch support to nolibc
  2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
                   ` (4 preceding siblings ...)
  2023-02-09  3:24 ` [PATCH v3 5/5] selftests/nolibc: Adjust indentation for Makefile chris.chenfeiyang
@ 2023-02-09  3:35 ` Willy Tarreau
  2023-02-09  3:38   ` Huacai Chen
  5 siblings, 1 reply; 12+ messages in thread
From: Willy Tarreau @ 2023-02-09  3:35 UTC (permalink / raw)
  To: chris.chenfeiyang
  Cc: paulmck, Feiyang Chen, arnd, chenhuacai, jiaxun.yang, loongarch,
	linux-kernel

Hi Feiyang,

On Thu, Feb 09, 2023 at 11:24:11AM +0800, chris.chenfeiyang@gmail.com wrote:
> From: Feiyang Chen <chenfeiyang@loongson.cn>
> 
> Add statx() and make stat() rely on statx() if necessary.
> Add support for LoongArch (32 and 64 bit) to nolibc.
> It was tested on LoongArch64 only.
> 
> The latest QEMU support full-system emulation of a LoongArch64
> machine, but for the moment we need to specify the firmware manually.
> https://github.com/loongson/Firmware/tree/main/LoongArchVirtMachine
> 
> QEMU_ARGS_loongarch  = -M virt -bios edk2-loongarch64-code.fd ...
> 
> v2:
> - Mention that statx() will also benefit other architectures.
> - Make stat() rely on statx() when available.
> - Put the whitespace changes into one commit.
> 
> v3:
> - Add #if defined(__NR_statx) guard.
> - Keep the check for statx() from the first version.
> - Mention that we may use statx() everywhere in the future.
> - struct statx stat -> struct statx statx.

I'm personally fine with this one. I'll give it a try with all supported
archs to make sure we don't have any unexpected side effect, and unless
anyone has any other comment, we'll queue this series.

Thank you!
Willy

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 0/5] Add LoongArch support to nolibc
  2023-02-09  3:35 ` [PATCH v3 0/5] Add LoongArch support to nolibc Willy Tarreau
@ 2023-02-09  3:38   ` Huacai Chen
  0 siblings, 0 replies; 12+ messages in thread
From: Huacai Chen @ 2023-02-09  3:38 UTC (permalink / raw)
  To: Willy Tarreau
  Cc: chris.chenfeiyang, paulmck, Feiyang Chen, arnd, jiaxun.yang,
	loongarch, linux-kernel

Acked-by: Huacai Chen <chenhuacai@loongson.cn>

On Thu, Feb 9, 2023 at 11:35 AM Willy Tarreau <w@1wt.eu> wrote:
>
> Hi Feiyang,
>
> On Thu, Feb 09, 2023 at 11:24:11AM +0800, chris.chenfeiyang@gmail.com wrote:
> > From: Feiyang Chen <chenfeiyang@loongson.cn>
> >
> > Add statx() and make stat() rely on statx() if necessary.
> > Add support for LoongArch (32 and 64 bit) to nolibc.
> > It was tested on LoongArch64 only.
> >
> > The latest QEMU support full-system emulation of a LoongArch64
> > machine, but for the moment we need to specify the firmware manually.
> > https://github.com/loongson/Firmware/tree/main/LoongArchVirtMachine
> >
> > QEMU_ARGS_loongarch  = -M virt -bios edk2-loongarch64-code.fd ...
> >
> > v2:
> > - Mention that statx() will also benefit other architectures.
> > - Make stat() rely on statx() when available.
> > - Put the whitespace changes into one commit.
> >
> > v3:
> > - Add #if defined(__NR_statx) guard.
> > - Keep the check for statx() from the first version.
> > - Mention that we may use statx() everywhere in the future.
> > - struct statx stat -> struct statx statx.
>
> I'm personally fine with this one. I'll give it a try with all supported
> archs to make sure we don't have any unexpected side effect, and unless
> anyone has any other comment, we'll queue this series.
>
> Thank you!
> Willy

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary
  2023-02-09  3:24 ` [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary chris.chenfeiyang
@ 2023-02-12 21:12   ` Willy Tarreau
  2023-02-13  1:06     ` Feiyang Chen
  0 siblings, 1 reply; 12+ messages in thread
From: Willy Tarreau @ 2023-02-12 21:12 UTC (permalink / raw)
  To: chris.chenfeiyang
  Cc: paulmck, Feiyang Chen, arnd, chenhuacai, jiaxun.yang, loongarch,
	linux-kernel, Vincent Dagonneau

Hi Feiyang,

On Thu, Feb 09, 2023 at 11:24:13AM +0800, chris.chenfeiyang@gmail.com wrote:
> From: Feiyang Chen <chenfeiyang@loongson.cn>
> 
> LoongArch and RISC-V 32-bit only have statx(). ARC, Hexagon, Nios2 and
> OpenRISC have statx() and stat64() but not stat() or newstat(). Add
> statx() and make stat() rely on statx() if necessary to make them happy.
> We may just use statx() for all architectures in the future.
> 
> Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
> ---
>  tools/include/nolibc/sys.h | 56 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 56 insertions(+)
> 
> diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
> index c4818a9c8823..70c30d457952 100644
> --- a/tools/include/nolibc/sys.h
> +++ b/tools/include/nolibc/sys.h
> @@ -20,6 +20,7 @@
>  #include <linux/time.h>
>  #include <linux/auxvec.h>
>  #include <linux/fcntl.h> // for O_* and AT_*
> +#include <linux/stat.h>  // for statx()

This one causes build warnings on all archs but x86_64:

  /f/tc/nolibc/gcc-11.3.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc -Os -fno-ident -fno-asynchronous-unwind-tables  -s -o nolibc-test \
    -nostdlib -static -Isysroot/arm64/include nolibc-test.c -lgcc
  In file included from sysroot/arm64/include/sys.h:23,
                   from sysroot/arm64/include/nolibc.h:99,
                   from sysroot/arm64/include/errno.h:26,
                   from sysroot/arm64/include/stdio.h:14,
                   from nolibc-test.c:15:
  sysroot/arm64/include/linux/stat.h:9: warning: "S_IFMT" redefined
      9 | #define S_IFMT  00170000
        | 
  In file included from sysroot/arm64/include/nolibc.h:98,
                   from sysroot/arm64/include/errno.h:26,
                   from sysroot/arm64/include/stdio.h:14,
                   from nolibc-test.c:15:
  sysroot/arm64/include/types.h:27: note: this is the location of the previous definition

This is caused by the definitions for S_IF* and S_IS* in types.h. However
if I remove them I'm seeing x86_64 fail on S_IFCHR not defined. The root
cause is that the x86_64 toolchain falls back to /usr/include for the
include_next <limits.h> that others do not do (probably that when built
it thought it was a native compiler instead of a cross-compiler). I'm
apparently able to work around this by ifdefing out the definitions but
it makes me feel like I'm hiding the dust under the carpet. Instead I'm
thinking of reusing Vincent's work who added stdint and the definitions
for the various INT*MAX values that are normally found in limits.h and
providing our own limits.h so that this issue is globally addressed.

I'm going to experiment a little bit about this and will propose something
once I'm satisfied with a solution that we can queue for 6.4. Most likely
it will involve merging a variant of Vincent's series first, a few changes
to have limits.h then your series.

Best regards,
Willy

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary
  2023-02-12 21:12   ` Willy Tarreau
@ 2023-02-13  1:06     ` Feiyang Chen
  2023-02-19 19:06       ` Willy Tarreau
  0 siblings, 1 reply; 12+ messages in thread
From: Feiyang Chen @ 2023-02-13  1:06 UTC (permalink / raw)
  To: Willy Tarreau
  Cc: paulmck, Feiyang Chen, arnd, chenhuacai, jiaxun.yang, loongarch,
	linux-kernel, Vincent Dagonneau

On Mon, 13 Feb 2023 at 05:12, Willy Tarreau <w@1wt.eu> wrote:
>
> Hi Feiyang,
>
> On Thu, Feb 09, 2023 at 11:24:13AM +0800, chris.chenfeiyang@gmail.com wrote:
> > From: Feiyang Chen <chenfeiyang@loongson.cn>
> >
> > LoongArch and RISC-V 32-bit only have statx(). ARC, Hexagon, Nios2 and
> > OpenRISC have statx() and stat64() but not stat() or newstat(). Add
> > statx() and make stat() rely on statx() if necessary to make them happy.
> > We may just use statx() for all architectures in the future.
> >
> > Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
> > ---
> >  tools/include/nolibc/sys.h | 56 ++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 56 insertions(+)
> >
> > diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
> > index c4818a9c8823..70c30d457952 100644
> > --- a/tools/include/nolibc/sys.h
> > +++ b/tools/include/nolibc/sys.h
> > @@ -20,6 +20,7 @@
> >  #include <linux/time.h>
> >  #include <linux/auxvec.h>
> >  #include <linux/fcntl.h> // for O_* and AT_*
> > +#include <linux/stat.h>  // for statx()
>
> This one causes build warnings on all archs but x86_64:
>
>   /f/tc/nolibc/gcc-11.3.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc -Os -fno-ident -fno-asynchronous-unwind-tables  -s -o nolibc-test \
>     -nostdlib -static -Isysroot/arm64/include nolibc-test.c -lgcc
>   In file included from sysroot/arm64/include/sys.h:23,
>                    from sysroot/arm64/include/nolibc.h:99,
>                    from sysroot/arm64/include/errno.h:26,
>                    from sysroot/arm64/include/stdio.h:14,
>                    from nolibc-test.c:15:
>   sysroot/arm64/include/linux/stat.h:9: warning: "S_IFMT" redefined
>       9 | #define S_IFMT  00170000
>         |
>   In file included from sysroot/arm64/include/nolibc.h:98,
>                    from sysroot/arm64/include/errno.h:26,
>                    from sysroot/arm64/include/stdio.h:14,
>                    from nolibc-test.c:15:
>   sysroot/arm64/include/types.h:27: note: this is the location of the previous definition
>
> This is caused by the definitions for S_IF* and S_IS* in types.h. However
> if I remove them I'm seeing x86_64 fail on S_IFCHR not defined. The root
> cause is that the x86_64 toolchain falls back to /usr/include for the
> include_next <limits.h> that others do not do (probably that when built
> it thought it was a native compiler instead of a cross-compiler). I'm
> apparently able to work around this by ifdefing out the definitions but
> it makes me feel like I'm hiding the dust under the carpet. Instead I'm
> thinking of reusing Vincent's work who added stdint and the definitions
> for the various INT*MAX values that are normally found in limits.h and
> providing our own limits.h so that this issue is globally addressed.
>
> I'm going to experiment a little bit about this and will propose something
> once I'm satisfied with a solution that we can queue for 6.4. Most likely
> it will involve merging a variant of Vincent's series first, a few changes
> to have limits.h then your series.
>

Hi, Willy,

OK. Thank you very much!

Thanks,
Feiyang

> Best regards,
> Willy

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary
  2023-02-13  1:06     ` Feiyang Chen
@ 2023-02-19 19:06       ` Willy Tarreau
  2023-02-20  1:04         ` Feiyang Chen
  0 siblings, 1 reply; 12+ messages in thread
From: Willy Tarreau @ 2023-02-19 19:06 UTC (permalink / raw)
  To: Feiyang Chen
  Cc: paulmck, Feiyang Chen, arnd, chenhuacai, jiaxun.yang, loongarch,
	linux-kernel, Vincent Dagonneau

[-- Attachment #1: Type: text/plain, Size: 6268 bytes --]

Hi Feiyang,

On Mon, Feb 13, 2023 at 09:06:36AM +0800, Feiyang Chen wrote:
> On Mon, 13 Feb 2023 at 05:12, Willy Tarreau <w@1wt.eu> wrote:
> >
> > Hi Feiyang,
> >
> > On Thu, Feb 09, 2023 at 11:24:13AM +0800, chris.chenfeiyang@gmail.com wrote:
> > > From: Feiyang Chen <chenfeiyang@loongson.cn>
> > >
> > > LoongArch and RISC-V 32-bit only have statx(). ARC, Hexagon, Nios2 and
> > > OpenRISC have statx() and stat64() but not stat() or newstat(). Add
> > > statx() and make stat() rely on statx() if necessary to make them happy.
> > > We may just use statx() for all architectures in the future.
> > >
> > > Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
> > > ---
> > >  tools/include/nolibc/sys.h | 56 ++++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 56 insertions(+)
> > >
> > > diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
> > > index c4818a9c8823..70c30d457952 100644
> > > --- a/tools/include/nolibc/sys.h
> > > +++ b/tools/include/nolibc/sys.h
> > > @@ -20,6 +20,7 @@
> > >  #include <linux/time.h>
> > >  #include <linux/auxvec.h>
> > >  #include <linux/fcntl.h> // for O_* and AT_*
> > > +#include <linux/stat.h>  // for statx()
> >
> > This one causes build warnings on all archs but x86_64:
> >
> >   /f/tc/nolibc/gcc-11.3.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc -Os -fno-ident -fno-asynchronous-unwind-tables  -s -o nolibc-test \
> >     -nostdlib -static -Isysroot/arm64/include nolibc-test.c -lgcc
> >   In file included from sysroot/arm64/include/sys.h:23,
> >                    from sysroot/arm64/include/nolibc.h:99,
> >                    from sysroot/arm64/include/errno.h:26,
> >                    from sysroot/arm64/include/stdio.h:14,
> >                    from nolibc-test.c:15:
> >   sysroot/arm64/include/linux/stat.h:9: warning: "S_IFMT" redefined
> >       9 | #define S_IFMT  00170000
> >         |
> >   In file included from sysroot/arm64/include/nolibc.h:98,
> >                    from sysroot/arm64/include/errno.h:26,
> >                    from sysroot/arm64/include/stdio.h:14,
> >                    from nolibc-test.c:15:
> >   sysroot/arm64/include/types.h:27: note: this is the location of the previous definition
> >
> > This is caused by the definitions for S_IF* and S_IS* in types.h. However
> > if I remove them I'm seeing x86_64 fail on S_IFCHR not defined. The root
> > cause is that the x86_64 toolchain falls back to /usr/include for the
> > include_next <limits.h> that others do not do (probably that when built
> > it thought it was a native compiler instead of a cross-compiler). I'm
> > apparently able to work around this by ifdefing out the definitions but
> > it makes me feel like I'm hiding the dust under the carpet. Instead I'm
> > thinking of reusing Vincent's work who added stdint and the definitions
> > for the various INT*MAX values that are normally found in limits.h and
> > providing our own limits.h so that this issue is globally addressed.
> >
> > I'm going to experiment a little bit about this and will propose something
> > once I'm satisfied with a solution that we can queue for 6.4. Most likely
> > it will involve merging a variant of Vincent's series first, a few changes
> > to have limits.h then your series.
> >
> 
> Hi, Willy,
> 
> OK. Thank you very much!

You're welcome. I finally figured the root cause of the problem. As
mentioned above, the cross-compiler mistakenly includes some glibc
entries (regardless of me defining limits.h), and linux/stat.h sees
glibc defined so it refrains from defining S_I* because this conflict
was apparently already identified in the past. In order to work around
the problem without touching the uapi headers, I preferred to modify
the nolibc one to add a similar test and detect whether linux/stat.h
had already provided them (see patch below). This way it remains simple
to understand and still pretty effective. And now your patchset works
fine with no modification.

I'll send all of this to Paul next week-end once he's back.

Thanks,
Willy

--

From 39843ae4a006c37cf09febaf286c438a9793f9a1 Mon Sep 17 00:00:00 2001
From: Willy Tarreau <w@1wt.eu>
Date: Sun, 19 Feb 2023 18:51:59 +0100
Subject: [PATCH] tools/nolibc: check for S_I* macros before defining them

Defining S_I* flags in types.h can cause some build failures if
linux/stat.h is included prior to it. But if not defined, some toolchains
that include some glibc parts will in turn fail because linux/stat.h
already takes care of avoiding these definitions when glibc is present.

Let's preserve the macros here but first include linux/stat.h and check
for their definition before doing so. We also define the previously
missing permission macros so that we don't get a different behavior
depending on the first include found.

Cc: Feiyang Chen <chenfeiyang@loongson.cn>
Signed-off-by: Willy Tarreau <w@1wt.eu>
---
 tools/include/nolibc/types.h | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/tools/include/nolibc/types.h b/tools/include/nolibc/types.h
index fbbc0e68c001..47a0997d2d74 100644
--- a/tools/include/nolibc/types.h
+++ b/tools/include/nolibc/types.h
@@ -9,6 +9,7 @@
 
 #include "std.h"
 #include <linux/time.h>
+#include <linux/stat.h>
 
 
 /* Only the generic macros and types may be defined here. The arch-specific
@@ -16,7 +17,11 @@
  * the layout of sys_stat_struct must not be defined here.
  */
 
-/* stat flags (WARNING, octal here) */
+/* stat flags (WARNING, octal here). We need to check for an existing
+ * definition because linux/stat.h may omit to define those if it finds
+ * that any glibc header was already included.
+ */
+#if !defined(S_IFMT)
 #define S_IFDIR        0040000
 #define S_IFCHR        0020000
 #define S_IFBLK        0060000
@@ -34,6 +39,22 @@
 #define S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
 #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
 
+#define S_IRWXU 00700
+#define S_IRUSR 00400
+#define S_IWUSR 00200
+#define S_IXUSR 00100
+
+#define S_IRWXG 00070
+#define S_IRGRP 00040
+#define S_IWGRP 00020
+#define S_IXGRP 00010
+
+#define S_IRWXO 00007
+#define S_IROTH 00004
+#define S_IWOTH 00002
+#define S_IXOTH 00001
+#endif
+
 /* dirent types */
 #define DT_UNKNOWN     0x0
 #define DT_FIFO        0x1
-- 
2.35.3


[-- Attachment #2: 0001-tools-nolibc-check-for-S_I-macros-before-defining-th.patch --]
[-- Type: text/plain, Size: 2239 bytes --]

From 39843ae4a006c37cf09febaf286c438a9793f9a1 Mon Sep 17 00:00:00 2001
From: Willy Tarreau <w@1wt.eu>
Date: Sun, 19 Feb 2023 18:51:59 +0100
Subject: [PATCH] tools/nolibc: check for S_I* macros before defining them

Defining S_I* flags in types.h can cause some build failures if
linux/stat.h is included prior to it. But if not defined, some toolchains
that include some glibc parts will in turn fail because linux/stat.h
already takes care of avoiding these definitions when glibc is present.

Let's preserve the macros here but first include linux/stat.h and check
for their definition before doing so. We also define the previously
missing permission macros so that we don't get a different behavior
depending on the first include found.

Cc: Feiyang Chen <chenfeiyang@loongson.cn>
Signed-off-by: Willy Tarreau <w@1wt.eu>
---
 tools/include/nolibc/types.h | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/tools/include/nolibc/types.h b/tools/include/nolibc/types.h
index fbbc0e68c001..47a0997d2d74 100644
--- a/tools/include/nolibc/types.h
+++ b/tools/include/nolibc/types.h
@@ -9,6 +9,7 @@
 
 #include "std.h"
 #include <linux/time.h>
+#include <linux/stat.h>
 
 
 /* Only the generic macros and types may be defined here. The arch-specific
@@ -16,7 +17,11 @@
  * the layout of sys_stat_struct must not be defined here.
  */
 
-/* stat flags (WARNING, octal here) */
+/* stat flags (WARNING, octal here). We need to check for an existing
+ * definition because linux/stat.h may omit to define those if it finds
+ * that any glibc header was already included.
+ */
+#if !defined(S_IFMT)
 #define S_IFDIR        0040000
 #define S_IFCHR        0020000
 #define S_IFBLK        0060000
@@ -34,6 +39,22 @@
 #define S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
 #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
 
+#define S_IRWXU 00700
+#define S_IRUSR 00400
+#define S_IWUSR 00200
+#define S_IXUSR 00100
+
+#define S_IRWXG 00070
+#define S_IRGRP 00040
+#define S_IWGRP 00020
+#define S_IXGRP 00010
+
+#define S_IRWXO 00007
+#define S_IROTH 00004
+#define S_IWOTH 00002
+#define S_IXOTH 00001
+#endif
+
 /* dirent types */
 #define DT_UNKNOWN     0x0
 #define DT_FIFO        0x1
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary
  2023-02-19 19:06       ` Willy Tarreau
@ 2023-02-20  1:04         ` Feiyang Chen
  0 siblings, 0 replies; 12+ messages in thread
From: Feiyang Chen @ 2023-02-20  1:04 UTC (permalink / raw)
  To: Willy Tarreau
  Cc: paulmck, Feiyang Chen, arnd, chenhuacai, jiaxun.yang, loongarch,
	linux-kernel, Vincent Dagonneau

On Mon, 20 Feb 2023 at 03:06, Willy Tarreau <w@1wt.eu> wrote:
>
> Hi Feiyang,
>
> On Mon, Feb 13, 2023 at 09:06:36AM +0800, Feiyang Chen wrote:
> > On Mon, 13 Feb 2023 at 05:12, Willy Tarreau <w@1wt.eu> wrote:
> > >
> > > Hi Feiyang,
> > >
> > > On Thu, Feb 09, 2023 at 11:24:13AM +0800, chris.chenfeiyang@gmail.com wrote:
> > > > From: Feiyang Chen <chenfeiyang@loongson.cn>
> > > >
> > > > LoongArch and RISC-V 32-bit only have statx(). ARC, Hexagon, Nios2 and
> > > > OpenRISC have statx() and stat64() but not stat() or newstat(). Add
> > > > statx() and make stat() rely on statx() if necessary to make them happy.
> > > > We may just use statx() for all architectures in the future.
> > > >
> > > > Signed-off-by: Feiyang Chen <chenfeiyang@loongson.cn>
> > > > ---
> > > >  tools/include/nolibc/sys.h | 56 ++++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 56 insertions(+)
> > > >
> > > > diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h
> > > > index c4818a9c8823..70c30d457952 100644
> > > > --- a/tools/include/nolibc/sys.h
> > > > +++ b/tools/include/nolibc/sys.h
> > > > @@ -20,6 +20,7 @@
> > > >  #include <linux/time.h>
> > > >  #include <linux/auxvec.h>
> > > >  #include <linux/fcntl.h> // for O_* and AT_*
> > > > +#include <linux/stat.h>  // for statx()
> > >
> > > This one causes build warnings on all archs but x86_64:
> > >
> > >   /f/tc/nolibc/gcc-11.3.0-nolibc/aarch64-linux/bin/aarch64-linux-gcc -Os -fno-ident -fno-asynchronous-unwind-tables  -s -o nolibc-test \
> > >     -nostdlib -static -Isysroot/arm64/include nolibc-test.c -lgcc
> > >   In file included from sysroot/arm64/include/sys.h:23,
> > >                    from sysroot/arm64/include/nolibc.h:99,
> > >                    from sysroot/arm64/include/errno.h:26,
> > >                    from sysroot/arm64/include/stdio.h:14,
> > >                    from nolibc-test.c:15:
> > >   sysroot/arm64/include/linux/stat.h:9: warning: "S_IFMT" redefined
> > >       9 | #define S_IFMT  00170000
> > >         |
> > >   In file included from sysroot/arm64/include/nolibc.h:98,
> > >                    from sysroot/arm64/include/errno.h:26,
> > >                    from sysroot/arm64/include/stdio.h:14,
> > >                    from nolibc-test.c:15:
> > >   sysroot/arm64/include/types.h:27: note: this is the location of the previous definition
> > >
> > > This is caused by the definitions for S_IF* and S_IS* in types.h. However
> > > if I remove them I'm seeing x86_64 fail on S_IFCHR not defined. The root
> > > cause is that the x86_64 toolchain falls back to /usr/include for the
> > > include_next <limits.h> that others do not do (probably that when built
> > > it thought it was a native compiler instead of a cross-compiler). I'm
> > > apparently able to work around this by ifdefing out the definitions but
> > > it makes me feel like I'm hiding the dust under the carpet. Instead I'm
> > > thinking of reusing Vincent's work who added stdint and the definitions
> > > for the various INT*MAX values that are normally found in limits.h and
> > > providing our own limits.h so that this issue is globally addressed.
> > >
> > > I'm going to experiment a little bit about this and will propose something
> > > once I'm satisfied with a solution that we can queue for 6.4. Most likely
> > > it will involve merging a variant of Vincent's series first, a few changes
> > > to have limits.h then your series.
> > >
> >
> > Hi, Willy,
> >
> > OK. Thank you very much!
>
> You're welcome. I finally figured the root cause of the problem. As
> mentioned above, the cross-compiler mistakenly includes some glibc
> entries (regardless of me defining limits.h), and linux/stat.h sees
> glibc defined so it refrains from defining S_I* because this conflict
> was apparently already identified in the past. In order to work around
> the problem without touching the uapi headers, I preferred to modify
> the nolibc one to add a similar test and detect whether linux/stat.h
> had already provided them (see patch below). This way it remains simple
> to understand and still pretty effective. And now your patchset works
> fine with no modification.
>
> I'll send all of this to Paul next week-end once he's back.
>

Hi, Willy,

Thank you!

Thanks,
Feiyang

> Thanks,
> Willy
>
> --
>
> From 39843ae4a006c37cf09febaf286c438a9793f9a1 Mon Sep 17 00:00:00 2001
> From: Willy Tarreau <w@1wt.eu>
> Date: Sun, 19 Feb 2023 18:51:59 +0100
> Subject: [PATCH] tools/nolibc: check for S_I* macros before defining them
>
> Defining S_I* flags in types.h can cause some build failures if
> linux/stat.h is included prior to it. But if not defined, some toolchains
> that include some glibc parts will in turn fail because linux/stat.h
> already takes care of avoiding these definitions when glibc is present.
>
> Let's preserve the macros here but first include linux/stat.h and check
> for their definition before doing so. We also define the previously
> missing permission macros so that we don't get a different behavior
> depending on the first include found.
>
> Cc: Feiyang Chen <chenfeiyang@loongson.cn>
> Signed-off-by: Willy Tarreau <w@1wt.eu>
> ---
>  tools/include/nolibc/types.h | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/tools/include/nolibc/types.h b/tools/include/nolibc/types.h
> index fbbc0e68c001..47a0997d2d74 100644
> --- a/tools/include/nolibc/types.h
> +++ b/tools/include/nolibc/types.h
> @@ -9,6 +9,7 @@
>
>  #include "std.h"
>  #include <linux/time.h>
> +#include <linux/stat.h>
>
>
>  /* Only the generic macros and types may be defined here. The arch-specific
> @@ -16,7 +17,11 @@
>   * the layout of sys_stat_struct must not be defined here.
>   */
>
> -/* stat flags (WARNING, octal here) */
> +/* stat flags (WARNING, octal here). We need to check for an existing
> + * definition because linux/stat.h may omit to define those if it finds
> + * that any glibc header was already included.
> + */
> +#if !defined(S_IFMT)
>  #define S_IFDIR        0040000
>  #define S_IFCHR        0020000
>  #define S_IFBLK        0060000
> @@ -34,6 +39,22 @@
>  #define S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
>  #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
>
> +#define S_IRWXU 00700
> +#define S_IRUSR 00400
> +#define S_IWUSR 00200
> +#define S_IXUSR 00100
> +
> +#define S_IRWXG 00070
> +#define S_IRGRP 00040
> +#define S_IWGRP 00020
> +#define S_IXGRP 00010
> +
> +#define S_IRWXO 00007
> +#define S_IROTH 00004
> +#define S_IWOTH 00002
> +#define S_IXOTH 00001
> +#endif
> +
>  /* dirent types */
>  #define DT_UNKNOWN     0x0
>  #define DT_FIFO        0x1
> --
> 2.35.3
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-02-20  1:05 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-09  3:24 [PATCH v3 0/5] Add LoongArch support to nolibc chris.chenfeiyang
2023-02-09  3:24 ` [PATCH v3 1/5] tools/nolibc: Include linux/fcntl.h and remove duplicate code chris.chenfeiyang
2023-02-09  3:24 ` [PATCH v3 2/5] tools/nolibc: Add statx() and make stat() rely on statx() if necessary chris.chenfeiyang
2023-02-12 21:12   ` Willy Tarreau
2023-02-13  1:06     ` Feiyang Chen
2023-02-19 19:06       ` Willy Tarreau
2023-02-20  1:04         ` Feiyang Chen
2023-02-09  3:24 ` [PATCH v3 3/5] tools/nolibc: Add support for LoongArch chris.chenfeiyang
2023-02-09  3:24 ` [PATCH v3 4/5] selftests/nolibc: " chris.chenfeiyang
2023-02-09  3:24 ` [PATCH v3 5/5] selftests/nolibc: Adjust indentation for Makefile chris.chenfeiyang
2023-02-09  3:35 ` [PATCH v3 0/5] Add LoongArch support to nolibc Willy Tarreau
2023-02-09  3:38   ` Huacai Chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).