Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux_ptrace.c
Show First 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | #define LINUX_PTRACE_O_MASK (LINUX_PTRACE_O_TRACESYSGOOD | \ | ||||
LINUX_PTRACE_O_TRACEVFORKDONE | LINUX_PTRACE_O_TRACEEXIT | \ | LINUX_PTRACE_O_TRACEVFORKDONE | LINUX_PTRACE_O_TRACEEXIT | \ | ||||
LINUX_PTRACE_O_TRACESECCOMP | LINUX_PTRACE_O_EXITKILL | \ | LINUX_PTRACE_O_TRACESECCOMP | LINUX_PTRACE_O_EXITKILL | \ | ||||
LINUX_PTRACE_O_SUSPEND_SECCOMP) | LINUX_PTRACE_O_SUSPEND_SECCOMP) | ||||
#define LINUX_PTRACE_SYSCALL_INFO_NONE 0 | #define LINUX_PTRACE_SYSCALL_INFO_NONE 0 | ||||
#define LINUX_PTRACE_SYSCALL_INFO_ENTRY 1 | #define LINUX_PTRACE_SYSCALL_INFO_ENTRY 1 | ||||
#define LINUX_PTRACE_SYSCALL_INFO_EXIT 2 | #define LINUX_PTRACE_SYSCALL_INFO_EXIT 2 | ||||
#define LINUX_PTRACE_PEEKUSER_ORIG_RAX 120 | |||||
#define LINUX_PTRACE_PEEKUSER_RIP 128 | |||||
#define LINUX_PTRACE_PEEKUSER_CS 136 | |||||
#define LINUX_PTRACE_PEEKUSER_DS 184 | |||||
static int | static int | ||||
map_signum(int lsig, int *bsigp) | map_signum(int lsig, int *bsigp) | ||||
{ | { | ||||
int bsig; | int bsig; | ||||
if (lsig == 0) { | if (lsig == 0) { | ||||
*bsigp = 0; | *bsigp = 0; | ||||
return (0); | return (0); | ||||
▲ Show 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
int error; | int error; | ||||
error = kern_ptrace(td, PT_READ_I, pid, addr, 0); | error = kern_ptrace(td, PT_READ_I, pid, addr, 0); | ||||
if (error == 0) | if (error == 0) | ||||
error = copyout(td->td_retval, data, sizeof(l_int)); | error = copyout(td->td_retval, data, sizeof(l_int)); | ||||
else if (error == ENOMEM) | else if (error == ENOMEM) | ||||
error = EIO; | error = EIO; | ||||
td->td_retval[0] = error; | |||||
return (error); | |||||
} | |||||
static int | |||||
linux_ptrace_peekuser(struct thread *td, pid_t pid, void *addr, void *data) | |||||
{ | |||||
struct reg b_reg; | |||||
uint64_t val; | |||||
int error; | |||||
error = kern_ptrace(td, PT_GETREGS, pid, &b_reg, 0); | |||||
if (error != 0) | |||||
return (error); | |||||
switch ((uintptr_t)addr) { | |||||
#ifdef __amd64__ | |||||
case LINUX_PTRACE_PEEKUSER_ORIG_RAX: | |||||
val = b_reg.r_rax; | |||||
break; | |||||
case LINUX_PTRACE_PEEKUSER_RIP: | |||||
val = b_reg.r_rip; | |||||
break; | |||||
case LINUX_PTRACE_PEEKUSER_CS: | |||||
val = b_reg.r_cs; | |||||
break; | |||||
case LINUX_PTRACE_PEEKUSER_DS: | |||||
val = b_reg.r_ds; | |||||
break; | |||||
#endif /* __amd64__ */ | |||||
default: | |||||
linux_msg(td, "PTRACE_PEEKUSER offset %ld not implemented; " | |||||
"returning EINVAL", (uintptr_t)addr); | |||||
return (EINVAL); | |||||
} | |||||
error = copyout(&val, data, sizeof(val)); | |||||
td->td_retval[0] = error; | td->td_retval[0] = error; | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
linux_ptrace_pokeuser(struct thread *td, pid_t pid, void *addr, void *data) | linux_ptrace_pokeuser(struct thread *td, pid_t pid, void *addr, void *data) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 396 Lines • Show Last 20 Lines |