summaryrefslogtreecommitdiffstats
path: root/sys/kern/makesyscalls.sh
diff options
context:
space:
mode:
authorjb <jb@FreeBSD.org>2006-08-03 05:29:09 +0000
committerjb <jb@FreeBSD.org>2006-08-03 05:29:09 +0000
commit3f04b04c3f15fa429944b822a0ec86c7633df024 (patch)
tree22f06ddb14c49d578457450f03ae40b7ae6696c6 /sys/kern/makesyscalls.sh
parentb39f2df25c0e93ad11f2d1373a0b5c7765d5db69 (diff)
downloadFreeBSD-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.sh45
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
OpenPOWER on IntegriCloud