[PATCH RFC v3 2/8] syscalls: Create unified partial table for all archs
From: André Almeida
Date: Fri Aug 07 2026 - 16:01:54 EST
To take advantage of the subset of syscall numbers that are guaranteed to
be shared, create a new table and adapt generation scripts to use it. In
that way, every new syscall can be added to a single file.
Create special ABIs in order to make the table work for different archs:
- `memfd_secret` for archs that implements it
- `cln3` for archs that use the common clone3 entry
- `__cln3` for archs that use their own special entry point
Create flags for syscall scripts to use the common table.
Some archs only care about the native entry point and have no compat, so
create a option to never generate __SYSCALL_WITH_COMPAT() and always
generate __SYSCALL().
Signed-off-by: André Almeida <andrealmeid@xxxxxxxxxx>
---
scripts/syscall_common.tbl | 83 ++++++++++++++++++++++++++++++++++++++++++++++
scripts/syscallhdr.sh | 60 +++++++++++++++++++++++++--------
scripts/syscalltbl.sh | 36 ++++++++++++++++----
3 files changed, 158 insertions(+), 21 deletions(-)
diff --git a/scripts/syscall_common.tbl b/scripts/syscall_common.tbl
new file mode 100644
index 000000000000..decbb0c23fe3
--- /dev/null
+++ b/scripts/syscall_common.tbl
@@ -0,0 +1,83 @@
+# SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
+#
+# syscall numbers shared by all architectures
+#
+# The format is:
+# <number> <abi> <name> <entry point> [<compat entry point> [noreturn]]
+#
+# The abi can be "32", "cln3", "__cln3" and "memfd_secret"
+#
+# cln3 stands for the common clone3 entry, used by most archs. Some archs have
+# their special entry and should use "__cln3".
+#
+# "memfd_secret" is not implemented by every architecture
+
+403 32 clock_gettime64 sys_clock_gettime
+404 32 clock_settime64 sys_clock_settime
+405 32 clock_adjtime64 sys_clock_adjtime
+406 32 clock_getres_time64 sys_clock_getres
+407 32 clock_nanosleep_time64 sys_clock_nanosleep
+408 32 timer_gettime64 sys_timer_gettime
+409 32 timer_settime64 sys_timer_settime
+410 32 timerfd_gettime64 sys_timerfd_gettime
+411 32 timerfd_settime64 sys_timerfd_settime
+412 32 utimensat_time64 sys_utimensat
+413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
+414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
+416 32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
+417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
+418 32 mq_timedsend_time64 sys_mq_timedsend
+419 32 mq_timedreceive_time64 sys_mq_timedreceive
+420 32 semtimedop_time64 sys_semtimedop
+421 32 rt_sigtimedwait_time64 sys_rt_sigtimedwait compat_sys_rt_sigtimedwait_time64
+422 32 futex_time64 sys_futex
+423 32 sched_rr_get_interval_time64 sys_sched_rr_get_interval
+424 common pidfd_send_signal sys_pidfd_send_signal
+425 common io_uring_setup sys_io_uring_setup
+426 common io_uring_enter sys_io_uring_enter
+427 common io_uring_register sys_io_uring_register
+428 common open_tree sys_open_tree
+429 common move_mount sys_move_mount
+430 common fsopen sys_fsopen
+431 common fsconfig sys_fsconfig
+432 common fsmount sys_fsmount
+433 common fspick sys_fspick
+434 common pidfd_open sys_pidfd_open
+435 cln3 clone3 sys_clone3
+435 __cln3 clone3 __sys_clone3
+436 common close_range sys_close_range
+437 common openat2 sys_openat2
+438 common pidfd_getfd sys_pidfd_getfd
+439 common faccessat2 sys_faccessat2
+440 common process_madvise sys_process_madvise
+441 common epoll_pwait2 sys_epoll_pwait2 compat_sys_epoll_pwait2
+442 common mount_setattr sys_mount_setattr
+443 common quotactl_fd sys_quotactl_fd
+444 common landlock_create_ruleset sys_landlock_create_ruleset
+445 common landlock_add_rule sys_landlock_add_rule
+446 common landlock_restrict_self sys_landlock_restrict_self
+447 memfd_secret memfd_secret sys_memfd_secret
+448 common process_mrelease sys_process_mrelease
+449 common futex_waitv sys_futex_waitv
+450 common set_mempolicy_home_node sys_set_mempolicy_home_node
+451 common cachestat sys_cachestat
+452 common fchmodat2 sys_fchmodat2
+453 common map_shadow_stack sys_map_shadow_stack
+454 common futex_wake sys_futex_wake
+455 common futex_wait sys_futex_wait
+456 common futex_requeue sys_futex_requeue
+457 common statmount sys_statmount
+458 common listmount sys_listmount
+459 common lsm_get_self_attr sys_lsm_get_self_attr
+460 common lsm_set_self_attr sys_lsm_set_self_attr
+461 common lsm_list_modules sys_lsm_list_modules
+462 common mseal sys_mseal
+463 common setxattrat sys_setxattrat
+464 common getxattrat sys_getxattrat
+465 common listxattrat sys_listxattrat
+466 common removexattrat sys_removexattrat
+467 common open_tree_attr sys_open_tree_attr
+468 common file_getattr sys_file_getattr
+469 common file_setattr sys_file_setattr
+470 common listns sys_listns
+471 common rseq_slice_yield sys_rseq_slice_yield
diff --git a/scripts/syscallhdr.sh b/scripts/syscallhdr.sh
index bad1ab606a0f..e33cba98a5e9 100755
--- a/scripts/syscallhdr.sh
+++ b/scripts/syscallhdr.sh
@@ -16,7 +16,7 @@
set -e
usage() {
- echo >&2 "usage: $0 [--abis ABIS] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] INFILE OUTFILE" >&2
+ echo >&2 "usage: $0 [--abis ABIS] [--emit-nr] [--offset OFFSET] [--prefix PREFIX] [--common-tbl] INFILE OUTFILE" >&2
echo >&2
echo >&2 " INFILE input syscall table"
echo >&2 " OUTFILE output header file"
@@ -26,6 +26,7 @@ usage() {
echo >&2 " --emit-nr Emit the macro of the number of syscalls (__NR_syscalls)"
echo >&2 " --offset OFFSET The offset of syscall numbers"
echo >&2 " --prefix PREFIX The prefix to the macro like __NR_<PREFIX><NAME>"
+ echo >&2 " --common-tbl PATH Use the common number table"
exit 1
}
@@ -34,6 +35,8 @@ abis=
emit_nr=
offset=
prefix=
+common_tbl=
+common_tbl_path=
while [ $# -gt 0 ]
do
@@ -50,6 +53,10 @@ do
--prefix)
prefix=$2
shift 2;;
+ --common-tbl)
+ common_tbl=1
+ common_tbl_path=$2
+ shift 2;;
-*)
echo "$1: unknown option" >&2
usage;;
@@ -69,13 +76,33 @@ guard=_UAPI_ASM_$(basename "$outfile" |
sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
-e 's/[^A-Z0-9_]/_/g' -e 's/__/_/g')
-grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | {
+emit_start_guard() {
echo "#ifndef $guard"
echo "#define $guard"
echo
+}
+
+# emit_nr(prefix, nr)
+emit_nr() {
+ local nr=$1
+ local prefix=$2
+ echo
+ echo "#ifdef __KERNEL__"
+ echo "#define __NR_${prefix}syscalls $nr"
+ echo "#endif"
+}
+
+emit_end_guard() {
+ echo
+ echo "#endif /* $guard */"
+}
+
+max=0
+# gen_hdr(infile)
+gen_hdr() {
+ input=$1
- max=0
- while read nr abi name native compat ; do
+ while read nr abi name native compat; do
max=$nr
@@ -84,15 +111,20 @@ grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$infile" | {
fi
echo "#define __NR_$prefix$name $nr"
- done
- if [ -n "$emit_nr" ]; then
- echo
- echo "#ifdef __KERNEL__"
- echo "#define __NR_${prefix}syscalls $(($max + 1))"
- echo "#endif"
- fi
+ done < <(grep -E "^[0-9A-Fa-fXx]+[[:space:]]+$abis" "$input")
+}
- echo
- echo "#endif /* $guard */"
-} > "$outfile"
+emit_start_guard > $outfile
+
+gen_hdr $infile >> $outfile
+
+if [ -n "$common_tbl" ]; then
+ gen_hdr $common_tbl_path >> "$outfile"
+fi
+
+if [ -n "$emit_nr" ]; then
+ emit_nr $(($max + 1)) $prefix >> $outfile
+fi
+
+emit_end_guard >> $outfile
diff --git a/scripts/syscalltbl.sh b/scripts/syscalltbl.sh
index c4b1f85c2dd6..c0fd6af2d892 100755
--- a/scripts/syscalltbl.sh
+++ b/scripts/syscalltbl.sh
@@ -16,18 +16,23 @@
set -e
usage() {
- echo >&2 "usage: $0 [--abis ABIS] INFILE OUTFILE" >&2
+ echo >&2 "usage: $0 [--abis ABIS] [--common-tbl] [--no-compat] INFILE OUTFILE" >&2
echo >&2
echo >&2 " INFILE input syscall table"
echo >&2 " OUTFILE output header file"
echo >&2
echo >&2 "options:"
echo >&2 " --abis ABIS ABI(s) to handle (By default, all lines are handled)"
+ echo >&2 " --common-tbl PATH Use the common syscall number table"
+ echo >&2 " --no-compat Always generate the native entry"
exit 1
}
# default unless specified by options
abis=
+common_tbl=
+common_tbl_path=
+no_compat=
while [ $# -gt 0 ]
do
@@ -35,6 +40,13 @@ do
--abis)
abis="($(echo "${2%,}" | tr ',' '|'))"
shift 2;;
+ --common-tbl)
+ common_tbl=1
+ common_tbl_path=$2
+ shift 2;;
+ --no-compat)
+ no_compat=1
+ shift 1;;
-*)
echo "$1: unknown option" >&2
usage;;
@@ -52,12 +64,14 @@ outfile="$2"
nxt=0
-grep -E "^[0-9]+[[:space:]]+$abis" "$infile" | {
+# gen_tbl(infile)
+gen_tbl() {
+ input=$1
while read nr abi name native compat noreturn; do
if [ $nxt -gt $nr ]; then
- echo "error: $infile: syscall table is not sorted or duplicates the same syscall number" >&2
+ echo "error: $input: syscall table is not sorted or duplicates the same syscall number" >&2
exit 1
fi
@@ -66,13 +80,13 @@ grep -E "^[0-9]+[[:space:]]+$abis" "$infile" | {
nxt=$((nxt + 1))
done
- if [ "$compat" = "-" ]; then
+ if [ "$compat" = "-" ] || [ -n "$no_compat" ]; then
unset compat
fi
if [ -n "$noreturn" ]; then
if [ "$noreturn" != "noreturn" ]; then
- echo "error: $infile: invalid string \"$noreturn\" in 'noreturn' column"
+ echo "error: $input: invalid string \"$noreturn\" in 'noreturn' column"
exit 1
fi
if [ -n "$compat" ]; then
@@ -88,5 +102,13 @@ grep -E "^[0-9]+[[:space:]]+$abis" "$infile" | {
echo "__SYSCALL($nr, sys_ni_syscall)"
fi
nxt=$((nr + 1))
- done
-} > "$outfile"
+
+ done < <(grep -E "^[0-9]+[[:space:]]+$abis" "$input")
+
+}
+
+gen_tbl $infile > "$outfile"
+
+if [ -n "$common_tbl" ]; then
+ gen_tbl $common_tbl_path >> "$outfile"
+fi
--
2.55.0