/*
- * Copyright (c) 2000-2001 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#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>
#include <sys/errno.h>
#include <sys/ktrace.h>
#include <sys/kdebug.h>
+#include <sys/kern_audit.h>
extern void
unix_syscall(
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
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);
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
}
}
- 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;
/*
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);
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) */
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,
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) */
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,
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)<z, (caddr_t)uap->tzp,
- sizeof (tz));
+ error = copyout((caddr_t)<z, (caddr_t)uap->tzp, sizeof (tz));
}
- return(error);
+ return (error);
}