#!/sbin/sh
#ident	"$Revision: 1.3 $"

PROG=`basename $0`
USAGE="Usage: $PROG [-syscalls SYSCALL_FILE] file"
SYSCALL_FILE=""
TMPDIR=${TMPDIR:-/var/tmp}
CHECKFILE=$TMPDIR/check.$$
DISFILE=$TMPDIR/dis.$$

case `uname -m` in
	SNI)	MIN_DISFILE_LEN=4;
		DISARG=-F
		DISFILE_PIC_ARG="8p";
		DISFILE_HALF_ARG="11p";;

	*)	MIN_DISFILE_LEN=0;
		DISARG=-p
		DISFILE_PIC_ARG="2p";
		DISFILE_HALF_ARG="5p";;
esac

trap "rm -f $CHECKFILE $DISFILE; exit 1" 1 2 13 15

while [ $# -gt 1 ]
do
	case "$1" in
	-syscalls)	shift;
		if [ $# -gt 1 ]
		then
			SYSCALL_FILE=$1; shift
		else
			echo $USAGE >&2;
			exit 1;
		fi;;
	*)	echo $USAGE >&2;
		exit 1;;
	esac
done


if [ $# -ne 1 ]
then
	echo $USAGE >&2
	exit 1
fi

if [ ! -f $1 ]
then
	echo "$PROG: cannot access file $1" >&2
	exit 1
fi

if [ "$SYSCALL_FILE" = """" ]
then
	SYSCALL_FILE=/usr/lib/abi/data/syscall.names
	CHECKER_ABIDIR=${CHECKER_ABIDIR:-/usr/lib/abi/data}
fi

rm -f $CHECKFILE

dis $DISARG _syscall $1 > $DISFILE 2> /dev/null
if [ `wc -l $DISFILE | awk '{ print $1 }'` -ne $MIN_DISFILE_LEN ]
then
	SYSCALL_START_PIC=`sed -n $DISFILE_PIC_ARG $DISFILE | awk '{ print $3 }' | sed -e "s/://p"`
	SYSCALL_START_HALF=`sed -n $DISFILE_HALF_ARG $DISFILE | awk '{ print $3 }' | sed -e "s/://p"`
else
	SYSCALL_START_PIC="xyzzy"
	SYSCALL_START_HALF="xyzzy"
fi

dis -i $1 | awk " \
BEGIN {foundjal = 0 } \
{ \
	if (foundjal == 1) { \
		if (( \$1 == \"li\") && (substr (\$2, 1, 2) == \"a0\")) { \
			printf \"%s\n\", substr (\$2, 4) \
		} else { \
			printf \"%s\n\", substr (lasta0, 4) \
		} \
	} \
} \
{ \
	if (\$1 == \"syscall\") { \
		printf \"%s\n\", substr (prev, 4) \
	} else { \
		prev = \$2 \
	} \
} \
{ \
	if ((\$1 == \"jal\") && ((\$2 == \"$SYSCALL_START_PIC\") || (\$2 == \"$SYSCALL_START_HALF\"))) { \
		foundjal = 1 \
	} else { \
		foundjal = 0 \
	} \
} \
{ \
	if ((\$1 == \"li\") && (substr (\$2, 1, 2) == \"a0\")) { \
		lasta0 = \$2 \
	} \
}" |
while read SYSCALL
do
	ENTRY=`awk " \
			NF > 2 { \
				if ((substr (\\\$0, 1, 7) == \"#define\") && \
					(\\\$3 == $SYSCALL)) { \
					print \\\$2 \
				} \
			}" $SYSCALL_FILE | sed -e "s/.*SYS_//p"`
	if [ "$ENTRY" != """" ]
	then
		echo $ENTRY >> $CHECKFILE
	else
		if [ $SYSCALL -ne 0 ]
		then
			echo $SYSCALL >> $CHECKFILE
		fi
	fi
done

if [ -f $CHECKFILE ]
then
	sort -u $CHECKFILE
fi

rm -f $CHECKFILE $DISFILE
