#!/bin/sh # # Update syscall_nr.h files from linux headers asm-generic/unistd.h # # This code is licensed under the GPL version 2 or later. See # the COPYING file in the top-level directory. # linux="$1" output="$2" TMP=$(mktemp -d) if [ "$linux" = "" ] ; then echo "Needs path to linux source tree" 1>&2 exit 1 fi if [ "$output" = "" ] ; then output="$PWD" fi upper() { echo "$1" | tr "[:lower:]" "[:upper:]" | tr "[:punct:]" "_" } qemu_arch() { case "$1" in arm64) echo "aarch64" ;; *) echo "$1" ;; esac } read_includes() { arch=$1 bits=$2 cpp -P -nostdinc -fdirectives-only \ -D_UAPI_ASM_$(upper ${arch})_BITSPERLONG_H \ -D__BITS_PER_LONG=${bits} \ -I${linux}/arch/${arch}/include/uapi/ \ -I${linux}/include/uapi \ -I${TMP} \ "${linux}/arch/${arch}/include/uapi/asm/unistd.h" } filter_defines() { grep -e "#define __NR_" -e "#define __NR3264" } rename_defines() { sed "s/ __NR_/ TARGET_NR_/g;s/(__NR_/(TARGET_NR_/g" } evaluate_values() { sed "s/#define TARGET_NR_/QEMU TARGET_NR_/" | \ cpp -P -nostdinc | \ sed "s/^QEMU /#define /" } generate_syscall_nr() { arch=$1 bits=$2 file="$3" guard="$(upper LINUX_USER_$(qemu_arch $arch)_$(basename "$file"))" (echo "/*" echo " * This file contains the system call numbers." echo " * Do not modify." echo " * This file is generated by scripts/gensyscalls.sh" echo " */" echo "#ifndef ${guard}" echo "#define ${guard}" echo read_includes $arch $bits | filter_defines | rename_defines | \ evaluate_values | sort -n -k 3 echo echo "#endif /* ${guard} */") > "$file" } mkdir "$TMP/asm" > "$TMP/asm/bitsperlong.h" generate_syscall_nr arm64 64 "$output/linux-user/aarch64/syscall_nr.h" generate_syscall_nr nios2 32 "$output/linux-user/nios2/syscall_nr.h" generate_syscall_nr openrisc 32 "$output/linux-user/openrisc/syscall_nr.h" generate_syscall_nr riscv 32 "$output/linux-user/riscv/syscall32_nr.h" generate_syscall_nr riscv 64 "$output/linux-user/riscv/syscall64_nr.h" generate_syscall_nr hexagon 32 "$output/linux-user/hexagon/syscall_nr.h" rm -fr "$TMP"