summaryrefslogtreecommitdiff
path: root/sys/kern/subr_syscall.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2017-06-12 21:03:23 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2017-06-12 21:03:23 +0000
commit2d88da2f06f296d84749996a2a76d755aa4c5c92 (patch)
tree872990de896132a2a54456a26e6891e28d6350c6 /sys/kern/subr_syscall.c
parent7127f6f455d58788344aef3aa1b07e67b4abce76 (diff)
downloadsrc-test2-2d88da2f06f296d84749996a2a76d755aa4c5c92.tar.gz
src-test2-2d88da2f06f296d84749996a2a76d755aa4c5c92.zip
Notes
Diffstat (limited to 'sys/kern/subr_syscall.c')
-rw-r--r--sys/kern/subr_syscall.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c
index 3c0a9323677b..6a5dc3f601ae 100644
--- a/sys/kern/subr_syscall.c
+++ b/sys/kern/subr_syscall.c
@@ -53,13 +53,15 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
static inline int
-syscallenter(struct thread *td, struct syscall_args *sa)
+syscallenter(struct thread *td)
{
struct proc *p;
+ struct syscall_args *sa;
int error, traced;
VM_CNT_INC(v_syscall);
p = td->td_proc;
+ sa = &td->td_sa;
td->td_pticks = 0;
if (td->td_cowgen != p->p_cowgen)
@@ -72,7 +74,7 @@ syscallenter(struct thread *td, struct syscall_args *sa)
td->td_dbgflags |= TDB_SCE;
PROC_UNLOCK(p);
}
- error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
+ error = (p->p_sysent->sv_fetch_syscall_args)(td);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, sa->narg, sa->args);
@@ -86,8 +88,6 @@ syscallenter(struct thread *td, struct syscall_args *sa)
STOPEVENT(p, S_SCE, sa->narg);
if (p->p_flag & P_TRACED) {
PROC_LOCK(p);
- td->td_dbg_sc_code = sa->code;
- td->td_dbg_sc_narg = sa->narg;
if (p->p_ptevents & PTRACE_SCE)
ptracestop((td), SIGTRAP, NULL);
PROC_UNLOCK(p);
@@ -97,11 +97,7 @@ syscallenter(struct thread *td, struct syscall_args *sa)
* Reread syscall number and arguments if
* debugger modified registers or memory.
*/
- error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
- PROC_LOCK(p);
- td->td_dbg_sc_code = sa->code;
- td->td_dbg_sc_narg = sa->narg;
- PROC_UNLOCK(p);
+ error = (p->p_sysent->sv_fetch_syscall_args)(td);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, sa->narg, sa->args);
@@ -163,9 +159,10 @@ syscallenter(struct thread *td, struct syscall_args *sa)
}
static inline void
-syscallret(struct thread *td, int error, struct syscall_args *sa)
+syscallret(struct thread *td, int error)
{
struct proc *p, *p2;
+ struct syscall_args *sa;
ksiginfo_t ksi;
int traced, error1;
@@ -173,6 +170,7 @@ syscallret(struct thread *td, int error, struct syscall_args *sa)
("fork() did not clear TDP_FORKING upon completion"));
p = td->td_proc;
+ sa = &td->td_sa;
if ((trap_enotcap || (p->p_flag2 & P2_TRAPCAP) != 0) &&
IN_CAPABILITY_MODE(td)) {
error1 = (td->td_pflags & TDP_NERRNO) == 0 ? error :