aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/subr_trap.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2011-09-11 16:05:09 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2011-09-11 16:05:09 +0000
commit26ccf4f10f9288c19ebe345b0dee7396d6b12ee2 (patch)
tree0b0a99497de53c0baa2f389ba7ca1c651e4df409 /sys/kern/subr_trap.c
parent637b8c6d881a99edd178203161fda260bc054d0d (diff)
downloadsrc-26ccf4f10f9288c19ebe345b0dee7396d6b12ee2.tar.gz
src-26ccf4f10f9288c19ebe345b0dee7396d6b12ee2.zip
Inline the syscallenter() and syscallret(). This reduces the time measured
by the syscall entry speed microbenchmarks by ~10% on amd64. Submitted by: jhb Approved by: re (bz) MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=225474
Diffstat (limited to 'sys/kern/subr_trap.c')
-rw-r--r--sys/kern/subr_trap.c162
1 files changed, 0 insertions, 162 deletions
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index 3527ed1fbedf..42adf80f04fe 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -252,7 +252,6 @@ ast(struct trapframe *framep)
mtx_assert(&Giant, MA_NOTOWNED);
}
-#ifdef HAVE_SYSCALL_ARGS_DEF
const char *
syscallname(struct proc *p, u_int code)
{
@@ -264,164 +263,3 @@ syscallname(struct proc *p, u_int code)
return (unknown);
return (sv->sv_syscallnames[code]);
}
-
-int
-syscallenter(struct thread *td, struct syscall_args *sa)
-{
- struct proc *p;
- int error, traced;
-
- PCPU_INC(cnt.v_syscall);
- p = td->td_proc;
-
- td->td_pticks = 0;
- if (td->td_ucred != p->p_ucred)
- cred_update_thread(td);
- if (p->p_flag & P_TRACED) {
- traced = 1;
- PROC_LOCK(p);
- td->td_dbgflags &= ~TDB_USERWR;
- td->td_dbgflags |= TDB_SCE;
- PROC_UNLOCK(p);
- } else
- traced = 0;
- error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
-#ifdef KTRACE
- if (KTRPOINT(td, KTR_SYSCALL))
- ktrsyscall(sa->code, sa->narg, sa->args);
-#endif
-
- CTR6(KTR_SYSC,
-"syscall: td=%p pid %d %s (%#lx, %#lx, %#lx)",
- td, td->td_proc->p_pid, syscallname(p, sa->code),
- sa->args[0], sa->args[1], sa->args[2]);
-
- if (error == 0) {
- STOPEVENT(p, S_SCE, sa->narg);
- PTRACESTOP_SC(p, td, S_PT_SCE);
- if (td->td_dbgflags & TDB_USERWR) {
- /*
- * Reread syscall number and arguments if
- * debugger modified registers or memory.
- */
- error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
-#ifdef KTRACE
- if (KTRPOINT(td, KTR_SYSCALL))
- ktrsyscall(sa->code, sa->narg, sa->args);
-#endif
- if (error != 0)
- goto retval;
- }
-
-#ifdef CAPABILITY_MODE
- /*
- * In capability mode, we only allow access to system calls
- * flagged with SYF_CAPENABLED.
- */
- if (IN_CAPABILITY_MODE(td) &&
- !(sa->callp->sy_flags & SYF_CAPENABLED)) {
- error = ECAPMODE;
- goto retval;
- }
-#endif
-
- error = syscall_thread_enter(td, sa->callp);
- if (error != 0)
- goto retval;
-
-#ifdef KDTRACE_HOOKS
- /*
- * If the systrace module has registered it's probe
- * callback and if there is a probe active for the
- * syscall 'entry', process the probe.
- */
- if (systrace_probe_func != NULL && sa->callp->sy_entry != 0)
- (*systrace_probe_func)(sa->callp->sy_entry, sa->code,
- sa->callp, sa->args, 0);
-#endif
-
- AUDIT_SYSCALL_ENTER(sa->code, td);
- error = (sa->callp->sy_call)(td, sa->args);
- AUDIT_SYSCALL_EXIT(error, td);
-
- /* Save the latest error return value. */
- td->td_errno = error;
-
-#ifdef KDTRACE_HOOKS
- /*
- * If the systrace module has registered it's probe
- * callback and if there is a probe active for the
- * syscall 'return', process the probe.
- */
- if (systrace_probe_func != NULL && sa->callp->sy_return != 0)
- (*systrace_probe_func)(sa->callp->sy_return, sa->code,
- sa->callp, NULL, (error) ? -1 : td->td_retval[0]);
-#endif
- syscall_thread_exit(td, sa->callp);
- CTR4(KTR_SYSC, "syscall: p=%p error=%d return %#lx %#lx",
- p, error, td->td_retval[0], td->td_retval[1]);
- }
- retval:
- if (traced) {
- PROC_LOCK(p);
- td->td_dbgflags &= ~TDB_SCE;
- PROC_UNLOCK(p);
- }
- (p->p_sysent->sv_set_syscall_retval)(td, error);
- return (error);
-}
-
-void
-syscallret(struct thread *td, int error, struct syscall_args *sa __unused)
-{
- struct proc *p;
- int traced;
-
- p = td->td_proc;
-
- /*
- * Check for misbehavior.
- */
- WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
- syscallname(p, sa->code));
- KASSERT(td->td_critnest == 0,
- ("System call %s returning in a critical section",
- syscallname(p, sa->code)));
- KASSERT(td->td_locks == 0,
- ("System call %s returning with %d locks held",
- syscallname(p, sa->code), td->td_locks));
-
- /*
- * Handle reschedule and other end-of-syscall issues
- */
- userret(td, td->td_frame);
-
- CTR4(KTR_SYSC, "syscall %s exit thread %p pid %d proc %s",
- syscallname(p, sa->code), td, td->td_proc->p_pid, td->td_name);
-
-#ifdef KTRACE
- if (KTRPOINT(td, KTR_SYSRET))
- ktrsysret(sa->code, error, td->td_retval[0]);
-#endif
-
- if (p->p_flag & P_TRACED) {
- traced = 1;
- PROC_LOCK(p);
- td->td_dbgflags |= TDB_SCX;
- PROC_UNLOCK(p);
- } else
- traced = 0;
- /*
- * This works because errno is findable through the
- * register set. If we ever support an emulation where this
- * is not the case, this code will need to be revisited.
- */
- STOPEVENT(p, S_SCX, sa->code);
- PTRACESTOP_SC(p, td, S_PT_SCX);
- if (traced || (td->td_dbgflags & (TDB_EXEC | TDB_FORK)) != 0) {
- PROC_LOCK(p);
- td->td_dbgflags &= ~(TDB_SCX | TDB_EXEC | TDB_FORK);
- PROC_UNLOCK(p);
- }
-}
-#endif /* HAVE_SYSCALL_ARGS_DEF */