gensyscalls.sh (2379B)
1 #!/bin/sh 2 # 3 # Update syscall_nr.h files from linux headers asm-generic/unistd.h 4 # 5 # This code is licensed under the GPL version 2 or later. See 6 # the COPYING file in the top-level directory. 7 # 8 9 linux="$1" 10 output="$2" 11 12 TMP=$(mktemp -d) 13 14 if [ "$linux" = "" ] ; then 15 echo "Needs path to linux source tree" 1>&2 16 exit 1 17 fi 18 19 if [ "$output" = "" ] ; then 20 output="$PWD" 21 fi 22 23 upper() 24 { 25 echo "$1" | tr "[:lower:]" "[:upper:]" | tr "[:punct:]" "_" 26 } 27 28 qemu_arch() 29 { 30 case "$1" in 31 arm64) 32 echo "aarch64" 33 ;; 34 *) 35 echo "$1" 36 ;; 37 esac 38 } 39 40 read_includes() 41 { 42 arch=$1 43 bits=$2 44 45 cpp -P -nostdinc -fdirectives-only \ 46 -D_UAPI_ASM_$(upper ${arch})_BITSPERLONG_H \ 47 -D__ASM_$(upper ${arch})_BITSPERLONG_H \ 48 -D__BITS_PER_LONG=${bits} \ 49 -I${linux}/arch/${arch}/include/uapi/ \ 50 -I${linux}/include/uapi \ 51 -I${TMP} \ 52 "${linux}/arch/${arch}/include/uapi/asm/unistd.h" 53 } 54 55 filter_defines() 56 { 57 grep -e "#define __NR_" -e "#define __NR3264" 58 } 59 60 rename_defines() 61 { 62 sed "s/ __NR_/ TARGET_NR_/g;s/(__NR_/(TARGET_NR_/g" 63 } 64 65 evaluate_values() 66 { 67 sed "s/#define TARGET_NR_/QEMU TARGET_NR_/" | \ 68 cpp -P -nostdinc | \ 69 sed "s/^QEMU /#define /" 70 } 71 72 generate_syscall_nr() 73 { 74 arch=$1 75 bits=$2 76 file="$3" 77 guard="$(upper LINUX_USER_$(qemu_arch $arch)_$(basename "$file"))" 78 79 (echo "/*" 80 echo " * This file contains the system call numbers." 81 echo " * Do not modify." 82 echo " * This file is generated by scripts/gensyscalls.sh" 83 echo " */" 84 echo "#ifndef ${guard}" 85 echo "#define ${guard}" 86 echo 87 read_includes $arch $bits | filter_defines | rename_defines | \ 88 evaluate_values | sort -n -k 3 89 echo 90 echo "#endif /* ${guard} */") > "$file" 91 } 92 93 mkdir "$TMP/asm" 94 > "$TMP/asm/bitsperlong.h" 95 96 generate_syscall_nr arm64 64 "$output/linux-user/aarch64/syscall_nr.h" 97 generate_syscall_nr nios2 32 "$output/linux-user/nios2/syscall_nr.h" 98 generate_syscall_nr openrisc 32 "$output/linux-user/openrisc/syscall_nr.h" 99 100 generate_syscall_nr riscv 32 "$output/linux-user/riscv/syscall32_nr.h" 101 generate_syscall_nr riscv 64 "$output/linux-user/riscv/syscall64_nr.h" 102 generate_syscall_nr hexagon 32 "$output/linux-user/hexagon/syscall_nr.h" 103 generate_syscall_nr loongarch 64 "$output/linux-user/loongarch64/syscall_nr.h" 104 rm -fr "$TMP"