makesyscalls.sh revision 89984
11541Srgrimes#! /bin/sh - 21541Srgrimes# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 350477Speter# $FreeBSD: head/sys/kern/makesyscalls.sh 89984 2002-01-30 15:12:12Z bde $ 41541Srgrimes 51541Srgrimesset -e 61541Srgrimes 71541Srgrimes# name of compat option: 81541Srgrimescompat=COMPAT_43 91541Srgrimes 101541Srgrimes# output files: 111541Srgrimessysnames="syscalls.c" 1210905Sbdesysproto="../sys/sysproto.h" 1310905Sbdesysproto_h=_SYS_SYSPROTO_H_ 141541Srgrimessyshdr="../sys/syscall.h" 1534354Sjbsysmk="../sys/syscall.mk" 161541Srgrimessyssw="init_sysent.c" 1711294Sswallacesyscallprefix="SYS_" 1811294Sswallaceswitchname="sysent" 1911294Sswallacenamesname="syscallnames" 201541Srgrimes 211541Srgrimes# tmp files: 2231627Sjmgsysdcl="sysent.dcl.$$" 2331627Sjmgsyscompat="sysent.compat.$$" 2431627Sjmgsyscompatdcl="sysent.compatdcl.$$" 2531627Sjmgsysent="sysent.switch.$$" 2631627Sjmgsysinc="sysinc.switch.$$" 2731627Sjmgsysarg="sysarg.switch.$$" 281541Srgrimes 2911294Sswallacetrap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0 301541Srgrimes 3124373Spetertouch $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg 3224373Speter 331541Srgrimescase $# in 3411294Sswallace 0) echo "Usage: $0 input-file <config-file>" 1>&2 351541Srgrimes exit 1 361541Srgrimes ;; 371541Srgrimesesac 381541Srgrimes 3936735Sdfrif [ -n "$2" -a -f "$2" ]; then 4011294Sswallace . $2 4111294Sswallacefi 4211294Sswallace 4311294Sswallacesed -e ' 4411294Sswallaces/\$//g 4511294Sswallace:join 4611294Sswallace /\\$/{a\ 4711294Sswallace 4811294Sswallace N 4911294Sswallace s/\\\n// 5011294Sswallace b join 5111294Sswallace } 5211294Sswallace2,${ 5311294Sswallace /^#/!s/\([{}()*,]\)/ \1 /g 5411294Sswallace} 5511294Sswallace' < $1 | awk " 561541Srgrimes BEGIN { 571541Srgrimes sysdcl = \"$sysdcl\" 5810905Sbde sysproto = \"$sysproto\" 5910905Sbde sysproto_h = \"$sysproto_h\" 601541Srgrimes syscompat = \"$syscompat\" 6111294Sswallace syscompatdcl = \"$syscompatdcl\" 621541Srgrimes sysent = \"$sysent\" 6336782Sbde syssw = \"$syssw\" 6411294Sswallace sysinc = \"$sysinc\" 6511294Sswallace sysarg = \"$sysarg\" 661541Srgrimes sysnames = \"$sysnames\" 671541Srgrimes syshdr = \"$syshdr\" 6834354Sjb sysmk = \"$sysmk\" 691541Srgrimes compat = \"$compat\" 7011294Sswallace syscallprefix = \"$syscallprefix\" 7111294Sswallace switchname = \"$switchname\" 7211294Sswallace namesname = \"$namesname\" 731541Srgrimes infile = \"$1\" 741541Srgrimes "' 751541Srgrimes 7636782Sbde printf "/*\n * System call switch table.\n *\n" > syssw 7736782Sbde printf " * DO NOT EDIT-- this file is automatically generated.\n" > syssw 7889977Sbde printf " * $%s$\n", "FreeBSD" > syssw 7910905Sbde 8011294Sswallace printf "/*\n * System call prototypes.\n *\n" > sysarg 8111294Sswallace printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg 8289977Sbde printf " * $%s$\n", "FreeBSD" > sysarg 831541Srgrimes 8431785Seivind printf "\n#ifdef %s\n\n", compat > syscompat 851541Srgrimes 861541Srgrimes printf "/*\n * System call names.\n *\n" > sysnames 871541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames 8889977Sbde printf " * $%s$\n", "FreeBSD" > sysnames 891541Srgrimes 901541Srgrimes printf "/*\n * System call numbers.\n *\n" > syshdr 911541Srgrimes printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr 9289977Sbde printf " * $%s$\n", "FreeBSD" > syshdr 9334354Sjb printf "# FreeBSD system call names.\n" > sysmk 9434354Sjb printf "# DO NOT EDIT-- this file is automatically generated.\n" > sysmk 9589984Sbde printf "# $%s$\n", "FreeBSD" > sysmk 961541Srgrimes } 971541Srgrimes NR == 1 { 9850478Speter gsub("[$]FreeBSD: ", "", $0) 9910906Sbde gsub(" [$]", "", $0) 10011294Sswallace 10136782Sbde printf " * created from%s\n */\n\n", $0 > syssw 10211294Sswallace 10336782Sbde printf "\n/* The casts are bogus but will do for now. */\n" > sysent 10411294Sswallace printf "struct sysent %s[] = {\n",switchname > sysent 10510905Sbde 10611294Sswallace printf " * created from%s\n */\n\n", $0 > sysarg 10733039Sbde printf "#ifndef %s\n", sysproto_h > sysarg 10833039Sbde printf "#define\t%s\n\n", sysproto_h > sysarg 10933039Sbde printf "#include <sys/signal.h>\n\n" > sysarg 11054803Srwatson printf "#include <sys/acl.h>\n\n" > sysarg 11133039Sbde printf "struct proc;\n\n" > sysarg 11283366Sjulian printf "struct thread;\n\n" > sysarg 11336770Sbde printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg 11436770Sbde printf "\t\t0 : sizeof(register_t) - sizeof(t))\n\n" > sysarg 11582149Stmm printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg 11682149Stmm printf "#define\tPADL_(t)\t0\n" > sysarg 11782149Stmm printf "#define\tPADR_(t)\tPAD_(t)\n" > sysarg 11882149Stmm printf "#else\n" > sysarg 11982149Stmm printf "#define\tPADL_(t)\tPAD_(t)\n" > sysarg 12082149Stmm printf "#define\tPADR_(t)\t0\n" > sysarg 12182149Stmm printf "#endif\n\n" > sysarg 1221541Srgrimes 1231541Srgrimes printf " * created from%s\n */\n\n", $0 > sysnames 12411294Sswallace printf "char *%s[] = {\n", namesname > sysnames 1251541Srgrimes 1261541Srgrimes printf " * created from%s\n */\n\n", $0 > syshdr 1272700Swollman 12834354Sjb printf "# created from%s\nMIASM = ", $0 > sysmk 12934354Sjb 1301541Srgrimes next 1311541Srgrimes } 1321541Srgrimes NF == 0 || $1 ~ /^;/ { 1331541Srgrimes next 1341541Srgrimes } 13511294Sswallace $1 ~ /^#[ ]*include/ { 13611294Sswallace print > sysinc 13711294Sswallace next 13811294Sswallace } 1391541Srgrimes $1 ~ /^#[ ]*if/ { 1401541Srgrimes print > sysent 1411541Srgrimes print > sysdcl 14211294Sswallace print > sysarg 1431541Srgrimes print > syscompat 1441541Srgrimes print > sysnames 1451541Srgrimes savesyscall = syscall 1461541Srgrimes next 1471541Srgrimes } 1481541Srgrimes $1 ~ /^#[ ]*else/ { 1491541Srgrimes print > sysent 1501541Srgrimes print > sysdcl 15111294Sswallace print > sysarg 1521541Srgrimes print > syscompat 1531541Srgrimes print > sysnames 1541541Srgrimes syscall = savesyscall 1551541Srgrimes next 1561541Srgrimes } 1571541Srgrimes $1 ~ /^#/ { 1581541Srgrimes print > sysent 1591541Srgrimes print > sysdcl 16011294Sswallace print > sysarg 1611541Srgrimes print > syscompat 1621541Srgrimes print > sysnames 1631541Srgrimes next 1641541Srgrimes } 1651541Srgrimes syscall != $1 { 16636770Sbde printf "%s: line %d: syscall number out of sync at %d\n", 16736770Sbde infile, NR, syscall 1681541Srgrimes printf "line is:\n" 1691541Srgrimes print 1701541Srgrimes exit 1 1711541Srgrimes } 17260287Sbde function align_sysent_comment(column) { 17360287Sbde printf("\t") > sysent 17460287Sbde column = column + 8 - column % 8 17560287Sbde while (column < 56) { 17660287Sbde printf("\t") > sysent 17760287Sbde column = column + 8 17860287Sbde } 17960287Sbde } 18011294Sswallace function parserr(was, wanted) { 18136770Sbde printf "%s: line %d: unexpected %s (expected %s)\n", 18211294Sswallace infile, NR, was, wanted 18311294Sswallace exit 1 18411294Sswallace } 18511294Sswallace function parseline() { 18611294Sswallace f=4 # toss number and type 18711294Sswallace argc= 0; 18860287Sbde argssize = "0" 18911294Sswallace if ($NF != "}") { 19011294Sswallace funcalias=$(NF-2) 19111294Sswallace argalias=$(NF-1) 19211294Sswallace rettype=$NF 19311294Sswallace end=NF-3 19411294Sswallace } else { 19511294Sswallace funcalias="" 19611294Sswallace argalias="" 19711294Sswallace rettype="int" 19811294Sswallace end=NF 19910905Sbde } 20011294Sswallace if ($2 == "NODEF") { 20111294Sswallace funcname=$4 20284600Smarcel argssize = "AS(" $6 ")" 20311294Sswallace return 20411294Sswallace } 20511294Sswallace if ($f != "{") 20611294Sswallace parserr($f, "{") 20711294Sswallace f++ 20811294Sswallace if ($end != "}") 20911294Sswallace parserr($end, "}") 21011294Sswallace end-- 21111294Sswallace if ($end != ";") 21211294Sswallace parserr($end, ";") 21311294Sswallace end-- 21411294Sswallace if ($end != ")") 21511294Sswallace parserr($end, ")") 21611294Sswallace end-- 21711294Sswallace 21811294Sswallace f++ #function return type 21911294Sswallace 22011294Sswallace funcname=$f 22111294Sswallace if (funcalias == "") 22211294Sswallace funcalias = funcname 22311294Sswallace if (argalias == "") { 22411294Sswallace argalias = funcname "_args" 22511330Sswallace if ($2 == "COMPAT") 22611330Sswallace argalias = "o" argalias 22711294Sswallace } 22811294Sswallace f++ 22911294Sswallace 23011294Sswallace if ($f != "(") 23111294Sswallace parserr($f, ")") 23211294Sswallace f++ 23311294Sswallace 23411294Sswallace if (f == end) { 23511294Sswallace if ($f != "void") 23611294Sswallace parserr($f, "argument definition") 23711294Sswallace return 23811294Sswallace } 23911294Sswallace 24011294Sswallace while (f <= end) { 24111294Sswallace argc++ 24211294Sswallace argtype[argc]="" 24311294Sswallace oldf="" 24411294Sswallace while (f < end && $(f+1) != ",") { 24511294Sswallace if (argtype[argc] != "" && oldf != "*") 24611294Sswallace argtype[argc] = argtype[argc]" "; 24711294Sswallace argtype[argc] = argtype[argc]$f; 24811294Sswallace oldf = $f; 24911294Sswallace f++ 25011294Sswallace } 25111294Sswallace if (argtype[argc] == "") 25211294Sswallace parserr($f, "argument definition") 25311294Sswallace argname[argc]=$f; 25411294Sswallace f += 2; # skip name, and any comma 25511294Sswallace } 25660287Sbde if (argc != 0) 25760287Sbde argssize = "AS(" argalias ")" 2581541Srgrimes } 25911294Sswallace { comment = $4 26011294Sswallace if (NF < 7) 26111294Sswallace for (i = 5; i <= NF; i++) 26211294Sswallace comment = comment " " $i 26311294Sswallace } 26482585Sdillon 26582585Sdillon # The 'M' type prefix 26682585Sdillon # 26782585Sdillon { 26882585Sdillon mpsafe = "SYF_MPSAFE | "; 26982585Sdillon if ($2 == "MSTD") { 27082585Sdillon $2 = "STD"; 27182585Sdillon } else if ($2 == "MNODEF") { 27282585Sdillon $2 = "NODEF"; 27382585Sdillon } else if ($2 == "MNOARGS") { 27482585Sdillon $2 = "NOARGS"; 27582585Sdillon } else if ($2 == "MNOPROTO") { 27682585Sdillon $2 = "NOPROTO"; 27782585Sdillon } else if ($2 == "MNOIMPL") { 27882585Sdillon $2 = "NOIMPL"; 27982585Sdillon } else if ($2 == "MNOSTD") { 28082585Sdillon $2 = "NOSTD"; 28182585Sdillon } else if ($2 == "MCOMPAT") { 28282585Sdillon $2 = "COMPAT"; 28382585Sdillon } else if ($2 == "MCPT_NOA") { 28482585Sdillon $2 = "CPT_NOA"; 28582585Sdillon } else if ($2 == "MLIBCOMPAT") { 28682585Sdillon $2 = "LIBCOMPAT"; 28782585Sdillon } else if ($2 == "MOBSOL") { 28882585Sdillon $2 = "OBSOL"; 28982585Sdillon } else if ($2 == "MUNIMPL") { 29082585Sdillon $2 = "UNIMPL"; 29182585Sdillon } else { 29282585Sdillon mpsafe = ""; 29382585Sdillon } 29458963Salfred } 29530740Sphk $2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "NOPROTO" \ 29669445Salfred || $2 == "NOIMPL" || $2 == "NOSTD" { 29711294Sswallace parseline() 29811330Sswallace if ((!nosys || funcname != "nosys") && \ 29969448Salfred (funcname != "lkmnosys") && (funcname != "lkmressys")) { 30011294Sswallace if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") { 30183046Sobrien printf("struct %s {\n", argalias) > sysarg 30211294Sswallace for (i = 1; i <= argc; i++) 30382149Stmm printf("\tchar %s_l_[PADL_(%s)]; " \ 30482149Stmm "%s %s; char %s_r_[PADR_(%s)];\n", 30582149Stmm argname[i], argtype[i], 30636735Sdfr argtype[i], argname[i], 30736735Sdfr argname[i], argtype[i]) > sysarg 30811294Sswallace printf("};\n") > sysarg 30911294Sswallace } 31084600Smarcel else if ($2 != "NOARGS" && $2 != "NOPROTO" && \ 31184600Smarcel $2 != "NODEF") 31283046Sobrien printf("struct %s {\n\tregister_t dummy;\n};\n", 31336770Sbde argalias) > sysarg 31410905Sbde } 31584600Smarcel if (($2 != "NOPROTO" && $2 != "NODEF" && \ 31684600Smarcel (funcname != "nosys" || !nosys)) || \ 31784600Smarcel (funcname == "lkmnosys" && !lkmnosys) || \ 31884600Smarcel funcname == "lkmressys") { 31983366Sjulian printf("%s\t%s __P((struct thread *, struct %s *))", 32018277Sbde rettype, funcname, argalias) > sysdcl 32118277Sbde printf(";\n") > sysdcl 32211330Sswallace } 32311294Sswallace if (funcname == "nosys") 3242671Sats nosys = 1 32511294Sswallace if (funcname == "lkmnosys") 3264216Sats lkmnosys = 1 32760287Sbde printf("\t{ %s%s, (sy_call_t *)", mpsafe, argssize) > sysent 32860287Sbde column = 8 + 2 + length(mpsafe) + length(argssize) + 15 32969445Salfred if ($2 == "NOIMPL") { 33069445Salfred printf("%s },", "nosys") > sysent 33169445Salfred column = column + length("nosys") + 3 33269445Salfred } else if ($2 == "NOSTD") { 33369448Salfred printf("%s },", "lkmressys") > sysent 33484600Smarcel column = column + length("lkmressys") + 3 33569445Salfred } else { 33660287Sbde printf("%s },", funcname) > sysent 33760287Sbde column = column + length(funcname) + 3 33869445Salfred } 33960287Sbde align_sysent_comment(column) 34058963Salfred printf("/* %d = %s */\n", syscall, funcalias) > sysent 34136770Sbde printf("\t\"%s\",\t\t\t/* %d = %s */\n", 34211294Sswallace funcalias, syscall, funcalias) > sysnames 34334354Sjb if ($2 != "NODEF") { 34436770Sbde printf("#define\t%s%s\t%d\n", syscallprefix, 34511294Sswallace funcalias, syscall) > syshdr 34634354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 34734354Sjb } 3481541Srgrimes syscall++ 3491541Srgrimes next 3501541Srgrimes } 35111330Sswallace $2 == "COMPAT" || $2 == "CPT_NOA" { 35236782Sbde ncompat++ 35311294Sswallace parseline() 35411330Sswallace if (argc != 0 && $2 != "CPT_NOA") { 35583046Sobrien printf("struct %s {\n", argalias) > syscompat 35611294Sswallace for (i = 1; i <= argc; i++) 35782149Stmm printf("\tchar %s_l_[PADL_(%s)]; %s %s; " \ 35882149Stmm "char %s_r_[PADR_(%s)];\n", 35982149Stmm argname[i], argtype[i], 36036735Sdfr argtype[i], argname[i], 36136735Sdfr argname[i], argtype[i]) > syscompat 36211294Sswallace printf("};\n") > syscompat 36311294Sswallace } 36411330Sswallace else if($2 != "CPT_NOA") 36583046Sobrien printf("struct %s {\n\tregister_t dummy;\n};\n", 36636770Sbde argalias) > sysarg 36783366Sjulian printf("%s\to%s __P((struct thread *, struct %s *));\n", 36811294Sswallace rettype, funcname, argalias) > syscompatdcl 36960287Sbde printf("\t{ compat(%s%s,%s) },", 37060287Sbde mpsafe, argssize, funcname) > sysent 37160287Sbde align_sysent_comment(8 + 9 + length(mpsafe) + \ 37260287Sbde length(argssize) + 1 + length(funcname) + 4) 37360287Sbde printf("/* %d = old %s */\n", syscall, funcalias) > sysent 37436770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 37511294Sswallace funcalias, syscall, funcalias) > sysnames 37636770Sbde printf("\t\t\t\t/* %d is old %s */\n", 37711294Sswallace syscall, funcalias) > syshdr 3781541Srgrimes syscall++ 3791541Srgrimes next 3801541Srgrimes } 3811541Srgrimes $2 == "LIBCOMPAT" { 38236782Sbde ncompat++ 38311294Sswallace parseline() 38411294Sswallace printf("%s\to%s();\n", rettype, funcname) > syscompatdcl 38560287Sbde printf("\t{ compat(%s%s,%s) },", 38660287Sbde mpsafe, argssize, funcname) > sysent 38760287Sbde align_sysent_comment(8 + 9 + length(mpsafe) + \ 38860287Sbde length(argssize) + 1 + length(funcname) + 4) 38960287Sbde printf("/* %d = old %s */\n", syscall, funcalias) > sysent 39036770Sbde printf("\t\"old.%s\",\t\t/* %d = old %s */\n", 39111294Sswallace funcalias, syscall, funcalias) > sysnames 39236770Sbde printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", 39311294Sswallace syscallprefix, funcalias, syscall) > syshdr 39434354Sjb printf(" \\\n\t%s.o", funcalias) > sysmk 3951541Srgrimes syscall++ 3961541Srgrimes next 3971541Srgrimes } 3981541Srgrimes $2 == "OBSOL" { 39960287Sbde printf("\t{ 0, (sy_call_t *)nosys },") > sysent 40060287Sbde align_sysent_comment(34) 40160287Sbde printf("/* %d = obsolete %s */\n", syscall, comment) > sysent 40236770Sbde printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", 40311294Sswallace $4, syscall, comment) > sysnames 40436770Sbde printf("\t\t\t\t/* %d is obsolete %s */\n", 4051541Srgrimes syscall, comment) > syshdr 4061541Srgrimes syscall++ 4071541Srgrimes next 4081541Srgrimes } 4091541Srgrimes $2 == "UNIMPL" { 41036770Sbde printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", 4111541Srgrimes syscall, comment) > sysent 41236770Sbde printf("\t\"#%d\",\t\t\t/* %d = %s */\n", 4131541Srgrimes syscall, syscall, comment) > sysnames 4141541Srgrimes syscall++ 4151541Srgrimes next 4161541Srgrimes } 4171541Srgrimes { 4181541Srgrimes printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 4191541Srgrimes exit 1 4201541Srgrimes } 4211541Srgrimes END { 42260287Sbde printf "\n#define AS(name) (sizeof(struct name) / sizeof(register_t))\n" > sysinc 42336782Sbde if (ncompat != 0) { 42436782Sbde printf "#include \"opt_compat.h\"\n\n" > syssw 42536782Sbde printf "\n#ifdef %s\n", compat > sysinc 42636782Sbde printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysinc 42736782Sbde printf "#else\n" > sysinc 42836782Sbde printf "#define compat(n, name) 0, (sy_call_t *)nosys\n" > sysinc 42936782Sbde printf "#endif\n" > sysinc 43036782Sbde } 43136782Sbde 43236735Sdfr printf("\n#endif /* %s */\n\n", compat) > syscompatdcl 43336735Sdfr printf("#undef PAD_\n") > syscompatdcl 43482149Stmm printf("#undef PADL_\n") > syscompatdcl 43582149Stmm printf("#undef PADR_\n") > syscompatdcl 43611294Sswallace printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl 4371541Srgrimes 43837227Sphk printf("\n") > sysmk 43914331Speter printf("};\n") > sysent 4401541Srgrimes printf("};\n") > sysnames 44111294Sswallace printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \ 44236770Sbde > syshdr 4431541Srgrimes } ' 4441541Srgrimes 44536782Sbdecat $sysinc $sysent >> $syssw 44611294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto 447