[LTP] [PATCH v3 2/4] Add script to generate arch(s) dependant syscalls

Jan Stancek jstancek@redhat.com
Thu Oct 3 15:58:15 CEST 2024


On Mon, Sep 30, 2024 at 9:22 PM Andrea Cervesato
<andrea.cervesato@suse.de> wrote:
>
> From: Andrea Cervesato <andrea.cervesato@suse.com>
>
> Add generate_arch.sh script which can be used to generate arch(s)
> dependant syscalls file. The way it works is pretty simple: for each
> architecture defined into supported-arch.txt, compile kernel headers,
> extract the list of syscalls and generate a .in file containing all of
> them, associated with their own syscall's number.
> The way syscalls files are generated, passes through a C application
> which is automatically checking the availability of the syscalls in
> the user space environment.
>
> Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
> ---
>  include/lapi/syscalls/{aarch64.in => arm64.in}     |   0
>  include/lapi/syscalls/blacklist-syscalls.txt       |   6 +
>  include/lapi/syscalls/generate_arch.sh             | 210 +++++++++++++++++++++
>  include/lapi/syscalls/generate_syscalls.sh         |   9 +-
>  .../lapi/syscalls/{loongarch.in => loongarch64.in} |   0
>  include/lapi/syscalls/{mips_n64.in => mips64.in}   |   0
>  .../lapi/syscalls/{mips_n32.in => mips64n32.in}    |   0
>  include/lapi/syscalls/{mips_o32.in => mipso32.in}  |   0
>  include/lapi/syscalls/{hppa.in => parisc.in}       |   0
>  include/lapi/syscalls/supported-arch.txt           |  12 +-
>  10 files changed, 228 insertions(+), 9 deletions(-)
>
> diff --git a/include/lapi/syscalls/aarch64.in b/include/lapi/syscalls/arm64.in
> similarity index 100%
> rename from include/lapi/syscalls/aarch64.in
> rename to include/lapi/syscalls/arm64.in
> diff --git a/include/lapi/syscalls/blacklist-syscalls.txt b/include/lapi/syscalls/blacklist-syscalls.txt
> new file mode 100644
> index 000000000..e1ae5f76f
> --- /dev/null
> +++ b/include/lapi/syscalls/blacklist-syscalls.txt
> @@ -0,0 +1,6 @@
> +arch_specific_syscall
> +available
> +ni_syscall

Overall I like v3, it appears to correct many mistakes we made manually.

But I'm not sure we want to blacklist "ni_syscall" entries.
It's still a valid syscall number, and the define is still provided in
kernel headers.

If we have a test for syscall, that upstream deprecates, the test would become
unbuildable after we update syscalls with this script (which drops the define).

Regards,
Jan

> +reserved
> +SYSCALL_MASK
> +unused
> diff --git a/include/lapi/syscalls/generate_arch.sh b/include/lapi/syscalls/generate_arch.sh
> new file mode 100755
> index 000000000..d8b36966e
> --- /dev/null
> +++ b/include/lapi/syscalls/generate_arch.sh
> @@ -0,0 +1,210 @@
> +#!/bin/sh
> +#
> +# This is an adaptation of the update-tables.sh script, included in the
> +# syscalls-table project (https://github.com/hrw/syscalls-table) and released
> +# under the MIT license.
> +#
> +# Author: Andrea Cervesato <andrea.cervesato@suse.com>
> +
> +KERNELSRC=$1
> +
> +# to keep sorting in order
> +export LC_ALL=C
> +
> +if [ -z $KERNELSRC ]; then
> +       echo "Please provide kernel sources:"
> +       echo ""
> +       echo "$0 path/to/Linux/kernel/sources"
> +       echo ""
> +       exit 1
> +fi
> +
> +if [ ! -e ${KERNELSRC}/Makefile ]; then
> +       echo "No Makefile in $KERNELSRC directory"
> +       exit 1
> +fi
> +
> +TEMP=$(mktemp -d)
> +KVER=$(make -C ${KERNELSRC} kernelversion -s)
> +
> +SCRIPT_DIR="$(realpath $(dirname "$0"))"
> +SUPPORTED_ARCH="${SCRIPT_DIR}/supported-arch.txt"
> +SYSCALLS_BLACKLIST="${SCRIPT_DIR}/blacklist-syscalls.txt"
> +LINUX_HEADERS="${TEMP}/headers"
> +
> +grab_syscall_names_from_tables()
> +{
> +       for tbl_file in $(find ${KERNELSRC}/arch -name syscall*.tbl); do
> +               grep -E -v "(^#|^$|sys_ni_syscall)" $tbl_file |
> +                       awk '{ print $3 }' >> ${TEMP}/syscall-names.tosort
> +       done
> +
> +       drop_bad_entries
> +}
> +
> +grab_syscall_names_from_unistd_h()
> +{
> +       grep -E -h "^#define __NR_" \
> +               ${LINUX_HEADERS}/usr/include/asm/unistd*.h \
> +               ${LINUX_HEADERS}/usr/include/asm-generic/unistd.h \
> +               >${TEMP}/syscall-names.tosort
> +
> +       drop_bad_entries
> +}
> +
> +drop_bad_entries()
> +{
> +       grep -E -v "(unistd.h|NR3264|__NR_syscall|__SC_COMP|__NR_.*Linux|__NR_FAST)" \
> +               ${TEMP}/syscall-names.tosort |
> +               grep -E -vi "(not implemented|available|unused|reserved|xtensa|spill)" |
> +               grep -E -v "(__SYSCALL|SYSCALL_BASE|SYSCALL_MASK)" |
> +               sed -e "s/#define\s*__NR_//g" -e "s/\s.*//g" |
> +               sort -u >${TEMP}/syscall-names.sorted
> +
> +       grep -w -v -f ${SYSCALLS_BLACKLIST} ${TEMP}/syscall-names.sorted |
> +               sort -u >${TEMP}/syscall-names.txt
> +}
> +
> +generate_table()
> +{
> +       echo "- $arch"
> +
> +       if [ $bits == 32 ]; then
> +               extraflags="${extraflags} -D__BITS_PER_LONG=32"
> +       fi
> +
> +       local uppercase_arch=$(echo "$arch" | tr '[:lower:]' '[:upper:]')
> +
> +       gcc ${TEMP}/list-syscalls.c -U__LP64__ -U__ILP32__ -U__i386__ \
> +               -D${uppercase_arch} \
> +               -D__${arch}__ ${extraflags} \
> +               -I ${LINUX_HEADERS}/usr/include/ \
> +               -o ${TEMP}/list-syscalls &>/dev/null
> +
> +       ${TEMP}/list-syscalls > "${TEMP}/${arch}.in.tosort"
> +
> +       sort -k2,2n "${TEMP}/${arch}.in.tosort" > "${TEMP}/${arch}.in"
> +}
> +
> +generate_list_syscalls_c()
> +{
> +       (
> +               echo
> +               echo "
> +               #include <stdio.h>
> +               #include <asm/unistd.h>
> +
> +               int main(void)
> +               {
> +               "
> +               for syscall in $(cat ${TEMP}/syscall-names.txt); do
> +                       echo "
> +               #ifdef __NR_$syscall
> +                       printf(\"$syscall %d\\n\", __NR_$syscall);
> +               #endif
> +               "
> +               done
> +               echo " return 0;
> +               }"
> +       ) > ${TEMP}/list-syscalls.c
> +}
> +
> +export_headers()
> +{
> +       make -s -C ${KERNELSRC} ARCH=${arch} O=${LINUX_HEADERS} \
> +               headers_install &>/dev/null
> +}
> +
> +do_all_tables()
> +{
> +       for archdir in ${KERNELSRC}/arch/*; do
> +               arch=$(basename $archdir)
> +
> +               bits=64
> +               extraflags=
> +
> +               case ${arch} in
> +               Kconfig)
> +                       continue
> +                       ;;
> +               um)
> +                       continue
> +                       ;;
> +               esac
> +
> +               export_headers
> +               grab_syscall_names_from_unistd_h
> +
> +               case ${arch} in
> +               arm)
> +                       bits=32
> +                       arch=armoabi extraflags= generate_table
> +                       arch=arm extraflags=-D__ARM_EABI__ generate_table
> +                       ;;
> +               loongarch)
> +                       # 32-bit variant of loongarch may appear
> +                       arch=loongarch64 extraflags=-D_LOONGARCH_SZLONG=64 generate_table
> +                       ;;
> +               mips)
> +                       arch=mips64 extraflags=-D_MIPS_SIM=_MIPS_SIM_ABI64 generate_table
> +                       bits=32
> +                       arch=mipso32 extraflags=-D_MIPS_SIM=_MIPS_SIM_ABI32 generate_table
> +                       arch=mips64n32 extraflags=-D_MIPS_SIM=_MIPS_SIM_NABI32 generate_table
> +                       ;;
> +               powerpc)
> +                       generate_table
> +                       arch=powerpc64 generate_table
> +                       ;;
> +               riscv)
> +                       arch=riscv64 extraflags=-D__LP64__ generate_table
> +                       bits=32
> +                       arch=riscv32 extraflags=-D__SIZEOF_POINTER__=4 generate_table
> +                       ;;
> +               s390)
> +                       bits=32
> +                       generate_table
> +                       bits=64
> +                       arch=s390x generate_table
> +                       ;;
> +               sparc)
> +                       bits=32
> +                       extraflags=-D__32bit_syscall_numbers__ generate_table
> +                       bits=64
> +                       arch=sparc64 extraflags=-D__arch64__ generate_table
> +                       ;;
> +               x86)
> +                       arch=x86_64 extraflags=-D__LP64__ generate_table
> +                       bits=32
> +                       arch=i386 generate_table
> +                       arch=x32 extraflags=-D__ILP32__ generate_table
> +                       ;;
> +               arc | csky | hexagon | m68k | microblaze | nios2 | openrisc | sh | xtensa)
> +                       bits=32 generate_table
> +                       ;;
> +               *)
> +                       generate_table
> +                       ;;
> +               esac
> +       done
> +}
> +
> +copy_supported_arch()
> +{
> +       while IFS= read -r arch; do
> +               if [ -f "${TEMP}/${arch}.in" ]; then
> +                       echo "- ${arch}"
> +                       cp "${TEMP}/${arch}.in" "${SCRIPT_DIR}/${arch}.in"
> +               fi
> +       done < ${SUPPORTED_ARCH}
> +}
> +
> +echo "Temporary directory ${TEMP}"
> +echo "Extracting syscalls"
> +
> +grab_syscall_names_from_tables
> +generate_list_syscalls_c
> +
> +do_all_tables
> +
> +echo "Copying supported syscalls"
> +copy_supported_arch
> diff --git a/include/lapi/syscalls/generate_syscalls.sh b/include/lapi/syscalls/generate_syscalls.sh
> index 863f52253..05f3d6e24 100755
> --- a/include/lapi/syscalls/generate_syscalls.sh
> +++ b/include/lapi/syscalls/generate_syscalls.sh
> @@ -74,9 +74,12 @@ tst_ret; \
>                         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" ;;
> +                       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
>
> diff --git a/include/lapi/syscalls/loongarch.in b/include/lapi/syscalls/loongarch64.in
> similarity index 100%
> rename from include/lapi/syscalls/loongarch.in
> rename to include/lapi/syscalls/loongarch64.in
> diff --git a/include/lapi/syscalls/mips_n64.in b/include/lapi/syscalls/mips64.in
> similarity index 100%
> rename from include/lapi/syscalls/mips_n64.in
> rename to include/lapi/syscalls/mips64.in
> diff --git a/include/lapi/syscalls/mips_n32.in b/include/lapi/syscalls/mips64n32.in
> similarity index 100%
> rename from include/lapi/syscalls/mips_n32.in
> rename to include/lapi/syscalls/mips64n32.in
> diff --git a/include/lapi/syscalls/mips_o32.in b/include/lapi/syscalls/mipso32.in
> similarity index 100%
> rename from include/lapi/syscalls/mips_o32.in
> rename to include/lapi/syscalls/mipso32.in
> diff --git a/include/lapi/syscalls/hppa.in b/include/lapi/syscalls/parisc.in
> similarity index 100%
> rename from include/lapi/syscalls/hppa.in
> rename to include/lapi/syscalls/parisc.in
> diff --git a/include/lapi/syscalls/supported-arch.txt b/include/lapi/syscalls/supported-arch.txt
> index c18aa38cf..c5c5191ac 100644
> --- a/include/lapi/syscalls/supported-arch.txt
> +++ b/include/lapi/syscalls/supported-arch.txt
> @@ -1,13 +1,13 @@
> -aarch64
>  arc
> +arm64
>  arm
> -hppa
>  i386
>  ia64
> -loongarch
> -mips_n32
> -mips_n64
> -mips_o32
> +loongarch64
> +mips64n32
> +mips64
> +mipso32
> +parisc
>  powerpc64
>  powerpc
>  s390x
>
> --
> 2.43.0
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>



More information about the ltp mailing list