#!/bin/sh output="syscalls.h" # For soon to be able to provide an argument # for output file so the header generation can # be added as a dependency in Android.bp if [ $# -gt 0 ]; then output=$1 echo "ltp syscalls gen output: "$output rm -f "${output}" fi rm -f "${output}".[1-9]* output_pid="${output}.$$" max_jobs=$(getconf _NPROCESSORS_ONLN 2>/dev/null) : ${max_jobs:=1} srcdir=${0%/*} err() { echo "$*" 1>&2 exit 1 } cat << EOF > "${output_pid}" /************************************************ * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE * * change your arch specific .in file instead * ************************************************/ /* * Here we stick all the ugly *fallback* logic for linux * system call numbers (those __NR_ thingies). * * Licensed under the GPLv2 or later, see the COPYING file. */ #ifndef __LAPI_SYSCALLS_H__ #define __LAPI_SYSCALLS_H__ #include <errno.h> #include <sys/syscall.h> #include <asm/unistd.h> #include "cleanup.c" #define ltp_syscall(NR, ...) ({ \\ int __ret; \\ if (NR == __LTP__NR_INVALID_SYSCALL) { \\ errno = ENOSYS; \\ __ret = -1; \\ } else { \\ __ret = syscall(NR, ##__VA_ARGS__); \\ } \\ if (__ret == -1 && errno == ENOSYS) { \\ tst_brkm(TCONF, CLEANUP, \\ "syscall(%d) " #NR " not supported on your arch", \\ NR); \\ } \\ __ret; \\ }) #define tst_syscall(NR, ...) ({ \\ int tst_ret; \\ if (NR == __LTP__NR_INVALID_SYSCALL) { \\ errno = ENOSYS; \\ tst_ret = -1; \\ } else { \\ tst_ret = syscall(NR, ##__VA_ARGS__); \\ } \\ if (tst_ret == -1 && errno == ENOSYS) { \\ tst_brk(TCONF, "syscall(%d) " #NR " not supported", NR); \\ } \\ tst_ret; \\ }) EOF jobs=0 for arch in $(cat "${srcdir}/order") ; do ( echo "Generating data for arch $arch ... " ( echo case ${arch} in sparc64) echo "#if defined(__sparc__) && defined(__arch64__)" ;; sparc) echo "#if defined(__sparc__) && !defined(__arch64__)" ;; *) echo "#ifdef __${arch}__" ;; esac while read line ; do set -- ${line} nr="__NR_$1" shift if [ $# -eq 0 ] ; then err "invalid line found: $line" fi echo "# ifndef ${nr}" echo "# define ${nr} $*" echo "# endif" done < "${srcdir}/${arch}.in" echo "#endif" echo ) >> "${output_pid}.${arch}" ) & jobs=$(( jobs + 1 )) if [ ${jobs} -ge ${max_jobs} ] ; then wait || exit 1 jobs=0 fi done echo "Generating stub list ... " ( echo echo "/* Common stubs */" echo "#define __LTP__NR_INVALID_SYSCALL -1" >> "${output_pid}" for nr in $(awk '{print $1}' "${srcdir}/"*.in | sort -u) ; do nr="__NR_${nr}" echo "# ifndef ${nr}" echo "# define ${nr} __LTP__NR_INVALID_SYSCALL" echo "# endif" done echo "#endif" ) >> "${output_pid}._footer" wait || exit 1 printf "Combining them all ... " for arch in $(cat "${srcdir}/order") _footer ; do cat "${output_pid}.${arch}" done >> "${output_pid}" if [ $# -gt 0 ]; then mv "${output_pid}" "${output}" else mv "${output_pid}" "../${output}" fi rm -f "${output_pid}"* echo "OK!"