Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F108994183
D28212.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D28212.diff
View Options
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"
+gen_table "ptraceop" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h" "PT_GET_SC_ARGS_ALL"
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
@@ -93,6 +93,12 @@
LINUX_PTRACE_O_TRACESECCOMP | LINUX_PTRACE_O_EXITKILL | \
LINUX_PTRACE_O_SUSPEND_SECCOMP)
+#define LINUX_PTRACE_SYSCALL_INFO_NONE 0
+#define LINUX_PTRACE_SYSCALL_INFO_ENTRY 1
+#define LINUX_PTRACE_SYSCALL_INFO_EXIT 2
+
+#define LINUX_ARCH_AMD64 0xc000003e
+
static int
map_signum(int lsig, int *bsigp)
{
@@ -172,6 +178,28 @@
l_ulong ss;
};
+struct syscall_info {
+ uint8_t op;
+ uint32_t arch;
+ uint64_t instruction_pointer;
+ uint64_t stack_pointer;
+ union {
+ struct {
+ uint64_t nr;
+ uint64_t args[6];
+ } entry;
+ struct {
+ int64_t rval;
+ uint8_t is_error;
+ } exit;
+ struct {
+ uint64_t nr;
+ uint64_t args[6];
+ uint32_t ret_data;
+ } seccomp;
+ };
+};
+
/*
* Translate amd64 ptrace registers between Linux and FreeBSD formats.
* The translation is pretty straighforward, for all registers but
@@ -495,11 +523,75 @@
}
static int
-linux_ptrace_get_syscall_info(struct thread *td, pid_t pid, l_ulong addr, l_ulong data)
+linux_ptrace_get_syscall_info(struct thread *td, pid_t pid,
+ l_ulong addr, l_ulong data)
{
+ struct ptrace_lwpinfo lwpinfo;
+ struct ptrace_sc_ret sr;
+ struct reg b_reg;
+ struct syscall_info si;
+ int error;
- linux_msg(td, "PTRACE_GET_SYSCALL_INFO not implemented; returning EINVAL");
- return (EINVAL);
+ error = kern_ptrace(td, PT_LWPINFO, pid, &lwpinfo, sizeof(lwpinfo));
+ if (error != 0) {
+ linux_msg(td, "PT_LWPINFO failed with error %d", error);
+ return (error);
+ }
+
+ memset(&si, 0, sizeof(si));
+
+ if (lwpinfo.pl_flags & PL_FLAG_SCE) {
+ 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.
+ */
+ error = kern_ptrace(td, PT_GET_SC_ARGS_ALL, pid,
+ &si.entry.args, sizeof(si.entry.args));
+ if (error != 0) {
+ linux_msg(td, "PT_GET_SC_ARGS_ALL failed with error %d",
+ error);
+ return (error);
+ }
+ } else if (lwpinfo.pl_flags & PL_FLAG_SCX) {
+ si.op = LINUX_PTRACE_SYSCALL_INFO_EXIT;
+ error = kern_ptrace(td, PT_GET_SC_RET, pid, &sr, sizeof(sr));
+
+ if (error != 0) {
+ linux_msg(td, "PT_GET_SC_RET failed with error %d",
+ error);
+ return (error);
+ }
+
+ if (sr.sr_error == 0) {
+ si.exit.rval = sr.sr_retval[0];
+ si.exit.is_error = 0;
+ } else {
+ si.exit.rval = bsd_to_linux_errno(sr.sr_error);
+ si.exit.is_error = 1;
+ }
+ } else {
+ si.op = LINUX_PTRACE_SYSCALL_INFO_NONE;
+ }
+
+ error = kern_ptrace(td, PT_GETREGS, pid, &b_reg, 0);
+ if (error != 0)
+ return (error);
+
+ si.arch = LINUX_ARCH_AMD64;
+ si.instruction_pointer = b_reg.r_rip;
+ si.stack_pointer = b_reg.r_rsp;
+
+ error = copyout(&si, (void *)data, sizeof(si));
+ if (error == 0)
+ td->td_retval[0] = sizeof(si);
+
+ return (error);
}
int
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,6 +1032,9 @@
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/sys_process.c b/sys/kern/sys_process.c
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -527,6 +527,9 @@
else
error = copyin(uap->addr, &r.pc, uap->data);
break;
+ case PT_GET_SC_ARGS_ALL:
+ error = EINVAL;
+ break;
default:
addr = uap->addr;
break;
@@ -708,6 +711,7 @@
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,6 +1015,19 @@
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));
+ break;
+
case PT_GET_SC_RET:
if ((td2->td_dbgflags & (TDB_SCX)) == 0
#ifdef COMPAT_FREEBSD32
diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h
--- a/sys/sys/ptrace.h
+++ b/sys/sys/ptrace.h
@@ -86,6 +86,10 @@
#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/ptrace.h> /* machine-specific requests, if any */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 31, 10:08 AM (14 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16360444
Default Alt Text
D28212.diff (5 KB)
Attached To
Mode
D28212: linux: implement PTRACE_GET_SYSCALL_INFO
Attached
Detach File
Event Timeline
Log In to Comment