1 /* $NetBSD: ptrace.h,v 1.46 2015/07/02 03:47:54 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 1984, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * @(#)ptrace.h 8.2 (Berkeley) 1/4/94 32 */ 33 34 #ifndef _SYS_PTRACE_H_ 35 #define _SYS_PTRACE_H_ 36 37 #define PT_TRACE_ME 0 /* child declares it's being traced */ 38 #define PT_READ_I 1 /* read word in child's I space */ 39 #define PT_READ_D 2 /* read word in child's D space */ 40 #define PT_WRITE_I 4 /* write word in child's I space */ 41 #define PT_WRITE_D 5 /* write word in child's D space */ 42 #define PT_CONTINUE 7 /* continue the child */ 43 #define PT_KILL 8 /* kill the child process */ 44 #define PT_ATTACH 9 /* attach to running process */ 45 #define PT_DETACH 10 /* detach from running process */ 46 #define PT_IO 11 /* do I/O to/from the stopped process */ 47 #define PT_DUMPCORE 12 /* make child generate a core dump */ 48 #define PT_LWPINFO 13 /* get info about the LWP */ 49 #define PT_SYSCALL 14 /* stop on syscall entry/exit */ 50 #define PT_SYSCALLEMU 15 /* cancel syscall, tracer emulates it */ 51 #define PT_SET_EVENT_MASK 16 /* set the event mask, defined below */ 52 #define PT_GET_EVENT_MASK 17 /* get the event mask, defined below */ 53 #define PT_GET_PROCESS_STATE 18 /* get process state, defined below */ 54 55 #define PT_FIRSTMACH 32 /* for machine-specific requests */ 56 #include <machine/ptrace.h> /* machine-specific requests, if any */ 57 58 #define PT_STRINGS \ 59 /* 0 */ "PT_TRACE_ME", \ 60 /* 1 */ "PT_READ_I", \ 61 /* 2 */ "PT_READ_D", \ 62 /* 3 */ "*PT_INVALID_3*", \ 63 /* 4 */ "PT_WRITE_I", \ 64 /* 5 */ "PT_WRITE_D", \ 65 /* 6 */ "*PT_INVALID_6*", \ 66 /* 7 */ "PT_CONTINUE", \ 67 /* 8 */ "PT_KILL", \ 68 /* 9 */ "PT_ATTACH", \ 69 /* 10 */ "PT_DETACH", \ 70 /* 11 */ "PT_IO", \ 71 /* 12 */ "PT_DUMPCORE", \ 72 /* 13 */ "PT_LWPINFO", \ 73 /* 14 */ "PT_SYSCALL", \ 74 /* 15 */ "PT_SYSCALLEMU", \ 75 /* 16 */ "PT_SET_EVENT_MASK", \ 76 /* 17 */ "PT_GET_EVENT_MASK", \ 77 /* 18 */ "PT_GET_PROCESS_STATE", 78 79 /* PT_{G,S}EVENT_MASK */ 80 typedef struct ptrace_event { 81 int pe_set_event; 82 } ptrace_event_t; 83 84 /* PT_GET_PROCESS_STATE */ 85 typedef struct ptrace_state { 86 int pe_report_event; 87 pid_t pe_other_pid; 88 } ptrace_state_t; 89 90 #define PTRACE_FORK 0x0001 /* Report forks */ 91 92 /* 93 * Argument structure for PT_IO. 94 */ 95 struct ptrace_io_desc { 96 int piod_op; /* I/O operation (see below) */ 97 void *piod_offs; /* child offset */ 98 void *piod_addr; /* parent offset */ 99 size_t piod_len; /* request length (in)/actual count (out) */ 100 }; 101 102 /* piod_op */ 103 #define PIOD_READ_D 1 /* read from D space */ 104 #define PIOD_WRITE_D 2 /* write to D spcae */ 105 #define PIOD_READ_I 3 /* read from I space */ 106 #define PIOD_WRITE_I 4 /* write to I space */ 107 #define PIOD_READ_AUXV 5 /* Read from aux array */ 108 109 /* 110 * Argument structure for PT_LWPINFO. 111 */ 112 struct ptrace_lwpinfo { 113 lwpid_t pl_lwpid; /* LWP described */ 114 int pl_event; /* Event that stopped the LWP */ 115 /* Add fields at the end */ 116 }; 117 118 #define PL_EVENT_NONE 0 119 #define PL_EVENT_SIGNAL 1 120 121 #ifdef _KERNEL 122 123 #if defined(PT_GETREGS) || defined(PT_SETREGS) 124 struct reg; 125 #ifndef process_reg32 126 #define process_reg32 struct reg 127 #endif 128 #ifndef process_reg64 129 #define process_reg64 struct reg 130 #endif 131 #endif 132 #if defined(PT_GETFPREGS) || defined(PT_SETFPREGS) 133 struct fpreg; 134 #ifndef process_fpreg32 135 #define process_fpreg32 struct fpreg 136 #endif 137 #ifndef process_fpreg64 138 #define process_fpreg64 struct fpreg 139 #endif 140 #endif 141 142 void ptrace_init(void); 143 144 int process_doregs(struct lwp *, struct lwp *, struct uio *); 145 int process_validregs(struct lwp *); 146 147 int process_dofpregs(struct lwp *, struct lwp *, struct uio *); 148 int process_validfpregs(struct lwp *); 149 150 int process_domem(struct lwp *, struct lwp *, struct uio *); 151 152 void process_stoptrace(void); 153 154 void proc_reparent(struct proc *, struct proc *); 155 156 /* 157 * 64bit architectures that support 32bit emulation (amd64 and sparc64) 158 * will #define process_read_regs32 to netbsd32_process_read_regs (etc). 159 * In all other cases these #defines drop the size suffix. 160 */ 161 #ifdef PT_GETFPREGS 162 int process_read_fpregs(struct lwp *, struct fpreg *, size_t *); 163 #ifndef process_read_fpregs32 164 #define process_read_fpregs32 process_read_fpregs 165 #endif 166 #ifndef process_read_fpregs64 167 #define process_read_fpregs64 process_read_fpregs 168 #endif 169 #endif 170 #ifdef PT_GETREGS 171 int process_read_regs(struct lwp *, struct reg *); 172 #ifndef process_read_regs32 173 #define process_read_regs32 process_read_regs 174 #endif 175 #ifndef process_read_regs64 176 #define process_read_regs64 process_read_regs 177 #endif 178 #endif 179 int process_set_pc(struct lwp *, void *); 180 int process_sstep(struct lwp *, int); 181 #ifdef PT_SETFPREGS 182 int process_write_fpregs(struct lwp *, const struct fpreg *, size_t); 183 #endif 184 #ifdef PT_SETREGS 185 int process_write_regs(struct lwp *, const struct reg *); 186 #endif 187 188 #ifdef __HAVE_PROCFS_MACHDEP 189 int ptrace_machdep_dorequest(struct lwp *, struct lwp *, int, 190 void *, int); 191 #endif 192 193 #ifndef FIX_SSTEP 194 #define FIX_SSTEP(p) 195 #endif 196 197 #else /* !_KERNEL */ 198 199 #include <sys/cdefs.h> 200 201 __BEGIN_DECLS 202 int ptrace(int _request, pid_t _pid, void *_addr, int _data); 203 __END_DECLS 204 205 #endif /* !_KERNEL */ 206 207 #if defined(__minix) 208 /* Trace options. */ 209 #define TO_TRACEFORK 0x1 /* automatically attach to forked children */ 210 #define TO_ALTEXEC 0x2 /* send SIGSTOP on successful exec() */ 211 #define TO_NOEXEC 0x4 /* do not send signal on successful exec() */ 212 213 /* Trace spaces. */ 214 #define TS_INS 0 /* text space */ 215 #define TS_DATA 1 /* data space */ 216 217 /* Trance range structure. */ 218 struct ptrace_range { 219 int pr_space; /* space in traced process */ 220 long pr_addr; /* address in traced process */ 221 void *pr_ptr; /* buffer in caller process */ 222 size_t pr_size; /* size of range, in bytes */ 223 }; 224 225 /* Trace requests aliases for minix. */ 226 #define T_OK PT_TRACE_ME /* enable tracing by parent for this process */ 227 #define T_GETINS PT_READ_I /* return value from instruction space */ 228 #define T_GETDATA PT_READ_D /* return value from data space */ 229 #define T_SETINS PT_WRITE_I /* set value from instruction space */ 230 #define T_SETDATA PT_WRITE_D /* set value from data space */ 231 #define T_RESUME PT_CONTINUE /* resume execution */ 232 #define T_EXIT PT_KILL /* exit */ 233 #define T_SYSCALL PT_SYSCALL /* trace system call */ 234 #define T_ATTACH PT_ATTACH /* attach to a running process */ 235 #define T_DETACH PT_DETACH /* detach from a traced process */ 236 237 /* Trace requests unique to minix */ 238 #define T_STOP -1 /* stop the process */ 239 #define T_READB_INS 100 /* Read a byte from the text segment of an 240 * untraced process (only for root) 241 */ 242 #define T_WRITEB_INS 101 /* Write a byte in the text segment of an 243 * untraced process (only for root) 244 */ 245 #define T_GETUSER 102 /* return value from user process table */ 246 #define T_SETUSER 103 /* set value in user process table */ 247 #define T_STEP 104 /* set trace bit */ 248 #define T_SETOPT 105 /* set trace options */ 249 #define T_GETRANGE 106 /* get range of values */ 250 #define T_SETRANGE 107 /* set range of values */ 251 252 #endif /* defined(__minix) */ 253 254 #endif /* !_SYS_PTRACE_H_ */ 255