summaryrefslogtreecommitdiffstats
path: root/sys/kern/makesyscalls.sh
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>2008-03-27 01:53:44 +0000
committerjb <jb@FreeBSD.org>2008-03-27 01:53:44 +0000
commit4a6deb0614681f857e32876f4b9089f458e429dc (patch)
treee71ab303c15e040ffb66055b4bd50044de47a64e /sys/kern/makesyscalls.sh
parent34d0dd01d65acb419530f155a19c96290c8cfcef (diff)
downloadFreeBSD-src-4a6deb0614681f857e32876f4b9089f458e429dc.zip
FreeBSD-src-4a6deb0614681f857e32876f4b9089f458e429dc.tar.gz
Generate another function for the DTrace syscall provider to specify
the syscall argument types. This code is only compiled into the systrace kernel modul and has no effect otherwise.
Diffstat (limited to 'sys/kern/makesyscalls.sh')
-rw-r--r--sys/kern/makesyscalls.sh16
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh
index e8722ab..74737f2 100644
--- a/sys/kern/makesyscalls.sh
+++ b/sys/kern/makesyscalls.sh
@@ -34,10 +34,11 @@ sysent="sysent.switch.$$"
sysinc="sysinc.switch.$$"
sysarg="sysarg.switch.$$"
sysprotoend="sysprotoend.$$"
+systracetmp="systrace.$$"
-trap "rm $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $sysent $sysinc $sysarg $sysprotoend" 0
+trap "rm $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp" 0
-touch $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $sysent $sysinc $sysarg $sysprotoend
+touch $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp
case $# in
0) echo "usage: $0 input-file <config-file>" 1>&2
@@ -82,6 +83,7 @@ s/\$//g
syshdr = \"$syshdr\"
sysmk = \"$sysmk\"
systrace = \"$systrace\"
+ systracetmp = \"$systracetmp\"
compat = \"$compat\"
compat4 = \"$compat4\"
compat6 = \"$compat6\"
@@ -160,6 +162,9 @@ s/\$//g
printf "\tint64_t *iarg = (int64_t *) uarg;\n" > systrace
printf "\tswitch (sysnum) {\n" > systrace
+ printf "static void\nsystrace_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systracetmp
+ printf "\tswitch (sysnum) {\n" > systracetmp
+
next
}
NF == 0 || $1 ~ /^;/ {
@@ -317,9 +322,12 @@ s/\$//g
|| $3 == "NOIMPL" || $3 == "NOSTD" {
parseline()
printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace
+ printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp
if (argc > 0) {
+ printf("\t\tswitch(ndx) {\n") > systracetmp
printf("\t\tstruct %s *p = params;\n", argalias) > systrace
for (i = 1; i <= argc; i++) {
+ printf("\t\tcase %d:\n\t\t\tp = \"%s\";\n\t\t\tbreak;\n", i - 1, argtype[i]) > systracetmp
if (index(argtype[i], "*") > 0 || argtype[i] == "caddr_t")
printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \
i - 1, \
@@ -333,8 +341,10 @@ s/\$//g
i - 1, \
argname[i], argtype[i]) > systrace
}
+ printf("\t\tdefault:\n\t\t\tbreak;\n\t\t};\n") > systracetmp
}
printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace
+ printf("\t\tbreak;\n") > systracetmp
if ((!nosys || funcname != "nosys") && \
(funcname != "lkmnosys") && (funcname != "lkmressys")) {
if (argc != 0 && $3 != "NOARGS" && $3 != "NOPROTO") {
@@ -529,6 +539,7 @@ s/\$//g
printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
> syshdr
printf "\tdefault:\n\t\t*n_args = 0;\n\t\tbreak;\n\t};\n}\n" > systrace
+ printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systracetmp
} '
cat $sysinc $sysent >> $syssw
@@ -537,4 +548,5 @@ cat $sysarg $sysdcl \
$syscompat4 $syscompat4dcl \
$syscompat6 $syscompat6dcl \
$sysaue $sysprotoend > $sysproto
+cat $systracetmp >> $systrace
OpenPOWER on IntegriCloud