diff options
author | Oleg Nesterov <oleg@redhat.com> | 2009-12-15 19:47:18 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-16 10:20:08 -0500 |
commit | 25baa35befeebe6a4a8d8d12a4fc5b95918bda54 (patch) | |
tree | 5634f996ac4e2067d2e1cc21b955eafbf9adb581 /arch | |
parent | 85ec7fd9f8e528c4f61d595cfe4df7681a19f252 (diff) |
ptrace: powerpc: implement user_single_step_siginfo()
Suggested by Roland.
Implement user_single_step_siginfo() for powerpc.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Roland McGrath <roland@redhat.com>
Cc: <linux-arch@vger.kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/include/asm/ptrace.h | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/traps.c | 9 |
2 files changed, 11 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 8c341490cfc5..cbd759e3cd78 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h | |||
@@ -140,6 +140,8 @@ extern void user_enable_single_step(struct task_struct *); | |||
140 | extern void user_enable_block_step(struct task_struct *); | 140 | extern void user_enable_block_step(struct task_struct *); |
141 | extern void user_disable_single_step(struct task_struct *); | 141 | extern void user_disable_single_step(struct task_struct *); |
142 | 142 | ||
143 | #define ARCH_HAS_USER_SINGLE_STEP_INFO | ||
144 | |||
143 | #endif /* __ASSEMBLY__ */ | 145 | #endif /* __ASSEMBLY__ */ |
144 | 146 | ||
145 | #endif /* __KERNEL__ */ | 147 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 804f0f30f227..d069ff8a7e03 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -174,6 +174,15 @@ int die(const char *str, struct pt_regs *regs, long err) | |||
174 | return 0; | 174 | return 0; |
175 | } | 175 | } |
176 | 176 | ||
177 | void user_single_step_siginfo(struct task_struct *tsk, | ||
178 | struct pt_regs *regs, siginfo_t *info) | ||
179 | { | ||
180 | memset(info, 0, sizeof(*info)); | ||
181 | info->si_signo = SIGTRAP; | ||
182 | info->si_code = TRAP_TRACE; | ||
183 | info->si_addr = (void __user *)regs->nip; | ||
184 | } | ||
185 | |||
177 | void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) | 186 | void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) |
178 | { | 187 | { |
179 | siginfo_t info; | 188 | siginfo_t info; |