#ifndef _SYS_PTRACE_H_
#define _SYS_PTRACE_H_
#include <sys/signal.h>
#include <sys/param.h>
#include <machine/reg.h>
#define PT_TRACE_ME 0
#define PT_READ_I 1
#define PT_READ_D 2
#define PT_WRITE_I 4
#define PT_WRITE_D 5
#define PT_CONTINUE 7
#define PT_KILL 8
#define PT_STEP 9
#define PT_ATTACH 10
#define PT_DETACH 11
#define PT_IO 12
#define PT_LWPINFO 13
#define PT_GETNUMLWPS 14
#define PT_GETLWPLIST 15
#define PT_CLEARSTEP 16
#define PT_SETSTEP 17
#define PT_SUSPEND 18
#define PT_RESUME 19
#define PT_TO_SCE 20
#define PT_TO_SCX 21
#define PT_SYSCALL 22
#define PT_FOLLOW_FORK 23
#define PT_LWP_EVENTS 24
#define PT_GET_EVENT_MASK 25
#define PT_SET_EVENT_MASK 26
#define PT_GET_SC_ARGS 27
#define PT_GET_SC_RET 28
#define PT_COREDUMP 29
#define PT_GETREGS 33
#define PT_SETREGS 34
#define PT_GETFPREGS 35
#define PT_SETFPREGS 36
#define PT_GETDBREGS 37
#define PT_SETDBREGS 38
#define PT_VM_TIMESTAMP 40
#define PT_VM_ENTRY 41
#define PT_GETREGSET 42
#define PT_SETREGSET 43
#define PT_SC_REMOTE 44
#define PT_FIRSTMACH 64
#define PT_LASTMACH 127
#include <machine/ptrace.h>
#ifdef _KERNEL
#define PTINTERNAL_FIRST 128
#define PTINTERNAL_LAST 191
#define PTLINUX_GET_SC_ARGS (PTINTERNAL_FIRST + 0)
#endif
#define PTRACE_EXEC 0x0001
#define PTRACE_SCE 0x0002
#define PTRACE_SCX 0x0004
#define PTRACE_SYSCALL (PTRACE_SCE | PTRACE_SCX)
#define PTRACE_FORK 0x0008
#define PTRACE_LWP 0x0010
#define PTRACE_VFORK 0x0020
#define PTRACE_DEFAULT (PTRACE_EXEC)
struct ptrace_io_desc {
int piod_op;
void *piod_offs;
void *piod_addr;
size_t piod_len;
};
#define PIOD_READ_D 1
#define PIOD_WRITE_D 2
#define PIOD_READ_I 3
#define PIOD_WRITE_I 4
struct ptrace_lwpinfo {
lwpid_t pl_lwpid;
int pl_event;
#define PL_EVENT_NONE 0
#define PL_EVENT_SIGNAL 1
int pl_flags;
#define PL_FLAG_SA 0x01
#define PL_FLAG_BOUND 0x02
#define PL_FLAG_SCE 0x04
#define PL_FLAG_SCX 0x08
#define PL_FLAG_EXEC 0x10
#define PL_FLAG_SI 0x20
#define PL_FLAG_FORKED 0x40
#define PL_FLAG_CHILD 0x80
#define PL_FLAG_BORN 0x100
#define PL_FLAG_EXITED 0x200
#define PL_FLAG_VFORKED 0x400
#define PL_FLAG_VFORK_DONE 0x800
sigset_t pl_sigmask;
sigset_t pl_siglist;
struct __siginfo pl_siginfo;
char pl_tdname[MAXCOMLEN + 1];
pid_t pl_child_pid;
u_int pl_syscall_code;
u_int pl_syscall_narg;
};
#if defined(_WANT_LWPINFO32) || (defined(_KERNEL) && defined(__LP64__))
struct ptrace_lwpinfo32 {
lwpid_t pl_lwpid;
int pl_event;
int pl_flags;
sigset_t pl_sigmask;
sigset_t pl_siglist;
struct __siginfo32 pl_siginfo;
char pl_tdname[MAXCOMLEN + 1];
pid_t pl_child_pid;
u_int pl_syscall_code;
u_int pl_syscall_narg;
};
#endif
struct ptrace_sc_ret {
syscallarg_t sr_retval[2];
int sr_error;
};
struct ptrace_vm_entry {
int pve_entry;
int pve_timestamp;
u_long pve_start;
u_long pve_end;
u_long pve_offset;
u_int pve_prot;
u_int pve_pathlen;
long pve_fileid;
uint32_t pve_fsid;
char *pve_path;
};
struct ptrace_coredump {
int pc_fd;
uint32_t pc_flags;
off_t pc_limit;
};
#define PC_COMPRESS 0x00000001
#define PC_ALL 0x00000002
struct ptrace_sc_remote {
struct ptrace_sc_ret pscr_ret;
u_int pscr_syscall;
u_int pscr_nargs;
syscallarg_t *pscr_args;
};
#ifdef _KERNEL
#include <sys/proc.h>
struct thr_coredump_req {
struct vnode *tc_vp;
off_t tc_limit;
int tc_flags;
int tc_error;
};
struct thr_syscall_req {
struct ptrace_sc_ret ts_ret;
u_int ts_nargs;
struct syscall_args ts_sa;
};
int ptrace_set_pc(struct thread *_td, unsigned long _addr);
int ptrace_single_step(struct thread *_td);
int ptrace_clear_single_step(struct thread *_td);
#ifdef __HAVE_PTRACE_MACHDEP
int cpu_ptrace(struct thread *_td, int _req, void *_addr, int _data);
#endif
struct reg;
struct fpreg;
struct dbreg;
struct uio;
int proc_read_regs(struct thread *_td, struct reg *_reg);
int proc_write_regs(struct thread *_td, struct reg *_reg);
int proc_read_fpregs(struct thread *_td, struct fpreg *_fpreg);
int proc_write_fpregs(struct thread *_td, struct fpreg *_fpreg);
int proc_read_dbregs(struct thread *_td, struct dbreg *_dbreg);
int proc_write_dbregs(struct thread *_td, struct dbreg *_dbreg);
int proc_sstep(struct thread *_td);
int proc_rwmem(struct proc *_p, struct uio *_uio);
ssize_t proc_readmem(struct thread *_td, struct proc *_p, vm_offset_t _va,
void *_buf, size_t _len);
ssize_t proc_writemem(struct thread *_td, struct proc *_p, vm_offset_t _va,
void *_buf, size_t _len);
#ifdef COMPAT_FREEBSD32
struct reg32;
struct fpreg32;
struct dbreg32;
int proc_read_regs32(struct thread *_td, struct reg32 *_reg32);
int proc_write_regs32(struct thread *_td, struct reg32 *_reg32);
int proc_read_fpregs32(struct thread *_td, struct fpreg32 *_fpreg32);
int proc_write_fpregs32(struct thread *_td, struct fpreg32 *_fpreg32);
int proc_read_dbregs32(struct thread *_td, struct dbreg32 *_dbreg32);
int proc_write_dbregs32(struct thread *_td, struct dbreg32 *_dbreg32);
#endif
void ptrace_unsuspend(struct proc *p);
extern bool allow_ptrace;
#else
#include <sys/cdefs.h>
__BEGIN_DECLS
int ptrace(int _request, pid_t _pid, caddr_t _addr, int _data);
__END_DECLS
#endif
#endif