#!/bin/sh

#----------------------------------------------------------------------------
# usage: __bt_syscall_name2id syscall_func_name,...
#        If a user specifies 'ALL' as syscall_func_name, then all system call
#        would be returned.
#----------------------------------------------------------------------------

source `dirname $0`/__bt_common_env

NR_syscalls=`grep NR_syscalls $UNISTD_H | awk '{print $3}'`

result=""
if [ "$1" = "ALL" ]; then
	i=0
	while [ $i -lt $NR_syscalls ]; do
		result=`echo $result $i`
		i=`expr $i + 1`
	done
	echo $result | sed 's/ /,/g'
	exit 0
fi

LEN=`expr $NR_syscalls \* 4`
START=0x`grep sys_call_table $SYSMAP | awk '{print $1}'`
START=`printf "%d" $START`
STOP=`expr $START + $LEN`

ADDRS=`$OBJDUMP -s --start-address=$START --stop-address=$STOP $VMLINUX \
	| grep ' c' | sed 's/  .*//' | awk '{print $2,$3,$4,$5}' \
	| sed ':a; $!N; $!b a; s/\n/ /g' \
	| sed 's/\(..\)\(..\)\(..\)\(..\)\($\| \)/\4\3\2\1 /g'`

if [ $# -ne 1 ]; then
	echo "Usage: `basename $0` syscall_func_name,..."
	exit 1
else
	for name in `echo $1 | sed 's/,/ /g'`; do
		addr=`grep "\<$name\>" $SYSMAP | awk '{print $1}'`
		pos=`expr "$ADDRS" : ".*$addr"`
		if [ "$addr" = "" ] || [ $pos -eq 0 ]; then
			echo "'$name' is not syscall function name."
			exit 1
		fi
		i=`expr $pos / 9`
		result=`echo $result $i`
	done
	echo $result | sed 's/ /,/g'
fi

