mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-18 10:35:55 +00:00
f479b2ac89
The base system libc is only used to run binaries built on FreeBSD 7.0 and later. It does not need to include system call wrappers for system calls only used by FreeBSD binaries built on versions older than 7.0. This was already true for "COMPAT" system calls, but now wrappers for system calls used on FreeBSD 4 and 6 are excluded as well. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D5597
664 lines
19 KiB
Bash
664 lines
19 KiB
Bash
#! /bin/sh -
|
|
# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
|
|
# $FreeBSD$
|
|
|
|
set -e
|
|
|
|
# name of compat options:
|
|
compat=COMPAT_43
|
|
compat4=COMPAT_FREEBSD4
|
|
compat6=COMPAT_FREEBSD6
|
|
compat7=COMPAT_FREEBSD7
|
|
|
|
# output files:
|
|
sysnames="syscalls.c"
|
|
sysproto="../sys/sysproto.h"
|
|
sysproto_h=_SYS_SYSPROTO_H_
|
|
syshdr="../sys/syscall.h"
|
|
sysmk="../sys/syscall.mk"
|
|
syssw="init_sysent.c"
|
|
syscallprefix="SYS_"
|
|
switchname="sysent"
|
|
namesname="syscallnames"
|
|
systrace="systrace_args.c"
|
|
|
|
# tmp files:
|
|
sysaue="sysent.aue.$$"
|
|
sysdcl="sysent.dcl.$$"
|
|
syscompat="sysent.compat.$$"
|
|
syscompatdcl="sysent.compatdcl.$$"
|
|
syscompat4="sysent.compat4.$$"
|
|
syscompat4dcl="sysent.compat4dcl.$$"
|
|
syscompat6="sysent.compat6.$$"
|
|
syscompat6dcl="sysent.compat6dcl.$$"
|
|
syscompat7="sysent.compat7.$$"
|
|
syscompat7dcl="sysent.compat7dcl.$$"
|
|
sysent="sysent.switch.$$"
|
|
sysinc="sysinc.switch.$$"
|
|
sysarg="sysarg.switch.$$"
|
|
sysprotoend="sysprotoend.$$"
|
|
systracetmp="systrace.$$"
|
|
systraceret="systraceret.$$"
|
|
|
|
if [ -r capabilities.conf ]; then
|
|
capenabled=`cat capabilities.conf | grep -v "^#" | grep -v "^$"`
|
|
capenabled=`echo $capenabled | sed 's/ /,/g'`
|
|
else
|
|
capenabled=""
|
|
fi
|
|
|
|
trap "rm $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp $systraceret" 0
|
|
|
|
touch $sysaue $sysdcl $syscompat $syscompatdcl $syscompat4 $syscompat4dcl $syscompat6 $syscompat6dcl $syscompat7 $syscompat7dcl $sysent $sysinc $sysarg $sysprotoend $systracetmp $systraceret
|
|
|
|
case $# in
|
|
0) echo "usage: $0 input-file <config-file>" 1>&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
if [ -n "$2" ]; then
|
|
. $2
|
|
fi
|
|
|
|
sed -e '
|
|
s/\$//g
|
|
:join
|
|
/\\$/{a\
|
|
|
|
N
|
|
s/\\\n//
|
|
b join
|
|
}
|
|
2,${
|
|
/^#/!s/\([{}()*,]\)/ \1 /g
|
|
}
|
|
' < $1 | awk "
|
|
BEGIN {
|
|
sysaue = \"$sysaue\"
|
|
sysdcl = \"$sysdcl\"
|
|
sysproto = \"$sysproto\"
|
|
sysprotoend = \"$sysprotoend\"
|
|
sysproto_h = \"$sysproto_h\"
|
|
syscompat = \"$syscompat\"
|
|
syscompatdcl = \"$syscompatdcl\"
|
|
syscompat4 = \"$syscompat4\"
|
|
syscompat4dcl = \"$syscompat4dcl\"
|
|
syscompat6 = \"$syscompat6\"
|
|
syscompat6dcl = \"$syscompat6dcl\"
|
|
syscompat7 = \"$syscompat7\"
|
|
syscompat7dcl = \"$syscompat7dcl\"
|
|
sysent = \"$sysent\"
|
|
syssw = \"$syssw\"
|
|
sysinc = \"$sysinc\"
|
|
sysarg = \"$sysarg\"
|
|
sysnames = \"$sysnames\"
|
|
syshdr = \"$syshdr\"
|
|
sysmk = \"$sysmk\"
|
|
systrace = \"$systrace\"
|
|
systracetmp = \"$systracetmp\"
|
|
systraceret = \"$systraceret\"
|
|
compat = \"$compat\"
|
|
compat4 = \"$compat4\"
|
|
compat6 = \"$compat6\"
|
|
compat7 = \"$compat7\"
|
|
syscallprefix = \"$syscallprefix\"
|
|
switchname = \"$switchname\"
|
|
namesname = \"$namesname\"
|
|
infile = \"$1\"
|
|
capenabled_string = \"$capenabled\"
|
|
"'
|
|
|
|
split(capenabled_string, capenabled, ",");
|
|
|
|
printf "/*\n * System call switch table.\n *\n" > syssw
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw
|
|
printf " * $%s$\n", "FreeBSD" > syssw
|
|
|
|
printf "/*\n * System call prototypes.\n *\n" > sysarg
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
|
|
printf " * $%s$\n", "FreeBSD" > sysarg
|
|
|
|
printf "\n#ifdef %s\n\n", compat > syscompat
|
|
printf "\n#ifdef %s\n\n", compat4 > syscompat4
|
|
printf "\n#ifdef %s\n\n", compat6 > syscompat6
|
|
printf "\n#ifdef %s\n\n", compat7 > syscompat7
|
|
|
|
printf "/*\n * System call names.\n *\n" > sysnames
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
|
|
printf " * $%s$\n", "FreeBSD" > sysnames
|
|
|
|
printf "/*\n * System call numbers.\n *\n" > syshdr
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
|
|
printf " * $%s$\n", "FreeBSD" > syshdr
|
|
printf "# FreeBSD system call object files.\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)
|
|
gsub(" [$]", "", $0)
|
|
|
|
printf " * created from%s\n */\n\n", $0 > syssw
|
|
|
|
printf "\n/* The casts are bogus but will do for now. */\n" > sysent
|
|
printf "struct sysent %s[] = {\n",switchname > sysent
|
|
|
|
printf " * created from%s\n */\n\n", $0 > sysarg
|
|
printf "#ifndef %s\n", sysproto_h > sysarg
|
|
printf "#define\t%s\n\n", sysproto_h > sysarg
|
|
printf "#include <sys/signal.h>\n" > sysarg
|
|
printf "#include <sys/acl.h>\n" > sysarg
|
|
printf "#include <sys/cpuset.h>\n" > sysarg
|
|
printf "#include <sys/_ffcounter.h>\n" > sysarg
|
|
printf "#include <sys/_semaphore.h>\n" > sysarg
|
|
printf "#include <sys/ucontext.h>\n" > sysarg
|
|
printf "#include <sys/wait.h>\n\n" > sysarg
|
|
printf "#include <bsm/audit_kevents.h>\n\n" > sysarg
|
|
printf "struct proc;\n\n" > sysarg
|
|
printf "struct thread;\n\n" > sysarg
|
|
printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
|
|
printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg
|
|
printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg
|
|
printf "#define\tPADL_(t)\t0\n" > sysarg
|
|
printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg
|
|
printf "#else\n" > sysarg
|
|
printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg
|
|
printf "#define\tPADR_(t)\t0\n" > sysarg
|
|
printf "#endif\n\n" > sysarg
|
|
|
|
printf " * created from%s\n */\n\n", $0 > sysnames
|
|
printf "const char *%s[] = {\n", namesname > sysnames
|
|
|
|
printf " * created from%s\n */\n\n", $0 > syshdr
|
|
|
|
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, uint64_t *uarg, int *n_args)\n{\n" > systrace
|
|
printf "\tint64_t *iarg = (int64_t *) uarg;\n" > systrace
|
|
printf "\tswitch (sysnum) {\n" > systrace
|
|
|
|
printf "static void\nsystrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systracetmp
|
|
printf "\tswitch (sysnum) {\n" > systracetmp
|
|
|
|
printf "static void\nsystrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)\n{\n\tconst char *p = NULL;\n" > systraceret
|
|
printf "\tswitch (sysnum) {\n" > systraceret
|
|
|
|
next
|
|
}
|
|
NF == 0 || $1 ~ /^;/ {
|
|
next
|
|
}
|
|
$1 ~ /^#[ ]*include/ {
|
|
print > sysinc
|
|
next
|
|
}
|
|
$1 ~ /^#[ ]*if/ {
|
|
print > sysent
|
|
print > sysdcl
|
|
print > sysarg
|
|
print > syscompat
|
|
print > syscompat4
|
|
print > syscompat6
|
|
print > syscompat7
|
|
print > sysnames
|
|
print > systrace
|
|
print > systracetmp
|
|
print > systraceret
|
|
savesyscall = syscall
|
|
next
|
|
}
|
|
$1 ~ /^#[ ]*else/ {
|
|
print > sysent
|
|
print > sysdcl
|
|
print > sysarg
|
|
print > syscompat
|
|
print > syscompat4
|
|
print > syscompat6
|
|
print > syscompat7
|
|
print > sysnames
|
|
print > systrace
|
|
print > systracetmp
|
|
print > systraceret
|
|
syscall = savesyscall
|
|
next
|
|
}
|
|
$1 ~ /^#/ {
|
|
print > sysent
|
|
print > sysdcl
|
|
print > sysarg
|
|
print > syscompat
|
|
print > syscompat4
|
|
print > syscompat6
|
|
print > syscompat7
|
|
print > sysnames
|
|
print > systrace
|
|
print > systracetmp
|
|
print > systraceret
|
|
next
|
|
}
|
|
syscall != $1 {
|
|
printf "%s: line %d: syscall number out of sync at %d\n",
|
|
infile, NR, syscall
|
|
printf "line is:\n"
|
|
print
|
|
exit 1
|
|
}
|
|
# Returns true if the type "name" is the first flag in the type field
|
|
function type(name, flags, n) {
|
|
n = split($3, flags, /\|/)
|
|
return (n > 0 && flags[1] == name)
|
|
}
|
|
# Returns true if the flag "name" is set in the type field
|
|
function flag(name, flags, i, n) {
|
|
n = split($3, flags, /\|/)
|
|
for (i = 1; i <= n; i++)
|
|
if (flags[i] == name)
|
|
return 1
|
|
return 0
|
|
}
|
|
function align_sysent_comment(column) {
|
|
printf("\t") > sysent
|
|
column = column + 8 - column % 8
|
|
while (column < 56) {
|
|
printf("\t") > sysent
|
|
column = column + 8
|
|
}
|
|
}
|
|
function parserr(was, wanted) {
|
|
printf "%s: line %d: unexpected %s (expected %s)\n",
|
|
infile, NR, was, wanted
|
|
exit 1
|
|
}
|
|
function parseline() {
|
|
f=4 # toss number, type, audit event
|
|
argc= 0;
|
|
argssize = "0"
|
|
thr_flag = "SY_THR_STATIC"
|
|
if (flag("NOTSTATIC")) {
|
|
thr_flag = "SY_THR_ABSENT"
|
|
}
|
|
if ($NF != "}") {
|
|
funcalias=$(NF-2)
|
|
argalias=$(NF-1)
|
|
rettype=$NF
|
|
end=NF-3
|
|
} else {
|
|
funcalias=""
|
|
argalias=""
|
|
rettype="int"
|
|
end=NF
|
|
}
|
|
if (flag("NODEF")) {
|
|
auditev="AUE_NULL"
|
|
funcname=$4
|
|
argssize = "AS(" $6 ")"
|
|
return
|
|
}
|
|
if ($f != "{")
|
|
parserr($f, "{")
|
|
f++
|
|
if ($end != "}")
|
|
parserr($end, "}")
|
|
end--
|
|
if ($end != ";")
|
|
parserr($end, ";")
|
|
end--
|
|
if ($end != ")")
|
|
parserr($end, ")")
|
|
end--
|
|
|
|
syscallret=$f
|
|
f++
|
|
|
|
funcname=$f
|
|
|
|
#
|
|
# We now know the func name, so define a flags field for it.
|
|
# Do this before any other processing as we may return early
|
|
# from it.
|
|
#
|
|
for (cap in capenabled) {
|
|
if (funcname == capenabled[cap]) {
|
|
flags = "SYF_CAPENABLED";
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (funcalias == "")
|
|
funcalias = funcname
|
|
if (argalias == "") {
|
|
argalias = funcname "_args"
|
|
if (flag("COMPAT"))
|
|
argalias = "o" argalias
|
|
if (flag("COMPAT4"))
|
|
argalias = "freebsd4_" argalias
|
|
if (flag("COMPAT6"))
|
|
argalias = "freebsd6_" argalias
|
|
if (flag("COMPAT7"))
|
|
argalias = "freebsd7_" argalias
|
|
}
|
|
f++
|
|
|
|
if ($f != "(")
|
|
parserr($f, ")")
|
|
f++
|
|
|
|
if (f == end) {
|
|
if ($f != "void")
|
|
parserr($f, "argument definition")
|
|
return
|
|
}
|
|
|
|
while (f <= end) {
|
|
argc++
|
|
argtype[argc]=""
|
|
oldf=""
|
|
while (f < end && $(f+1) != ",") {
|
|
if (argtype[argc] != "" && oldf != "*")
|
|
argtype[argc] = argtype[argc]" ";
|
|
argtype[argc] = argtype[argc]$f;
|
|
oldf = $f;
|
|
f++
|
|
}
|
|
if (argtype[argc] == "")
|
|
parserr($f, "argument definition")
|
|
argname[argc]=$f;
|
|
f += 2; # skip name, and any comma
|
|
}
|
|
if (argc != 0)
|
|
argssize = "AS(" argalias ")"
|
|
}
|
|
{ comment = $4
|
|
if (NF < 7)
|
|
for (i = 5; i <= NF; i++)
|
|
comment = comment " " $i
|
|
}
|
|
|
|
#
|
|
# The AUE_ audit event identifier.
|
|
#
|
|
{
|
|
auditev = $2;
|
|
}
|
|
|
|
#
|
|
# The flags, if any.
|
|
#
|
|
{
|
|
flags = "0";
|
|
}
|
|
|
|
type("STD") || type("NODEF") || type("NOARGS") || type("NOPROTO") \
|
|
|| type("NOSTD") {
|
|
parseline()
|
|
printf("\t/* %s */\n\tcase %d: {\n", funcname, syscall) > systrace
|
|
printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systracetmp
|
|
printf("\t/* %s */\n\tcase %d:\n", funcname, syscall) > systraceret
|
|
if (argc > 0) {
|
|
printf("\t\tswitch(ndx) {\n") > systracetmp
|
|
printf("\t\tstruct %s *p = params;\n", argalias) > systrace
|
|
for (i = 1; i <= argc; i++) {
|
|
arg = argtype[i]
|
|
sub("__restrict$", "", arg)
|
|
printf("\t\tcase %d:\n\t\t\tp = \"%s\";\n\t\t\tbreak;\n", i - 1, arg) > systracetmp
|
|
if (index(arg, "*") > 0 || arg == "caddr_t")
|
|
printf("\t\tuarg[%d] = (intptr_t) p->%s; /* %s */\n", \
|
|
i - 1, \
|
|
argname[i], arg) > systrace
|
|
else if (arg == "union l_semun")
|
|
printf("\t\tuarg[%d] = p->%s.buf; /* %s */\n", \
|
|
i - 1, \
|
|
argname[i], arg) > systrace
|
|
else if (substr(arg, 1, 1) == "u" || arg == "size_t")
|
|
printf("\t\tuarg[%d] = p->%s; /* %s */\n", \
|
|
i - 1, \
|
|
argname[i], arg) > systrace
|
|
else
|
|
printf("\t\tiarg[%d] = p->%s; /* %s */\n", \
|
|
i - 1, \
|
|
argname[i], arg) > systrace
|
|
}
|
|
printf("\t\tdefault:\n\t\t\tbreak;\n\t\t};\n") > systracetmp
|
|
|
|
printf("\t\tif (ndx == 0 || ndx == 1)\n") > systraceret
|
|
printf("\t\t\tp = \"%s\";\n", syscallret) > systraceret
|
|
printf("\t\tbreak;\n") > systraceret
|
|
}
|
|
printf("\t\t*n_args = %d;\n\t\tbreak;\n\t}\n", argc) > systrace
|
|
printf("\t\tbreak;\n") > systracetmp
|
|
if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
|
|
!flag("NODEF")) {
|
|
printf("struct %s {\n", argalias) > sysarg
|
|
for (i = 1; i <= argc; i++)
|
|
printf("\tchar %s_l_[PADL_(%s)]; " \
|
|
"%s %s; char %s_r_[PADR_(%s)];\n",
|
|
argname[i], argtype[i],
|
|
argtype[i], argname[i],
|
|
argname[i], argtype[i]) > sysarg
|
|
printf("};\n") > sysarg
|
|
}
|
|
else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
|
|
printf("struct %s {\n\tregister_t dummy;\n};\n",
|
|
argalias) > sysarg
|
|
if (!flag("NOPROTO") && !flag("NODEF")) {
|
|
if (funcname == "nosys" || funcname == "lkmnosys" ||
|
|
funcname == "sysarch" || funcname ~ /^freebsd/ ||
|
|
funcname ~ /^linux/ || funcname ~ /^svr4/ ||
|
|
funcname ~ /^ibcs2/ || funcname ~ /^xenix/ ||
|
|
funcname ~ /^cloudabi/) {
|
|
printf("%s\t%s(struct thread *, struct %s *)",
|
|
rettype, funcname, argalias) > sysdcl
|
|
} else {
|
|
printf("%s\tsys_%s(struct thread *, struct %s *)",
|
|
rettype, funcname, argalias) > sysdcl
|
|
}
|
|
printf(";\n") > sysdcl
|
|
printf("#define\t%sAUE_%s\t%s\n", syscallprefix,
|
|
funcalias, auditev) > sysaue
|
|
}
|
|
printf("\t{ %s, (sy_call_t *)", argssize) > sysent
|
|
column = 8 + 2 + length(argssize) + 15
|
|
if (flag("NOSTD")) {
|
|
printf("lkmressys, AUE_NULL, NULL, 0, 0, %s, SY_THR_ABSENT },", flags) > sysent
|
|
column = column + length("lkmressys") + length("AUE_NULL") + 3
|
|
} else {
|
|
if (funcname == "nosys" || funcname == "sysarch" ||
|
|
funcname == "lkmnosys" || funcname ~ /^freebsd/ ||
|
|
funcname ~ /^linux/ || funcname ~ /^svr4/ ||
|
|
funcname ~ /^ibcs2/ || funcname ~ /^xenix/ ||
|
|
funcname ~ /^cloudabi/) {
|
|
printf("%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
|
|
column = column + length(funcname) + length(auditev) + length(flags) + 3
|
|
} else {
|
|
printf("sys_%s, %s, NULL, 0, 0, %s, %s },", funcname, auditev, flags, thr_flag) > sysent
|
|
column = column + length(funcname) + length(auditev) + length(flags) + 3 + 4
|
|
}
|
|
}
|
|
align_sysent_comment(column)
|
|
printf("/* %d = %s */\n", syscall, funcalias) > sysent
|
|
printf("\t\"%s\",\t\t\t/* %d = %s */\n",
|
|
funcalias, syscall, funcalias) > sysnames
|
|
if (!flag("NODEF")) {
|
|
printf("#define\t%s%s\t%d\n", syscallprefix,
|
|
funcalias, syscall) > syshdr
|
|
printf(" \\\n\t%s.o", funcalias) > sysmk
|
|
}
|
|
syscall++
|
|
next
|
|
}
|
|
type("COMPAT") || type("COMPAT4") || type("COMPAT6") || \
|
|
type("COMPAT7") {
|
|
if (flag("COMPAT")) {
|
|
ncompat++
|
|
out = syscompat
|
|
outdcl = syscompatdcl
|
|
wrap = "compat"
|
|
prefix = "o"
|
|
descr = "old"
|
|
} else if (flag("COMPAT4")) {
|
|
ncompat4++
|
|
out = syscompat4
|
|
outdcl = syscompat4dcl
|
|
wrap = "compat4"
|
|
prefix = "freebsd4_"
|
|
descr = "freebsd4"
|
|
} else if (flag("COMPAT6")) {
|
|
ncompat6++
|
|
out = syscompat6
|
|
outdcl = syscompat6dcl
|
|
wrap = "compat6"
|
|
prefix = "freebsd6_"
|
|
descr = "freebsd6"
|
|
} else if (flag("COMPAT7")) {
|
|
ncompat7++
|
|
out = syscompat7
|
|
outdcl = syscompat7dcl
|
|
wrap = "compat7"
|
|
prefix = "freebsd7_"
|
|
descr = "freebsd7"
|
|
}
|
|
parseline()
|
|
if (argc != 0 && !flag("NOARGS") && !flag("NOPROTO") && \
|
|
!flag("NODEF")) {
|
|
printf("struct %s {\n", argalias) > out
|
|
for (i = 1; i <= argc; i++)
|
|
printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \
|
|
"char %s_r_[PADR_(%s)];\n",
|
|
argname[i], argtype[i],
|
|
argtype[i], argname[i],
|
|
argname[i], argtype[i]) > out
|
|
printf("};\n") > out
|
|
}
|
|
else if (!flag("NOARGS") && !flag("NOPROTO") && !flag("NODEF"))
|
|
printf("struct %s {\n\tregister_t dummy;\n};\n",
|
|
argalias) > sysarg
|
|
if (!flag("NOPROTO") && !flag("NODEF")) {
|
|
printf("%s\t%s%s(struct thread *, struct %s *);\n",
|
|
rettype, prefix, funcname, argalias) > outdcl
|
|
printf("#define\t%sAUE_%s%s\t%s\n", syscallprefix,
|
|
prefix, funcname, auditev) > sysaue
|
|
}
|
|
if (flag("NOSTD")) {
|
|
printf("\t{ %s, (sy_call_t *)%s, %s, NULL, 0, 0, 0, SY_THR_ABSENT },",
|
|
"0", "lkmressys", "AUE_NULL") > sysent
|
|
align_sysent_comment(8 + 2 + length("0") + 15 + \
|
|
length("lkmressys") + length("AUE_NULL") + 3)
|
|
} else {
|
|
printf("\t{ %s(%s,%s), %s, NULL, 0, 0, %s, %s },",
|
|
wrap, argssize, funcname, auditev, flags, thr_flag) > sysent
|
|
align_sysent_comment(8 + 9 + length(argssize) + 1 + \
|
|
length(funcname) + length(auditev) + \
|
|
length(flags) + 4)
|
|
}
|
|
printf("/* %d = %s %s */\n", syscall, descr, funcalias) > sysent
|
|
printf("\t\"%s.%s\",\t\t/* %d = %s %s */\n",
|
|
wrap, funcalias, syscall, descr, funcalias) > sysnames
|
|
if (flag("COMPAT") || flag("COMPAT4") || flag("COMPAT6")) {
|
|
printf("\t\t\t\t/* %d is %s %s */\n",
|
|
syscall, descr, funcalias) > syshdr
|
|
} else if (!flag("NODEF")) {
|
|
printf("#define\t%s%s%s\t%d\n", syscallprefix,
|
|
prefix, funcalias, syscall) > syshdr
|
|
printf(" \\\n\t%s%s.o", prefix, funcalias) > sysmk
|
|
}
|
|
syscall++
|
|
next
|
|
}
|
|
type("OBSOL") {
|
|
printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },") > sysent
|
|
align_sysent_comment(34)
|
|
printf("/* %d = obsolete %s */\n", syscall, comment) > sysent
|
|
printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n",
|
|
$4, syscall, comment) > sysnames
|
|
printf("\t\t\t\t/* %d is obsolete %s */\n",
|
|
syscall, comment) > syshdr
|
|
syscall++
|
|
next
|
|
}
|
|
type("UNIMPL") {
|
|
printf("\t{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT },\t\t\t/* %d = %s */\n",
|
|
syscall, comment) > sysent
|
|
printf("\t\"#%d\",\t\t\t/* %d = %s */\n",
|
|
syscall, syscall, comment) > sysnames
|
|
syscall++
|
|
next
|
|
}
|
|
{
|
|
printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $3
|
|
exit 1
|
|
}
|
|
END {
|
|
printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc
|
|
|
|
if (ncompat != 0 || ncompat4 != 0 || ncompat6 != 0 || ncompat7 != 0)
|
|
printf "#include \"opt_compat.h\"\n\n" > syssw
|
|
|
|
if (ncompat != 0) {
|
|
printf "\n#ifdef %s\n", compat > sysinc
|
|
printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc
|
|
printf "#else\n" > sysinc
|
|
printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc
|
|
printf "#endif\n" > sysinc
|
|
}
|
|
|
|
if (ncompat4 != 0) {
|
|
printf "\n#ifdef %s\n", compat4 > sysinc
|
|
printf "#define compat4(n, name) n, (sy_call_t *)__CONCAT(freebsd4_,name)\n" > sysinc
|
|
printf "#else\n" > sysinc
|
|
printf "#define compat4(n, name) 0, (sy_call_t *)nosys\n" > sysinc
|
|
printf "#endif\n" > sysinc
|
|
}
|
|
|
|
if (ncompat6 != 0) {
|
|
printf "\n#ifdef %s\n", compat6 > sysinc
|
|
printf "#define compat6(n, name) n, (sy_call_t *)__CONCAT(freebsd6_,name)\n" > sysinc
|
|
printf "#else\n" > sysinc
|
|
printf "#define compat6(n, name) 0, (sy_call_t *)nosys\n" > sysinc
|
|
printf "#endif\n" > sysinc
|
|
}
|
|
|
|
if (ncompat7 != 0) {
|
|
printf "\n#ifdef %s\n", compat7 > sysinc
|
|
printf "#define compat7(n, name) n, (sy_call_t *)__CONCAT(freebsd7_,name)\n" > sysinc
|
|
printf "#else\n" > sysinc
|
|
printf "#define compat7(n, name) 0, (sy_call_t *)nosys\n" > sysinc
|
|
printf "#endif\n" > sysinc
|
|
}
|
|
|
|
printf("\n#endif /* %s */\n\n", compat) > syscompatdcl
|
|
printf("\n#endif /* %s */\n\n", compat4) > syscompat4dcl
|
|
printf("\n#endif /* %s */\n\n", compat6) > syscompat6dcl
|
|
printf("\n#endif /* %s */\n\n", compat7) > syscompat7dcl
|
|
|
|
printf("\n#undef PAD_\n") > sysprotoend
|
|
printf("#undef PADL_\n") > sysprotoend
|
|
printf("#undef PADR_\n") > sysprotoend
|
|
printf("\n#endif /* !%s */\n", sysproto_h) > sysprotoend
|
|
|
|
printf("\n") > sysmk
|
|
printf("};\n") > sysent
|
|
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
|
|
printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systracetmp
|
|
printf "\tdefault:\n\t\tbreak;\n\t};\n\tif (p != NULL)\n\t\tstrlcpy(desc, p, descsz);\n}\n" > systraceret
|
|
} '
|
|
|
|
cat $sysinc $sysent >> $syssw
|
|
cat $sysarg $sysdcl \
|
|
$syscompat $syscompatdcl \
|
|
$syscompat4 $syscompat4dcl \
|
|
$syscompat6 $syscompat6dcl \
|
|
$syscompat7 $syscompat7dcl \
|
|
$sysaue $sysprotoend > $sysproto
|
|
cat $systracetmp >> $systrace
|
|
cat $systraceret >> $systrace
|
|
|