Linux-arch Archive on lore.kernel.org
 help / color / Atom feed
From: Masahiro Yamada <masahiroy@kernel.org>
To: linux-arch@vger.kernel.org, x86@kernel.org
Cc: linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-alpha@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-ia64@vger.kernel.org,
	linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org,
	linux-parisc@vger.kernel.org, linux-sh@vger.kernel.org,
	linux-um@lists.infradead.org, linux-xtensa@linux-xtensa.org,
	linuxppc-dev@lists.ozlabs.org, sparclinux@vger.kernel.org,
	Masahiro Yamada <masahiroy@kernel.org>
Subject: [PATCH 01/27] scripts: add generic syscalltbl.sh
Date: Thu, 28 Jan 2021 09:50:43 +0900
Message-ID: <20210128005110.2613902-2-masahiroy@kernel.org> (raw)
In-Reply-To: <20210128005110.2613902-1-masahiroy@kernel.org>

Most of architectures generate syscall headers at the compile time
in the almost same way.

The syscall table has the same format for all architectures. Each line
has 3, 4 or 5 fields; syscall number, ABI, syscall name, native entry
point, and compat entry point. The syscall table is processed by
syscalltbl.sh script into header files.

Despite the same pattern, scripts are maintained per architecture,
which results in code duplication and bad maintainability.

As of v5.11-rc1, 12 architectures duplicate similar shell scripts:

  $ find arch -name syscalltbl.sh | sort
  arch/alpha/kernel/syscalls/syscalltbl.sh
  arch/arm/tools/syscalltbl.sh
  arch/ia64/kernel/syscalls/syscalltbl.sh
  arch/m68k/kernel/syscalls/syscalltbl.sh
  arch/microblaze/kernel/syscalls/syscalltbl.sh
  arch/mips/kernel/syscalls/syscalltbl.sh
  arch/parisc/kernel/syscalls/syscalltbl.sh
  arch/powerpc/kernel/syscalls/syscalltbl.sh
  arch/sh/kernel/syscalls/syscalltbl.sh
  arch/sparc/kernel/syscalls/syscalltbl.sh
  arch/x86/entry/syscalls/syscalltbl.sh
  arch/xtensa/kernel/syscalls/syscalltbl.sh

My goal is to unify them into a single file, scripts/syscalltbl.sh.

For example, the i386 syscall table looks like this:

  0  i386  restart_syscall  sys_restart_syscall
  1  i386  exit             sys_exit
  2  i386  fork             sys_fork
  3  i386  read             sys_read
  4  i386  write            sys_write
  5  i386  open             sys_open              compat_sys_open
  ...

scripts/syscalltbl.sh generates the following code:

  __SYSCALL(0, sys_restart_syscall)
  __SYSCALL(1, sys_exit)
  __SYSCALL(2, sys_fork)
  __SYSCALL(3, sys_read)
  __SYSCALL(4, sys_write)
  __SYSCALL_WITH_COMPAT(5, sys_open, compat_sys_open)
  ...

Then, the i386 kernel will do:

  #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native)

and the x86_64 kernel will do:

  #define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat)

I noticed all 32/64 bit architectures can be covered by the same
pattern. Having an arch-specific script is fine if there is a good
reason to do so, but a single generic script should work for this case.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/syscalltbl.sh | 52 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 scripts/syscalltbl.sh

diff --git a/scripts/syscalltbl.sh b/scripts/syscalltbl.sh
new file mode 100644
index 000000000000..15bf4e09f88c
--- /dev/null
+++ b/scripts/syscalltbl.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Usage:
+#  scripts/syscalltbl.sh INFILE OUTFILE [ABIS] [OFFSET]
+#
+# INFILE: input syscall table
+# OUTFILE: output file
+# ABIS (optional): specify the ABIs to handle.
+#                  If omitted, all lines are handled.
+# OFFSET (optinal): spefify the offset of the syscall numbers.
+#                   If omitted, the offset is zero.
+#
+# The syscall table format:
+# nr abi name native [compat]
+#
+# nr: syscall number
+# abi: ABI name
+# name: syscall name
+# native: native entry point
+# compat (optional): compat entry point
+
+set -e
+
+in="$1"
+out="$2"
+abis=$(echo "($3)" | tr ',' '|')
+offset="${4:-0}"
+
+nxt=$offset
+
+grep -E "^[0-9]+[[:space:]]+${abis}" "$in" | sort -n | {
+
+	while read nr abi name native compat ; do
+
+		nr=$((nr + $offset))
+
+		while [ $nxt -lt $nr ]; do
+			echo "__SYSCALL($nxt, sys_ni_syscall)"
+			nxt=$((nxt + 1))
+		done
+
+		if [ -n "$compat" ]; then
+			echo "__SYSCALL_WITH_COMPAT($nr, $native, $compat)"
+		elif [ -n "$native" ]; then
+			echo "__SYSCALL($nr, $native)"
+		else
+			echo "__SYSCALL($nr, sys_ni_syscall)"
+		fi
+		nxt=$((nr + 1))
+	done
+} > "$out"
-- 
2.27.0


  reply index

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-28  0:50 [PATCH 00/27] arch: syscalls: unifiy all syscalltbl.sh into scripts/syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` Masahiro Yamada [this message]
2021-01-28  1:01   ` [PATCH 01/27] scripts: add generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` [PATCH 02/27] x86/syscalls: fix -Wmissing-prototypes warnings from COND_SYSCALL() Masahiro Yamada
2021-01-28  0:55   ` Masahiro Yamada
2021-01-28  7:59   ` Sergei Shtylyov
2021-01-28  8:00     ` Sergei Shtylyov
2021-02-04 14:16   ` Mickaël Salaün
2021-02-12 15:13     ` Mickaël Salaün
2021-02-13  4:50       ` Masahiro Yamada
2021-01-28  0:50 ` [PATCH 03/27] x86/build: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:50 ` [PATCH 04/27] x86/entry/x32: rename __x32_compat_sys_* to __x64_compat_sys_* Masahiro Yamada
2021-01-28  0:50 ` [PATCH 05/27] x86/syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` [PATCH 06/27] ARM: syscalls: " Masahiro Yamada
2021-01-28  0:50 ` [PATCH 07/27] alpha: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:50 ` [PATCH 08/27] alpha: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` [PATCH 09/27] ia64: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:50 ` [PATCH 10/27] ia64: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` [PATCH 11/27] m68k: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  7:58   ` Geert Uytterhoeven
2021-01-28  0:50 ` [PATCH 12/27] m68k: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  8:17   ` Geert Uytterhoeven
2021-01-28  0:50 ` [PATCH 13/27] microblaze: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:50 ` [PATCH 14/27] microblaze: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` [PATCH 15/27] mips: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:50 ` [PATCH 16/27] mips: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:50 ` [PATCH 17/27] parisc: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:51 ` [PATCH 18/27] parisc: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:51 ` [PATCH 19/27] sh: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:51 ` [PATCH 20/27] sh: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:51 ` [PATCH 21/27] sparc: remove wrong comment from arch/sparc/include/asm/Kbuild Masahiro Yamada
2021-02-14 17:00   ` Masahiro Yamada
2021-01-28  0:51 ` [PATCH 22/27] sparc: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:51 ` [PATCH 23/27] sparc: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:51 ` [PATCH 24/27] powerpc: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:51 ` [PATCH 25/27] powerpc: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-01-28  0:51 ` [PATCH 26/27] xtensa: add missing FORCE and fix 'targets' to make if_changed work Masahiro Yamada
2021-01-28  0:51 ` [PATCH 27/27] xtensa: syscalls: switch to generic syscalltbl.sh Masahiro Yamada
2021-02-15 12:03 ` [PATCH 00/27] arch: syscalls: unifiy all syscalltbl.sh into scripts/syscalltbl.sh Masahiro Yamada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210128005110.2613902-2-masahiroy@kernel.org \
    --to=masahiroy@kernel.org \
    --cc=linux-alpha@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@lists.linux-m68k.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-parisc@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=linux-um@lists.infradead.org \
    --cc=linux-xtensa@linux-xtensa.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=sparclinux@vger.kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Linux-arch Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-arch/0 linux-arch/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-arch linux-arch/ https://lore.kernel.org/linux-arch \
		linux-arch@vger.kernel.org
	public-inbox-index linux-arch

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-arch


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git