diff options
author | jb <jb@FreeBSD.org> | 2006-08-03 05:29:09 +0000 |
---|---|---|
committer | jb <jb@FreeBSD.org> | 2006-08-03 05:29:09 +0000 |
commit | 3f04b04c3f15fa429944b822a0ec86c7633df024 (patch) | |
tree | 22f06ddb14c49d578457450f03ae40b7ae6696c6 /sys/kern/makesyscalls.sh | |
parent | b39f2df25c0e93ad11f2d1373a0b5c7765d5db69 (diff) | |
download | FreeBSD-src-3f04b04c3f15fa429944b822a0ec86c7633df024.zip FreeBSD-src-3f04b04c3f15fa429944b822a0ec86c7633df024.tar.gz |
Generate another file called systrace_args.c. This will be compiled
into systrace and is used to map the syscall arguments into the 64-bit
parameter array.
Diffstat (limited to 'sys/kern/makesyscalls.sh')
-rw-r--r-- | sys/kern/makesyscalls.sh | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh index 634e631..709dde0 100644 --- a/sys/kern/makesyscalls.sh +++ b/sys/kern/makesyscalls.sh @@ -18,6 +18,7 @@ syssw="init_sysent.c" syscallprefix="SYS_" switchname="sysent" namesname="syscallnames" +systrace="systrace_args.c" # tmp files: sysdcl="sysent.dcl.$$" @@ -73,6 +74,7 @@ s/\$//g sysnames = \"$sysnames\" syshdr = \"$syshdr\" sysmk = \"$sysmk\" + systrace = \"$systrace\" compat = \"$compat\" compat4 = \"$compat4\" syscallprefix = \"$syscallprefix\" @@ -102,6 +104,10 @@ s/\$//g printf "# FreeBSD system call names.\n" > sysmk printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk printf "# $%s$\n", "FreeBSD" > sysmk + + printf "/*\n * System call argument to DTrace register array converstion.\n *\n" > systrace + printf " * DO NOT EDIT-- this file is automatically generated.\n" > systrace + printf " * $%s$\n", "FreeBSD" > systrace } NR == 1 { gsub("[$]FreeBSD: ", "", $0) @@ -138,6 +144,11 @@ s/\$//g printf "# created from%s\nMIASM = ", $0 > sysmk + printf " * This file is part of the DTrace syscall provider.\n */\n\n" > systrace + printf "static void\nsystrace_args(int sysnum, void *params, u_int64_t *uarg, int *n_args)\n{\n" > systrace + printf "\tint64_t *iarg = (int64_t *) uarg;\n" > systrace + printf "\tswitch (sysnum) {\n" > systrace + next } NF == 0 || $1 ~ /^;/ { @@ -289,6 +300,25 @@ s/\$//g $3 == "STD" || $3 == "NODEF" || $3 == "NOARGS" || $3 == "NOPROTO" \ || $3 == "NOIMPL" || $3 == "NOSTD" { parseline() + printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace + if (argc > 0) { + printf("\t\tstruct %s *p = params;\n", argalias) > systrace + for (i = 1; i <= argc; i++) { + if (index(argtype[i], "*") > 0 || argtype[i] == "caddr_t") + printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \ + i - 1, \ + argname[i], argtype[i]) > systrace + else if (substr(argtype[i], 1, 1) == "u" || argtype[i] == "size_t") + printf("\t\tuarg[%d] = p->%s; /* %s */\n", \ + i - 1, \ + argname[i], argtype[i]) > systrace + else + printf("\t\tiarg[%d] = p->%s; /* %s */\n", \ + i - 1, \ + argname[i], argtype[i]) > systrace + } + } + printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace if ((!nosys || funcname != "nosys") && \ (funcname != "lkmnosys") && (funcname != "lkmressys")) { if (argc != 0 && $3 != "NOARGS" && $3 != "NOPROTO") { @@ -321,13 +351,13 @@ s/\$//g printf("\t{ %s, (sy_call_t *)", argssize) > sysent column = 8 + 2 + length(argssize) + 15 if ($3 == "NOIMPL") { - printf("%s },", "nosys, AUE_NULL") > sysent + printf("%s },", "nosys, AUE_NULL, NULL, 0, 0") > sysent column = column + length("nosys") + 3 } else if ($3 == "NOSTD") { - printf("%s },", "lkmressys, AUE_NULL") > sysent + printf("%s },", "lkmressys, AUE_NULL, NULL, 0, 0") > sysent column = column + length("lkmressys") + 3 } else { - printf("%s, %s },", funcname, auditev) > sysent + printf("%s, %s, NULL, 0, 0 },", funcname, auditev) > sysent column = column + length(funcname) + length(auditev) + 3 } align_sysent_comment(column) @@ -372,7 +402,7 @@ s/\$//g argalias) > sysarg printf("%s\t%s%s(struct thread *, struct %s *);\n", rettype, prefix, funcname, argalias) > outdcl - printf("\t{ %s(%s,%s), %s },", + printf("\t{ %s(%s,%s), %s, NULL, 0, 0 },", wrap, argssize, funcname, auditev) > sysent align_sysent_comment(8 + 9 + \ length(argssize) + 1 + length(funcname) + length(auditev) + 4) @@ -388,7 +418,7 @@ s/\$//g ncompat++ parseline() printf("%s\to%s();\n", rettype, funcname) > syscompatdcl - printf("\t{ compat(%s,%s), %s },", + printf("\t{ compat(%s,%s), %s, NULL, 0, 0 },", argssize, funcname, auditev) > sysent align_sysent_comment(8 + 9 + \ length(argssize) + 1 + length(funcname) + length(auditev) + 4) @@ -402,7 +432,7 @@ s/\$//g next } $3 == "OBSOL" { - printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL },") > sysent + printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 },") > sysent align_sysent_comment(34) printf("/* %d = obsolete %s */\n", syscall, comment) > sysent printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", @@ -413,7 +443,7 @@ s/\$//g next } $3 == "UNIMPL" { - printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL },\t\t\t/* %d = %s */\n", + printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0 },\t\t\t/* %d = %s */\n", syscall, comment) > sysent printf("\t\"#%d\",\t\t\t/* %d = %s */\n", syscall, syscall, comment) > sysnames @@ -461,6 +491,7 @@ s/\$//g printf("};\n") > sysnames 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 } ' cat $sysinc $sysent >> $syssw |