hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/powerpc/include/asm/hw_breakpoint.h
....@@ -1,36 +1,27 @@
1
+/* SPDX-License-Identifier: GPL-2.0-or-later */
12 /*
23 * PowerPC BookIII S hardware breakpoint definitions
34 *
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
- *
185 * Copyright 2010, IBM Corporation.
196 * Author: K.Prasad <prasad@linux.vnet.ibm.com>
20
- *
217 */
228
239 #ifndef _PPC_BOOK3S_64_HW_BREAKPOINT_H
2410 #define _PPC_BOOK3S_64_HW_BREAKPOINT_H
11
+
12
+#include <asm/cpu_has_feature.h>
13
+#include <asm/inst.h>
2514
2615 #ifdef __KERNEL__
2716 struct arch_hw_breakpoint {
2817 unsigned long address;
2918 u16 type;
3019 u16 len; /* length of the target data symbol */
20
+ u16 hw_len; /* length programmed in hw */
21
+ u8 flags;
3122 };
3223
33
-/* Note: Don't change the the first 6 bits below as they are in the same order
24
+/* Note: Don't change the first 6 bits below as they are in the same order
3425 * as the dabr and dabrx.
3526 */
3627 #define HW_BRK_TYPE_READ 0x01
....@@ -47,6 +38,31 @@
4738 #define HW_BRK_TYPE_PRIV_ALL (HW_BRK_TYPE_USER | HW_BRK_TYPE_KERNEL | \
4839 HW_BRK_TYPE_HYP)
4940
41
+#define HW_BRK_FLAG_DISABLED 0x1
42
+
43
+/* Minimum granularity */
44
+#ifdef CONFIG_PPC_8xx
45
+#define HW_BREAKPOINT_SIZE 0x4
46
+#else
47
+#define HW_BREAKPOINT_SIZE 0x8
48
+#endif
49
+#define HW_BREAKPOINT_SIZE_QUADWORD 0x10
50
+
51
+#define DABR_MAX_LEN 8
52
+#define DAWR_MAX_LEN 512
53
+
54
+static inline int nr_wp_slots(void)
55
+{
56
+ return cpu_has_feature(CPU_FTR_DAWR1) ? 2 : 1;
57
+}
58
+
59
+bool wp_check_constraints(struct pt_regs *regs, struct ppc_inst instr,
60
+ unsigned long ea, int type, int size,
61
+ struct arch_hw_breakpoint *info);
62
+
63
+void wp_get_instr_detail(struct pt_regs *regs, struct ppc_inst *instr,
64
+ int *type, int *size, unsigned long *ea);
65
+
5066 #ifdef CONFIG_HAVE_HW_BREAKPOINT
5167 #include <linux/kdebug.h>
5268 #include <asm/reg.h>
....@@ -58,8 +74,6 @@
5874 struct perf_sample_data;
5975 struct task_struct;
6076
61
-#define HW_BREAKPOINT_ALIGN 0x7
62
-
6377 extern int hw_breakpoint_slots(int type);
6478 extern int arch_bp_generic_fields(int type, int *gen_bp_type);
6579 extern int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw);
....@@ -70,7 +84,6 @@
7084 unsigned long val, void *data);
7185 int arch_install_hw_breakpoint(struct perf_event *bp);
7286 void arch_uninstall_hw_breakpoint(struct perf_event *bp);
73
-void arch_unregister_hw_breakpoint(struct perf_event *bp);
7487 void hw_breakpoint_pmu_read(struct perf_event *bp);
7588 extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
7689
....@@ -79,13 +92,14 @@
7992 struct perf_sample_data *data, struct pt_regs *regs);
8093 static inline void hw_breakpoint_disable(void)
8194 {
82
- struct arch_hw_breakpoint brk;
95
+ int i;
96
+ struct arch_hw_breakpoint null_brk = {0};
8397
84
- brk.address = 0;
85
- brk.type = 0;
86
- brk.len = 0;
87
- if (ppc_breakpoint_available())
88
- __set_breakpoint(&brk);
98
+ if (!ppc_breakpoint_available())
99
+ return;
100
+
101
+ for (i = 0; i < nr_wp_slots(); i++)
102
+ __set_breakpoint(i, &null_brk);
89103 }
90104 extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs);
91105 int hw_breakpoint_handler(struct die_args *args);
....@@ -94,6 +108,21 @@
94108 static inline void hw_breakpoint_disable(void) { }
95109 static inline void thread_change_pc(struct task_struct *tsk,
96110 struct pt_regs *regs) { }
111
+
97112 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
113
+
114
+
115
+#ifdef CONFIG_PPC_DAWR
116
+extern bool dawr_force_enable;
117
+static inline bool dawr_enabled(void)
118
+{
119
+ return dawr_force_enable;
120
+}
121
+int set_dawr(int nr, struct arch_hw_breakpoint *brk);
122
+#else
123
+static inline bool dawr_enabled(void) { return false; }
124
+static inline int set_dawr(int nr, struct arch_hw_breakpoint *brk) { return -1; }
125
+#endif
126
+
98127 #endif /* __KERNEL__ */
99128 #endif /* _PPC_BOOK3S_64_HW_BREAKPOINT_H */