diff mbox series

[v6,1/3] Refactor regen.sh script to generate syscalls

Message ID 20241031-generate_syscalls-v6-1-1ad86a33ce2d@suse.com
State Superseded
Headers show
Series Automatically generate syscalls.h | expand

Commit Message

Andrea Cervesato Oct. 31, 2024, 7:27 a.m. UTC
From: Andrea Cervesato <andrea.cervesato@suse.com>

Rename regen.sh into a more meaningful generate_syscalls.sh name, rename
order into a more meaningful supported-syscalls.txt name and rewrite
part of the regen.sh script code in order to execute it from anywhere in
the filesystem, without need to be in its own folder. The new code is
also more clear and concise, using native sh features which are
simplifying the code.

Reviewed-by: Li Wang <liwang@redhat.com>
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
 configure.ac                                       |   2 +-
 include/lapi/syscalls/generate_syscalls.sh         | 111 ++++++++++++++++++
 include/lapi/syscalls/regen.sh                     | 129 ---------------------
 .../lapi/syscalls/{order => supported-arch.txt}    |   0
 4 files changed, 112 insertions(+), 130 deletions(-)

Comments

Petr Vorel Oct. 31, 2024, 9:49 a.m. UTC | #1
Hi Andrea,

whole patchset LGTM, thank you!

I was comparing the old include/lapi/syscalls.h (21579 lines) and the new one
(20054). Having new file shorter is a bit surprising to me. I haven't found what
is missing, probably I'm missing something myself :).

> Rename regen.sh into a more meaningful generate_syscalls.sh name, rename
> order into a more meaningful supported-syscalls.txt name and rewrite
> part of the regen.sh script code in order to execute it from anywhere in
> the filesystem, without need to be in its own folder. The new code is
> also more clear and concise, using native sh features which are
> simplifying the code.

Purely out of curiosity (nothing to block this), which "native sh features"?

> +++ b/include/lapi/syscalls/generate_syscalls.sh
...
> +SCRIPT_DIR="$(realpath $(dirname "$0"))"
> +SUPPORTED_ARCH="${SCRIPT_DIR}/supported-arch.txt"
> +
> +echo '
> +// SPDX-License-Identifier: GPL-2.0-or-later

very nit stylish: This produce new line. Why not just:

echo '// SPDX-License-Identifier: GPL-2.0-or-later
/************************************************

Feel free to ignore or amend before push.

Kind regards,
Petr
Cyril Hrubis Oct. 31, 2024, 10:25 a.m. UTC | #2
Hi!
> +echo '
^
This adds an empty line to the start of the file.

> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/************************************************
> + * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
> + *  change your arch specific .in file instead  *
> + ************************************************/
> +
> +/*
> + * Here we stick all the ugly *fallback* logic for linux
> + * system call numbers (those __NR_ thingies).
> + */
> +
> +#ifndef LAPI_SYSCALLS_H__
> +#define LAPI_SYSCALLS_H__
> +
> +#include <errno.h>
> +#include <sys/syscall.h>
> +#include <asm/unistd.h>
> +
> +#ifdef TST_TEST_H__
> +#define TST_SYSCALL_BRK__(NR, SNR) ({ \
> +tst_brk(TCONF, \
> +	"syscall(%d) " SNR " not supported on your arch", NR); \
> +})
> +#else
> +inline static void dummy_cleanup(void) {}
> +
> +#define TST_SYSCALL_BRK__(NR, SNR) ({ \
> +tst_brkm(TCONF, dummy_cleanup, \
> +	"syscall(%d) " SNR " not supported on your arch", NR); \
> +})
> +#endif
> +
> +#define tst_syscall(NR, ...) ({ \
> +intptr_t tst_ret; \
> +if (NR == __LTP__NR_INVALID_SYSCALL) { \
> +	errno = ENOSYS; \
> +	tst_ret = -1; \
> +} else { \
> +	tst_ret = syscall(NR, ##__VA_ARGS__); \
> +} \
> +if (tst_ret == -1 && errno == ENOSYS) { \
> +	TST_SYSCALL_BRK__(NR, #NR); \
> +} \
> +tst_ret; \
> +})
> +
> +#define __LTP__NR_INVALID_SYSCALL -1' >${SYSCALLS_FILE}
> +
> +while IFS= read -r arch; do
> +	(
> +		echo
> +		case ${arch} in
> +		sparc64) echo "#if defined(__sparc__) && defined(__arch64__)" ;;
> +		sparc) echo "#if defined(__sparc__) && !defined(__arch64__)" ;;
> +		s390) echo "#if defined(__s390__) && !defined(__s390x__)" ;;
> +		mips64n32) echo "#if defined(__mips__) && defined(_ABIN32)" ;;
> +		mips64) echo "#if defined(__mips__) && defined(_ABI64)" ;;
> +		mipso32) echo "#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32" ;;
> +		parisc) echo "#ifdef __hppa__" ;;
> +		loongarch64) echo "#ifdef __loongarch__" ;;
> +		arm64) echo "#ifdef __aarch64__" ;;
> +		*) echo "#ifdef __${arch}__" ;;
> +		esac
> +
> +		while read -r line; do
> +			set -- ${line}
> +			syscall_nr="__NR_$1"
> +			shift
> +
> +			echo "# ifndef ${syscall_nr}"
> +			echo "#  define ${syscall_nr} $*"
> +			echo "# endif"
> +		done <"${SCRIPT_DIR}/${arch}.in"
> +		echo "#endif"
> +		echo
> +	) >>${SYSCALLS_FILE}
> +done <${SUPPORTED_ARCH}
> +
> +(
> +	echo
> +	echo "/* Common stubs */"
> +	for num in $(awk '{print $1}' "${SCRIPT_DIR}/"*.in | sort -u); do
> +		syscall_nr="__NR_${num}"
> +		shift

This shift is not needed here anymore and generates a lot of warnings.

> +		echo "# ifndef ${syscall_nr}"
> +		echo "#  define ${syscall_nr} __LTP__NR_INVALID_SYSCALL"
> +		echo "# endif"
> +	done
> +	echo "#endif"
> +) >>${SYSCALLS_FILE}
Cyril Hrubis Oct. 31, 2024, 10:28 a.m. UTC | #3
Hi!
> I was comparing the old include/lapi/syscalls.h (21579 lines) and the new one
> (20054). Having new file shorter is a bit surprising to me. I haven't found what
> is missing, probably I'm missing something myself :).

That is strange, I got exactly same content minus some whitespaces and
slightly different macros that check for arch support:

--- syscalls.h.old      2024-10-31 11:17:04.840217056 +0100
+++ syscalls.h  2024-10-31 11:23:38.326891830 +0100
@@ -1,3 +1,5 @@
+
+// SPDX-License-Identifier: GPL-2.0-or-later
 /************************************************
  * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
  *  change your arch specific .in file instead  *
@@ -6,8 +8,6 @@
 /*
  * Here we stick all the ugly *fallback* logic for linux
  * system call numbers (those __NR_ thingies).
- *
- * Licensed under the GPLv2 or later, see the COPYING file.
  */

 #ifndef LAPI_SYSCALLS_H__
@@ -19,30 +19,30 @@

 #ifdef TST_TEST_H__
 #define TST_SYSCALL_BRK__(NR, SNR) ({ \
-       tst_brk(TCONF, \
-               "syscall(%d) " SNR " not supported on your arch", NR); \
+tst_brk(TCONF, \
+       "syscall(%d) " SNR " not supported on your arch", NR); \
 })
 #else
 inline static void dummy_cleanup(void) {}

 #define TST_SYSCALL_BRK__(NR, SNR) ({ \
-       tst_brkm(TCONF, dummy_cleanup, \
-               "syscall(%d) " SNR " not supported on your arch", NR); \
+tst_brkm(TCONF, dummy_cleanup, \
+       "syscall(%d) " SNR " not supported on your arch", NR); \
 })
 #endif

 #define tst_syscall(NR, ...) ({ \
-       intptr_t tst_ret; \
-       if (NR == __LTP__NR_INVALID_SYSCALL) { \
-               errno = ENOSYS; \
-               tst_ret = -1; \
-       } else { \
-               tst_ret = syscall(NR, ##__VA_ARGS__); \
-       } \
-       if (tst_ret == -1 && errno == ENOSYS) { \
-               TST_SYSCALL_BRK__(NR, #NR); \
-       } \
-       tst_ret; \
+intptr_t tst_ret; \
+if (NR == __LTP__NR_INVALID_SYSCALL) { \
+       errno = ENOSYS; \
+       tst_ret = -1; \
+} else { \
+       tst_ret = syscall(NR, ##__VA_ARGS__); \
+} \
+if (tst_ret == -1 && errno == ENOSYS) { \
+       TST_SYSCALL_BRK__(NR, #NR); \
+} \
+tst_ret; \
 })

 #define __LTP__NR_INVALID_SYSCALL -1
@@ -6681,7 +6681,7 @@
 #endif


-#if defined(__mips__) && defined(_ABIN32)
+#ifdef __mips_n32__
 # ifndef __NR_read
 #  define __NR_read 6000
 # endif
@@ -7828,7 +7828,7 @@
 #endif


-#if defined(__mips__) && defined(_ABI64)
+#ifdef __mips_n64__
 # ifndef __NR_read
 #  define __NR_read 5000
 # endif
@@ -8903,7 +8903,7 @@
 #endif


-#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32
+#ifdef __mips_o32__
 # ifndef __NR_syscall
 #  define __NR_syscall 4000
 # endif
Cyril Hrubis Oct. 31, 2024, 10:31 a.m. UTC | #4
Hi!
And besides these two issues I pointed out it seems to work fine and the
code looks fine, so with these two fixed:

Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Andrea Cervesato Oct. 31, 2024, 10:37 a.m. UTC | #5
Hi,

On 10/31/24 11:28, Cyril Hrubis wrote:
> Hi!
>> I was comparing the old include/lapi/syscalls.h (21579 lines) and the new one
>> (20054). Having new file shorter is a bit surprising to me. I haven't found what
>> is missing, probably I'm missing something myself :).
> That is strange, I got exactly same content minus some whitespaces and
> slightly different macros that check for arch support:
>
> --- syscalls.h.old      2024-10-31 11:17:04.840217056 +0100
> +++ syscalls.h  2024-10-31 11:23:38.326891830 +0100
> @@ -1,3 +1,5 @@
> +
> +// SPDX-License-Identifier: GPL-2.0-or-later
>   /************************************************
>    * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
>    *  change your arch specific .in file instead  *
> @@ -6,8 +8,6 @@
>   /*
>    * Here we stick all the ugly *fallback* logic for linux
>    * system call numbers (those __NR_ thingies).
> - *
> - * Licensed under the GPLv2 or later, see the COPYING file.
>    */
>
>   #ifndef LAPI_SYSCALLS_H__
> @@ -19,30 +19,30 @@
>
>   #ifdef TST_TEST_H__
>   #define TST_SYSCALL_BRK__(NR, SNR) ({ \
> -       tst_brk(TCONF, \
> -               "syscall(%d) " SNR " not supported on your arch", NR); \
> +tst_brk(TCONF, \
> +       "syscall(%d) " SNR " not supported on your arch", NR); \
>   })
>   #else
>   inline static void dummy_cleanup(void) {}
>
>   #define TST_SYSCALL_BRK__(NR, SNR) ({ \
> -       tst_brkm(TCONF, dummy_cleanup, \
> -               "syscall(%d) " SNR " not supported on your arch", NR); \
> +tst_brkm(TCONF, dummy_cleanup, \
> +       "syscall(%d) " SNR " not supported on your arch", NR); \
>   })
>   #endif
>
>   #define tst_syscall(NR, ...) ({ \
> -       intptr_t tst_ret; \
> -       if (NR == __LTP__NR_INVALID_SYSCALL) { \
> -               errno = ENOSYS; \
> -               tst_ret = -1; \
> -       } else { \
> -               tst_ret = syscall(NR, ##__VA_ARGS__); \
> -       } \
> -       if (tst_ret == -1 && errno == ENOSYS) { \
> -               TST_SYSCALL_BRK__(NR, #NR); \
> -       } \
> -       tst_ret; \
> +intptr_t tst_ret; \
> +if (NR == __LTP__NR_INVALID_SYSCALL) { \
> +       errno = ENOSYS; \
> +       tst_ret = -1; \
> +} else { \
> +       tst_ret = syscall(NR, ##__VA_ARGS__); \
> +} \
> +if (tst_ret == -1 && errno == ENOSYS) { \
> +       TST_SYSCALL_BRK__(NR, #NR); \
> +} \
> +tst_ret; \
>   })
>
>   #define __LTP__NR_INVALID_SYSCALL -1
> @@ -6681,7 +6681,7 @@
>   #endif
>
>
> -#if defined(__mips__) && defined(_ABIN32)
> +#ifdef __mips_n32__
Do you believe these lines are an error? I'm checking the code and it 
seems fine.
>   # ifndef __NR_read
>   #  define __NR_read 6000
>   # endif
> @@ -7828,7 +7828,7 @@
>   #endif
>
>
> -#if defined(__mips__) && defined(_ABI64)
> +#ifdef __mips_n64__
>   # ifndef __NR_read
>   #  define __NR_read 5000
>   # endif
> @@ -8903,7 +8903,7 @@
>   #endif
>
>
> -#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32
> +#ifdef __mips_o32__
>   # ifndef __NR_syscall
>   #  define __NR_syscall 4000
>   # endif
>
Andrea
Andrea Cervesato Oct. 31, 2024, 11:02 a.m. UTC | #6
On 10/31/24 11:28, Cyril Hrubis wrote:
> Hi!
>> I was comparing the old include/lapi/syscalls.h (21579 lines) and the new one
>> (20054). Having new file shorter is a bit surprising to me. I haven't found what
>> is missing, probably I'm missing something myself :).
> That is strange, I got exactly same content minus some whitespaces and
> slightly different macros that check for arch support:
>
> --- syscalls.h.old      2024-10-31 11:17:04.840217056 +0100
> +++ syscalls.h  2024-10-31 11:23:38.326891830 +0100
> @@ -1,3 +1,5 @@
> +
> +// SPDX-License-Identifier: GPL-2.0-or-later
>   /************************************************
>    * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
>    *  change your arch specific .in file instead  *
> @@ -6,8 +8,6 @@
>   /*
>    * Here we stick all the ugly *fallback* logic for linux
>    * system call numbers (those __NR_ thingies).
> - *
> - * Licensed under the GPLv2 or later, see the COPYING file.
>    */
>
>   #ifndef LAPI_SYSCALLS_H__
> @@ -19,30 +19,30 @@
>
>   #ifdef TST_TEST_H__
>   #define TST_SYSCALL_BRK__(NR, SNR) ({ \
> -       tst_brk(TCONF, \
> -               "syscall(%d) " SNR " not supported on your arch", NR); \
> +tst_brk(TCONF, \
> +       "syscall(%d) " SNR " not supported on your arch", NR); \
>   })
>   #else
>   inline static void dummy_cleanup(void) {}
>
>   #define TST_SYSCALL_BRK__(NR, SNR) ({ \
> -       tst_brkm(TCONF, dummy_cleanup, \
> -               "syscall(%d) " SNR " not supported on your arch", NR); \
> +tst_brkm(TCONF, dummy_cleanup, \
> +       "syscall(%d) " SNR " not supported on your arch", NR); \
>   })
>   #endif
>
>   #define tst_syscall(NR, ...) ({ \
> -       intptr_t tst_ret; \
> -       if (NR == __LTP__NR_INVALID_SYSCALL) { \
> -               errno = ENOSYS; \
> -               tst_ret = -1; \
> -       } else { \
> -               tst_ret = syscall(NR, ##__VA_ARGS__); \
> -       } \
> -       if (tst_ret == -1 && errno == ENOSYS) { \
> -               TST_SYSCALL_BRK__(NR, #NR); \
> -       } \
> -       tst_ret; \
> +intptr_t tst_ret; \
> +if (NR == __LTP__NR_INVALID_SYSCALL) { \
> +       errno = ENOSYS; \
> +       tst_ret = -1; \
> +} else { \
> +       tst_ret = syscall(NR, ##__VA_ARGS__); \
> +} \
> +if (tst_ret == -1 && errno == ENOSYS) { \
> +       TST_SYSCALL_BRK__(NR, #NR); \
> +} \
> +tst_ret; \
>   })
>
>   #define __LTP__NR_INVALID_SYSCALL -1
> @@ -6681,7 +6681,7 @@
>   #endif
>
>
> -#if defined(__mips__) && defined(_ABIN32)
> +#ifdef __mips_n32__
>   # ifndef __NR_read
>   #  define __NR_read 6000
>   # endif
> @@ -7828,7 +7828,7 @@
>   #endif
>
>
> -#if defined(__mips__) && defined(_ABI64)
> +#ifdef __mips_n64__
>   # ifndef __NR_read
>   #  define __NR_read 5000
>   # endif
> @@ -8903,7 +8903,7 @@
>   #endif
>
>
> -#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32
> +#ifdef __mips_o32__
>   # ifndef __NR_syscall
>   #  define __NR_syscall 4000
>   # endif
>
I just realized that these are errors. The reason is that files are 
changed now, so I need to change the way architecture is seen at compile 
time. For example, mips64n32 is now mips_n32 and that has to be handled 
in the syscalls file generator.

Andrea
Petr Vorel Oct. 31, 2024, 11:17 a.m. UTC | #7
> Hi!
> > I was comparing the old include/lapi/syscalls.h (21579 lines) and the new one
> > (20054). Having new file shorter is a bit surprising to me. I haven't found what
> > is missing, probably I'm missing something myself :).

> That is strange, I got exactly same content minus some whitespaces and
> slightly different macros that check for arch support:

Hm, that must be on my side than. I was doing that on old version,
but even with update to the current master and deleting all:

rm -rf *; git reset --hard; make autotools && ./configure

I still get:

21579 for master (84e77afb3a)
20054 for v6.

Because diff is big, I posted: diff [1], old master [2], new v6 [3]

Now I see the reason - what I pushed as Anrea's v6 [4] is broken for many
distros [5].

Reason for the failure itself is quite obvious [6]:

414 ../include/lapi/syscalls.h:13:2: error: unterminated conditional directive
415 #ifndef LAPI_SYSCALLS_H__
416 ^
417 1 error generated.

Looking it's broken on Debian any version I suspect
include/lapi/syscalls/generate_syscalls.sh works differently on dash.
But it works on ash. Maybe it's not a shell syntax but some dependency.

I suppose include/lapi/syscalls/generate_syscalls.sh should use:
#!/bin/sh -eux
instead of plain #!/bin/sh, that will show the error immediately.
(set -eu is useful for shell scripts which should not fail).

Kind regards,
Petr

[1] https://github.com/pevik/ltp/wiki/diff-master-and-v6
[2] https://github.com/pevik/ltp/wiki/syscalls.h-old-master-(84e77afb3a)
[3] https://github.com/pevik/ltp/wiki/syscalls.h-v6-(new)
[4] https://github.com/pevik/ltp/tree/refs/heads/andrea/automatically-generate-syscalls.h.v6
[5] https://github.com/pevik/ltp/actions/runs/11609439723
[6] https://github.com/pevik/ltp/actions/runs/11609439723/job/32326686364
Cyril Hrubis Oct. 31, 2024, 11:35 a.m. UTC | #8
Hi!
> > -#if defined(__mips__) && defined(_ABIN32)
> > +#ifdef __mips_n32__
> Do you believe these lines are an error? I'm checking the code and it 
> seems fine.

I guess that these are mostly equivalent, there may be a special cases
where the are not though. I guess that Peter can check with the
buildroot folks, they probably know which one is more correct.
Cyril Hrubis Oct. 31, 2024, 12:19 p.m. UTC | #9
Hi!
> Looking it's broken on Debian any version I suspect
> include/lapi/syscalls/generate_syscalls.sh works differently on dash.
> But it works on ash. Maybe it's not a shell syntax but some dependency.

That is strange, I checked with dash here as well, no differencies. But
I did so only for the generate_syscalls.sh script. If you tested the
whole patchset together it's the code that generates the *.in files that
differs.
Andrea Cervesato Oct. 31, 2024, 12:25 p.m. UTC | #10
On 10/31/24 13:19, Cyril Hrubis wrote:
> Hi!
>> Looking it's broken on Debian any version I suspect
>> include/lapi/syscalls/generate_syscalls.sh works differently on dash.
>> But it works on ash. Maybe it's not a shell syntax but some dependency.
> That is strange, I checked with dash here as well, no differencies. But
> I did so only for the generate_syscalls.sh script. If you tested the
> whole patchset together it's the code that generates the *.in files that
> differs.
>
Yes it's strange. Check v7 which introduces `/bin/sh -eux`. The CI 
passes without issues: https://github.com/acerv/ltp/actions/runs/11611080151

Andrea
diff mbox series

Patch

diff --git a/configure.ac b/configure.ac
index d327974efa71f263d7f7f5aec9d2c5831d53dd0e..cd1233d19fad376973fc880d6689859845613fb0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -386,7 +386,7 @@  else
     AC_SUBST([WITH_REALTIME_TESTSUITE],["no"])
 fi
 
-AC_CONFIG_COMMANDS([syscalls.h], [cd ${ac_top_srcdir}/include/lapi/syscalls; ./regen.sh; cd - >/dev/null])
+AC_CONFIG_COMMANDS([syscalls.h], [cd ${ac_top_srcdir}/include/lapi/syscalls; ./generate_syscalls.sh ../syscalls.h; cd - >/dev/null])
 
 # custom functions
 # NOTE: don't create custom functions for simple checks, put them into this file
diff --git a/include/lapi/syscalls/generate_syscalls.sh b/include/lapi/syscalls/generate_syscalls.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8fcc0f80654011e8d0811b9ca64157c778bb12ce
--- /dev/null
+++ b/include/lapi/syscalls/generate_syscalls.sh
@@ -0,0 +1,111 @@ 
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Generate the syscalls.h file, merging all architectures syscalls input file
+# which are in the current folder and defined inside supported-arch.txt file.
+
+SYSCALLS_FILE="$1"
+
+if [ -z "${SYSCALLS_FILE}" ]; then
+	echo "Please provide the syscalls.h directory:"
+	echo ""
+	echo "$0 path/of/syscalls.h"
+	echo ""
+	exit 1
+fi
+
+SCRIPT_DIR="$(realpath $(dirname "$0"))"
+SUPPORTED_ARCH="${SCRIPT_DIR}/supported-arch.txt"
+
+echo '
+// SPDX-License-Identifier: GPL-2.0-or-later
+/************************************************
+ * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
+ *  change your arch specific .in file instead  *
+ ************************************************/
+
+/*
+ * Here we stick all the ugly *fallback* logic for linux
+ * system call numbers (those __NR_ thingies).
+ */
+
+#ifndef LAPI_SYSCALLS_H__
+#define LAPI_SYSCALLS_H__
+
+#include <errno.h>
+#include <sys/syscall.h>
+#include <asm/unistd.h>
+
+#ifdef TST_TEST_H__
+#define TST_SYSCALL_BRK__(NR, SNR) ({ \
+tst_brk(TCONF, \
+	"syscall(%d) " SNR " not supported on your arch", NR); \
+})
+#else
+inline static void dummy_cleanup(void) {}
+
+#define TST_SYSCALL_BRK__(NR, SNR) ({ \
+tst_brkm(TCONF, dummy_cleanup, \
+	"syscall(%d) " SNR " not supported on your arch", NR); \
+})
+#endif
+
+#define tst_syscall(NR, ...) ({ \
+intptr_t tst_ret; \
+if (NR == __LTP__NR_INVALID_SYSCALL) { \
+	errno = ENOSYS; \
+	tst_ret = -1; \
+} else { \
+	tst_ret = syscall(NR, ##__VA_ARGS__); \
+} \
+if (tst_ret == -1 && errno == ENOSYS) { \
+	TST_SYSCALL_BRK__(NR, #NR); \
+} \
+tst_ret; \
+})
+
+#define __LTP__NR_INVALID_SYSCALL -1' >${SYSCALLS_FILE}
+
+while IFS= read -r arch; do
+	(
+		echo
+		case ${arch} in
+		sparc64) echo "#if defined(__sparc__) && defined(__arch64__)" ;;
+		sparc) echo "#if defined(__sparc__) && !defined(__arch64__)" ;;
+		s390) echo "#if defined(__s390__) && !defined(__s390x__)" ;;
+		mips64n32) echo "#if defined(__mips__) && defined(_ABIN32)" ;;
+		mips64) echo "#if defined(__mips__) && defined(_ABI64)" ;;
+		mipso32) echo "#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32" ;;
+		parisc) echo "#ifdef __hppa__" ;;
+		loongarch64) echo "#ifdef __loongarch__" ;;
+		arm64) echo "#ifdef __aarch64__" ;;
+		*) echo "#ifdef __${arch}__" ;;
+		esac
+
+		while read -r line; do
+			set -- ${line}
+			syscall_nr="__NR_$1"
+			shift
+
+			echo "# ifndef ${syscall_nr}"
+			echo "#  define ${syscall_nr} $*"
+			echo "# endif"
+		done <"${SCRIPT_DIR}/${arch}.in"
+		echo "#endif"
+		echo
+	) >>${SYSCALLS_FILE}
+done <${SUPPORTED_ARCH}
+
+(
+	echo
+	echo "/* Common stubs */"
+	for num in $(awk '{print $1}' "${SCRIPT_DIR}/"*.in | sort -u); do
+		syscall_nr="__NR_${num}"
+		shift
+
+		echo "# ifndef ${syscall_nr}"
+		echo "#  define ${syscall_nr} __LTP__NR_INVALID_SYSCALL"
+		echo "# endif"
+	done
+	echo "#endif"
+) >>${SYSCALLS_FILE}
diff --git a/include/lapi/syscalls/regen.sh b/include/lapi/syscalls/regen.sh
deleted file mode 100755
index 663ce4458bbc67c3a9e8073dfe8359164a9da0ee..0000000000000000000000000000000000000000
--- a/include/lapi/syscalls/regen.sh
+++ /dev/null
@@ -1,129 +0,0 @@ 
-#!/bin/sh
-
-output="syscalls.h"
-rm -f "${output}".[1-9]*
-output_pid="${output}.$$"
-
-max_jobs=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
-: ${max_jobs:=1}
-
-srcdir=${0%/*}
-
-err() {
-	echo "$*" 1>&2
-	exit 1
-}
-
-cat << EOF > "${output_pid}"
-/************************************************
- * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
- *  change your arch specific .in file instead  *
- ************************************************/
-
-/*
- * Here we stick all the ugly *fallback* logic for linux
- * system call numbers (those __NR_ thingies).
- *
- * Licensed under the GPLv2 or later, see the COPYING file.
- */
-
-#ifndef LAPI_SYSCALLS_H__
-#define LAPI_SYSCALLS_H__
-
-#include <errno.h>
-#include <sys/syscall.h>
-#include <asm/unistd.h>
-
-#ifdef TST_TEST_H__
-#define TST_SYSCALL_BRK__(NR, SNR) ({ \\
-	tst_brk(TCONF, \\
-		"syscall(%d) " SNR " not supported on your arch", NR); \\
-})
-#else
-inline static void dummy_cleanup(void) {}
-
-#define TST_SYSCALL_BRK__(NR, SNR) ({ \\
-	tst_brkm(TCONF, dummy_cleanup, \\
-		"syscall(%d) " SNR " not supported on your arch", NR); \\
-})
-#endif
-
-#define tst_syscall(NR, ...) ({ \\
-	intptr_t tst_ret; \\
-	if (NR == __LTP__NR_INVALID_SYSCALL) { \\
-		errno = ENOSYS; \\
-		tst_ret = -1; \\
-	} else { \\
-		tst_ret = syscall(NR, ##__VA_ARGS__); \\
-	} \\
-	if (tst_ret == -1 && errno == ENOSYS) { \\
-		TST_SYSCALL_BRK__(NR, #NR); \\
-	} \\
-	tst_ret; \\
-})
-
-EOF
-
-jobs=0
-for arch in $(cat "${srcdir}/order") ; do
-	(
-	echo "Generating data for arch $arch ... "
-
-	(
-	echo
-	case ${arch} in
-		sparc64) echo "#if defined(__sparc__) && defined(__arch64__)" ;;
-		sparc) echo "#if defined(__sparc__) && !defined(__arch64__)" ;;
-		s390) echo "#if defined(__s390__) && !defined(__s390x__)" ;;
-		mips_n32) echo "#if defined(__mips__) && defined(_ABIN32)" ;;
-		mips_n64) echo "#if defined(__mips__) && defined(_ABI64)" ;;
-		mips_o32) echo "#if defined(__mips__) && defined(_ABIO32) && _MIPS_SZLONG == 32" ;;
-		*) echo "#ifdef __${arch}__" ;;
-	esac
-	while read line ; do
-		set -- ${line}
-		nr="__NR_$1"
-		shift
-		if [ $# -eq 0 ] ; then
-			err "invalid line found: $line"
-		fi
-		echo "# ifndef ${nr}"
-		echo "#  define ${nr} $*"
-		echo "# endif"
-	done < "${srcdir}/${arch}.in"
-	echo "#endif"
-	echo
-	) >> "${output_pid}.${arch}"
-
-	) &
-
-	jobs=$(( jobs + 1 ))
-	if [ ${jobs} -ge ${max_jobs} ] ; then
-		wait || exit 1
-		jobs=0
-	fi
-done
-
-echo "Generating stub list ... "
-(
-echo
-echo "/* Common stubs */"
-echo "#define __LTP__NR_INVALID_SYSCALL -1" >> "${output_pid}"
-for nr in $(awk '{print $1}' "${srcdir}/"*.in | sort -u) ; do
-	nr="__NR_${nr}"
-	echo "# ifndef ${nr}"
-	echo "#  define ${nr} __LTP__NR_INVALID_SYSCALL"
-	echo "# endif"
-done
-echo "#endif"
-) >> "${output_pid}._footer"
-
-wait || exit 1
-
-printf "Combining them all ... "
-for arch in $(cat "${srcdir}/order") _footer ; do
-	cat "${output_pid}.${arch}"
-done >> "${output_pid}"
-mv "${output_pid}" "../${output}"
-rm -f "${output_pid}"*
-echo "OK!"
diff --git a/include/lapi/syscalls/order b/include/lapi/syscalls/supported-arch.txt
similarity index 100%
rename from include/lapi/syscalls/order
rename to include/lapi/syscalls/supported-arch.txt