Skip to content

Commit 5aae8a5

Browse files
K.Prasadpaulusmack
K.Prasad
authored andcommitted
powerpc, hw_breakpoints: Implement hw_breakpoints for 64-bit server processors
Implement perf-events based hw-breakpoint interfaces for PowerPC 64-bit server (Book III S) processors. This allows access to a given location to be used as an event that can be counted or profiled by the perf_events subsystem. This is done using the DABR (data breakpoint register), which can also be used for process debugging via ptrace. When perf_event hw_breakpoint support is configured in, the perf_event subsystem manages the DABR and arbitrates access to it, and ptrace then creates a perf_event when it is requested to set a data breakpoint. [Adopted suggestions from Paul Mackerras <[email protected]> to - emulate_step() all system-wide breakpoints and single-step only the per-task breakpoints - perform arch-specific cleanup before unregistration through arch_unregister_hw_breakpoint() ] Signed-off-by: K.Prasad <[email protected]> Signed-off-by: Paul Mackerras <[email protected]>
1 parent f7136c5 commit 5aae8a5

File tree

11 files changed

+495
-0
lines changed

11 files changed

+495
-0
lines changed

arch/powerpc/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ config PPC
141141
select GENERIC_ATOMIC64 if PPC32
142142
select HAVE_PERF_EVENTS
143143
select HAVE_REGS_AND_STACK_ACCESS_API
144+
select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64
144145

145146
config EARLY_PRINTK
146147
bool

arch/powerpc/include/asm/cputable.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,10 @@ static inline int cpu_has_feature(unsigned long feature)
517517
& feature);
518518
}
519519

520+
#ifdef CONFIG_HAVE_HW_BREAKPOINT
521+
#define HBP_NUM 1
522+
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
523+
520524
#endif /* !__ASSEMBLY__ */
521525

522526
#endif /* __KERNEL__ */
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* PowerPC BookIII S hardware breakpoint definitions
3+
*
4+
* This program is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation; either version 2 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program; if not, write to the Free Software
16+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17+
*
18+
* Copyright 2010, IBM Corporation.
19+
* Author: K.Prasad <[email protected]>
20+
*
21+
*/
22+
23+
#ifndef _PPC_BOOK3S_64_HW_BREAKPOINT_H
24+
#define _PPC_BOOK3S_64_HW_BREAKPOINT_H
25+
26+
#ifdef __KERNEL__
27+
#ifdef CONFIG_HAVE_HW_BREAKPOINT
28+
29+
struct arch_hw_breakpoint {
30+
u8 len; /* length of the target data symbol */
31+
int type;
32+
unsigned long address;
33+
};
34+
35+
#include <linux/kdebug.h>
36+
#include <asm/reg.h>
37+
#include <asm/system.h>
38+
39+
static inline int hw_breakpoint_slots(int type)
40+
{
41+
return HBP_NUM;
42+
}
43+
struct perf_event;
44+
struct pmu;
45+
struct perf_sample_data;
46+
47+
#define HW_BREAKPOINT_ALIGN 0x7
48+
/* Maximum permissible length of any HW Breakpoint */
49+
#define HW_BREAKPOINT_LEN 0x8
50+
51+
extern int arch_bp_generic_fields(int type, int *gen_bp_type);
52+
extern int arch_check_bp_in_kernelspace(struct perf_event *bp);
53+
extern int arch_validate_hwbkpt_settings(struct perf_event *bp);
54+
extern int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
55+
unsigned long val, void *data);
56+
int arch_install_hw_breakpoint(struct perf_event *bp);
57+
void arch_uninstall_hw_breakpoint(struct perf_event *bp);
58+
void hw_breakpoint_pmu_read(struct perf_event *bp);
59+
extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
60+
61+
extern struct pmu perf_ops_bp;
62+
extern void ptrace_triggered(struct perf_event *bp, int nmi,
63+
struct perf_sample_data *data, struct pt_regs *regs);
64+
static inline void hw_breakpoint_disable(void)
65+
{
66+
set_dabr(0);
67+
}
68+
69+
#else /* CONFIG_HAVE_HW_BREAKPOINT */
70+
static inline void hw_breakpoint_disable(void) { }
71+
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
72+
#endif /* __KERNEL__ */
73+
#endif /* _PPC_BOOK3S_64_HW_BREAKPOINT_H */

arch/powerpc/include/asm/processor.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,14 @@ struct thread_struct {
209209
#ifdef CONFIG_PPC64
210210
unsigned long start_tb; /* Start purr when proc switched in */
211211
unsigned long accum_tb; /* Total accumilated purr for process */
212+
#ifdef CONFIG_HAVE_HW_BREAKPOINT
213+
struct perf_event *ptrace_bps[HBP_NUM];
214+
/*
215+
* Helps identify source of single-step exception and subsequent
216+
* hw-breakpoint enablement
217+
*/
218+
struct perf_event *last_hit_ubp;
219+
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
212220
#endif
213221
unsigned long dabr; /* Data address breakpoint register */
214222
#ifdef CONFIG_ALTIVEC

arch/powerpc/kernel/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ obj-y += vdso32/
3434
obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \
3535
signal_64.o ptrace32.o \
3636
paca.o nvram_64.o firmware.o
37+
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
3738
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o
3839
obj64-$(CONFIG_RELOCATABLE) += reloc_64.o
3940
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o

arch/powerpc/kernel/exceptions-64s.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@ END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
828828

829829
/* We have a data breakpoint exception - handle it */
830830
handle_dabr_fault:
831+
bl .save_nvgprs
831832
ld r4,_DAR(r1)
832833
ld r5,_DSISR(r1)
833834
addi r3,r1,STACK_FRAME_OVERHEAD

0 commit comments

Comments
 (0)