24 #define pr_fmt(fmt) "hw-breakpoint: " fmt
26 #include <linux/errno.h>
28 #include <linux/perf_event.h>
29 #include <linux/hw_breakpoint.h>
32 #include <asm/cacheflush.h>
33 #include <asm/cputype.h>
34 #include <asm/current.h>
35 #include <asm/hw_breakpoint.h>
36 #include <asm/kdebug.h>
37 #include <asm/traps.h>
46 static int core_num_brps;
47 static int core_num_wrps;
53 static u8 max_watchpoint_len;
55 #define READ_WB_REG_CASE(OP2, M, VAL) \
56 case ((OP2 << 4) + M): \
57 ARM_DBG_READ(c ## M, OP2, VAL); \
60 #define WRITE_WB_REG_CASE(OP2, M, VAL) \
61 case ((OP2 << 4) + M): \
62 ARM_DBG_WRITE(c ## M, OP2, VAL);\
65 #define GEN_READ_WB_REG_CASES(OP2, VAL) \
66 READ_WB_REG_CASE(OP2, 0, VAL); \
67 READ_WB_REG_CASE(OP2, 1, VAL); \
68 READ_WB_REG_CASE(OP2, 2, VAL); \
69 READ_WB_REG_CASE(OP2, 3, VAL); \
70 READ_WB_REG_CASE(OP2, 4, VAL); \
71 READ_WB_REG_CASE(OP2, 5, VAL); \
72 READ_WB_REG_CASE(OP2, 6, VAL); \
73 READ_WB_REG_CASE(OP2, 7, VAL); \
74 READ_WB_REG_CASE(OP2, 8, VAL); \
75 READ_WB_REG_CASE(OP2, 9, VAL); \
76 READ_WB_REG_CASE(OP2, 10, VAL); \
77 READ_WB_REG_CASE(OP2, 11, VAL); \
78 READ_WB_REG_CASE(OP2, 12, VAL); \
79 READ_WB_REG_CASE(OP2, 13, VAL); \
80 READ_WB_REG_CASE(OP2, 14, VAL); \
81 READ_WB_REG_CASE(OP2, 15, VAL)
83 #define GEN_WRITE_WB_REG_CASES(OP2, VAL) \
84 WRITE_WB_REG_CASE(OP2, 0, VAL); \
85 WRITE_WB_REG_CASE(OP2, 1, VAL); \
86 WRITE_WB_REG_CASE(OP2, 2, VAL); \
87 WRITE_WB_REG_CASE(OP2, 3, VAL); \
88 WRITE_WB_REG_CASE(OP2, 4, VAL); \
89 WRITE_WB_REG_CASE(OP2, 5, VAL); \
90 WRITE_WB_REG_CASE(OP2, 6, VAL); \
91 WRITE_WB_REG_CASE(OP2, 7, VAL); \
92 WRITE_WB_REG_CASE(OP2, 8, VAL); \
93 WRITE_WB_REG_CASE(OP2, 9, VAL); \
94 WRITE_WB_REG_CASE(OP2, 10, VAL); \
95 WRITE_WB_REG_CASE(OP2, 11, VAL); \
96 WRITE_WB_REG_CASE(OP2, 12, VAL); \
97 WRITE_WB_REG_CASE(OP2, 13, VAL); \
98 WRITE_WB_REG_CASE(OP2, 14, VAL); \
99 WRITE_WB_REG_CASE(OP2, 15, VAL)
101 static u32 read_wb_reg(
int n)
111 pr_warning(
"attempt to read from unknown breakpoint "
118 static void write_wb_reg(
int n,
u32 val)
126 pr_warning(
"attempt to write to unknown breakpoint "
133 static u8 get_debug_arch(
void)
138 if (((read_cpuid_id() >> 16) & 0xf) != 0xf) {
139 pr_warning(
"CPUID feature registers not supported. "
140 "Assuming v6 debug is present.\n");
141 return ARM_DEBUG_ARCH_V6;
144 ARM_DBG_READ(c0, 0, didr);
145 return (didr >> 16) & 0xf;
153 static int debug_arch_supported(
void)
155 u8 arch = get_debug_arch();
158 return (arch >= ARM_DEBUG_ARCH_V6 && arch <= ARM_DEBUG_ARCH_V7_ECP14) ||
159 arch >= ARM_DEBUG_ARCH_V7_1;
163 static int debug_exception_updates_fsr(
void)
169 static int get_num_wrp_resources(
void)
172 ARM_DBG_READ(c0, 0, didr);
173 return ((didr >> 28) & 0xf) + 1;
177 static int get_num_brp_resources(
void)
180 ARM_DBG_READ(c0, 0, didr);
181 return ((didr >> 24) & 0xf) + 1;
185 static int core_has_mismatch_brps(
void)
187 return (get_debug_arch() >= ARM_DEBUG_ARCH_V7_ECP14 &&
188 get_num_brp_resources() > 1);
192 static int get_num_wrps(
void)
212 if (get_debug_arch() < ARM_DEBUG_ARCH_V7_1)
215 return get_num_wrp_resources();
219 static int get_num_brps(
void)
221 int brps = get_num_brp_resources();
222 return core_has_mismatch_brps() ? brps - 1 : brps;
231 static int enable_monitor_mode(
void)
236 ARM_DBG_READ(c1, 0, dscr);
240 "halting debug mode enabled. Unable to access hardware resources.\n")) {
246 if (dscr & ARM_DSCR_MDBGEN)
250 switch (get_debug_arch()) {
251 case ARM_DEBUG_ARCH_V6:
252 case ARM_DEBUG_ARCH_V6_1:
253 ARM_DBG_WRITE(c1, 0, (dscr | ARM_DSCR_MDBGEN));
255 case ARM_DEBUG_ARCH_V7_ECP14:
256 case ARM_DEBUG_ARCH_V7_1:
257 ARM_DBG_WRITE(c2, 2, (dscr | ARM_DSCR_MDBGEN));
265 ARM_DBG_READ(c1, 0, dscr);
266 if (!(dscr & ARM_DSCR_MDBGEN))
275 if (!debug_arch_supported())
284 return get_num_brps();
286 return get_num_wrps();
297 static u8 get_max_wp_len(
void)
300 struct arch_hw_breakpoint_ctrl
ctrl;
303 if (debug_arch < ARM_DEBUG_ARCH_V7_ECP14)
307 ctrl.len = ARM_BREAKPOINT_LEN_8;
308 ctrl_reg = encode_ctrl_reg(
ctrl);
310 write_wb_reg(ARM_BASE_WVR, 0);
311 write_wb_reg(ARM_BASE_WCR, ctrl_reg);
312 if ((read_wb_reg(ARM_BASE_WCR) & ctrl_reg) == ctrl_reg)
321 return max_watchpoint_len;
331 int i, max_slots, ctrl_base, val_base, ret = 0;
335 ret = enable_monitor_mode();
340 ctrl = encode_ctrl_reg(info->ctrl) | 0x1;
342 if (info->ctrl.
type == ARM_BREAKPOINT_EXECUTE) {
344 ctrl_base = ARM_BASE_BCR;
345 val_base = ARM_BASE_BVR;
347 max_slots = core_num_brps;
350 ctrl_base = ARM_BASE_WCR;
351 val_base = ARM_BASE_WVR;
353 max_slots = core_num_wrps;
356 for (i = 0; i < max_slots; ++
i) {
365 if (
WARN_ONCE(i == max_slots,
"Can't find any breakpoint slot\n")) {
371 if (info->step_ctrl.enabled) {
372 addr = info->trigger & ~0x3;
373 ctrl = encode_ctrl_reg(info->step_ctrl);
374 if (info->ctrl.
type != ARM_BREAKPOINT_EXECUTE) {
376 ctrl_base = ARM_BASE_BCR + core_num_brps;
377 val_base = ARM_BASE_BVR + core_num_brps;
382 write_wb_reg(val_base + i, addr);
385 write_wb_reg(ctrl_base + i, ctrl);
395 int i, max_slots,
base;
397 if (info->ctrl.
type == ARM_BREAKPOINT_EXECUTE) {
401 max_slots = core_num_brps;
406 max_slots = core_num_wrps;
410 for (i = 0; i < max_slots; ++
i) {
419 if (
WARN_ONCE(i == max_slots,
"Can't find any breakpoint slot\n"))
423 if (info->ctrl.
type != ARM_BREAKPOINT_EXECUTE &&
424 info->step_ctrl.enabled) {
426 base = ARM_BASE_BCR + core_num_brps;
430 write_wb_reg(base + i, 0);
433 static int get_hbp_len(
u8 hbp_len)
435 unsigned int len_in_bytes = 0;
438 case ARM_BREAKPOINT_LEN_1:
441 case ARM_BREAKPOINT_LEN_2:
444 case ARM_BREAKPOINT_LEN_4:
447 case ARM_BREAKPOINT_LEN_8:
465 len = get_hbp_len(info->ctrl.
len);
476 int *gen_len,
int *gen_type)
480 case ARM_BREAKPOINT_EXECUTE:
483 case ARM_BREAKPOINT_LOAD:
486 case ARM_BREAKPOINT_STORE:
489 case ARM_BREAKPOINT_LOAD | ARM_BREAKPOINT_STORE:
498 case ARM_BREAKPOINT_LEN_1:
501 case ARM_BREAKPOINT_LEN_2:
504 case ARM_BREAKPOINT_LEN_4:
507 case ARM_BREAKPOINT_LEN_8:
520 static int arch_build_bp_info(
struct perf_event *bp)
525 switch (bp->
attr.bp_type) {
527 info->ctrl.
type = ARM_BREAKPOINT_EXECUTE;
530 info->ctrl.
type = ARM_BREAKPOINT_LOAD;
533 info->ctrl.
type = ARM_BREAKPOINT_STORE;
536 info->ctrl.
type = ARM_BREAKPOINT_LOAD | ARM_BREAKPOINT_STORE;
543 switch (bp->
attr.bp_len) {
545 info->ctrl.
len = ARM_BREAKPOINT_LEN_1;
548 info->ctrl.
len = ARM_BREAKPOINT_LEN_2;
551 info->ctrl.
len = ARM_BREAKPOINT_LEN_4;
554 info->ctrl.
len = ARM_BREAKPOINT_LEN_8;
555 if ((info->ctrl.
type != ARM_BREAKPOINT_EXECUTE)
556 && max_watchpoint_len >= 8)
568 if (info->ctrl.
type == ARM_BREAKPOINT_EXECUTE &&
569 info->ctrl.
len != ARM_BREAKPOINT_LEN_2 &&
570 info->ctrl.
len != ARM_BREAKPOINT_LEN_4)
577 info->ctrl.privilege = ARM_BREAKPOINT_USER;
579 info->ctrl.privilege |= ARM_BREAKPOINT_PRIV;
582 info->ctrl.enabled = !bp->
attr.disabled;
585 info->ctrl.mismatch = 0;
600 ret = arch_build_bp_info(bp);
605 if (info->ctrl.
len == ARM_BREAKPOINT_LEN_8)
606 alignment_mask = 0x7;
607 offset = info->
address & alignment_mask;
615 if (info->ctrl.
len == ARM_BREAKPOINT_LEN_2)
619 if (info->ctrl.
len == ARM_BREAKPOINT_LEN_1)
626 info->
address &= ~alignment_mask;
629 if (!bp->overflow_handler) {
634 if (!core_has_mismatch_brps())
645 if (!bp->hw.bp_target)
652 if (!debug_exception_updates_fsr() &&
653 (info->ctrl.
type == ARM_BREAKPOINT_LOAD ||
654 info->ctrl.
type == ARM_BREAKPOINT_STORE))
670 info->step_ctrl.mismatch = 1;
671 info->step_ctrl.
len = ARM_BREAKPOINT_LEN_4;
672 info->step_ctrl.
type = ARM_BREAKPOINT_EXECUTE;
673 info->step_ctrl.privilege = info->ctrl.privilege;
674 info->step_ctrl.enabled = 1;
675 info->trigger =
addr;
679 static void disable_single_step(
struct perf_event *bp)
682 counter_arch_bp(bp)->step_ctrl.enabled = 0;
686 static void watchpoint_handler(
unsigned long addr,
unsigned int fsr,
690 u32 val, ctrl_reg, alignment_mask;
693 struct arch_hw_breakpoint_ctrl
ctrl;
697 for (i = 0; i < core_num_wrps; ++
i) {
705 info = counter_arch_bp(wp);
712 if (debug_arch < ARM_DEBUG_ARCH_V7_1) {
714 info->trigger = wp->
attr.bp_addr;
716 if (info->ctrl.
len == ARM_BREAKPOINT_LEN_8)
717 alignment_mask = 0x7;
719 alignment_mask = 0x3;
722 val = read_wb_reg(ARM_BASE_WVR + i);
723 if (val != (addr & ~alignment_mask))
727 ctrl_reg = read_wb_reg(ARM_BASE_WCR + i);
728 decode_ctrl_reg(ctrl_reg, &
ctrl);
729 if (!((1 << (addr & alignment_mask)) &
ctrl.len))
733 if (debug_exception_updates_fsr()) {
734 access = (fsr & ARM_FSR_ACCESS_MASK) ?
736 if (!(access & hw_breakpoint_type(wp)))
741 info->trigger =
addr;
744 pr_debug(
"watchpoint fired: address = 0x%x\n", info->trigger);
745 perf_bp_event(wp, regs);
752 if (!wp->overflow_handler)
760 static void watchpoint_single_step_handler(
unsigned long pc)
768 for (i = 0; i < core_num_wrps; ++
i) {
776 info = counter_arch_bp(wp);
777 if (!info->step_ctrl.enabled)
784 if (info->trigger != pc)
785 disable_single_step(wp);
792 static void breakpoint_handler(
unsigned long unknown,
struct pt_regs *regs)
798 struct arch_hw_breakpoint_ctrl
ctrl;
806 for (i = 0; i < core_num_brps; ++
i) {
814 info = counter_arch_bp(bp);
817 val = read_wb_reg(ARM_BASE_BVR + i);
818 if (val != (addr & ~0x3))
822 ctrl_reg = read_wb_reg(ARM_BASE_BCR + i);
823 decode_ctrl_reg(ctrl_reg, &
ctrl);
824 if ((1 << (addr & 0x3)) &
ctrl.len) {
825 info->trigger =
addr;
826 pr_debug(
"breakpoint fired: address = 0x%x\n", addr);
827 perf_bp_event(bp, regs);
828 if (!bp->overflow_handler)
829 enable_single_step(bp, addr);
835 if (info->step_ctrl.enabled)
836 disable_single_step(bp);
842 watchpoint_single_step_handler(addr);
849 static int hw_breakpoint_pending(
unsigned long addr,
unsigned int fsr,
861 ARM_DBG_READ(c1, 0, dscr);
864 switch (ARM_DSCR_MOE(dscr)) {
865 case ARM_ENTRY_BREAKPOINT:
866 breakpoint_handler(addr, regs);
868 case ARM_ENTRY_ASYNC_WATCHPOINT:
869 WARN(1,
"Asynchronous watchpoint exception taken. Debugging results may be unreliable\n");
870 case ARM_ENTRY_SYNC_WATCHPOINT:
871 watchpoint_handler(addr, fsr, regs);
887 static int debug_reg_trap(
struct pt_regs *regs,
unsigned int instr)
891 pr_warning(
"Debug register access (0x%x) caused undefined instruction on CPU %d\n",
895 cpumask_set_cpu(cpu, &debug_err_mask);
901 .instr_mask = 0x0fe80f10,
902 .instr_val = 0x0e000e10,
903 .fn = debug_reg_trap,
906 static void reset_ctrl_regs(
void *
unused)
919 switch (debug_arch) {
920 case ARM_DEBUG_ARCH_V6:
921 case ARM_DEBUG_ARCH_V6_1:
924 case ARM_DEBUG_ARCH_V7_ECP14:
929 asm volatile(
"mrc p14, 0, %0, c1, c5, 4" :
"=r" (dbg_power));
930 if ((dbg_power & 0x1) == 0)
933 case ARM_DEBUG_ARCH_V7_1:
937 asm volatile(
"mrc p14, 0, %0, c1, c3, 4" :
"=r" (dbg_power));
938 if ((dbg_power & 0x1) == 1)
945 cpumask_or(&debug_err_mask, &debug_err_mask,
cpumask_of(
cpu));
953 asm volatile(
"mcr p14, 0, %0, c1, c0, 4" : :
"r" (0));
960 asm volatile(
"mcr p14, 0, %0, c0, c7, 0" : :
"r" (0));
964 if (enable_monitor_mode())
968 raw_num_brps = get_num_brp_resources();
969 for (i = 0; i < raw_num_brps; ++
i) {
970 write_wb_reg(ARM_BASE_BCR + i, 0
UL);
971 write_wb_reg(ARM_BASE_BVR + i, 0
UL);
974 for (i = 0; i < core_num_wrps; ++
i) {
975 write_wb_reg(ARM_BASE_WCR + i, 0
UL);
976 write_wb_reg(ARM_BASE_WVR + i, 0
UL);
990 .notifier_call = dbg_reset_notify,
993 static int __init arch_hw_breakpoint_init(
void)
997 debug_arch = get_debug_arch();
999 if (!debug_arch_supported()) {
1000 pr_info(
"debug architecture 0x%x unsupported.\n", debug_arch);
1005 core_num_brps = get_num_brps();
1006 core_num_wrps = get_num_wrps();
1021 if (!cpumask_empty(&debug_err_mask)) {
1027 pr_info(
"found %d " "%s" "breakpoint and %d watchpoint registers.\n",
1028 core_num_brps, core_has_mismatch_brps() ?
"(+1 reserved) " :
1031 ARM_DBG_READ(c1, 0, dscr);
1032 if (dscr & ARM_DSCR_HDBGEN) {
1033 max_watchpoint_len = 4;
1034 pr_warning(
"halting debug mode enabled. Assuming maximum watchpoint size of %u bytes.\n",
1035 max_watchpoint_len);
1038 max_watchpoint_len = get_max_wp_len();
1039 pr_info(
"maximum watchpoint size is %u bytes.\n",
1040 max_watchpoint_len);
1050 register_cpu_notifier(&dbg_reset_nb);
1063 unsigned long val,
void *
data)