powerpc: Hardware breakpoints rewrite to handle non DABR breakpoint registers
This is a rewrite so that we don't assume we are using the DABR throughout the code. We now use the arch_hw_breakpoint to store the breakpoint in a generic manner in the thread_struct, rather than storing the raw DABR value. The ptrace GET/SET_DEBUGREG interface currently passes the raw DABR in from userspace. We keep this functionality, so that future changes (like the POWER8 DAWR), will still fake the DABR to userspace. Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:

committed by
Benjamin Herrenschmidt

parent
a8190a59e7
commit
9422de3e95
@@ -4,6 +4,8 @@
|
||||
#ifndef _ASM_POWERPC_DEBUG_H
|
||||
#define _ASM_POWERPC_DEBUG_H
|
||||
|
||||
#include <asm/hw_breakpoint.h>
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
extern struct dentry *powerpc_debugfs_root;
|
||||
@@ -15,7 +17,7 @@ extern int (*__debugger_ipi)(struct pt_regs *regs);
|
||||
extern int (*__debugger_bpt)(struct pt_regs *regs);
|
||||
extern int (*__debugger_sstep)(struct pt_regs *regs);
|
||||
extern int (*__debugger_iabr_match)(struct pt_regs *regs);
|
||||
extern int (*__debugger_dabr_match)(struct pt_regs *regs);
|
||||
extern int (*__debugger_break_match)(struct pt_regs *regs);
|
||||
extern int (*__debugger_fault_handler)(struct pt_regs *regs);
|
||||
|
||||
#define DEBUGGER_BOILERPLATE(__NAME) \
|
||||
@@ -31,7 +33,7 @@ DEBUGGER_BOILERPLATE(debugger_ipi)
|
||||
DEBUGGER_BOILERPLATE(debugger_bpt)
|
||||
DEBUGGER_BOILERPLATE(debugger_sstep)
|
||||
DEBUGGER_BOILERPLATE(debugger_iabr_match)
|
||||
DEBUGGER_BOILERPLATE(debugger_dabr_match)
|
||||
DEBUGGER_BOILERPLATE(debugger_break_match)
|
||||
DEBUGGER_BOILERPLATE(debugger_fault_handler)
|
||||
|
||||
#else
|
||||
@@ -40,17 +42,18 @@ static inline int debugger_ipi(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_bpt(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_sstep(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_iabr_match(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_break_match(struct pt_regs *regs) { return 0; }
|
||||
static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
|
||||
#endif
|
||||
|
||||
extern int set_dabr(unsigned long dabr, unsigned long dabrx);
|
||||
int set_break(struct arch_hw_breakpoint *brk);
|
||||
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
||||
extern void do_send_trap(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code, int signal_code, int brkpt);
|
||||
#else
|
||||
extern void do_dabr(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code);
|
||||
|
||||
extern void do_break(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code);
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_POWERPC_DEBUG_H */
|
||||
|
Reference in New Issue
Block a user