1 #!/bin/sh 2 3 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 # Generates a header file with a system call table made up of "name", 8 # syscall_nr entries by including the build target <asm/unistd.h> and 9 # emitting the list of defines. Use of the compiler is needed to 10 # dereference the actual provider of syscall definitions. 11 # E.g., asm/unistd_32.h or asm/unistd_64.h, etc. 12 13 set -e 14 15 if [ $# -ne 1 ] && [ $# -ne 2 ]; then 16 echo "Usage: $(basename "$0") OUTFILE" 17 echo "Usage: $(basename "$0") CC OUTFILE" 18 exit 1 19 fi 20 21 if [ $# -eq 2 ]; then 22 CC="$1" 23 shift 24 fi 25 OUTFILE="$1" 26 27 # Generate a dependency file which helps the build tool to see when it 28 # should regenerate ${OUTFILE}. 29 echo '#include <asm/unistd.h>' | ${CC} - -E -M -MF "${OUTFILE}.d.tmp" 30 # Correct the output filename. 31 (echo "${OUTFILE}: \\" ; sed -e 's/^-\.o://' -e 's/^-://' "${OUTFILE}.d.tmp") \ 32 > "${OUTFILE}.d" 33 rm "${OUTFILE}.d.tmp" 34 35 # sed expression which extracts system calls that are 36 # defined via asm/unistd.h. It converts them from: 37 # #define __NR_read foo 38 # to: 39 # #ifdef __NR_read 40 # { "read", __NR_read }, 41 # #endif 42 SED_MULTILINE='s/#define __(ARM_)?(NR_)([[:lower:]0-9_]*) (.*)$/#ifdef __\1\2\3\ 43 { "\1\3", __\1\2\3 },\ 44 #endif/g p;' 45 46 cat <<-EOF > "${OUTFILE}" 47 /* GENERATED BY MAKEFILE */ 48 #include <stddef.h> 49 #include <asm/unistd.h> 50 #include "libsyscalls.h" 51 const struct syscall_entry syscall_table[] = { 52 $(echo '#include <asm/unistd.h>' | \ 53 ${CC} -dD - -E | sed -Ene "${SED_MULTILINE}") 54 { NULL, -1 }, 55 }; 56 EOF 57