diff options
author | Will Deacon <will.deacon@arm.com> | 2010-09-03 05:42:55 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-09-08 05:05:00 -0400 |
commit | 864232fa1a2f8dfe003438ef0851a56722740f3e (patch) | |
tree | 0f85f2b1b2f030e7c51f0c69b112dea746b3a861 /arch/arm/kernel/process.c | |
parent | f81ef4a920c8e1af75adf9f15042c2daa49d3cb3 (diff) |
ARM: 6357/1: hw-breakpoint: add new ptrace requests for hw-breakpoint interaction
For debuggers to take advantage of the hw-breakpoint framework in the kernel,
it is necessary to expose the API calls via a ptrace interface.
This patch exposes the hardware breakpoints framework as a collection of
virtual registers, accesible using PTRACE_SETHBPREGS and PTRACE_GETHBPREGS
requests. The breakpoints are stored in the debug_info struct of the running
thread.
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: S. Karthikeyan <informkarthik@gmail.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/process.c')
-rw-r--r-- | arch/arm/kernel/process.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 401e38be1f78..974af1c3eb1d 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/utsname.h> | 29 | #include <linux/utsname.h> |
30 | #include <linux/uaccess.h> | 30 | #include <linux/uaccess.h> |
31 | #include <linux/random.h> | 31 | #include <linux/random.h> |
32 | #include <linux/hw_breakpoint.h> | ||
32 | 33 | ||
33 | #include <asm/cacheflush.h> | 34 | #include <asm/cacheflush.h> |
34 | #include <asm/leds.h> | 35 | #include <asm/leds.h> |
@@ -317,6 +318,8 @@ void flush_thread(void) | |||
317 | struct thread_info *thread = current_thread_info(); | 318 | struct thread_info *thread = current_thread_info(); |
318 | struct task_struct *tsk = current; | 319 | struct task_struct *tsk = current; |
319 | 320 | ||
321 | flush_ptrace_hw_breakpoint(tsk); | ||
322 | |||
320 | memset(thread->used_cp, 0, sizeof(thread->used_cp)); | 323 | memset(thread->used_cp, 0, sizeof(thread->used_cp)); |
321 | memset(&tsk->thread.debug, 0, sizeof(struct debug_info)); | 324 | memset(&tsk->thread.debug, 0, sizeof(struct debug_info)); |
322 | memset(&thread->fpstate, 0, sizeof(union fp_state)); | 325 | memset(&thread->fpstate, 0, sizeof(union fp_state)); |
@@ -345,6 +348,8 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, | |||
345 | thread->cpu_context.sp = (unsigned long)childregs; | 348 | thread->cpu_context.sp = (unsigned long)childregs; |
346 | thread->cpu_context.pc = (unsigned long)ret_from_fork; | 349 | thread->cpu_context.pc = (unsigned long)ret_from_fork; |
347 | 350 | ||
351 | clear_ptrace_hw_breakpoint(p); | ||
352 | |||
348 | if (clone_flags & CLONE_SETTLS) | 353 | if (clone_flags & CLONE_SETTLS) |
349 | thread->tp_value = regs->ARM_r3; | 354 | thread->tp_value = regs->ARM_r3; |
350 | 355 | ||