1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr, unsigned long, data) { struct task_struct *child; long ret;
child = find_get_task_by_vpid(pid); if (!child) return -ESRCH;
if (!may_attach(child)) { put_task_struct(child); return -EPERM; }
ret = ptrace_check_attach(child, request == PTRACE_KILL);
switch (request) { case PTRACE_TRACEME: ret = ptrace_traceme(); break;
case PTRACE_ATTACH: ret = ptrace_attach(child, data); break;
case PTRACE_SETOPTIONS: ret = ptrace_set_options(child, data); break;
case PTRACE_GETREGS: ret = ptrace_get_regs(child, (void __user *)data); break;
case PTRACE_SETREGS: ret = ptrace_set_regs(child, (void __user *)data); break;
case PTRACE_CONT: ret = ptrace_resume(child, data); break;
case PTRACE_SINGLESTEP: ret = ptrace_singlestep(child, data); break;
case PTRACE_PEEKTEXT: case PTRACE_PEEKDATA: ret = ptrace_peek_data(child, addr, (void __user *)data); break;
case PTRACE_POKETEXT: case PTRACE_POKEDATA: ret = ptrace_poke_data(child, addr, (void __user *)data); break;
default: ret = arch_ptrace(child, request, addr, data); break; }
put_task_struct(child); return ret; }
|