Move struct syscall_args syscall arguments parameters container into
struct thread. For all architectures, the syscall trap handlers have to allocate the structure on the stack. The structure takes 88 bytes on 64bit arches which is not negligible. Also, it cannot be easily found by other code, which e.g. caused duplication of some members of the structure to struct thread already. The change removes td_dbg_sc_code and td_dbg_sc_nargs which were directly copied from syscall_args. The structure is put into the copied on fork part of the struct thread to make the syscall arguments information correct in the child after fork. This move will also allow several more uses shortly. Reviewed by: jhb (previous version) Sponsored by: The FreeBSD Foundation MFC after: 3 weeks X-Differential revision: https://reviews.freebsd.org/D11080
This commit is contained in:
parent
8f34063675
commit
e2a14c603f
@ -829,16 +829,18 @@ dblfault_handler(struct trapframe *frame)
|
||||
}
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
|
||||
@ -889,7 +891,6 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
void
|
||||
amd64_syscall(struct thread *td, int traced)
|
||||
{
|
||||
struct syscall_args sa;
|
||||
int error;
|
||||
ksiginfo_t ksi;
|
||||
|
||||
@ -899,7 +900,7 @@ amd64_syscall(struct thread *td, int traced)
|
||||
/* NOT REACHED */
|
||||
}
|
||||
#endif
|
||||
error = syscallenter(td, &sa);
|
||||
error = syscallenter(td);
|
||||
|
||||
/*
|
||||
* Traced syscall.
|
||||
@ -915,15 +916,16 @@ 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, sa.code)));
|
||||
syscallname(td->td_proc, td->td_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, sa.code)));
|
||||
syscallname(td->td_proc, td->td_sa.code)));
|
||||
KASSERT(td->td_md.md_invl_gen.gen == 0,
|
||||
("System call %s returning with leaked invl_gen %lu",
|
||||
syscallname(td->td_proc, sa.code), td->td_md.md_invl_gen.gen));
|
||||
syscallname(td->td_proc, td->td_sa.code),
|
||||
td->td_md.md_invl_gen.gen));
|
||||
|
||||
syscallret(td, error, &sa);
|
||||
syscallret(td, error);
|
||||
|
||||
/*
|
||||
* If the user-supplied value of %rip is not a canonical
|
||||
|
@ -90,11 +90,15 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cloudabi32_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
struct trapframe *frame;
|
||||
struct syscall_args *sa;
|
||||
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)
|
||||
|
@ -87,9 +87,13 @@ cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cloudabi64_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
struct trapframe *frame;
|
||||
struct syscall_args *sa;
|
||||
|
||||
frame = td->td_frame;
|
||||
sa = &td->td_sa;
|
||||
|
||||
/* Obtain system call number. */
|
||||
sa->code = frame->tf_rax;
|
||||
|
@ -105,16 +105,18 @@ ia32_set_syscall_retval(struct thread *td, int error)
|
||||
}
|
||||
|
||||
int
|
||||
ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
ia32_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
@ -175,7 +177,6 @@ void
|
||||
ia32_syscall(struct trapframe *frame)
|
||||
{
|
||||
struct thread *td;
|
||||
struct syscall_args sa;
|
||||
register_t orig_tf_rflags;
|
||||
int error;
|
||||
ksiginfo_t ksi;
|
||||
@ -184,7 +185,7 @@ ia32_syscall(struct trapframe *frame)
|
||||
td = curthread;
|
||||
td->td_frame = frame;
|
||||
|
||||
error = syscallenter(td, &sa);
|
||||
error = syscallenter(td);
|
||||
|
||||
/*
|
||||
* Traced syscall.
|
||||
@ -198,7 +199,7 @@ ia32_syscall(struct trapframe *frame)
|
||||
trapsignal(td, &ksi);
|
||||
}
|
||||
|
||||
syscallret(td, error, &sa);
|
||||
syscallret(td, error);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -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, struct syscall_args *sa);
|
||||
static int linux_fetch_syscall_args(struct thread *td);
|
||||
static void linux_exec_setregs(struct thread *td, struct image_params *imgp,
|
||||
u_long stack);
|
||||
static int linux_vsyscall(struct thread *td);
|
||||
@ -217,13 +217,15 @@ translate_traps(int signal, int trap_code)
|
||||
}
|
||||
|
||||
static int
|
||||
linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
linux_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
|
@ -725,13 +725,15 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
|
||||
}
|
||||
|
||||
static int
|
||||
linux32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
linux32_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
|
@ -99,12 +99,14 @@ __FBSDID("$FreeBSD$");
|
||||
void swi_handler(struct trapframe *);
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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) {
|
||||
@ -141,15 +143,14 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
static void
|
||||
syscall(struct thread *td, struct trapframe *frame)
|
||||
{
|
||||
struct syscall_args sa;
|
||||
int error;
|
||||
|
||||
sa.nap = 4;
|
||||
td->td_sa.nap = 4;
|
||||
|
||||
error = syscallenter(td, &sa);
|
||||
error = syscallenter(td);
|
||||
KASSERT(error != 0 || td->td_ar == NULL,
|
||||
("returning from syscall with td_ar set!"));
|
||||
syscallret(td, error, &sa);
|
||||
syscallret(td, error);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -67,11 +67,15 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cloudabi32_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
struct trapframe *frame;
|
||||
struct syscall_args *sa;
|
||||
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)
|
||||
|
@ -92,15 +92,17 @@ call_trapsignal(struct thread *td, int sig, int code, void *addr)
|
||||
}
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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];
|
||||
|
||||
@ -132,12 +134,11 @@ cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
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, &sa);
|
||||
syscallret(td, error, &sa);
|
||||
error = syscallenter(td);
|
||||
syscallret(td, error);
|
||||
} else {
|
||||
call_trapsignal(td, SIGILL, ILL_ILLOPN, (void *)frame->tf_elr);
|
||||
userret(td, frame);
|
||||
|
@ -67,11 +67,15 @@ cloudabi64_proc_setregs(struct thread *td, struct image_params *imgp,
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi64_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cloudabi64_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
struct trapframe *frame;
|
||||
struct syscall_args *sa;
|
||||
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)
|
||||
|
@ -50,7 +50,7 @@
|
||||
#define IA32_MAXVMEM 0 /* Unlimited */
|
||||
|
||||
struct syscall_args;
|
||||
int ia32_fetch_syscall_args(struct thread *td, struct syscall_args *sa);
|
||||
int ia32_fetch_syscall_args(struct thread *td);
|
||||
void ia32_set_syscall_retval(struct thread *, int);
|
||||
void ia32_fixlimit(struct rlimit *rl, int which);
|
||||
|
||||
|
@ -85,11 +85,15 @@ cloudabi32_proc_setregs(struct thread *td, struct image_params *imgp,
|
||||
}
|
||||
|
||||
static int
|
||||
cloudabi32_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cloudabi32_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct trapframe *frame = td->td_frame;
|
||||
struct trapframe *frame;
|
||||
struct syscall_args *sa;
|
||||
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)
|
||||
|
@ -1012,16 +1012,18 @@ dblfault_handler()
|
||||
}
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
@ -1082,7 +1084,6 @@ void
|
||||
syscall(struct trapframe *frame)
|
||||
{
|
||||
struct thread *td;
|
||||
struct syscall_args sa;
|
||||
register_t orig_tf_eflags;
|
||||
int error;
|
||||
ksiginfo_t ksi;
|
||||
@ -1099,7 +1100,7 @@ syscall(struct trapframe *frame)
|
||||
td = curthread;
|
||||
td->td_frame = frame;
|
||||
|
||||
error = syscallenter(td, &sa);
|
||||
error = syscallenter(td);
|
||||
|
||||
/*
|
||||
* Traced syscall.
|
||||
@ -1115,10 +1116,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, sa.code)));
|
||||
syscallname(td->td_proc, td->td_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, sa.code)));
|
||||
syscallname(td->td_proc, td->td_sa.code)));
|
||||
|
||||
syscallret(td, error, &sa);
|
||||
syscallret(td, error);
|
||||
}
|
||||
|
@ -850,13 +850,15 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
|
||||
}
|
||||
|
||||
static int
|
||||
linux_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
linux_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
|
@ -360,8 +360,7 @@ SYSINIT(diagwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 2,
|
||||
#endif
|
||||
|
||||
static int
|
||||
null_fetch_syscall_args(struct thread *td __unused,
|
||||
struct syscall_args *sa __unused)
|
||||
null_fetch_syscall_args(struct thread *td __unused)
|
||||
{
|
||||
|
||||
panic("null_fetch_syscall_args");
|
||||
|
@ -1099,7 +1099,7 @@ fork_return(struct thread *td, struct trapframe *frame)
|
||||
*/
|
||||
PROC_LOCK(p);
|
||||
td->td_dbgflags |= TDB_SCX;
|
||||
_STOPEVENT(p, S_SCX, td->td_dbg_sc_code);
|
||||
_STOPEVENT(p, S_SCX, td->td_sa.code);
|
||||
if ((p->p_ptevents & PTRACE_SCX) != 0 ||
|
||||
(td->td_dbgflags & TDB_BORN) != 0)
|
||||
ptracestop(td, SIGTRAP, NULL);
|
||||
|
@ -80,9 +80,9 @@ _Static_assert(offsetof(struct thread, td_flags) == 0xf4,
|
||||
"struct thread KBI td_flags");
|
||||
_Static_assert(offsetof(struct thread, td_pflags) == 0xfc,
|
||||
"struct thread KBI td_pflags");
|
||||
_Static_assert(offsetof(struct thread, td_frame) == 0x410,
|
||||
_Static_assert(offsetof(struct thread, td_frame) == 0x460,
|
||||
"struct thread KBI td_frame");
|
||||
_Static_assert(offsetof(struct thread, td_emuldata) == 0x4b8,
|
||||
_Static_assert(offsetof(struct thread, td_emuldata) == 0x508,
|
||||
"struct thread KBI td_emuldata");
|
||||
_Static_assert(offsetof(struct proc, p_flag) == 0xb0,
|
||||
"struct proc KBI p_flag");
|
||||
@ -100,9 +100,9 @@ _Static_assert(offsetof(struct thread, td_flags) == 0x9c,
|
||||
"struct thread KBI td_flags");
|
||||
_Static_assert(offsetof(struct thread, td_pflags) == 0xa4,
|
||||
"struct thread KBI td_pflags");
|
||||
_Static_assert(offsetof(struct thread, td_frame) == 0x2c8,
|
||||
_Static_assert(offsetof(struct thread, td_frame) == 0x2ec,
|
||||
"struct thread KBI td_frame");
|
||||
_Static_assert(offsetof(struct thread, td_emuldata) == 0x314,
|
||||
_Static_assert(offsetof(struct thread, td_emuldata) == 0x338,
|
||||
"struct thread KBI td_emuldata");
|
||||
_Static_assert(offsetof(struct proc, p_flag) == 0x68,
|
||||
"struct proc KBI p_flag");
|
||||
|
@ -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 :
|
||||
|
@ -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_dbg_sc_code;
|
||||
pl->pl_syscall_narg = td2->td_dbg_sc_narg;
|
||||
pl->pl_syscall_code = td2->td_sa.code;
|
||||
pl->pl_syscall_narg = td2->td_sa.narg;
|
||||
} else {
|
||||
pl->pl_syscall_code = 0;
|
||||
pl->pl_syscall_narg = 0;
|
||||
|
@ -334,12 +334,16 @@ static int emulate_unaligned_access(struct trapframe *frame, int mode);
|
||||
extern void fswintrberr(void); /* XXX */
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct trapframe *locr0 = td->td_frame;
|
||||
struct trapframe *locr0;
|
||||
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 */
|
||||
@ -785,19 +789,18 @@ trap(struct trapframe *trapframe)
|
||||
|
||||
case T_SYSCALL + T_USER:
|
||||
{
|
||||
struct syscall_args sa;
|
||||
int error;
|
||||
|
||||
sa.trapframe = trapframe;
|
||||
error = syscallenter(td, &sa);
|
||||
td->td_sa.trapframe = trapframe;
|
||||
error = syscallenter(td);
|
||||
|
||||
#if !defined(SMP) && (defined(DDB) || defined(DEBUG))
|
||||
if (trp == trapdebug)
|
||||
trapdebug[TRAPSIZE - 1].code = sa.code;
|
||||
trapdebug[TRAPSIZE - 1].code = td->td_sa.code;
|
||||
else
|
||||
trp[-1].code = sa.code;
|
||||
trp[-1].code = td->td_sa.code;
|
||||
#endif
|
||||
trapdebug_enter(td->td_frame, -sa.code);
|
||||
trapdebug_enter(td->td_frame, -td->td_sa.code);
|
||||
|
||||
/*
|
||||
* The sync'ing of I & D caches for SYS_ptrace() is
|
||||
@ -805,7 +808,7 @@ trap(struct trapframe *trapframe)
|
||||
* instead of being done here under a special check
|
||||
* for SYS_ptrace().
|
||||
*/
|
||||
syscallret(td, error, &sa);
|
||||
syscallret(td, error);
|
||||
return (trapframe->pc);
|
||||
}
|
||||
|
||||
|
@ -496,16 +496,18 @@ handle_onfault(struct trapframe *frame)
|
||||
}
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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);
|
||||
@ -587,7 +589,6 @@ void
|
||||
syscall(struct trapframe *frame)
|
||||
{
|
||||
struct thread *td;
|
||||
struct syscall_args sa;
|
||||
int error;
|
||||
|
||||
td = curthread;
|
||||
@ -602,8 +603,8 @@ syscall(struct trapframe *frame)
|
||||
"r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE));
|
||||
#endif
|
||||
|
||||
error = syscallenter(td, &sa);
|
||||
syscallret(td, error, &sa);
|
||||
error = syscallenter(td);
|
||||
syscallret(td, error);
|
||||
}
|
||||
|
||||
#if defined(__powerpc64__) && defined(AIM)
|
||||
|
@ -89,14 +89,16 @@ call_trapsignal(struct thread *td, int sig, int code, void *addr)
|
||||
}
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
struct proc *p;
|
||||
register_t *ap;
|
||||
struct syscall_args *sa;
|
||||
int nap;
|
||||
|
||||
nap = NARGREG;
|
||||
p = td->td_proc;
|
||||
sa = &td->td_sa;
|
||||
ap = &td->td_frame->tf_a[0];
|
||||
|
||||
sa->code = td->td_frame->tf_t[0];
|
||||
@ -151,15 +153,14 @@ 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, &sa);
|
||||
syscallret(td, error, &sa);
|
||||
error = syscallenter(td);
|
||||
syscallret(td, error);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -538,17 +538,19 @@ trap_pfault(struct thread *td, struct trapframe *tf)
|
||||
#define REG_MAXARGS 6
|
||||
|
||||
int
|
||||
cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
|
||||
cpu_fetch_syscall_args(struct thread *td)
|
||||
{
|
||||
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;
|
||||
|
||||
@ -596,7 +598,6 @@ void
|
||||
syscall(struct trapframe *tf)
|
||||
{
|
||||
struct thread *td;
|
||||
struct syscall_args sa;
|
||||
int error;
|
||||
|
||||
td = curthread;
|
||||
@ -612,6 +613,6 @@ syscall(struct trapframe *tf)
|
||||
td->td_pcb->pcb_tpc = tf->tf_tpc;
|
||||
TF_DONE(tf);
|
||||
|
||||
error = syscallenter(td, &sa);
|
||||
syscallret(td, error, &sa);
|
||||
error = syscallenter(td);
|
||||
syscallret(td, error);
|
||||
}
|
||||
|
@ -142,6 +142,7 @@ 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,11 +297,11 @@ 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_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. */
|
||||
struct syscall_args td_sa; /* (kx) Syscall parameters. Copied on
|
||||
fork for child tracing. */
|
||||
#define td_endcopy td_pcb
|
||||
|
||||
/*
|
||||
@ -1053,7 +1054,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, struct syscall_args *sa);
|
||||
int cpu_fetch_syscall_args(struct thread *td);
|
||||
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);
|
||||
|
@ -119,8 +119,7 @@ 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 *, struct
|
||||
syscall_args *);
|
||||
int (*sv_fetch_syscall_args)(struct thread *);
|
||||
const char **sv_syscallnames;
|
||||
vm_offset_t sv_timekeep_base;
|
||||
vm_offset_t sv_shared_page_base;
|
||||
|
Loading…
Reference in New Issue
Block a user