diff options
author | jb <jb@FreeBSD.org> | 2008-03-27 01:53:44 +0000 |
---|---|---|
committer | jb <jb@FreeBSD.org> | 2008-03-27 01:53:44 +0000 |
commit | 4a6deb0614681f857e32876f4b9089f458e429dc (patch) | |
tree | e71ab303c15e040ffb66055b4bd50044de47a64e /sys/kern/makesyscalls.sh | |
parent | 34d0dd01d65acb419530f155a19c96290c8cfcef (diff) | |
download | FreeBSD-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.sh | 16 |
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 |