X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..c18c124eaa464aaaa5549e99e5a70fc9cbb50944:/bsd/kern/makesyscalls.sh?ds=sidebyside diff --git a/bsd/kern/makesyscalls.sh b/bsd/kern/makesyscalls.sh index a6f88584d..13d56f58a 100755 --- a/bsd/kern/makesyscalls.sh +++ b/bsd/kern/makesyscalls.sh @@ -2,7 +2,7 @@ # @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93 # $FreeBSD: src/sys/kern/makesyscalls.sh,v 1.60 2003/04/01 01:12:24 jeff Exp $ # -# Copyright (c) 2004-2007 Apple Inc. All rights reserved. +# Copyright (c) 2004-2008 Apple Inc. All rights reserved. # # @APPLE_OSREFERENCE_LICENSE_HEADER_START@ # @@ -26,13 +26,23 @@ set -e +input_file="" # first argument + +# output type: +output_syscallnamesfile=0 +output_sysprotofile=0 +output_syshdrfile=0 +output_syscalltablefile=0 +output_auditevfile=0 + # output files: syscallnamesfile="syscalls.c" -sysprotofile="../sys/sysproto.h" +sysprotofile="sysproto.h" sysproto_h=_SYS_SYSPROTO_H_ -syshdrfile="../sys/syscall.h" +syshdrfile="syscall.h" syscall_h=_SYS_SYSCALL_H_ syscalltablefile="init_sysent.c" +auditevfile="audit_kevents.c" syscallprefix="SYS_" switchname="sysent" namesname="syscallnames" @@ -45,21 +55,55 @@ sysarg="sysarg.switch.$$" sysprotoend="sysprotoend.$$" syscallnamestempfile="syscallnamesfile.$$" syshdrtempfile="syshdrtempfile.$$" +audittempfile="audittempfile.$$" -trap "rm $syslegal $sysent $sysinc $sysarg $sysprotoend $syscallnamestempfile $syshdrtempfile" 0 +trap "rm $syslegal $sysent $sysinc $sysarg $sysprotoend $syscallnamestempfile $syshdrtempfile $audittempfile" 0 -touch $syslegal $sysent $sysinc $sysarg $sysprotoend $syscallnamestempfile $syshdrtempfile +touch $syslegal $sysent $sysinc $sysarg $sysprotoend $syscallnamestempfile $syshdrtempfile $audittempfile case $# in - 0) echo "usage: $0 input-file " 1>&2 + 0) + echo "usage: $0 input-file [ []]" 1>&2 exit 1 ;; esac -if [ -n "$2" -a -f "$2" ]; then - . $2 +input_file="$1" +shift + +if [ -n "$1" ]; then + case $1 in + names) + output_syscallnamesfile=1 + ;; + proto) + output_sysprotofile=1 + ;; + header) + output_syshdrfile=1 + ;; + table) + output_syscalltablefile=1 + ;; + audit) + output_auditevfile=1 + ;; + esac + shift; +else + output_syscallnamesfile=1 + output_sysprotofile=1 + output_syshdrfile=1 + output_syscalltablefile=1 + output_auditevfile=1 +fi + +if [ -n "$1" -a -f "$1" ]; then + . $1 fi + + sed -e ' s/\$//g :join @@ -72,7 +116,7 @@ s/\$//g 2,${ /^#/!s/\([{}()*,;]\)/ \1 /g } -' < $1 | awk " +' < "$input_file" | awk " BEGIN { syslegal = \"$syslegal\" sysprotofile = \"$sysprotofile\" @@ -87,14 +131,15 @@ s/\$//g syscallnamestempfile = \"$syscallnamestempfile\" syshdrfile = \"$syshdrfile\" syshdrtempfile = \"$syshdrtempfile\" + audittempfile = \"$audittempfile\" syscallprefix = \"$syscallprefix\" switchname = \"$switchname\" namesname = \"$namesname\" - infile = \"$1\" + infile = \"$input_file\" "' printf "/*\n" > syslegal - printf " * Copyright (c) 2004-2007 Apple Inc. All rights reserved.\n" > syslegal + printf " * Copyright (c) 2004-2008 Apple Inc. All rights reserved.\n" > syslegal printf " * \n" > syslegal printf " * @APPLE_OSREFERENCE_LICENSE_HEADER_START@\n" > syslegal printf " * \n" > syslegal @@ -127,7 +172,7 @@ s/\$//g } NR == 1 { printf "\n/* The casts are bogus but will do for now. */\n" > sysent - printf "__private_extern__ struct sysent %s[] = {\n",switchname > sysent + printf "__private_extern__ const struct sysent %s[] = {\n",switchname > sysent printf "#ifndef %s\n", sysproto_h > sysarg printf "#define\t%s\n\n", sysproto_h > sysarg @@ -145,12 +190,17 @@ s/\$//g printf "#include \n" > sysarg printf "\n#ifdef KERNEL\n" > sysarg printf "#ifdef __APPLE_API_PRIVATE\n" > sysarg - printf "#ifndef __arm__\n" > sysarg + printf "/*\n" > sysarg + printf " * The kernel may support multiple userspace ABIs, and must use\n" > sysarg + printf " * argument structures with elements large enough for any of them.\n" > sysarg + printf "*/\n" > sysarg + printf "\n" > sysarg + printf "#if CONFIG_REQUIRES_U32_MUNGING\n" > sysarg printf "#define\tPAD_(t)\t(sizeof(uint64_t) <= sizeof(t) \\\n " > sysarg printf "\t\t? 0 : sizeof(uint64_t) - sizeof(t))\n" > sysarg printf "#else\n" > sysarg - printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) \\\n" > sysarg - printf " ? 0 : sizeof(register_t) - sizeof(t))\n" > sysarg + printf "#define\tPAD_(t)\t(sizeof(uint32_t) <= sizeof(t) \\\n" > sysarg + printf " ? 0 : sizeof(uint32_t) - sizeof(t))\n" > sysarg printf "#endif\n" > sysarg printf "#if BYTE_ORDER == LITTLE_ENDIAN\n"> sysarg printf "#define\tPADL_(t)\t0\n" > sysarg @@ -160,71 +210,18 @@ s/\$//g printf "#define\tPADR_(t)\t0\n" > sysarg printf "#endif\n" > sysarg printf "\n__BEGIN_DECLS\n" > sysarg - printf "#ifndef __MUNGE_ONCE\n" > sysarg - printf "#define __MUNGE_ONCE\n" > sysarg - printf "#ifndef __arm__\n" > sysarg - printf "void munge_w(const void *, void *); \n" > sysarg - printf "void munge_ww(const void *, void *); \n" > sysarg - printf "void munge_www(const void *, void *); \n" > sysarg - printf "void munge_wwww(const void *, void *); \n" > sysarg - printf "void munge_wwwww(const void *, void *); \n" > sysarg - printf "void munge_wwwwww(const void *, void *); \n" > sysarg - printf "void munge_wwwwwww(const void *, void *); \n" > sysarg - printf "void munge_wwwwwwww(const void *, void *); \n" > sysarg - printf "void munge_wl(const void *, void *); \n" > sysarg - printf "void munge_wlw(const void *, void *); \n" > sysarg - printf "void munge_wwwl(const void *, void *); \n" > sysarg - printf "void munge_wwwlww(const void *, void *); \n" > sysarg - printf "void munge_wwlwww(const void *, void *); \n" > sysarg - printf "void munge_wwwwl(const void *, void *); \n" > sysarg - printf "void munge_wwwwwl(const void *, void *); \n" > sysarg - printf "void munge_wsw(const void *, void *); \n" > sysarg - printf "void munge_wws(const void *, void *); \n" > sysarg - printf "void munge_wwwsw(const void *, void *); \n" > sysarg - printf "#else \n" > sysarg - printf "#define munge_w NULL \n" > sysarg - printf "#define munge_ww NULL \n" > sysarg - printf "#define munge_www NULL \n" > sysarg - printf "#define munge_wwww NULL \n" > sysarg - printf "#define munge_wwwww NULL \n" > sysarg - printf "#define munge_wwwwww NULL \n" > sysarg - printf "#define munge_wwwwwww NULL \n" > sysarg - printf "#define munge_wwwwwwww NULL \n" > sysarg - printf "#define munge_wl NULL \n" > sysarg - printf "#define munge_wlw NULL \n" > sysarg - printf "#define munge_wwwl NULL \n" > sysarg - printf "#define munge_wwwlww NULL\n" > sysarg - printf "#define munge_wwlwww NULL \n" > sysarg - printf "#define munge_wwwwl NULL \n" > sysarg - printf "#define munge_wwwwwl NULL \n" > sysarg - printf "#define munge_wsw NULL \n" > sysarg - printf "#define munge_wws NULL \n" > sysarg - printf "#define munge_wwwsw NULL \n" > sysarg - printf "#endif // ! __arm__\n" > sysarg - printf "#ifdef __ppc__\n" > sysarg - printf "void munge_d(const void *, void *); \n" > sysarg - printf "void munge_dd(const void *, void *); \n" > sysarg - printf "void munge_ddd(const void *, void *); \n" > sysarg - printf "void munge_dddd(const void *, void *); \n" > sysarg - printf "void munge_ddddd(const void *, void *); \n" > sysarg - printf "void munge_dddddd(const void *, void *); \n" > sysarg - printf "void munge_ddddddd(const void *, void *); \n" > sysarg - printf "void munge_dddddddd(const void *, void *); \n" > sysarg - printf "#else \n" > sysarg - printf "#define munge_d NULL \n" > sysarg - printf "#define munge_dd NULL \n" > sysarg - printf "#define munge_ddd NULL \n" > sysarg - printf "#define munge_dddd NULL \n" > sysarg - printf "#define munge_ddddd NULL \n" > sysarg - printf "#define munge_dddddd NULL \n" > sysarg - printf "#define munge_ddddddd NULL \n" > sysarg - printf "#define munge_dddddddd NULL \n" > sysarg - printf "#endif // __ppc__\n" > sysarg - printf "#endif /* !__MUNGE_ONCE */\n" > sysarg + printf "#include \n" > sysarg printf "\n" > sysarg printf "const char *%s[] = {\n", namesname > syscallnamestempfile + + printf "#include \n" > audittempfile + printf "#include \n\n" > audittempfile + printf "#include \n" > audittempfile + printf "#include \n\n" > audittempfile + printf "#if CONFIG_AUDIT\n\n" > audittempfile + printf "au_event_t sys_au_event[] = {\n" > audittempfile next } NF == 0 || $1 ~ /^;/ { @@ -239,6 +236,7 @@ s/\$//g print > sysarg print > syscallnamestempfile print > sysprotoend + print > audittempfile savesyscall = syscall_num skip_for_header = 0 next @@ -248,6 +246,7 @@ s/\$//g print > sysarg print > syscallnamestempfile print > sysprotoend + print > audittempfile syscall_num = savesyscall skip_for_header = 1 next @@ -257,6 +256,7 @@ s/\$//g print > sysarg print > syscallnamestempfile print > sysprotoend + print > audittempfile skip_for_header = 0 next } @@ -282,7 +282,7 @@ s/\$//g function parseline() { funcname = "" - current_field = 3 + current_field = 4 # skip number, audit event, type args_start = 0 args_end = 0 comments_start = 0 @@ -398,56 +398,47 @@ s/\$//g if (argc != 0) argssize = "AC(" argalias ")" } - + + { + auditev = $2; + } + { add_sysent_entry = 1 add_sysnames_entry = 1 add_sysheader_entry = 1 add_sysproto_entry = 1 - add_64bit_unsafe = 0 - add_64bit_fakesafe = 0 - add_resv = "0" - my_flags = "0" - if ($2 != "ALL" && $2 != "UALL") { + if ($3 != "ALL") { files_keyword_OK = 0 add_sysent_entry = 0 add_sysnames_entry = 0 add_sysheader_entry = 0 add_sysproto_entry = 0 - if (match($2, "[T]") != 0) { + if (match($3, "[T]") != 0) { add_sysent_entry = 1 files_keyword_OK = 1 } - if (match($2, "[N]") != 0) { + if (match($3, "[N]") != 0) { add_sysnames_entry = 1 files_keyword_OK = 1 } - if (match($2, "[H]") != 0) { + if (match($3, "[H]") != 0) { add_sysheader_entry = 1 files_keyword_OK = 1 } - if (match($2, "[P]") != 0) { + if (match($3, "[P]") != 0) { add_sysproto_entry = 1 files_keyword_OK = 1 } - if (match($2, "[U]") != 0) { - add_64bit_unsafe = 1 - } - if (match($2, "[F]") != 0) { - add_64bit_fakesafe = 1 - } if (files_keyword_OK == 0) { printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2 exit 1 } } - else if ($2 == "UALL") { - add_64bit_unsafe = 1; - } parseline() @@ -455,7 +446,6 @@ s/\$//g # output function argument structures to sysproto.h and build the # name of the appropriate argument mungers munge32 = "NULL" - munge64 = "NULL" size32 = 0 if ((funcname != "nosys" && funcname != "enosys") || (syscall_num == 0 && funcname == "nosys")) { @@ -464,73 +454,60 @@ s/\$//g printf("struct %s {\n", argalias) > sysarg } munge32 = "munge_" - munge64 = "munge_" for (i = 1; i <= argc; i++) { # Build name of argument munger. # We account for all sys call argument types here. # This is where you add any new types. With LP64 support # each argument consumes 64-bits. - # see .../xnu/bsd/dev/ppc/munge.s for munge argument types. + # see .../xnu/bsd/dev/munge.c for munge argument types. if (argtype[i] == "long") { - if (add_64bit_unsafe == 0) - ext_argtype[i] = "user_long_t"; + ext_argtype[i] = "user_long_t"; munge32 = munge32 "s" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "u_long") { - if (add_64bit_unsafe == 0) - ext_argtype[i] = "user_ulong_t"; + ext_argtype[i] = "user_ulong_t"; munge32 = munge32 "w" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "size_t") { - if (add_64bit_unsafe == 0) - ext_argtype[i] = "user_size_t"; + ext_argtype[i] = "user_size_t"; munge32 = munge32 "w" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "ssize_t") { - if (add_64bit_unsafe == 0) - ext_argtype[i] = "user_ssize_t"; + ext_argtype[i] = "user_ssize_t"; munge32 = munge32 "s" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "user_ssize_t" || argtype[i] == "user_long_t") { munge32 = munge32 "s" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "user_addr_t" || argtype[i] == "user_size_t" || argtype[i] == "user_ulong_t") { munge32 = munge32 "w" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "caddr_t" || argtype[i] == "semun_t" || - match(argtype[i], "[\*]") != 0) { - if (add_64bit_unsafe == 0) - ext_argtype[i] = "user_addr_t"; + argtype[i] == "uuid_t" || match(argtype[i], "[\*]") != 0) { + ext_argtype[i] = "user_addr_t"; munge32 = munge32 "w" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "int" || argtype[i] == "u_int" || argtype[i] == "uid_t" || argtype[i] == "pid_t" || argtype[i] == "id_t" || argtype[i] == "idtype_t" || argtype[i] == "socklen_t" || argtype[i] == "uint32_t" || argtype[i] == "int32_t" || - argtype[i] == "sigset_t" || argtype[i] == "gid_t" || - argtype[i] == "mode_t" || argtype[i] == "key_t" || argtype[i] == "time_t") { + argtype[i] == "sigset_t" || argtype[i] == "gid_t" || argtype[i] == "unsigned int" || + argtype[i] == "mode_t" || argtype[i] == "key_t" || + argtype[i] == "mach_port_name_t" || argtype[i] == "au_asid_t" || + argtype[i] == "associd_t" || argtype[i] == "connid_t") { munge32 = munge32 "w" - munge64 = munge64 "d" size32 += 4 } else if (argtype[i] == "off_t" || argtype[i] == "int64_t" || argtype[i] == "uint64_t") { munge32 = munge32 "l" - munge64 = munge64 "d" size32 += 8 } else { @@ -553,7 +530,7 @@ s/\$//g } } else if (add_sysproto_entry == 1) { - printf("struct %s {\n\tregister_t dummy;\n};\n", argalias) > sysarg + printf("struct %s {\n\tint32_t dummy;\n};\n", argalias) > sysarg } } @@ -562,7 +539,6 @@ s/\$//g if (add_sysent_entry == 0) { argssize = "0" munge32 = "NULL" - munge64 = "NULL" munge_ret = "_SYSCALL_RET_NONE" if (tempname != "enosys") { tempname = "nosys" @@ -582,9 +558,15 @@ s/\$//g else if (returntype == "int") { munge_ret = "_SYSCALL_RET_INT_T" } - else if (returntype == "u_int") { + else if (returntype == "u_int" || returntype == "mach_port_name_t") { + munge_ret = "_SYSCALL_RET_UINT_T" + } + else if (returntype == "uint32_t") { munge_ret = "_SYSCALL_RET_UINT_T" } + else if (returntype == "uint64_t") { + munge_ret = "_SYSCALL_RET_UINT64_T" + } else if (returntype == "off_t") { munge_ret = "_SYSCALL_RET_OFF_T" } @@ -600,15 +582,17 @@ s/\$//g } } - if (add_64bit_unsafe == 1 && add_64bit_fakesafe == 0) - my_flags = "UNSAFE_64BIT"; - - printf("\t{%s, %s, %s, \(sy_call_t *\)%s, %s, %s, %s, %s},", - argssize, add_resv, my_flags, tempname, munge32, munge64, munge_ret, size32) > sysent - linesize = length(argssize) + length(add_resv) + length(my_flags) + length(tempname) + \ - length(munge32) + length(munge64) + length(munge_ret) + 28 + printf("#if CONFIG_REQUIRES_U32_MUNGING\n") > sysent + printf("\t{ \(sy_call_t *\)%s, %s, %s, %s, %s},", + tempname, munge32, munge_ret, argssize, size32) > sysent + linesize = length(tempname) + length(munge32) + \ + length(munge_ret) + length(argssize) + length(size32) + 28 align_comment(linesize, 88, sysent) printf("/* %d = %s%s*/\n", syscall_num, funcname, additional_comments) > sysent + printf("#else\n") > sysent + printf("\t{ \(sy_call_t *\)%s, %s, %s, %s},\n", + tempname, munge_ret, argssize, size32) > sysent + printf("#endif\n") > sysent # output to syscalls.c if (add_sysnames_entry == 1) { @@ -657,7 +641,7 @@ s/\$//g # output function prototypes to sysproto.h if (add_sysproto_entry == 1) { if (funcname =="exit") { - printf("void %s(struct proc *, struct %s *, int *);\n", + printf("void %s(struct proc *, struct %s *, int32_t *);\n", funcname, argalias) > sysprotoend } else if ((funcname != "nosys" && funcname != "enosys") || (syscall_num == 0 && funcname == "nosys")) { @@ -665,6 +649,10 @@ s/\$//g funcname, argalias, returntype) > sysprotoend } } + + # output to audit_kevents.c + printf("\t%s,\t\t", auditev) > audittempfile + printf("/* %d = %s%s*/\n", syscall_num, tempname, additional_comments) > audittempfile syscall_num++ next @@ -692,13 +680,30 @@ s/\$//g > syshdrtempfile printf("\n#endif /* __APPLE_API_PRIVATE */\n") > syshdrtempfile printf("#endif /* !%s */\n", syscall_h) > syshdrtempfile + printf("};\n\n") > audittempfile + printf("#endif /* AUDIT */\n") > audittempfile } ' # define value in syscall table file to permit redifintion because of the way # __private_extern__ (doesn't) work. -cat $syslegal > $syscalltablefile -printf "#define __INIT_SYSENT_C__ 1\n" >> $syscalltablefile -cat $sysinc $sysent >> $syscalltablefile -cat $syslegal $sysarg $sysprotoend > $sysprotofile -cat $syslegal $syscallnamestempfile > $syscallnamesfile -cat $syslegal $syshdrtempfile > $syshdrfile +if [ $output_syscalltablefile -eq 1 ]; then + cat $syslegal > $syscalltablefile + printf "#define __INIT_SYSENT_C__ 1\n" >> $syscalltablefile + cat $sysinc $sysent >> $syscalltablefile +fi + +if [ $output_syscallnamesfile -eq 1 ]; then + cat $syslegal $syscallnamestempfile > $syscallnamesfile +fi + +if [ $output_sysprotofile -eq 1 ]; then + cat $syslegal $sysarg $sysprotoend > $sysprotofile +fi + +if [ $output_syshdrfile -eq 1 ]; then + cat $syslegal $syshdrtempfile > $syshdrfile +fi + +if [ $output_auditevfile -eq 1 ]; then + cat $syslegal $audittempfile > $auditevfile +fi