home *** CD-ROM | disk | FTP | other *** search
/ IRIS Development Option 6.2 / IRIS_Development_Option_6.2_814-0478-001.iso / dist / dev.idb / usr / bin / check_for_syscalls.z / check_for_syscalls
Text File  |  1996-03-14  |  2KB  |  128 lines

  1. #!/sbin/sh
  2. #ident    "$Revision: 1.2 $"
  3.  
  4. PROG=`basename $0`
  5. USAGE="Usage: $PROG [-syscalls SYSCALL_FILE] file"
  6. SYSCALL_FILE=""
  7. TMPDIR=${TMPDIR:-/var/tmp}
  8. CHECKFILE=$TMPDIR/check.$$
  9. DISFILE=$TMPDIR/dis.$$
  10.  
  11. case `uname -m` in
  12.     SNI)    MIN_DISFILE_LEN=4;
  13.         DISARG=-F
  14.         DISFILE_PIC_ARG="8p";
  15.         DISFILE_HALF_ARG="11p";;
  16.  
  17.     *)    MIN_DISFILE_LEN=0;
  18.         DISARG=-p
  19.         DISFILE_PIC_ARG="2p";
  20.         DISFILE_HALF_ARG="5p";;
  21. esac
  22.  
  23. trap "rm -f $CHECKFILE $DISFILE; exit 1" 1 2 13 15
  24.  
  25. while [ $# -gt 1 ]
  26. do
  27.     case "$1" in
  28.     -syscalls)    shift;
  29.         if [ $# -gt 1 ]
  30.         then
  31.             SYSCALL_FILE=$1; shift
  32.         else
  33.             echo $USAGE >&2;
  34.             exit 1;
  35.         fi;;
  36.     *)    echo $USAGE >&2;
  37.         exit 1;;
  38.     esac
  39. done
  40.  
  41.  
  42. if [ $# -ne 1 ]
  43. then
  44.     echo $USAGE >&2
  45.     exit 1
  46. fi
  47.  
  48. if [ ! -f $1 ]
  49. then
  50.     echo "$PROG: cannot access file $1" >&2
  51.     exit 1
  52. fi
  53.  
  54. if [ "$SYSCALL_FILE" = """" ]
  55. then
  56.     SYSCALL_FILE=/usr/lib/abi/data/syscall.names
  57.     CHECKER_ABIDIR=${CHECKER_ABIDIR:-/usr/lib/abi/data}
  58. fi
  59.  
  60. rm -f $CHECKFILE
  61.  
  62. dis $DISARG _syscall $1 > $DISFILE 2> /dev/null
  63. if [ `wc -l $DISFILE | awk '{ print $1 }'` -ne $MIN_DISFILE_LEN ]
  64. then
  65.     SYSCALL_START_PIC=`sed -n $DISFILE_PIC_ARG $DISFILE | awk '{ print $3 }' | sed -e "s/://p"`
  66.     SYSCALL_START_HALF=`sed -n $DISFILE_HALF_ARG $DISFILE | awk '{ print $3 }' | sed -e "s/://p"`
  67. else
  68.     SYSCALL_START_PIC="xyzzy"
  69.     SYSCALL_START_HALF="xyzzy"
  70. fi
  71.  
  72. dis -d $1 | awk " \
  73. BEGIN {foundjal = 0 } \
  74. { \
  75.     if (foundjal == 1) { \
  76.         if (( \$1 == \"li\") && (substr (\$2, 1, 2) == \"a0\")) { \
  77.             printf \"%s\n\", substr (\$2, 4) \
  78.         } else { \
  79.             printf \"%s\n\", substr (lasta0, 4) \
  80.         } \
  81.     } \
  82. } \
  83. { \
  84.     if (\$1 == \"syscall\") { \
  85.         printf \"%s\n\", substr (prev, 4) \
  86.     } else { \
  87.         prev = \$2 \
  88.     } \
  89. } \
  90. { \
  91.     if ((\$1 == \"jal\") && ((\$2 == \"$SYSCALL_START_PIC\") || (\$2 == \"$SYSCALL_START_HALF\"))) { \
  92.         foundjal = 1 \
  93.     } else { \
  94.         foundjal = 0 \
  95.     } \
  96. } \
  97. { \
  98.     if ((\$1 == \"li\") && (substr (\$2, 1, 2) == \"a0\")) { \
  99.         lasta0 = \$2 \
  100.     } \
  101. }" |
  102. while read SYSCALL
  103. do
  104.     ENTRY=`awk " \
  105.             NF > 2 { \
  106.                 if ((substr (\\\$0, 1, 7) == \"#define\") && \
  107.                     (\\\$3 == $SYSCALL)) { \
  108.                     print \\\$2 \
  109.                 } \
  110.             }" $SYSCALL_FILE | sed -e "s/.*SYS_//p"`
  111.     if [ "$ENTRY" != """" ]
  112.     then
  113.         echo $ENTRY >> $CHECKFILE
  114.     else
  115.         if [ $SYSCALL -ne 0 ]
  116.         then
  117.             echo $SYSCALL >> $CHECKFILE
  118.         fi
  119.     fi
  120. done
  121.  
  122. if [ -f $CHECKFILE ]
  123. then
  124.     sort -u $CHECKFILE
  125. fi
  126.  
  127. rm -f $CHECKFILE $DISFILE
  128.