128 lines
2.3 KiB
Bash
128 lines
2.3 KiB
Bash
#!/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
|