aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorFrederic Weisbecker <frederic@kernel.org>2018-06-25 22:58:56 -0400
committerIngo Molnar <mingo@kernel.org>2018-06-26 03:07:58 -0400
commitac46c7fddef702dadae18c1fc932530cd31cf9cd (patch)
treebf7223d8b565c8d138e76f3c300b09579b0c9206 /arch
parent551624d6fc6b282cdcc3f8ab395cb03da0a38fc7 (diff)
perf/arch/xtensa: Implement hw_breakpoint_arch_parse()
Migrate to the new API in order to remove arch_validate_hwbkpt_settings() that clumsily mixes up architecture validation and commit Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Chris Zankel <chris@zankel.net> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Joel Fernandes <joel.opensrc@gmail.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rich Felker <dalias@libc.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Will Deacon <will.deacon@arm.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Link: http://lkml.kernel.org/r/1529981939-8231-10-git-send-email-frederic@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/xtensa/include/asm/hw_breakpoint.h6
-rw-r--r--arch/xtensa/kernel/hw_breakpoint.c33
2 files changed, 17 insertions, 22 deletions
diff --git a/arch/xtensa/include/asm/hw_breakpoint.h b/arch/xtensa/include/asm/hw_breakpoint.h
index 2525bf6816a6..f347c2132e6b 100644
--- a/arch/xtensa/include/asm/hw_breakpoint.h
+++ b/arch/xtensa/include/asm/hw_breakpoint.h
@@ -30,13 +30,17 @@ struct arch_hw_breakpoint {
30 u16 type; 30 u16 type;
31}; 31};
32 32
33struct perf_event_attr;
33struct perf_event; 34struct perf_event;
34struct pt_regs; 35struct pt_regs;
35struct task_struct; 36struct task_struct;
36 37
37int hw_breakpoint_slots(int type); 38int hw_breakpoint_slots(int type);
38int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw); 39int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw);
39int arch_validate_hwbkpt_settings(struct perf_event *bp); 40int hw_breakpoint_arch_parse(struct perf_event *bp,
41 const struct perf_event_attr *attr,
42 struct arch_hw_breakpoint *hw);
43#define hw_breakpoint_arch_parse hw_breakpoint_arch_parse
40int hw_breakpoint_exceptions_notify(struct notifier_block *unused, 44int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
41 unsigned long val, void *data); 45 unsigned long val, void *data);
42 46
diff --git a/arch/xtensa/kernel/hw_breakpoint.c b/arch/xtensa/kernel/hw_breakpoint.c
index 6e34c3848885..c2e387c19cda 100644
--- a/arch/xtensa/kernel/hw_breakpoint.c
+++ b/arch/xtensa/kernel/hw_breakpoint.c
@@ -47,50 +47,41 @@ int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw)
47/* 47/*
48 * Construct an arch_hw_breakpoint from a perf_event. 48 * Construct an arch_hw_breakpoint from a perf_event.
49 */ 49 */
50static int arch_build_bp_info(struct perf_event *bp) 50int hw_breakpoint_arch_parse(struct perf_event *bp,
51 const struct perf_event_attr *attr,
52 struct arch_hw_breakpoint *hw)
51{ 53{
52 struct arch_hw_breakpoint *info = counter_arch_bp(bp);
53
54 /* Type */ 54 /* Type */
55 switch (bp->attr.bp_type) { 55 switch (attr->bp_type) {
56 case HW_BREAKPOINT_X: 56 case HW_BREAKPOINT_X:
57 info->type = XTENSA_BREAKPOINT_EXECUTE; 57 hw->type = XTENSA_BREAKPOINT_EXECUTE;
58 break; 58 break;
59 case HW_BREAKPOINT_R: 59 case HW_BREAKPOINT_R:
60 info->type = XTENSA_BREAKPOINT_LOAD; 60 hw->type = XTENSA_BREAKPOINT_LOAD;
61 break; 61 break;
62 case HW_BREAKPOINT_W: 62 case HW_BREAKPOINT_W:
63 info->type = XTENSA_BREAKPOINT_STORE; 63 hw->type = XTENSA_BREAKPOINT_STORE;
64 break; 64 break;
65 case HW_BREAKPOINT_RW: 65 case HW_BREAKPOINT_RW:
66 info->type = XTENSA_BREAKPOINT_LOAD | XTENSA_BREAKPOINT_STORE; 66 hw->type = XTENSA_BREAKPOINT_LOAD | XTENSA_BREAKPOINT_STORE;
67 break; 67 break;
68 default: 68 default:
69 return -EINVAL; 69 return -EINVAL;
70 } 70 }
71 71
72 /* Len */ 72 /* Len */
73 info->len = bp->attr.bp_len; 73 hw->len = attr->bp_len;
74 if (info->len < 1 || info->len > 64 || !is_power_of_2(info->len)) 74 if (hw->len < 1 || hw->len > 64 || !is_power_of_2(hw->len))
75 return -EINVAL; 75 return -EINVAL;
76 76
77 /* Address */ 77 /* Address */
78 info->address = bp->attr.bp_addr; 78 hw->address = attr->bp_addr;
79 if (info->address & (info->len - 1)) 79 if (hw->address & (hw->len - 1))
80 return -EINVAL; 80 return -EINVAL;
81 81
82 return 0; 82 return 0;
83} 83}
84 84
85int arch_validate_hwbkpt_settings(struct perf_event *bp)
86{
87 int ret;
88
89 /* Build the arch_hw_breakpoint. */
90 ret = arch_build_bp_info(bp);
91 return ret;
92}
93
94int hw_breakpoint_exceptions_notify(struct notifier_block *unused, 85int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
95 unsigned long val, void *data) 86 unsigned long val, void *data)
96{ 87{