powerpc/watchpoint: Introduce function to get nr watchpoints dynamically
authorRavi Bangoria <ravi.bangoria@linux.ibm.com>
Thu, 14 May 2020 11:17:28 +0000 (16:47 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 18 May 2020 14:11:04 +0000 (00:11 +1000)
So far we had only one watchpoint, so we have hardcoded HBP_NUM to 1.
But Power10 is introducing 2nd DAWR and thus kernel should be able to
dynamically find actual number of watchpoints supported by hw it's
running on. Introduce function for the same. Also convert HBP_NUM macro
to HBP_NUM_MAX, which will now represent maximum number of watchpoints
supported by Powerpc.

Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Reviewed-by: Michael Neuling <mikey@neuling.org>
Link: https://lore.kernel.org/r/20200514111741.97993-4-ravi.bangoria@linux.ibm.com
arch/powerpc/include/asm/cputable.h
arch/powerpc/include/asm/hw_breakpoint.h
arch/powerpc/include/asm/processor.h
arch/powerpc/kernel/hw_breakpoint.c

index 40a4d3c6fd9916b06622b12238c6b51f41900d6f..c67b94f3334c9ca1b9700f81223124563e96d73b 100644 (file)
@@ -614,7 +614,11 @@ enum {
 };
 #endif /* __powerpc64__ */
 
-#define HBP_NUM 1
+/*
+ * Maximum number of hw breakpoint supported on powerpc. Number of
+ * breakpoints supported by actual hw might be less than this.
+ */
+#define HBP_NUM_MAX    1
 
 #endif /* !__ASSEMBLY__ */
 
index f2f8d8aa8e3b5a0429b73b96ee16ff4c21481078..518b41eef924fee7f4253c47d80f86d52dbf7369 100644 (file)
@@ -43,6 +43,11 @@ struct arch_hw_breakpoint {
 #define DABR_MAX_LEN   8
 #define DAWR_MAX_LEN   512
 
+static inline int nr_wp_slots(void)
+{
+       return HBP_NUM_MAX;
+}
+
 #ifdef CONFIG_HAVE_HW_BREAKPOINT
 #include <linux/kdebug.h>
 #include <asm/reg.h>
index 5ab202055d5a6508c7069ba3b639106d5ff81163..f209c5703ee229ab4c4a9650a87e97356c4c2909 100644 (file)
@@ -180,7 +180,7 @@ struct thread_struct {
        int             fpexc_mode;     /* floating-point exception mode */
        unsigned int    align_ctl;      /* alignment handling control */
 #ifdef CONFIG_HAVE_HW_BREAKPOINT
-       struct perf_event *ptrace_bps[HBP_NUM];
+       struct perf_event *ptrace_bps[HBP_NUM_MAX];
        /*
         * Helps identify source of single-step exception and subsequent
         * hw-breakpoint enablement
index 423603c92c0f40f103d311c98cacbe831fda5d7c..01f07d91df70e8bdd2e71f49856191eedc9e5540 100644 (file)
@@ -39,7 +39,7 @@ static DEFINE_PER_CPU(struct perf_event *, bp_per_reg);
 int hw_breakpoint_slots(int type)
 {
        if (type == TYPE_DATA)
-               return HBP_NUM;
+               return nr_wp_slots();
        return 0;               /* no instruction breakpoints available */
 }