powerpc/watchpoint: Guest support for 2nd DAWR hcall
authorRavi Bangoria <ravi.bangoria@linux.ibm.com>
Thu, 23 Jul 2020 09:08:11 +0000 (14:38 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 26 Jul 2020 13:34:19 +0000 (23:34 +1000)
2nd DAWR can be set/unset using H_SET_MODE hcall with resource value 5.
Enable powervm guest support with that. This has no effect on kvm guest
because kvm will return error if guest does hcall with resource value 5.

Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200723090813.303838-9-ravi.bangoria@linux.ibm.com
arch/powerpc/include/asm/hvcall.h
arch/powerpc/include/asm/machdep.h
arch/powerpc/include/asm/plpar_wrappers.h
arch/powerpc/kernel/dawr.c
arch/powerpc/platforms/pseries/setup.c

index 9ab367030f4f9e188da98c94c1296ed142e47c74..fbb37705547185cdcd33f8a2ef7681f0e1eec78e 100644 (file)
 #define H_SET_MODE_RESOURCE_SET_DAWR0          2
 #define H_SET_MODE_RESOURCE_ADDR_TRANS_MODE    3
 #define H_SET_MODE_RESOURCE_LE                 4
+#define H_SET_MODE_RESOURCE_SET_DAWR1          5
 
 /* Values for argument to H_SIGNAL_SYS_RESET */
 #define H_SIGNAL_SYS_RESET_ALL                 -1
index 7bcb64444a394335309c73b269152bce55b6acf1..a90b892f0bfe345453bddc19413d2ccf482ad58b 100644 (file)
@@ -131,7 +131,7 @@ struct machdep_calls {
                                    unsigned long dabrx);
 
        /* Set DAWR for this platform, leave empty for default implementation */
-       int             (*set_dawr)(unsigned long dawr,
+       int             (*set_dawr)(int nr, unsigned long dawr,
                                    unsigned long dawrx);
 
 #ifdef CONFIG_PPC32    /* XXX for now */
index d12c3680d94693b2349343df70f5e455f0ae25d3..ece84a430701fcc20ac17e709bcff0f02732036d 100644 (file)
@@ -315,6 +315,11 @@ static inline long plpar_set_watchpoint0(unsigned long dawr0, unsigned long dawr
        return plpar_set_mode(0, H_SET_MODE_RESOURCE_SET_DAWR0, dawr0, dawrx0);
 }
 
+static inline long plpar_set_watchpoint1(unsigned long dawr1, unsigned long dawrx1)
+{
+       return plpar_set_mode(0, H_SET_MODE_RESOURCE_SET_DAWR1, dawr1, dawrx1);
+}
+
 static inline long plpar_signal_sys_reset(long cpu)
 {
        return plpar_hcall_norets(H_SIGNAL_SYS_RESET, cpu);
index 500f52fa47114a8f16578a10162451051ca09cef..cdc2dccb987dca0e2b33931b90770ee14ca456e5 100644 (file)
@@ -37,7 +37,7 @@ int set_dawr(int nr, struct arch_hw_breakpoint *brk)
        dawrx |= (mrd & 0x3f) << (63 - 53);
 
        if (ppc_md.set_dawr)
-               return ppc_md.set_dawr(dawr, dawrx);
+               return ppc_md.set_dawr(nr, dawr, dawrx);
 
        if (nr == 0) {
                mtspr(SPRN_DAWR0, dawr);
index 8c85466e0dd8eee9d1f80a4728d1521effcf1d0e..ba34eb23e8f53a2141dd19718fb69ff05c5a2020 100644 (file)
@@ -833,12 +833,15 @@ static int pseries_set_xdabr(unsigned long dabr, unsigned long dabrx)
        return plpar_hcall_norets(H_SET_XDABR, dabr, dabrx);
 }
 
-static int pseries_set_dawr(unsigned long dawr, unsigned long dawrx)
+static int pseries_set_dawr(int nr, unsigned long dawr, unsigned long dawrx)
 {
        /* PAPR says we can't set HYP */
        dawrx &= ~DAWRX_HYP;
 
-       return  plpar_set_watchpoint0(dawr, dawrx);
+       if (nr == 0)
+               return plpar_set_watchpoint0(dawr, dawrx);
+       else
+               return plpar_set_watchpoint1(dawr, dawrx);
 }
 
 #define CMO_CHARACTERISTICS_TOKEN 44