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

Andrea Cervesato andrea.cervesato@suse.com
Wed Oct 9 10:40:56 CEST 2024


Hi,

On 10/3/24 15:58, Jan Stancek wrote:
> 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
>
This is a good point. So your suggestion is to keep all syscalls defined 
in blacklist-syscalls.txt available anyway, or just the ni_syscall 
definition? At this point I would just drop the blacklist-syscalls.txt 
file and keep all defined syscalls for the LTP syscalls backorts.

Andrea

>> +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