aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/process.c
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2010-09-03 05:42:55 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-09-08 05:05:00 -0400
commit864232fa1a2f8dfe003438ef0851a56722740f3e (patch)
tree0f85f2b1b2f030e7c51f0c69b112dea746b3a861 /arch/arm/kernel/process.c
parentf81ef4a920c8e1af75adf9f15042c2daa49d3cb3 (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.c5
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