af8adb5b79
CloudABI is a pure capability-based runtime environment for UNIX. It works similar to Capsicum, except that processes already run in capabilities mode on startup. All functionality that conflicts with this model has been omitted, making it a compact binary interface that can be supported by other operating systems without too much effort. CloudABI is 'secure by default'; the idea is that it should be safe to run arbitrary third-party binaries without requiring any explicit hardware virtualization (Bhyve) or namespace virtualization (Jails). The rights of an application are purely determined by the set of file descriptors that you grant it on startup. The datatypes and constants used by CloudABI's C library (cloudlibc) are defined in separate files called syscalldefs_mi.h (pointer size independent) and syscalldefs_md.h (pointer size dependent). We import these files in sys/contrib/cloudabi and wrap around them in cloudabi*_syscalldefs.h. We then add stubs for all of the system calls in sys/compat/cloudabi or sys/compat/cloudabi64, depending on whether the system call depends on the pointer size. We only have nine system calls that depend on the pointer size. If we ever want to support 32-bit binaries, we can simply add sys/compat/cloudabi32 and implement these nine system calls again. The next step is to send in code reviews for the individual system call implementations, but also add a sysentvec, to allow CloudABI executabled to be started through execve(). More information about CloudABI: - GitHub: https://github.com/NuxiNL/cloudlibc - Talk at BSDCan: https://www.youtube.com/watch?v=SVdF84x1EdA Differential Revision: https://reviews.freebsd.org/D2848 Reviewed by: emaste, brooks Obtained from: https://github.com/NuxiNL/freebsd
660 lines
19 KiB
Bash
660 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 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)
|
|
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 (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")) {
|
|
printf("\t\t\t\t/* %d is old %s */\n",
|
|
syscall, 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
|
|
|