diff --git a/lib/libsysdecode/mktables b/lib/libsysdecode/mktables --- a/lib/libsysdecode/mktables +++ b/lib/libsysdecode/mktables @@ -116,7 +116,7 @@ gen_table "pathconfname" "_PC_[A-Z4_]+[[:space:]]+[0-9]+" "sys/unistd.h" gen_table "prio" "PRIO_[A-Z]+[[:space:]]+[0-9]" "sys/resource.h" gen_table "procctlcmd" "PROC_[A-Z_]+[[:space:]]+[0-9]" "sys/procctl.h" "PROC_TRACE_CTL_" -gen_table "ptraceop" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h" "PT_GET_SC_ARGS_ALL" +gen_table "ptraceop" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h" gen_table "quotactlcmds" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h" gen_table "rebootopt" "RB_[A-Z]+[[:space:]]+0x[0-9]+" "sys/reboot.h" gen_table "rforkflags" "RF[A-Z]+[[:space:]]+\([0-9]+<<[0-9]+\)" "sys/unistd.h" diff --git a/sys/amd64/linux/linux_ptrace.c b/sys/amd64/linux/linux_ptrace.c --- a/sys/amd64/linux/linux_ptrace.c +++ b/sys/amd64/linux/linux_ptrace.c @@ -544,17 +544,19 @@ si.op = LINUX_PTRACE_SYSCALL_INFO_ENTRY; si.entry.nr = lwpinfo.pl_syscall_code; /* - * The reason for using PT_GET_SC_ARGS_ALL instead - * of PT_GET_SC_ARGS is to emulate Linux bug which strace(1) - * depends on: at initialization it tests whether ptrace works - * by calling close(2), or some other single-argument syscall, - * _with six arguments_, and then verifies whether it can - * fetch them all using this API; otherwise it bails out. + * The use of PT_GET_SC_ARGS there is special, + * implementation of PT_GET_SC_ARGS for Linux-ABI + * callers emulates Linux bug which strace(1) depends + * on: at initialization it tests whether ptrace works + * by calling close(2), or some other single-argument + * syscall, _with six arguments_, and then verifies + * whether it can fetch them all using this API; + * otherwise it bails out. */ - error = kern_ptrace(td, PT_GET_SC_ARGS_ALL, pid, + error = kern_ptrace(td, PT_GET_SC_ARGS, pid, &si.entry.args, sizeof(si.entry.args)); if (error != 0) { - linux_msg(td, "PT_GET_SC_ARGS_ALL failed with error %d", + linux_msg(td, "PT_GET_SC_ARGS failed with error %d", error); return (error); } diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -1032,9 +1032,6 @@ r.pc.pc_limit = PAIR32TO64(off_t, r32.pc.pc_limit); data = sizeof(r.pc); break; - case PT_GET_SC_ARGS_ALL: - error = EINVAL; - break; default: addr = uap->addr; break; diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -762,6 +762,7 @@ return (NULL); } td->td_tid = tid; + bzero(&td->td_sa.args, sizeof(td->td_sa.args)); kmsan_thread_alloc(td); cpu_thread_alloc(td); EVENTHANDLER_DIRECT_INVOKE(thread_ctor, td); diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -527,9 +527,6 @@ else error = copyin(uap->addr, &r.pc, uap->data); break; - case PT_GET_SC_ARGS_ALL: - error = EINVAL; - break; default: addr = uap->addr; break; @@ -711,7 +708,6 @@ case PT_SET_EVENT_MASK: case PT_DETACH: case PT_GET_SC_ARGS: - case PT_GET_SC_ARGS_ALL: sx_xlock(&proctree_lock); proctree_locked = true; break; @@ -1011,21 +1007,10 @@ break; } bzero(addr, sizeof(td2->td_sa.args)); - bcopy(td2->td_sa.args, addr, td2->td_sa.callp->sy_narg * - sizeof(register_t)); - break; - - case PT_GET_SC_ARGS_ALL: - CTR1(KTR_PTRACE, "PT_GET_SC_ARGS_ALL: pid %d", p->p_pid); - if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) == 0 -#ifdef COMPAT_FREEBSD32 - || (wrap32 && !safe) -#endif - ) { - error = EINVAL; - break; - } - bcopy(td2->td_sa.args, addr, sizeof(td2->td_sa.args)); + /* See the explanation in linux_ptrace_get_syscall_info(). */ + bcopy(td2->td_sa.args, addr, SV_PROC_ABI(td->td_proc) == + SV_ABI_LINUX ? sizeof(td2->td_sa.args) : + td2->td_sa.callp->sy_narg * sizeof(register_t)); break; case PT_GET_SC_RET: diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h --- a/sys/sys/ptrace.h +++ b/sys/sys/ptrace.h @@ -86,10 +86,6 @@ #define PT_VM_TIMESTAMP 40 /* Get VM version (timestamp) */ #define PT_VM_ENTRY 41 /* Get VM map (entry) */ -#ifdef _KERNEL -#define PT_GET_SC_ARGS_ALL 42 /* Used by linux(4) */ -#endif - #define PT_FIRSTMACH 64 /* for machine-specific requests */ #include /* machine-specific requests, if any */