提交 03f3e54a 编写于 作者: R Ravi Bangoria 提交者: Michael Ellerman

powerpc/watchpoint: Guest support for 2nd DAWR hcall

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: NRavi Bangoria <ravi.bangoria@linux.ibm.com>
Signed-off-by: NMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200723090813.303838-9-ravi.bangoria@linux.ibm.com
上级 6f3fe297
...@@ -358,6 +358,7 @@ ...@@ -358,6 +358,7 @@
#define H_SET_MODE_RESOURCE_SET_DAWR0 2 #define H_SET_MODE_RESOURCE_SET_DAWR0 2
#define H_SET_MODE_RESOURCE_ADDR_TRANS_MODE 3 #define H_SET_MODE_RESOURCE_ADDR_TRANS_MODE 3
#define H_SET_MODE_RESOURCE_LE 4 #define H_SET_MODE_RESOURCE_LE 4
#define H_SET_MODE_RESOURCE_SET_DAWR1 5
/* Values for argument to H_SIGNAL_SYS_RESET */ /* Values for argument to H_SIGNAL_SYS_RESET */
#define H_SIGNAL_SYS_RESET_ALL -1 #define H_SIGNAL_SYS_RESET_ALL -1
......
...@@ -131,7 +131,7 @@ struct machdep_calls { ...@@ -131,7 +131,7 @@ struct machdep_calls {
unsigned long dabrx); unsigned long dabrx);
/* Set DAWR for this platform, leave empty for default implementation */ /* 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); unsigned long dawrx);
#ifdef CONFIG_PPC32 /* XXX for now */ #ifdef CONFIG_PPC32 /* XXX for now */
......
...@@ -315,6 +315,11 @@ static inline long plpar_set_watchpoint0(unsigned long dawr0, unsigned long dawr ...@@ -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); 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) static inline long plpar_signal_sys_reset(long cpu)
{ {
return plpar_hcall_norets(H_SIGNAL_SYS_RESET, cpu); return plpar_hcall_norets(H_SIGNAL_SYS_RESET, cpu);
......
...@@ -37,7 +37,7 @@ int set_dawr(int nr, struct arch_hw_breakpoint *brk) ...@@ -37,7 +37,7 @@ int set_dawr(int nr, struct arch_hw_breakpoint *brk)
dawrx |= (mrd & 0x3f) << (63 - 53); dawrx |= (mrd & 0x3f) << (63 - 53);
if (ppc_md.set_dawr) if (ppc_md.set_dawr)
return ppc_md.set_dawr(dawr, dawrx); return ppc_md.set_dawr(nr, dawr, dawrx);
if (nr == 0) { if (nr == 0) {
mtspr(SPRN_DAWR0, dawr); mtspr(SPRN_DAWR0, dawr);
......
...@@ -833,12 +833,15 @@ static int pseries_set_xdabr(unsigned long dabr, unsigned long dabrx) ...@@ -833,12 +833,15 @@ static int pseries_set_xdabr(unsigned long dabr, unsigned long dabrx)
return plpar_hcall_norets(H_SET_XDABR, dabr, 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 */ /* PAPR says we can't set HYP */
dawrx &= ~DAWRX_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 #define CMO_CHARACTERISTICS_TOKEN 44
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册