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") INFILE OUTFILE" 18 exit 1 19 fi 20 21 BUILD="${CC} -dD gen_syscalls.c -E" 22 GEN_DEPS=1 23 24 if [ $# -eq 2 ]; then 25 BUILD="cat $1" 26 GEN_DEPS=0 27 shift 28 fi 29 OUTFILE="$1" 30 31 if [ ${GEN_DEPS} -eq 1 ]; then 32 # Generate a dependency file which helps the build tool to see when it 33 # should regenerate ${OUTFILE}. 34 ${BUILD} -M -MF "${OUTFILE}.d" 35 fi 36 37 # sed expression which extracts system calls that are 38 # defined via asm/unistd.h. It converts them from: 39 # #define __NR_read foo 40 # to: 41 # #ifdef __NR_read 42 # { "read", __NR_read }, 43 # #endif 44 SED_MULTILINE='s/#define __(ARM_)?(NR_)([[:lower:]0-9_]*) (.*)$/#ifdef __\1\2\3\ 45 { "\1\3", __\1\2\3 },\ 46 #endif/g p;' 47 48 cat <<-EOF > "${OUTFILE}" 49 /* GENERATED BY MAKEFILE */ 50 #include <stddef.h> 51 #include <asm/unistd.h> 52 #include "libsyscalls.h" 53 const struct syscall_entry syscall_table[] = { 54 $(${BUILD} | sed -Ene "${SED_MULTILINE}") 55 { NULL, -1 }, 56 }; 57 EOF 58