diff options
| author | Daniel Jacobowitz <drow@nevyn.them.org> | 2002-09-17 11:50:35 -0400 |
|---|---|---|
| committer | Daniel Jacobowitz <drow@nevyn.them.org> | 2002-09-17 11:50:35 -0400 |
| commit | acc7088569c8eef04eeed0eff51d23bb5bcff964 (patch) | |
| tree | db94db9a51ff744719909b8f097f9d35635325e1 | |
| parent | 1ab068b34497d982070c6e29abff164c74a6302f (diff) | |
Factor out common ptrace code and PTRACE_SETOPTIONS
Support PTRACE_O_TRACESYSGOOD on all platforms
31 files changed, 98 insertions, 166 deletions
diff --git a/arch/alpha/kernel/ptrace.c b/arch/alpha/kernel/ptrace.c index c73317b256ae..1f9ac636c1dc 100644 --- a/arch/alpha/kernel/ptrace.c +++ b/arch/alpha/kernel/ptrace.c @@ -383,7 +383,7 @@ sys_ptrace(long request, long pid, long addr, long data, goto out; default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); goto out; } out: @@ -400,7 +400,8 @@ syscall_trace(void) return; if (!(current->ptrace & PT_PTRACED)) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 9f325ea5dda6..0ebfa584d5e1 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -629,16 +629,8 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat ret = ptrace_setfpregs(child, (void *)data); break; - case PTRACE_SETOPTIONS: - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } diff --git a/arch/cris/kernel/ptrace.c b/arch/cris/kernel/ptrace.c index 59f7d38fe4cd..b4e1f9282694 100644 --- a/arch/cris/kernel/ptrace.c +++ b/arch/cris/kernel/ptrace.c @@ -292,7 +292,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) } default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: @@ -307,10 +307,8 @@ asmlinkage void syscall_trace(void) if ((current->ptrace & (PT_PTRACED | PT_TRACESYS)) != (PT_PTRACED | PT_TRACESYS)) return; - /* TODO: make a way to distinguish between a syscall stop and SIGTRAP - * delivery like in the i386 port ? - */ - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/i386/kernel/ptrace.c b/arch/i386/kernel/ptrace.c index a10602335c56..60000c57ae3a 100644 --- a/arch/i386/kernel/ptrace.c +++ b/arch/i386/kernel/ptrace.c @@ -425,17 +425,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) break; } - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index 9a49666f2b6e..d6d18c90b758 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c @@ -3084,7 +3084,7 @@ sys32_ptrace (int request, pid_t pid, unsigned int addr, unsigned int data, break; default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 7b58ee45121a..b3b9ab4f4656 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c @@ -1268,16 +1268,8 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data, ret = ptrace_setregs(child, (struct pt_all_user_regs*) data); goto out_tsk; - case PTRACE_SETOPTIONS: - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); goto out_tsk; } out_tsk: diff --git a/arch/m68k/kernel/ptrace.c b/arch/m68k/kernel/ptrace.c index cba62cc1c115..f6522a41b6e9 100644 --- a/arch/m68k/kernel/ptrace.c +++ b/arch/m68k/kernel/ptrace.c @@ -355,7 +355,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) } default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: @@ -370,7 +370,8 @@ asmlinkage void syscall_trace(void) if (!current->thread.work.delayed_trace && !current->thread.work.syscall_trace) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 511ef439f4d2..90601f455433 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c @@ -304,16 +304,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) res = ptrace_detach(child, data); break; - case PTRACE_SETOPTIONS: - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - res = 0; - break; - default: - res = -EIO; + res = ptrace_request(child, request, addr, data); goto out; } out_tsk: diff --git a/arch/mips64/kernel/ptrace.c b/arch/mips64/kernel/ptrace.c index 874ccc438aa7..3f79d3db6989 100644 --- a/arch/mips64/kernel/ptrace.c +++ b/arch/mips64/kernel/ptrace.c @@ -275,17 +275,8 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) ret = ptrace_detach(child, data); break; - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } @@ -535,17 +526,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) ret = ptrace_detach(child, data); break; - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index d44e0238d8ac..aedcdbbeed07 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c @@ -244,7 +244,7 @@ long sys_ptrace(long request, pid_t pid, long addr, long data) goto out_tsk; default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); goto out_tsk; } @@ -269,7 +269,8 @@ void syscall_trace(void) if ((current->ptrace & (PT_PTRACED|PT_TRACESYS)) != (PT_PTRACED|PT_TRACESYS)) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/ppc/kernel/ptrace.c b/arch/ppc/kernel/ptrace.c index 3eda630f9977..dfc3b477ddd7 100644 --- a/arch/ppc/kernel/ptrace.c +++ b/arch/ppc/kernel/ptrace.c @@ -342,7 +342,7 @@ int sys_ptrace(long request, long pid, long addr, long data) #endif default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: @@ -357,7 +357,8 @@ void do_syscall_trace(void) if (!test_thread_flag(TIF_SYSCALL_TRACE) || !(current->ptrace & PT_PTRACED)) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/ppc64/kernel/ptrace.c b/arch/ppc64/kernel/ptrace.c index c71b738092d4..1b55b7903a30 100644 --- a/arch/ppc64/kernel/ptrace.c +++ b/arch/ppc64/kernel/ptrace.c @@ -258,7 +258,7 @@ int sys_ptrace(long request, long pid, long addr, long data) } default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: @@ -274,7 +274,8 @@ void do_syscall_trace(void) return; if (!(current->ptrace & PT_PTRACED)) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/ppc64/kernel/ptrace32.c b/arch/ppc64/kernel/ptrace32.c index cf863b29e2e0..441b9f3e1f02 100644 --- a/arch/ppc64/kernel/ptrace32.c +++ b/arch/ppc64/kernel/ptrace32.c @@ -345,7 +345,7 @@ int sys32_ptrace(long request, long pid, unsigned long addr, unsigned long data) break; default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index ff361cbc2abb..134146f80e2e 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c @@ -346,16 +346,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) ret=copy_user(child,parea.kernel_addr,parea.process_addr, parea.len,1,(request==PTRACE_POKEUSR_AREA)); break; - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: diff --git a/arch/s390x/kernel/ptrace.c b/arch/s390x/kernel/ptrace.c index bd3dd773a94b..9671740cc9c5 100644 --- a/arch/s390x/kernel/ptrace.c +++ b/arch/s390x/kernel/ptrace.c @@ -576,16 +576,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) parea.len,1,(request==PTRACE_POKEUSR_AREA)); } break; - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: diff --git a/arch/sh/kernel/ptrace.c b/arch/sh/kernel/ptrace.c index baee23d8e3b4..2ec58a8e9f84 100644 --- a/arch/sh/kernel/ptrace.c +++ b/arch/sh/kernel/ptrace.c @@ -356,17 +356,8 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data) ret = ptrace_detach(child, data); break; - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c index e7daf14ea25d..3af8e63ca653 100644 --- a/arch/sparc/kernel/ptrace.c +++ b/arch/sparc/kernel/ptrace.c @@ -584,10 +584,15 @@ asmlinkage void do_ptrace(struct pt_regs *regs) /* PTRACE_DUMPCORE unsupported... */ - default: - pt_error_return(regs, EIO); + default: { + int err = ptrace_request(child, request, addr, data); + if (err) + pt_error_return(regs, -err); + else + pt_succ_return(regs, 0); goto out_tsk; } + } out_tsk: if (child) put_task_struct(child); @@ -604,7 +609,8 @@ asmlinkage void syscall_trace(void) return; if (!(current->ptrace & PT_PTRACED)) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; current->thread.flags ^= MAGIC_CONSTANT; notify_parent(current, SIGCHLD); diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c index c1ef6e0c2b4c..7417163890b7 100644 --- a/arch/sparc64/kernel/ptrace.c +++ b/arch/sparc64/kernel/ptrace.c @@ -571,10 +571,15 @@ asmlinkage void do_ptrace(struct pt_regs *regs) /* PTRACE_DUMPCORE unsupported... */ - default: - pt_error_return(regs, EIO); + default: { + int err = ptrace_request(child, request, addr, data); + if (err) + pt_error_return(regs, -err); + else + pt_succ_return(regs, 0); goto out_tsk; } + } flush_and_out: { unsigned long va; @@ -612,7 +617,8 @@ asmlinkage void syscall_trace(void) return; if (!(current->ptrace & PT_PTRACED)) return; - current->exit_code = SIGTRAP; + current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) + ? 0x80 : 0); current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c index cc27bee8ee1c..38ecc525c40a 100644 --- a/arch/x86_64/ia32/ptrace32.c +++ b/arch/x86_64/ia32/ptrace32.c @@ -172,17 +172,6 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) __u32 val; switch (request) { - case PTRACE_TRACEME: - case PTRACE_ATTACH: - case PTRACE_SYSCALL: - case PTRACE_CONT: - case PTRACE_KILL: - case PTRACE_SINGLESTEP: - case PTRACE_DETACH: - case PTRACE_SETOPTIONS: - ret = sys_ptrace(request, pid, addr, data); - return ret; - case PTRACE_PEEKTEXT: case PTRACE_PEEKDATA: case PTRACE_POKEDATA: @@ -198,7 +187,8 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) break; default: - return -EIO; + ret = sys_ptrace(request, pid, addr, data); + return ret; } child = find_target(request, pid, &ret); diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c index c3420450439c..f74c9fe947c0 100644 --- a/arch/x86_64/kernel/ptrace.c +++ b/arch/x86_64/kernel/ptrace.c @@ -396,17 +396,8 @@ asmlinkage long sys_ptrace(long request, long pid, long addr, long data) break; } - case PTRACE_SETOPTIONS: { - if (data & PTRACE_O_TRACESYSGOOD) - child->ptrace |= PT_TRACESYSGOOD; - else - child->ptrace &= ~PT_TRACESYSGOOD; - ret = 0; - break; - } - default: - ret = -EIO; + ret = ptrace_request(child, request, addr, data); break; } out_tsk: diff --git a/include/asm-arm/ptrace.h b/include/asm-arm/ptrace.h index 0e4482b8c7ab..eaf50e3bd63e 100644 --- a/include/asm-arm/ptrace.h +++ b/include/asm-arm/ptrace.h @@ -6,10 +6,7 @@ #define PTRACE_GETFPREGS 14 #define PTRACE_SETFPREGS 15 -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #include <asm/proc/ptrace.h> diff --git a/include/asm-i386/ptrace.h b/include/asm-i386/ptrace.h index ae1ee677118d..4e72df9eb0dc 100644 --- a/include/asm-i386/ptrace.h +++ b/include/asm-i386/ptrace.h @@ -49,10 +49,7 @@ struct pt_regs { #define PTRACE_GETFPXREGS 18 #define PTRACE_SETFPXREGS 19 -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #ifdef __KERNEL__ #define user_mode(regs) ((VM_MASK & (regs)->eflags) || (3 & (regs)->xcs)) diff --git a/include/asm-ia64/ptrace.h b/include/asm-ia64/ptrace.h index 844975e0faf4..eb33ef4579f7 100644 --- a/include/asm-ia64/ptrace.h +++ b/include/asm-ia64/ptrace.h @@ -287,9 +287,6 @@ struct pt_all_user_regs { #define PTRACE_GETREGS 18 /* get all registers (pt_all_user_regs) in one shot */ #define PTRACE_SETREGS 19 /* set all registers (pt_all_user_regs) in one shot */ -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #endif /* _ASM_IA64_PTRACE_H */ diff --git a/include/asm-mips/ptrace.h b/include/asm-mips/ptrace.h index 39ac6cea4c49..c52592cbbbe0 100644 --- a/include/asm-mips/ptrace.h +++ b/include/asm-mips/ptrace.h @@ -59,10 +59,7 @@ struct pt_regs { /* #define PTRACE_GETFPXREGS 18 */ /* #define PTRACE_SETFPXREGS 19 */ -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #ifdef _LANGUAGE_ASSEMBLY #include <asm/offset.h> diff --git a/include/asm-mips64/ptrace.h b/include/asm-mips64/ptrace.h index 773f8a0c03c3..f62c31f83037 100644 --- a/include/asm-mips64/ptrace.h +++ b/include/asm-mips64/ptrace.h @@ -64,10 +64,7 @@ struct pt_regs { /* #define PTRACE_GETFPXREGS 18 */ /* #define PTRACE_SETFPXREGS 19 */ -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #ifdef _LANGUAGE_ASSEMBLY #include <asm/offset.h> diff --git a/include/asm-s390/ptrace.h b/include/asm-s390/ptrace.h index edc3b5b5c1f2..e631c7833816 100644 --- a/include/asm-s390/ptrace.h +++ b/include/asm-s390/ptrace.h @@ -105,10 +105,7 @@ #define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */ -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #ifndef __ASSEMBLY__ #include <linux/config.h> diff --git a/include/asm-s390x/ptrace.h b/include/asm-s390x/ptrace.h index 311d6624a6d0..590623ba5468 100644 --- a/include/asm-s390x/ptrace.h +++ b/include/asm-s390x/ptrace.h @@ -85,10 +85,7 @@ #define STACK_FRAME_OVERHEAD 160 /* size of minimum stack frame */ -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 #ifndef __ASSEMBLY__ #include <linux/config.h> diff --git a/include/asm-sh/ptrace.h b/include/asm-sh/ptrace.h index a799e15f90de..71333b7415a8 100644 --- a/include/asm-sh/ptrace.h +++ b/include/asm-sh/ptrace.h @@ -44,10 +44,7 @@ #define REG_XDREG14 47 #define REG_FPSCR 48 -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 /* * This struct defines the way the registers are stored on the diff --git a/include/asm-x86_64/ptrace.h b/include/asm-x86_64/ptrace.h index 0de905b1137b..15f69a1a6bf7 100644 --- a/include/asm-x86_64/ptrace.h +++ b/include/asm-x86_64/ptrace.h @@ -32,10 +32,7 @@ /* top of stack page */ #define FRAME_SIZE 168 -#define PTRACE_SETOPTIONS 21 - -/* options set using PTRACE_SETOPTIONS */ -#define PTRACE_O_TRACESYSGOOD 0x00000001 +#define PTRACE_OLDSETOPTIONS 21 /* Dummy values for ptrace */ #define FS 1000 diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index a0378ef64867..8d4f8dcefbab 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h @@ -23,6 +23,12 @@ #define PTRACE_SYSCALL 24 +/* 0x4200-0x4300 are reserved for architecture-independent additions. */ +#define PTRACE_SETOPTIONS 0x4200 + +/* options set using PTRACE_SETOPTIONS */ +#define PTRACE_O_TRACESYSGOOD 0x00000001 + #include <asm/ptrace.h> #include <linux/sched.h> @@ -32,6 +38,7 @@ extern int ptrace_attach(struct task_struct *tsk); extern int ptrace_detach(struct task_struct *, unsigned int); extern void ptrace_disable(struct task_struct *); extern int ptrace_check_attach(struct task_struct *task, int kill); +extern int ptrace_request(struct task_struct *child, long request, long addr, long data); extern void __ptrace_link(struct task_struct *child, struct task_struct *new_parent); extern void __ptrace_unlink(struct task_struct *child); diff --git a/kernel/ptrace.c b/kernel/ptrace.c index cc7a76bb65b7..ab3aa39a38cf 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -248,3 +248,35 @@ int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int } return copied; } + +int ptrace_setoptions(struct task_struct *child, long data) +{ + if (data & PTRACE_O_TRACESYSGOOD) + child->ptrace |= PT_TRACESYSGOOD; + else + child->ptrace &= ~PT_TRACESYSGOOD; + + if ((data & PTRACE_O_TRACESYSGOOD) != data) + return -EINVAL; + + return 0; +} + +int ptrace_request(struct task_struct *child, long request, + long addr, long data) +{ + int ret = -EIO; + + switch (request) { +#ifdef PTRACE_OLDSETOPTIONS + case PTRACE_OLDSETOPTIONS: +#endif + case PTRACE_SETOPTIONS: + ret = ptrace_setoptions(child, data); + break; + default: + break; + } + + return ret; +} |
