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 13set -e 14 15if [ $# -ne 1 ] && [ $# -ne 2 ]; then 16 echo "Usage: $(basename "$0") OUTFILE" 17 echo "Usage: $(basename "$0") INFILE OUTFILE" 18 exit 1 19fi 20 21BUILD="${CC} -dD ${SRC:-.}/gen_syscalls.c -E" 22GEN_DEPS=1 23 24if [ $# -eq 2 ]; then 25 BUILD="cat $1" 26 GEN_DEPS=0 27 shift 28fi 29OUTFILE="$1" 30 31if [ ${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" 35fi 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 44SED_MULTILINE='s/#define __(ARM_)?(NR_)([[:lower:]0-9_]*) (.*)$/#ifdef __\1\2\3\ 45{ "\1\3", __\1\2\3 },\ 46#endif/g p;' 47 48cat <<-EOF > "${OUTFILE}" 49/* GENERATED BY MAKEFILE */ 50#include <stddef.h> 51#include "gen_syscalls-inl.h" 52#include "libsyscalls.h" 53const struct syscall_entry syscall_table[] = { 54$(${BUILD} | sed -Ene "${SED_MULTILINE}") 55 { NULL, -1 }, 56}; 57 58const size_t syscall_table_size = 59 sizeof(syscall_table) / sizeof(syscall_table[0]); 60EOF 61