summaryrefslogtreecommitdiff
path: root/arch/powerpc
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2010-06-29 06:50:32 +0400
committerPaul Mackerras <paulus@samba.org>2010-06-30 07:54:58 +0400
commitd09ec7387184eba9e3030496f0451204090ff610 (patch)
treec3a6f251bf695a20009d1cd3f0d7a9115fdb3018 /arch/powerpc
parent76b0f1337690d223811c852ad3a5078eb89276c5 (diff)
downloadlinux-d09ec7387184eba9e3030496f0451204090ff610.tar.xz
powerpc, hw_breakpoint: Tell generic code we have no instruction breakpoints
At present, hw_breakpoint_slots() returns 1 regardless of what type of breakpoint is specified in the type argument. Since we don't define CONFIG_HAVE_MIXED_BREAKPOINTS_REGS, there are separate values for TYPE_INST and TYPE_DATA, and hw_breakpoint_slots() returns 1 for both, effectively advertising instruction breakpoint support which doesn't exist. This fixes it by making hw_breakpoint_slots return 1 for TYPE_DATA and 0 for TYPE_INST. This moves hw_breakpoint_slots() from the powerpc hw_breakpoint.h to hw_breakpoint.c because the definitions of TYPE_INST and TYPE_DATA aren't available in <asm/hw_breakpoint.h>. They are defined in <linux/hw_breakpoint.h> but we can't include that header in <asm/hw_breakpoint.h>, and nor can we rely on <linux/hw_breakpoint.h> being included before <asm/hw_breakpoint.h>. Since hw_breakpoint_slots() is only called at boot time, there is no performance impact from making it a real function rather than a static inline. Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/include/asm/hw_breakpoint.h5
-rw-r--r--arch/powerpc/kernel/hw_breakpoint.c10
2 files changed, 11 insertions, 4 deletions
diff --git a/arch/powerpc/include/asm/hw_breakpoint.h b/arch/powerpc/include/asm/hw_breakpoint.h
index ea87f8ae7bdb..1c33ec17ca36 100644
--- a/arch/powerpc/include/asm/hw_breakpoint.h
+++ b/arch/powerpc/include/asm/hw_breakpoint.h
@@ -37,10 +37,6 @@ struct arch_hw_breakpoint {
#include <asm/reg.h>
#include <asm/system.h>
-static inline int hw_breakpoint_slots(int type)
-{
- return HBP_NUM;
-}
struct perf_event;
struct pmu;
struct perf_sample_data;
@@ -49,6 +45,7 @@ struct perf_sample_data;
/* Maximum permissible length of any HW Breakpoint */
#define HW_BREAKPOINT_LEN 0x8
+extern int hw_breakpoint_slots(int type);
extern int arch_bp_generic_fields(int type, int *gen_bp_type);
extern int arch_check_bp_in_kernelspace(struct perf_event *bp);
extern int arch_validate_hwbkpt_settings(struct perf_event *bp);
diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c
index 5a1d55d06a08..5ecd0401cdb1 100644
--- a/arch/powerpc/kernel/hw_breakpoint.c
+++ b/arch/powerpc/kernel/hw_breakpoint.c
@@ -44,6 +44,16 @@
static DEFINE_PER_CPU(struct perf_event *, bp_per_reg);
/*
+ * Returns total number of data or instruction breakpoints available.
+ */
+int hw_breakpoint_slots(int type)
+{
+ if (type == TYPE_DATA)
+ return HBP_NUM;
+ return 0; /* no instruction breakpoints available */
+}
+
+/*
* Install a perf counter breakpoint.
*
* We seek a free debug address register and use it for this