aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/make-syscalls.sh
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/make-syscalls.sh')
-rw-r--r--sysdeps/unix/make-syscalls.sh133
1 files changed, 72 insertions, 61 deletions
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
index 503ad78787..628522b2c6 100644
--- a/sysdeps/unix/make-syscalls.sh
+++ b/sysdeps/unix/make-syscalls.sh
@@ -8,23 +8,24 @@
# Syscall Signature Key Letters for BP Thunks:
#
# a: unchecked address (e.g., 1st arg to mmap)
-# b: non-NULL buffer (e.g., 2nd arg to read)
+# b: non-NULL buffer (e.g., 2nd arg to read; return value from mmap)
# B: optionally-NULL buffer (e.g., 4th arg to getsockopt)
# f: buffer of 2 ints (e.g., 4th arg to socketpair)
+# F: 3rd arg to fcntl
# i: scalar (any signedness & size: int, long, long long, enum, whatever)
+# I: 3rd arg to ioctl
# n: scalar buffer length (e.g., 3rd arg to read)
# N: pointer to value/return scalar buffer length (e.g., 6th arg to recvfrom)
-# p: pointer to typed object (e.g., any non-void* arg)
-# P: pointer return value (e.g., return value from mmap)
-# s: string (e.g., 1st arg to open)
+# p: non-NULL pointer to typed object (e.g., any non-void* arg)
+# P: optionally-NULL pointer to typed object (e.g., 2nd argument to gettimeofday)
+# s: non-NULL string (e.g., 1st arg to open)
+# S: optionally-NULL string (e.g., 1st arg to acct)
# v: vararg scalar (e.g., optional 3rd arg to open)
-# V: vararg pointer (e.g., 3rd arg to fcntl & ioctl)
+# W: wait status, optionally-NULL pointer to int (e.g., 2nd arg of wait4)
-ptrlet='[abBfNpPs]'
-argdig='[1-9]'
-fixarg='[^vV]'$argdig # fixed args (declare extern)
-ptrarg=$ptrlet$argdig # pointer arg (toss bounds)
-intarg='[inv]'$argdig # scalar arg
+ptr='[abBfFINpPsSW]' # all pointer keyletters
+int='[inv]' # all scalar keyletters
+typ='[ifnNpP]' # typed-arg keyletters: we capture type for use in thunk
##############################################################################
@@ -185,7 +186,7 @@ shared-only-routines += $file
case x"$callnum",$srcfile,$args in
x-,-,* | x*,*.[sS],*V*) ;;
- x*,-,*$ptrlet* | x*,*.[sS],*$ptrlet*)
+ x*,-,*$ptr* | x*,*.[sS],*$ptr*)
nv_weak=`for name in $weak; do
case $name in
@@ -200,16 +201,16 @@ shared-only-routines += $file
# convert signature string to individual numbered arg names
# e.g., i:ipbN -> i0 i1 p2 b3 N4
set `echo $args |
- sed -e 's/^\(.\):\(.*\)/\2 \10/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \11/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \12/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \13/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \14/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \15/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \16/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \17/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \18/' \
- -e 's/^\([^ ]\)\(.*\)/\2 \19/'`
+ sed -e 's/^\(.\):\(.*\)/\2 <\10>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\11>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\12>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\13>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\14>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\15>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\16>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\17>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\18>/' \
+ -e 's/^\([^ ]\)\(.*\)/\2 <\19>/'`
rtn=$1; shift
args=$*
arglist=`echo $* |sed 's/ /, /g'`
@@ -222,43 +223,53 @@ shared-only-routines += $file
echo "bp-thunks += $file"
echo "\$(objpfx)\$(bppfx)$file.ob: \$(common-objpfx)s-proto.d"
- # generate macro head & thunk prologue
- echo "\
- (echo '#define $callname($arglist) r0, $rtn; \\'; \\
- echo '`echo $args | \
- sed -e 's/\('$fixarg'\)/extern \1, \1v;/g' \
- -e 's/\(v'$argdig'\)/extern int \1v;/g'` \\'; \\
- echo '__typeof (r0) BP_SYM ($strong) (`echo $args | \
- sed -e 's/ /, /g' \
- -e 's/\('$ptrarg'\)/__typeof (\1v) *__bounded \1a/g' \
- -e 's/\('$intarg'\)/__typeof (\1v) \1a/g'`) { \\'; \\
- echo ' extern __typeof (r0) ($callname) (`echo $args | \
- sed -e 's/ /, /g' \
- -e 's/\('$ptrarg'\)/__typeof (\1v) *__unbounded/g' \
- -e 's/\('$intarg'\)/__typeof (\1v)/g'`); \\'; \\"
-
- # stash length arg for use with mman calls that return pointers
- len=`echo $args |sed -e 's/.*\('n$argdig'\).*/\1/'`
-
- # generate thunk epilogue
- funcall="($callname) (`echo $args | \
- sed -e 's/ /, /g' \
- -e 's/\('a$argdig'\)/__ptrvalue (\1a)/g' \
- -e 's/\('s$argdig'\)/CHECK_STRING (\1a)/g' \
- -e 's/\('p$argdig'\)/CHECK_1 (\1a)/g' \
- -e 's/\('f$argdig'\)/CHECK_N (\1a, 2)/g' \
- -e 's/\('b$argdig'\), \('n$argdig'\)/CHECK_N (\1a, \2), \2/g' \
- -e 's/\('b$argdig'\), \('N$argdig'\)/CHECK_N (\1a, *CHECK_1 (\2a)), __ptrvalue (\2a)/g' \
- -e 's/\('B$argdig'\), \('n$argdig'\)/CHECK_Nopt (\1a, \2), \2/g' \
- -e 's/\('B$argdig'\), \('N$argdig'\)/CHECK_Nopt (\1a, *CHECK_1 (\2a)), __ptrvalue (\2a)/g' \
- -e 's/\('[ivn]$argdig'\)/\1a/g'`)"
-
- case $rtn in
- P*) echo " echo '{ __typeof ($rtn) *__bounded rtn; \\'; \\
- echo ' __ptrlow (rtn) = __ptrvalue (rtn) = $funcall; \\'; \\
- echo ' __ptrhigh (rtn) = __ptrlow (rtn) + ${len}a; return rtn; } \\'; \\" ;;
- *) echo " echo ' return $funcall; \\'; \\" ;;
- esac
+ # generate macro head
+ echo " (echo '#define $callname(`echo $arglist | \
+ sed -e 's/[<>]//g'`) `echo $rtn | \
+ sed -e 's/<\('$typ'0\)>/\1v;/g' \
+ -e 's/<\(b0\)>/x0; extern char \1v;/g'` \\'; \\"
+
+ # generate extern decls of dummy variables for each arg
+ echo " echo '`echo $args | \
+ sed -e 's/<\('$typ'[1-9]\)>/extern \1, \1v;/g' \
+ -e 's/<\([abBFIsS][1-9]\)>/extern char \1v;/g' \
+ -e 's/<\([Wv][1-9]\)>/extern int \1v;/g'` \\'; \\"
+
+ # generate bounded-pointer thunk declarator
+ echo " echo '`echo $rtn | \
+ sed -e 's/<\('$ptr'0\)>/__typeof (\1v) *__bounded/g' \
+ -e 's/<\('$int'0\)>/__typeof (\1v)/g'` BP_SYM ($strong) (`echo $arglist | \
+ sed -e 's/<\('$ptr'[1-9]\)>/__typeof (\1v) *__bounded \1a/g' \
+ -e 's/<\('$int'[1-9]\)>/__typeof (\1v) \1a/g'`) { \\'; \\"
+
+ # generate extern primitive syscall declaration
+ echo " echo ' extern `echo $rtn | \
+ sed -e 's/<\('$ptr'0\)>/__typeof (\1v) *__unbounded/g' \
+ -e 's/<\('$int'0\)>/__typeof (\1v)/g'` ($callname) (`echo $arglist | \
+ sed -e 's/<\('$ptr'[1-9]\)>/__typeof (\1v) *__unbounded/g' \
+ -e 's/<\('$int'[1-9]\)>/__typeof (\1v)/g'`); \\'; \\"
+
+ # generate call the primtive system call, optionally wrapping bounds
+ # around the result if the signature's return keyletter is `b'.
+ echo " echo ' return `echo $rtn |
+ sed -e 's/<b0>/BOUNDED_N (/' \
+ -e 's/<.0>//'`($callname) (`echo $arglist | \
+ sed -e 's/<\(a[1-9]\)>/__ptrvalue (\1a)/g' \
+ -e 's/<\(b[1-9]\)>, <\(n[1-9]\)>/CHECK_N (\1a, \2a), \2a/g' \
+ -e 's/<\(b[1-9]\)>, <\(N[1-9]\)>/CHECK_N (\1a, *CHECK_1 (\2a)), __ptrvalue (\2a)/g' \
+ -e 's/<\(B[1-9]\)>, <\(n[1-9]\)>/CHECK_Nopt (\1a, \2a), \2a/g' \
+ -e 's/<\(B[1-9]\)>, <\(N[1-9]\)>/CHECK_Nopt (\1a, *CHECK_1 (\2a)), __ptrvalue (\2a)/g' \
+ -e 's/<\(f[1-9]\)>/CHECK_N (\1a, 2)/g' \
+ -e 's/<\(i[1-9]\)>, <\(F[1-9]\)>/\1a, CHECK_FCNTL (\2a, \1a)/g' \
+ -e 's/<\(i[1-9]\)>, <\(I[1-9]\)>/\1a, CHECK_IOCTL (\2a, \1a)/g' \
+ -e 's/<\(p[1-9]\)>/CHECK_1 (\1a)/g' \
+ -e 's/<\([PW][1-9]\)>/CHECK_1opt (\1a)/g' \
+ -e 's/<\(s[1-9]\)>/CHECK_STRING (\1a)/g' \
+ -e 's/<\(S[1-9]\)>/CHECK_STRINGopt (\1a)/g' \
+ -e 's/<\([ivn][1-9]\)>/\1a/g'`)`echo $rtn $args |
+ sed -e 's/<b0>.*<\(n[1-9]\)>.*/, \1a)/' \
+ -e 's/<.0>.*//'`; \\'; \\"
+
echo " echo '} \\'; \\"
# generate thunk aliases
@@ -272,9 +283,9 @@ shared-only-routines += $file
echo '#include <bp-thunks.h>'; \\
) | \$(COMPILE.c) -x c -o \$@ -"
### Use this for debugging intermediate output:
-### echo ' ) >$(@:.ob=.c)
-### $(subst -c,-E,$(COMPILE.c)) -o $(@:.ob=.ib) $(@:.ob=.c)
-### $(COMPILE.c) -x cpp-output -o $@ $(@:.ob=.ib)'
+### ) >\$(@:.ob=.c)
+### \$(subst -c,-E,\$(COMPILE.c)) -o \$(@:.ob=.ib) \$(@:.ob=.c)
+### \$(COMPILE.c) -x cpp-output -o \$@ \$(@:.ob=.ib)"
echo endif
;;
esac