]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/dev/ppc/systemcalls.c
xnu-517.3.15.tar.gz
[apple/xnu.git] / bsd / dev / ppc / systemcalls.c
index e84fd36dc675abda15167e80d75bc2a8e637b3be..769da1ec3b67dd7cf3078ac6b77302cbb3e78a4a 100644 (file)
@@ -1,21 +1,24 @@
 /*
- * Copyright (c) 2000-2001 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
@@ -24,6 +27,7 @@
 #include <kern/thread.h>
 #include <kern/thread_act.h>
 #include <kern/assert.h>
+#include <kern/clock.h>
 #include <mach/machine/thread_status.h>
 #include <ppc/savearea.h>
 
@@ -36,6 +40,7 @@
 #include <sys/errno.h>
 #include <sys/ktrace.h>
 #include <sys/kdebug.h>
+#include <sys/kern_audit.h>
 
 extern void
 unix_syscall(
@@ -46,8 +51,8 @@ extern struct savearea *
 find_user_regs(
        thread_act_t act);
 
-extern enter_funnel_section(funnel_t *funnel_lock);
-extern exit_funnel_section(funnel_t *funnel_lock);
+extern void enter_funnel_section(funnel_t *funnel_lock);
+extern void exit_funnel_section(void);
 
 /*
  * Function:   unix_syscall
@@ -70,6 +75,21 @@ unix_syscall(
        boolean_t                       flavor;
        int funnel_type;
 
+       flavor = (((unsigned int)regs->save_r0) == NULL)? 1: 0;
+
+       if (flavor)
+               code = regs->save_r3;
+       else
+               code = regs->save_r0;
+
+       if (kdebug_enable && (code != 180)) {
+               if (flavor)
+                       KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_EXCP_SC, code) | DBG_FUNC_START,
+                               regs->save_r4, regs->save_r5, regs->save_r6, regs->save_r7, 0);
+               else
+                       KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_EXCP_SC, code) | DBG_FUNC_START,
+                               regs->save_r3, regs->save_r4, regs->save_r5, regs->save_r6, 0);
+       }
        thread_act = current_act();
        uthread = get_bsdthread_info(thread_act);
 
@@ -78,15 +98,8 @@ unix_syscall(
        else
                proc = current_proc();
 
-       flavor = (regs->save_r0 == NULL)? 1: 0;
-
        uthread->uu_ar0 = (int *)regs;
 
-       if (flavor)
-               code = regs->save_r3;
-       else
-               code = regs->save_r0;
-
        callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
 
 #ifdef DEBUG
@@ -115,24 +128,12 @@ unix_syscall(
                }
        }
 
-       callp = (code >= nsysent) ? &sysent[63] : &sysent[code];
-
-       if (kdebug_enable && (code != 180)) {
-               if (flavor)
-                       KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_EXCP_SC, code) | DBG_FUNC_START,
-                               regs->save_r4, regs->save_r5, regs->save_r6, regs->save_r7, 0);
-               else
-                       KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_EXCP_SC, code) | DBG_FUNC_START,
-                               regs->save_r3, regs->save_r4, regs->save_r5, regs->save_r6, 0);
-       }
-
        funnel_type = (int)callp->sy_funnel;
-       if(funnel_type == KERNEL_FUNNEL) 
+       if (funnel_type == KERNEL_FUNNEL) 
                 enter_funnel_section(kernel_flock);
        else if (funnel_type == NETWORK_FUNNEL)
                 enter_funnel_section(network_flock);
        
-
        uthread->uu_rval[0] = 0;
 
        /*
@@ -153,7 +154,9 @@ unix_syscall(
        if (KTRPOINT(proc, KTR_SYSCALL))
                ktrsyscall(proc, code, callp->sy_narg, uthread->uu_arg, funnel_type);
 
+       AUDIT_CMD(audit_syscall_enter(code, proc, uthread));
        error = (*(callp->sy_call))(proc, (void *)uthread->uu_arg, &(uthread->uu_rval[0]));
+       AUDIT_CMD(audit_syscall_exit(error, proc, uthread));
 
        regs = find_user_regs(thread_act);
 
@@ -161,7 +164,7 @@ unix_syscall(
                regs->save_srr0 -= 8;
        } else if (error != EJUSTRETURN) {
                if (error) {
-                       regs->save_r3 = error;
+                       regs->save_r3 = (long long)error;
                        /* set the "pc" to execute cerror routine */
                        regs->save_srr0 -= 4;
                } else { /* (not error) */
@@ -174,10 +177,7 @@ unix_syscall(
        if (KTRPOINT(proc, KTR_SYSRET))
                ktrsysret(proc, code, error, uthread->uu_rval[0], funnel_type);
 
-       if(funnel_type == KERNEL_FUNNEL) 
-                exit_funnel_section(kernel_flock);
-       else if (funnel_type == NETWORK_FUNNEL)
-                exit_funnel_section(network_flock);
+        exit_funnel_section();
 
        if (kdebug_enable && (code != 180)) {
                KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_EXCP_SC, code) | DBG_FUNC_END,
@@ -211,7 +211,7 @@ unix_syscall_return(error)
                regs->save_srr0 -= 8;
        } else if (error != EJUSTRETURN) {
                if (error) {
-                       regs->save_r3 = error;
+                       regs->save_r3 = (long long)error;
                        /* set the "pc" to execute cerror routine */
                        regs->save_srr0 -= 4;
                } else { /* (not error) */
@@ -233,10 +233,7 @@ unix_syscall_return(error)
        if (KTRPOINT(proc, KTR_SYSRET))
                ktrsysret(proc, code, error, uthread->uu_rval[0], funnel_type);
 
-       if(funnel_type == KERNEL_FUNNEL) 
-                exit_funnel_section(kernel_flock);
-       else if (funnel_type == NETWORK_FUNNEL)
-                exit_funnel_section(network_flock);
+        exit_funnel_section();
 
        if (kdebug_enable && (code != 180)) {
                KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_EXCP_SC, code) | DBG_FUNC_END,
@@ -260,33 +257,31 @@ struct gettimeofday_args{
        struct timeval *tp;
        struct timezone *tzp;
 };
-/*  NOTE THIS implementation is for  ppc architectures only */
+/*  NOTE THIS implementation is for  ppc architectures only.
+ *  It is infrequently called, since the commpage intercepts
+ *  most calls in user mode.
+ */
 int
 ppc_gettimeofday(p, uap, retval)
        struct proc *p;
        register struct gettimeofday_args *uap;
        register_t *retval;
 {
-       struct timeval atv;
        int error = 0;
-       struct timezone ltz;
-       //struct savearea *child_state;
-       extern simple_lock_data_t tz_slock;
-
-       if (uap->tp) {
-               microtime(&atv);
-               retval[0] = atv.tv_sec;
-               retval[1] = atv.tv_usec;
-       }
+
+       if (uap->tp)
+               clock_gettimeofday(&retval[0], &retval[1]);
        
        if (uap->tzp) {
+               struct timezone ltz;
+               extern simple_lock_data_t tz_slock;
+
                usimple_lock(&tz_slock);
                ltz = tz;
                usimple_unlock(&tz_slock);
-               error = copyout((caddr_t)&ltz, (caddr_t)uap->tzp,
-                   sizeof (tz));
+               error = copyout((caddr_t)&ltz, (caddr_t)uap->tzp, sizeof (tz));
        }
 
-       return(error);
+       return (error);
 }