[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