summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/trap.c16
-rw-r--r--sys/amd64/cloudabi32/cloudabi32_sysvec.c8
-rw-r--r--sys/amd64/cloudabi64/cloudabi64_sysvec.c8
-rw-r--r--sys/amd64/ia32/ia32_syscall.c9
-rw-r--r--sys/amd64/linux/linux_sysvec.c6
-rw-r--r--sys/amd64/linux32/linux32_sysvec.c4
-rw-r--r--sys/arm/arm/syscall.c11
-rw-r--r--sys/arm/cloudabi32/cloudabi32_sysvec.c8
-rw-r--r--sys/arm64/arm64/trap.c9
-rw-r--r--sys/arm64/cloudabi64/cloudabi64_sysvec.c8
-rw-r--r--sys/compat/ia32/ia32_util.h2
-rw-r--r--sys/compat/linux/linux_fork.c1
-rw-r--r--sys/i386/cloudabi32/cloudabi32_sysvec.c8
-rw-r--r--sys/i386/i386/trap.c13
-rw-r--r--sys/i386/linux/linux_sysvec.c4
-rw-r--r--sys/kern/init_main.c3
-rw-r--r--sys/kern/kern_fork.c3
-rw-r--r--sys/kern/kern_kthread.c1
-rw-r--r--sys/kern/kern_thr.c1
-rw-r--r--sys/kern/subr_syscall.c18
-rw-r--r--sys/kern/sys_process.c4
-rw-r--r--sys/mips/mips/trap.c21
-rw-r--r--sys/powerpc/powerpc/trap.c9
-rw-r--r--sys/riscv/riscv/trap.c9
-rw-r--r--sys/sparc64/sparc64/trap.c9
-rw-r--r--sys/sys/proc.h9
-rw-r--r--sys/sys/sysent.h3
27 files changed, 82 insertions, 123 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index d3adf65..e779ef2 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -829,18 +829,16 @@ dblfault_handler(struct trapframe *frame)
}
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
register_t *argp;
- struct syscall_args *sa;
caddr_t params;
int reg, regcnt, error;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
reg = 0;
regcnt = 6;
@@ -891,6 +889,7 @@ cpu_fetch_syscall_args(struct thread *td)
void
amd64_syscall(struct thread *td, int traced)
{
+ struct syscall_args sa;
int error;
ksiginfo_t ksi;
@@ -900,7 +899,7 @@ amd64_syscall(struct thread *td, int traced)
/* NOT REACHED */
}
#endif
- error = syscallenter(td);
+ error = syscallenter(td, &sa);
/*
* Traced syscall.
@@ -916,16 +915,15 @@ amd64_syscall(struct thread *td, int traced)
KASSERT(PCB_USER_FPU(td->td_pcb),
("System call %s returning with kernel FPU ctx leaked",
- syscallname(td->td_proc, td->td_sa.code)));
+ syscallname(td->td_proc, sa.code)));
KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td),
("System call %s returning with mangled pcb_save",
- syscallname(td->td_proc, td->td_sa.code)));
+ syscallname(td->td_proc, sa.code)));
KASSERT(td->td_md.md_invl_gen.gen == 0,
("System call %s returning with leaked invl_gen %lu",
- syscallname(td->td_proc, td->td_sa.code),
- td->td_md.md_invl_gen.gen));
+ syscallname(td->td_proc, sa.code), td->td_md.md_invl_gen.gen));
- syscallret(td, error);
+ syscallret(td, error, &sa);
/*
* If the user-supplied value of %rip is not a canonical
diff --git a/sys/amd64/cloudabi32/cloudabi32_sysvec.c b/sys/amd64/cloudabi32/cloudabi32_sysvec.c
index d5dd58c..abede1a 100644
--- a/sys/amd64/cloudabi32/cloudabi32_sysvec.c
+++ b/sys/amd64/cloudabi32/cloudabi32_sysvec.c
@@ -90,15 +90,11 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
-cloudabi32_fetch_syscall_args(struct thread *td)
+cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
- struct trapframe *frame;
- struct syscall_args *sa;
+ struct trapframe *frame = td->td_frame;
int error;
- frame = td->td_frame;
- sa = &td->td_sa;
-
/* Obtain system call number. */
sa->code = frame->tf_rax;
if (sa->code >= CLOUDABI32_SYS_MAXSYSCALL)
diff --git a/sys/amd64/cloudabi64/cloudabi64_sysvec.c b/sys/amd64/cloudabi64/cloudabi64_sysvec.c
index 679888b..84f0cb3 100644
--- a/sys/amd64/cloudabi64/cloudabi64_sysvec.c
+++ b/sys/amd64/cloudabi64/cloudabi64_sysvec.c
@@ -87,13 +87,9 @@ cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
-cloudabi64_fetch_syscall_args(struct thread *td)
+cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
- struct trapframe *frame;
- struct syscall_args *sa;
-
- frame = td->td_frame;
- sa = &td->td_sa;
+ struct trapframe *frame = td->td_frame;
/* Obtain system call number. */
sa->code = frame->tf_rax;
diff --git a/sys/amd64/ia32/ia32_syscall.c b/sys/amd64/ia32/ia32_syscall.c
index c07b38c..6e96edd 100644
--- a/sys/amd64/ia32/ia32_syscall.c
+++ b/sys/amd64/ia32/ia32_syscall.c
@@ -105,18 +105,16 @@ ia32_set_syscall_retval(struct thread *td, int error)
}
int
-ia32_fetch_syscall_args(struct thread *td)
+ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
- struct syscall_args *sa;
caddr_t params;
u_int32_t args[8], tmp;
int error, i;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
params = (caddr_t)frame->tf_rsp + sizeof(u_int32_t);
sa->code = frame->tf_rax;
@@ -177,6 +175,7 @@ void
ia32_syscall(struct trapframe *frame)
{
struct thread *td;
+ struct syscall_args sa;
register_t orig_tf_rflags;
int error;
ksiginfo_t ksi;
@@ -185,7 +184,7 @@ ia32_syscall(struct trapframe *frame)
td = curthread;
td->td_frame = frame;
- error = syscallenter(td);
+ error = syscallenter(td, &sa);
/*
* Traced syscall.
@@ -199,7 +198,7 @@ ia32_syscall(struct trapframe *frame)
trapsignal(td, &ksi);
}
- syscallret(td, error);
+ syscallret(td, error, &sa);
}
static void
diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c
index f77c2c9..6e12d41 100644
--- a/sys/amd64/linux/linux_sysvec.c
+++ b/sys/amd64/linux/linux_sysvec.c
@@ -126,7 +126,7 @@ static boolean_t linux_trans_osrel(const Elf_Note *note, int32_t *osrel);
static void linux_vdso_install(void *param);
static void linux_vdso_deinstall(void *param);
static void linux_set_syscall_retval(struct thread *td, int error);
-static int linux_fetch_syscall_args(struct thread *td);
+static int linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
static void linux_exec_setregs(struct thread *td, struct image_params *imgp,
u_long stack);
static int linux_vsyscall(struct thread *td);
@@ -217,15 +217,13 @@ translate_traps(int signal, int trap_code)
}
static int
-linux_fetch_syscall_args(struct thread *td)
+linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
- struct syscall_args *sa;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
sa->args[0] = frame->tf_rdi;
sa->args[1] = frame->tf_rsi;
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
index ea849ba..c264f3a 100644
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -725,15 +725,13 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
}
static int
-linux32_fetch_syscall_args(struct thread *td)
+linux32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
- struct syscall_args *sa;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
sa->args[0] = frame->tf_rbx;
sa->args[1] = frame->tf_rcx;
diff --git a/sys/arm/arm/syscall.c b/sys/arm/arm/syscall.c
index 8c33fff..1ff48ab 100644
--- a/sys/arm/arm/syscall.c
+++ b/sys/arm/arm/syscall.c
@@ -99,14 +99,12 @@ __FBSDID("$FreeBSD$");
void swi_handler(struct trapframe *);
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
register_t *ap;
- struct syscall_args *sa;
int error;
- sa = &td->td_sa;
sa->code = td->td_frame->tf_r7;
ap = &td->td_frame->tf_r0;
if (sa->code == SYS_syscall) {
@@ -143,14 +141,15 @@ cpu_fetch_syscall_args(struct thread *td)
static void
syscall(struct thread *td, struct trapframe *frame)
{
+ struct syscall_args sa;
int error;
- td->td_sa.nap = 4;
+ sa.nap = 4;
- error = syscallenter(td);
+ error = syscallenter(td, &sa);
KASSERT(error != 0 || td->td_ar == NULL,
("returning from syscall with td_ar set!"));
- syscallret(td, error);
+ syscallret(td, error, &sa);
}
void
diff --git a/sys/arm/cloudabi32/cloudabi32_sysvec.c b/sys/arm/cloudabi32/cloudabi32_sysvec.c
index a0bebcc..100fa47 100644
--- a/sys/arm/cloudabi32/cloudabi32_sysvec.c
+++ b/sys/arm/cloudabi32/cloudabi32_sysvec.c
@@ -67,15 +67,11 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
-cloudabi32_fetch_syscall_args(struct thread *td)
+cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
- struct trapframe *frame;
- struct syscall_args *sa;
+ struct trapframe *frame = td->td_frame;
int error;
- frame = td->td_frame;
- sa = &td->td_sa;
-
/* Obtain system call number. */
sa->code = frame->tf_r12;
if (sa->code >= CLOUDABI32_SYS_MAXSYSCALL)
diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c
index bb9fe75..d7209de1 100644
--- a/sys/arm64/arm64/trap.c
+++ b/sys/arm64/arm64/trap.c
@@ -92,17 +92,15 @@ call_trapsignal(struct thread *td, int sig, int code, void *addr)
}
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
register_t *ap;
- struct syscall_args *sa;
int nap;
nap = 8;
p = td->td_proc;
ap = td->td_frame->tf_x;
- sa = &td->td_sa;
sa->code = td->td_frame->tf_x[8];
@@ -134,11 +132,12 @@ cpu_fetch_syscall_args(struct thread *td)
static void
svc_handler(struct thread *td, struct trapframe *frame)
{
+ struct syscall_args sa;
int error;
if ((frame->tf_esr & ESR_ELx_ISS_MASK) == 0) {
- error = syscallenter(td);
- syscallret(td, error);
+ error = syscallenter(td, &sa);
+ syscallret(td, error, &sa);
} else {
call_trapsignal(td, SIGILL, ILL_ILLOPN, (void *)frame->tf_elr);
userret(td, frame);
diff --git a/sys/arm64/cloudabi64/cloudabi64_sysvec.c b/sys/arm64/cloudabi64/cloudabi64_sysvec.c
index f6e75f5..fbad0ba 100644
--- a/sys/arm64/cloudabi64/cloudabi64_sysvec.c
+++ b/sys/arm64/cloudabi64/cloudabi64_sysvec.c
@@ -67,15 +67,11 @@ cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
-cloudabi64_fetch_syscall_args(struct thread *td)
+cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
- struct trapframe *frame;
- struct syscall_args *sa;
+ struct trapframe *frame = td->td_frame;
int i;
- frame = td->td_frame;
- sa = &td->td_sa;
-
/* Obtain system call number. */
sa->code = frame->tf_x[8];
if (sa->code >= CLOUDABI64_SYS_MAXSYSCALL)
diff --git a/sys/compat/ia32/ia32_util.h b/sys/compat/ia32/ia32_util.h
index 41aad4e..6b5f9a1 100644
--- a/sys/compat/ia32/ia32_util.h
+++ b/sys/compat/ia32/ia32_util.h
@@ -50,7 +50,7 @@
#define IA32_MAXVMEM 0 /* Unlimited */
struct syscall_args;
-int ia32_fetch_syscall_args(struct thread *td);
+int ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
void ia32_set_syscall_retval(struct thread *, int);
void ia32_fixlimit(struct rlimit *rl, int which);
diff --git a/sys/compat/linux/linux_fork.c b/sys/compat/linux/linux_fork.c
index 930be5d..971006d 100644
--- a/sys/compat/linux/linux_fork.c
+++ b/sys/compat/linux/linux_fork.c
@@ -306,7 +306,6 @@ linux_clone_thread(struct thread *td, struct linux_clone_args *args)
__rangeof(struct thread, td_startzero, td_endzero));
bcopy(&td->td_startcopy, &newtd->td_startcopy,
__rangeof(struct thread, td_startcopy, td_endcopy));
- newtd->td_sa = td->td_sa;
newtd->td_proc = p;
thread_cow_get(newtd, td);
diff --git a/sys/i386/cloudabi32/cloudabi32_sysvec.c b/sys/i386/cloudabi32/cloudabi32_sysvec.c
index e50a19c..c2a21fa 100644
--- a/sys/i386/cloudabi32/cloudabi32_sysvec.c
+++ b/sys/i386/cloudabi32/cloudabi32_sysvec.c
@@ -85,15 +85,11 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
}
static int
-cloudabi32_fetch_syscall_args(struct thread *td)
+cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
- struct trapframe *frame;
- struct syscall_args *sa;
+ struct trapframe *frame = td->td_frame;
int error;
- frame = td->td_frame;
- sa = &td->td_sa;
-
/* Obtain system call number. */
sa->code = frame->tf_eax;
if (sa->code >= CLOUDABI32_SYS_MAXSYSCALL)
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index 3c8f4b5..7c16b24 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -1012,18 +1012,16 @@ dblfault_handler()
}
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
- struct syscall_args *sa;
caddr_t params;
long tmp;
int error;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
params = (caddr_t)frame->tf_esp + sizeof(int);
sa->code = frame->tf_eax;
@@ -1084,6 +1082,7 @@ void
syscall(struct trapframe *frame)
{
struct thread *td;
+ struct syscall_args sa;
register_t orig_tf_eflags;
int error;
ksiginfo_t ksi;
@@ -1100,7 +1099,7 @@ syscall(struct trapframe *frame)
td = curthread;
td->td_frame = frame;
- error = syscallenter(td);
+ error = syscallenter(td, &sa);
/*
* Traced syscall.
@@ -1116,10 +1115,10 @@ syscall(struct trapframe *frame)
KASSERT(PCB_USER_FPU(td->td_pcb),
("System call %s returning with kernel FPU ctx leaked",
- syscallname(td->td_proc, td->td_sa.code)));
+ syscallname(td->td_proc, sa.code)));
KASSERT(td->td_pcb->pcb_save == get_pcb_user_save_td(td),
("System call %s returning with mangled pcb_save",
- syscallname(td->td_proc, td->td_sa.code)));
+ syscallname(td->td_proc, sa.code)));
- syscallret(td, error);
+ syscallret(td, error, &sa);
}
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index a4919a0..49fafdc 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -850,15 +850,13 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
}
static int
-linux_fetch_syscall_args(struct thread *td)
+linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
- struct syscall_args *sa;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
sa->code = frame->tf_eax;
sa->args[0] = frame->tf_ebx;
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 2599ff4..a1d9846 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -369,7 +369,8 @@ SYSINIT(diagwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 2,
#endif
static int
-null_fetch_syscall_args(struct thread *td __unused)
+null_fetch_syscall_args(struct thread *td __unused,
+ struct syscall_args *sa __unused)
{
panic("null_fetch_syscall_args");
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index b63bc65..c7680aa 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -478,7 +478,6 @@ do_fork(struct thread *td, struct fork_req *fr, struct proc *p2, struct thread *
bcopy(&td->td_startcopy, &td2->td_startcopy,
__rangeof(struct thread, td_startcopy, td_endcopy));
- td2->td_sa = td->td_sa;
bcopy(&p2->p_comm, &td2->td_name, sizeof(td2->td_name));
td2->td_sigstk = td->td_sigstk;
@@ -1104,7 +1103,7 @@ fork_return(struct thread *td, struct trapframe *frame)
*/
PROC_LOCK(p);
td->td_dbgflags |= TDB_SCX;
- _STOPEVENT(p, S_SCX, td->td_sa.code);
+ _STOPEVENT(p, S_SCX, td->td_dbg_sc_code);
if ((p->p_ptevents & PTRACE_SCX) != 0 ||
(td->td_dbgflags & TDB_BORN) != 0)
ptracestop(td, SIGTRAP, NULL);
diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c
index 69c1140..520bf97 100644
--- a/sys/kern/kern_kthread.c
+++ b/sys/kern/kern_kthread.c
@@ -276,7 +276,6 @@ kthread_add(void (*func)(void *), void *arg, struct proc *p,
newtd->td_sleeptimo = 0;
bcopy(&oldtd->td_startcopy, &newtd->td_startcopy,
__rangeof(struct thread, td_startcopy, td_endcopy));
- newtd->td_sa = oldtd->td_sa;
/* set up arg0 for 'ps', et al */
va_start(ap, fmt);
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 6bebac9..c39986d 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -235,7 +235,6 @@ thread_create(struct thread *td, struct rtprio *rtp,
newtd->td_sleeptimo = 0;
bcopy(&td->td_startcopy, &newtd->td_startcopy,
__rangeof(struct thread, td_startcopy, td_endcopy));
- newtd->td_sa = td->td_sa;
newtd->td_proc = td->td_proc;
newtd->td_rb_list = newtd->td_rbp_list = newtd->td_rb_inact = 0;
thread_cow_get(newtd, td);
diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c
index 0182884..2bcad34 100644
--- a/sys/kern/subr_syscall.c
+++ b/sys/kern/subr_syscall.c
@@ -52,15 +52,13 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
static inline int
-syscallenter(struct thread *td)
+syscallenter(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
- struct syscall_args *sa;
int error, traced;
PCPU_INC(cnt.v_syscall);
p = td->td_proc;
- sa = &td->td_sa;
td->td_pticks = 0;
if (td->td_cowgen != p->p_cowgen)
@@ -73,7 +71,7 @@ syscallenter(struct thread *td)
td->td_dbgflags |= TDB_SCE;
PROC_UNLOCK(p);
}
- error = (p->p_sysent->sv_fetch_syscall_args)(td);
+ error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, sa->narg, sa->args);
@@ -87,6 +85,8 @@ syscallenter(struct thread *td)
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);
@@ -96,7 +96,11 @@ syscallenter(struct thread *td)
* Reread syscall number and arguments if
* debugger modified registers or memory.
*/
- error = (p->p_sysent->sv_fetch_syscall_args)(td);
+ 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);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, sa->narg, sa->args);
@@ -158,10 +162,9 @@ syscallenter(struct thread *td)
}
static inline void
-syscallret(struct thread *td, int error)
+syscallret(struct thread *td, int error, struct syscall_args *sa)
{
struct proc *p, *p2;
- struct syscall_args *sa;
ksiginfo_t ksi;
int traced, error1;
@@ -169,7 +172,6 @@ syscallret(struct thread *td, int error)
("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 :
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index e0c4806..a8513c9 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -1347,8 +1347,8 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
pl->pl_siglist = td2->td_siglist;
strcpy(pl->pl_tdname, td2->td_name);
if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) != 0) {
- pl->pl_syscall_code = td2->td_sa.code;
- pl->pl_syscall_narg = td2->td_sa.narg;
+ pl->pl_syscall_code = td2->td_dbg_sc_code;
+ pl->pl_syscall_narg = td2->td_dbg_sc_narg;
} else {
pl->pl_syscall_code = 0;
pl->pl_syscall_narg = 0;
diff --git a/sys/mips/mips/trap.c b/sys/mips/mips/trap.c
index 396f69b..f98fc97 100644
--- a/sys/mips/mips/trap.c
+++ b/sys/mips/mips/trap.c
@@ -339,16 +339,12 @@ static int emulate_unaligned_access(struct trapframe *frame, int mode);
extern void fswintrberr(void); /* XXX */
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
- struct trapframe *locr0;
+ struct trapframe *locr0 = td->td_frame;
struct sysentvec *se;
- struct syscall_args *sa;
int error, nsaved;
- locr0 = td->td_frame;
- sa = &td->td_sa;
-
bzero(sa->args, sizeof(sa->args));
/* compute next PC after syscall instruction */
@@ -790,18 +786,19 @@ dofault:
case T_SYSCALL + T_USER:
{
+ struct syscall_args sa;
int error;
- td->td_sa.trapframe = trapframe;
- error = syscallenter(td);
+ sa.trapframe = trapframe;
+ error = syscallenter(td, &sa);
#if !defined(SMP) && (defined(DDB) || defined(DEBUG))
if (trp == trapdebug)
- trapdebug[TRAPSIZE - 1].code = td->td_sa.code;
+ trapdebug[TRAPSIZE - 1].code = sa.code;
else
- trp[-1].code = td->td_sa.code;
+ trp[-1].code = sa.code;
#endif
- trapdebug_enter(td->td_frame, -td->td_sa.code);
+ trapdebug_enter(td->td_frame, -sa.code);
/*
* The sync'ing of I & D caches for SYS_ptrace() is
@@ -809,7 +806,7 @@ dofault:
* instead of being done here under a special check
* for SYS_ptrace().
*/
- syscallret(td, error);
+ syscallret(td, error, &sa);
return (trapframe->pc);
}
diff --git a/sys/powerpc/powerpc/trap.c b/sys/powerpc/powerpc/trap.c
index 95fb554..4464dd8 100644
--- a/sys/powerpc/powerpc/trap.c
+++ b/sys/powerpc/powerpc/trap.c
@@ -484,18 +484,16 @@ handle_onfault(struct trapframe *frame)
}
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
struct trapframe *frame;
- struct syscall_args *sa;
caddr_t params;
size_t argsz;
int error, n, i;
p = td->td_proc;
frame = td->td_frame;
- sa = &td->td_sa;
sa->code = frame->fixreg[0];
params = (caddr_t)(frame->fixreg + FIRSTARG);
@@ -577,6 +575,7 @@ void
syscall(struct trapframe *frame)
{
struct thread *td;
+ struct syscall_args sa;
int error;
td = curthread;
@@ -591,8 +590,8 @@ syscall(struct trapframe *frame)
"r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE));
#endif
- error = syscallenter(td);
- syscallret(td, error);
+ error = syscallenter(td, &sa);
+ syscallret(td, error, &sa);
}
#ifdef __powerpc64__
diff --git a/sys/riscv/riscv/trap.c b/sys/riscv/riscv/trap.c
index 7e85c16..22d27f4 100644
--- a/sys/riscv/riscv/trap.c
+++ b/sys/riscv/riscv/trap.c
@@ -89,16 +89,14 @@ call_trapsignal(struct thread *td, int sig, int code, void *addr)
}
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct proc *p;
register_t *ap;
- struct syscall_args *sa;
int nap;
nap = 8;
p = td->td_proc;
- sa = &td->td_sa;
ap = &td->td_frame->tf_a[0];
sa->code = td->td_frame->tf_t[0];
@@ -153,14 +151,15 @@ dump_regs(struct trapframe *frame)
static void
svc_handler(struct trapframe *frame)
{
+ struct syscall_args sa;
struct thread *td;
int error;
td = curthread;
td->td_frame = frame;
- error = syscallenter(td);
- syscallret(td, error);
+ error = syscallenter(td, &sa);
+ syscallret(td, error, &sa);
}
static void
diff --git a/sys/sparc64/sparc64/trap.c b/sys/sparc64/sparc64/trap.c
index e77ccf7..73719f2 100644
--- a/sys/sparc64/sparc64/trap.c
+++ b/sys/sparc64/sparc64/trap.c
@@ -538,19 +538,17 @@ trap_pfault(struct thread *td, struct trapframe *tf)
#define REG_MAXARGS 6
int
-cpu_fetch_syscall_args(struct thread *td)
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
{
struct trapframe *tf;
struct proc *p;
register_t *argp;
- struct syscall_args *sa;
int reg;
int regcnt;
int error;
p = td->td_proc;
tf = td->td_frame;
- sa = &td->td_sa;
reg = 0;
regcnt = REG_MAXARGS;
@@ -598,6 +596,7 @@ void
syscall(struct trapframe *tf)
{
struct thread *td;
+ struct syscall_args sa;
int error;
td = curthread;
@@ -613,6 +612,6 @@ syscall(struct trapframe *tf)
td->td_pcb->pcb_tpc = tf->tf_tpc;
TF_DONE(tf);
- error = syscallenter(td);
- syscallret(td, error);
+ error = syscallenter(td, &sa);
+ syscallret(td, error, &sa);
}
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 11947db6..d32807a 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -142,7 +142,6 @@ struct pargs {
* j - locked by proc slock
* k - only accessed by curthread
* k*- only accessed by curthread and from an interrupt
- * kx- only accessed by curthread and by debugger
* l - the attaching proc or attaching proc parent
* m - Giant
* n - not locked, lazy
@@ -296,8 +295,8 @@ struct thread {
u_char td_pri_class; /* (t) Scheduling class. */
u_char td_user_pri; /* (t) User pri from estcpu and nice. */
u_char td_base_user_pri; /* (t) Base user pri */
- u_int td_padding3;
- u_int td_padding4;
+ u_int td_dbg_sc_code; /* (c) Syscall code to debugger. */
+ u_int td_dbg_sc_narg; /* (c) Syscall arg count to debugger.*/
uintptr_t td_rb_list; /* (k) Robust list head. */
uintptr_t td_rbp_list; /* (k) Robust priv list head. */
uintptr_t td_rb_inact; /* (k) Current in-action mutex loc. */
@@ -344,8 +343,6 @@ struct thread {
sbintime_t td_sleeptimo; /* (t) Sleep timeout. */
sigqueue_t td_sigqueue; /* (c) Sigs arrived, not delivered. */
#define td_siglist td_sigqueue.sq_signals
- struct syscall_args td_sa; /* (kx) Syscall parameters. Copied on
- fork for child tracing. */
};
struct thread0_storage {
@@ -1054,7 +1051,7 @@ void userret(struct thread *, struct trapframe *);
void cpu_exit(struct thread *);
void exit1(struct thread *, int, int) __dead2;
void cpu_copy_thread(struct thread *td, struct thread *td0);
-int cpu_fetch_syscall_args(struct thread *td);
+int cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
void cpu_fork(struct thread *, struct proc *, struct thread *, int);
void cpu_fork_kthread_handler(struct thread *, void (*)(void *), void *);
void cpu_set_syscall_retval(struct thread *, int);
diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h
index f1f4590..8313fc0 100644
--- a/sys/sys/sysent.h
+++ b/sys/sys/sysent.h
@@ -119,7 +119,8 @@ struct sysentvec {
u_long *sv_maxssiz;
u_int sv_flags;
void (*sv_set_syscall_retval)(struct thread *, int);
- int (*sv_fetch_syscall_args)(struct thread *);
+ int (*sv_fetch_syscall_args)(struct thread *, struct
+ syscall_args *);
const char **sv_syscallnames;
vm_offset_t sv_timekeep_base;
vm_offset_t sv_shared_page_base;
OpenPOWER on IntegriCloud