diff mbox

[kernel] KVM: PPC: Add MMIO emulation for stdx (store doubleword indexed)

Message ID 20170317083138.36527-1-aik@ozlabs.ru (mailing list archive)
State Superseded
Delegated to: Paul Mackerras
Headers show

Commit Message

Alexey Kardashevskiy March 17, 2017, 8:31 a.m. UTC
This adds missing stdx emulation which allow Mellanox driver from
recent kernels work when MMIO emulation is enforced in the userspace.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 arch/powerpc/include/asm/ppc-opcode.h | 1 +
 arch/powerpc/kvm/emulate_loadstore.c  | 6 ++++++
 2 files changed, 7 insertions(+)

Comments

Alexey Kardashevskiy March 17, 2017, 12:11 p.m. UTC | #1
On 17/03/17 19:31, Alexey Kardashevskiy wrote:
> This adds missing stdx emulation which allow Mellanox driver from
> recent kernels work when MMIO emulation is enforced in the userspace.


btw what would its load counterpart? Load Doubleword Indexed - ldx RT,RA,RB?


> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> ---
>  arch/powerpc/include/asm/ppc-opcode.h | 1 +
>  arch/powerpc/kvm/emulate_loadstore.c  | 6 ++++++
>  2 files changed, 7 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
> index e7d6d86563ee..ca1bbe49590b 100644
> --- a/arch/powerpc/include/asm/ppc-opcode.h
> +++ b/arch/powerpc/include/asm/ppc-opcode.h
> @@ -92,6 +92,7 @@
>  #define OP_31_XOP_TRAP_64   68
>  #define OP_31_XOP_DCBF      86
>  #define OP_31_XOP_LBZX      87
> +#define OP_31_XOP_STDX      149
>  #define OP_31_XOP_STWX      151
>  #define OP_31_XOP_STBX      215
>  #define OP_31_XOP_LBZUX     119
> diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c
> index 6d3c0ee1d744..9fdbeb8ea86c 100644
> --- a/arch/powerpc/kvm/emulate_loadstore.c
> +++ b/arch/powerpc/kvm/emulate_loadstore.c
> @@ -82,6 +82,12 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
>  			kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
>  			break;
>  
> +		case OP_31_XOP_STDX:
> +			emulated = kvmppc_handle_store(run, vcpu,
> +						       kvmppc_get_gpr(vcpu, rs),
> +							8, 1);
> +			break;
> +
>  		case OP_31_XOP_STWX:
>  			emulated = kvmppc_handle_store(run, vcpu,
>  						       kvmppc_get_gpr(vcpu, rs),
>
Benjamin Herrenschmidt March 19, 2017, 5:40 a.m. UTC | #2
On Fri, 2017-03-17 at 23:11 +1100, Alexey Kardashevskiy wrote:
> On 17/03/17 19:31, Alexey Kardashevskiy wrote:
> > This adds missing stdx emulation which allow Mellanox driver from
> > recent kernels work when MMIO emulation is enforced in the
> > userspace.
> 
> 
> btw what would its load counterpart? Load Doubleword Indexed - ldx
> RT,RA,RB?

Yes.

Do we also do the more "classic" ld/std ?

Cheers,
Ben.

> 
> > 
> > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> > ---
> >  arch/powerpc/include/asm/ppc-opcode.h | 1 +
> >  arch/powerpc/kvm/emulate_loadstore.c  | 6 ++++++
> >  2 files changed, 7 insertions(+)
> > 
> > diff --git a/arch/powerpc/include/asm/ppc-opcode.h
> > b/arch/powerpc/include/asm/ppc-opcode.h
> > index e7d6d86563ee..ca1bbe49590b 100644
> > --- a/arch/powerpc/include/asm/ppc-opcode.h
> > +++ b/arch/powerpc/include/asm/ppc-opcode.h
> > @@ -92,6 +92,7 @@
> >  #define OP_31_XOP_TRAP_64   68
> >  #define OP_31_XOP_DCBF      86
> >  #define OP_31_XOP_LBZX      87
> > +#define OP_31_XOP_STDX      149
> >  #define OP_31_XOP_STWX      151
> >  #define OP_31_XOP_STBX      215
> >  #define OP_31_XOP_LBZUX     119
> > diff --git a/arch/powerpc/kvm/emulate_loadstore.c
> > b/arch/powerpc/kvm/emulate_loadstore.c
> > index 6d3c0ee1d744..9fdbeb8ea86c 100644
> > --- a/arch/powerpc/kvm/emulate_loadstore.c
> > +++ b/arch/powerpc/kvm/emulate_loadstore.c
> > @@ -82,6 +82,12 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu
> > *vcpu)
> >  			kvmppc_set_gpr(vcpu, ra, vcpu-
> > >arch.vaddr_accessed);
> >  			break;
> >  
> > +		case OP_31_XOP_STDX:
> > +			emulated = kvmppc_handle_store(run, vcpu,
> > +						       kvmppc_get_
> > gpr(vcpu, rs),
> > +							8, 1);
> > +			break;
> > +
> >  		case OP_31_XOP_STWX:
> >  			emulated = kvmppc_handle_store(run, vcpu,
> >  						       kvmppc_get_
> > gpr(vcpu, rs),
> > 
> 
>
diff mbox

Patch

diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
index e7d6d86563ee..ca1bbe49590b 100644
--- a/arch/powerpc/include/asm/ppc-opcode.h
+++ b/arch/powerpc/include/asm/ppc-opcode.h
@@ -92,6 +92,7 @@ 
 #define OP_31_XOP_TRAP_64   68
 #define OP_31_XOP_DCBF      86
 #define OP_31_XOP_LBZX      87
+#define OP_31_XOP_STDX      149
 #define OP_31_XOP_STWX      151
 #define OP_31_XOP_STBX      215
 #define OP_31_XOP_LBZUX     119
diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c
index 6d3c0ee1d744..9fdbeb8ea86c 100644
--- a/arch/powerpc/kvm/emulate_loadstore.c
+++ b/arch/powerpc/kvm/emulate_loadstore.c
@@ -82,6 +82,12 @@  int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
 			kvmppc_set_gpr(vcpu, ra, vcpu->arch.vaddr_accessed);
 			break;
 
+		case OP_31_XOP_STDX:
+			emulated = kvmppc_handle_store(run, vcpu,
+						       kvmppc_get_gpr(vcpu, rs),
+							8, 1);
+			break;
+
 		case OP_31_XOP_STWX:
 			emulated = kvmppc_handle_store(run, vcpu,
 						       kvmppc_get_gpr(vcpu, rs),