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.
This commit is contained in:
parent
b39f2df25c
commit
3f04b04c3f
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user