Patchwork KVM/PPC: emulate ehpriv

login
register
mail settings
Submitter Tiejun Chen
Date April 19, 2013, 2:44 a.m.
Message ID <1366339480-9223-1-git-send-email-tiejun.chen@windriver.com>
Download mbox | patch
Permalink /patch/237822/
State New
Headers show

Comments

Tiejun Chen - April 19, 2013, 2:44 a.m.
We can provide this emulation to simplify more extension later.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/include/asm/disassemble.h |    4 ++++
 arch/powerpc/kvm/e500_emulate.c        |   17 +++++++++++++++++
 2 files changed, 21 insertions(+)
Alexander Graf - April 19, 2013, 12:13 p.m.
On 19.04.2013, at 04:44, Tiejun Chen wrote:

> We can provide this emulation to simplify more extension later.

Works for me, but this should really be part of a series that makes use of ehpriv.


Alex

> 
> Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
> ---
> arch/powerpc/include/asm/disassemble.h |    4 ++++
> arch/powerpc/kvm/e500_emulate.c        |   17 +++++++++++++++++
> 2 files changed, 21 insertions(+)
> 
> diff --git a/arch/powerpc/include/asm/disassemble.h b/arch/powerpc/include/asm/disassemble.h
> index 9b198d1..856f8de 100644
> --- a/arch/powerpc/include/asm/disassemble.h
> +++ b/arch/powerpc/include/asm/disassemble.h
> @@ -77,4 +77,8 @@ static inline unsigned int get_d(u32 inst)
> 	return inst & 0xffff;
> }
> 
> +static inline unsigned int get_oc(u32 inst)
> +{
> +	return (inst >> 11) & 0x7fff;
> +}
> #endif /* __ASM_PPC_DISASSEMBLE_H__ */
> diff --git a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c
> index e78f353..36492cf 100644
> --- a/arch/powerpc/kvm/e500_emulate.c
> +++ b/arch/powerpc/kvm/e500_emulate.c
> @@ -26,6 +26,7 @@
> #define XOP_TLBRE   946
> #define XOP_TLBWE   978
> #define XOP_TLBILX  18
> +#define XOP_EHPRIV  270
> 
> #ifdef CONFIG_KVM_E500MC
> static int dbell2prio(ulong param)
> @@ -80,6 +81,18 @@ static int kvmppc_e500_emul_msgsnd(struct kvm_vcpu *vcpu, int rb)
> 
> 	return EMULATE_DONE;
> }
> +
> +static int kvmppc_e500_emul_ehpriv(struct kvm_run *run, struct kvm_vcpu *vcpu,
> +					unsigned int inst)
> +{
> +	int emulated = EMULATE_DONE;
> +
> +	switch (get_oc(inst)) {
> +	default:
> +		emulated = EMULATE_FAIL;
> +	}
> +	return emulated;
> +}
> #endif
> 
> int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
> @@ -130,6 +143,10 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
> 			emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);
> 			break;
> 
> +		case XOP_EHPRIV:
> +			emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst);
> +			break;
> +
> 		default:
> 			emulated = EMULATE_FAIL;
> 		}
> -- 
> 1.7.9.5
> 

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Bharat Bhushan - April 19, 2013, 3:29 p.m.
> -----Original Message-----
> From: Alexander Graf [mailto:agraf@suse.de]
> Sent: Friday, April 19, 2013 5:44 PM
> To: Tiejun Chen
> Cc: kvm@vger.kernel.org mailing list; kvm-ppc@vger.kernel.org; Bhushan Bharat-
> R65777
> Subject: Re: [PATCH] KVM/PPC: emulate ehpriv
> 
> 
> On 19.04.2013, at 04:44, Tiejun Chen wrote:
> 
> > We can provide this emulation to simplify more extension later.
> 
> Works for me, but this should really be part of a series that makes use of
> ehpriv.

Alex, this already planned to be in my debug patches. I know you are busy and I am just waiting for other patches to be reviewed :) 

-Bharat

> 
> 
> Alex
> 
> >
> > Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
> > ---
> > arch/powerpc/include/asm/disassemble.h |    4 ++++
> > arch/powerpc/kvm/e500_emulate.c        |   17 +++++++++++++++++
> > 2 files changed, 21 insertions(+)
> >
> > diff --git a/arch/powerpc/include/asm/disassemble.h
> > b/arch/powerpc/include/asm/disassemble.h
> > index 9b198d1..856f8de 100644
> > --- a/arch/powerpc/include/asm/disassemble.h
> > +++ b/arch/powerpc/include/asm/disassemble.h
> > @@ -77,4 +77,8 @@ static inline unsigned int get_d(u32 inst)
> > 	return inst & 0xffff;
> > }
> >
> > +static inline unsigned int get_oc(u32 inst) {
> > +	return (inst >> 11) & 0x7fff;
> > +}
> > #endif /* __ASM_PPC_DISASSEMBLE_H__ */ diff --git
> > a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c
> > index e78f353..36492cf 100644
> > --- a/arch/powerpc/kvm/e500_emulate.c
> > +++ b/arch/powerpc/kvm/e500_emulate.c
> > @@ -26,6 +26,7 @@
> > #define XOP_TLBRE   946
> > #define XOP_TLBWE   978
> > #define XOP_TLBILX  18
> > +#define XOP_EHPRIV  270
> >
> > #ifdef CONFIG_KVM_E500MC
> > static int dbell2prio(ulong param)
> > @@ -80,6 +81,18 @@ static int kvmppc_e500_emul_msgsnd(struct kvm_vcpu
> > *vcpu, int rb)
> >
> > 	return EMULATE_DONE;
> > }
> > +
> > +static int kvmppc_e500_emul_ehpriv(struct kvm_run *run, struct kvm_vcpu
> *vcpu,
> > +					unsigned int inst)
> > +{
> > +	int emulated = EMULATE_DONE;
> > +
> > +	switch (get_oc(inst)) {
> > +	default:
> > +		emulated = EMULATE_FAIL;
> > +	}
> > +	return emulated;
> > +}
> > #endif
> >
> > int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
> > @@ -130,6 +143,10 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct
> kvm_vcpu *vcpu,
> > 			emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);
> > 			break;
> >
> > +		case XOP_EHPRIV:
> > +			emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst);
> > +			break;
> > +
> > 		default:
> > 			emulated = EMULATE_FAIL;
> > 		}
> > --
> > 1.7.9.5
> >
> 


--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/arch/powerpc/include/asm/disassemble.h b/arch/powerpc/include/asm/disassemble.h
index 9b198d1..856f8de 100644
--- a/arch/powerpc/include/asm/disassemble.h
+++ b/arch/powerpc/include/asm/disassemble.h
@@ -77,4 +77,8 @@  static inline unsigned int get_d(u32 inst)
 	return inst & 0xffff;
 }
 
+static inline unsigned int get_oc(u32 inst)
+{
+	return (inst >> 11) & 0x7fff;
+}
 #endif /* __ASM_PPC_DISASSEMBLE_H__ */
diff --git a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c
index e78f353..36492cf 100644
--- a/arch/powerpc/kvm/e500_emulate.c
+++ b/arch/powerpc/kvm/e500_emulate.c
@@ -26,6 +26,7 @@ 
 #define XOP_TLBRE   946
 #define XOP_TLBWE   978
 #define XOP_TLBILX  18
+#define XOP_EHPRIV  270
 
 #ifdef CONFIG_KVM_E500MC
 static int dbell2prio(ulong param)
@@ -80,6 +81,18 @@  static int kvmppc_e500_emul_msgsnd(struct kvm_vcpu *vcpu, int rb)
 
 	return EMULATE_DONE;
 }
+
+static int kvmppc_e500_emul_ehpriv(struct kvm_run *run, struct kvm_vcpu *vcpu,
+					unsigned int inst)
+{
+	int emulated = EMULATE_DONE;
+
+	switch (get_oc(inst)) {
+	default:
+		emulated = EMULATE_FAIL;
+	}
+	return emulated;
+}
 #endif
 
 int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
@@ -130,6 +143,10 @@  int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
 			emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);
 			break;
 
+		case XOP_EHPRIV:
+			emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst);
+			break;
+
 		default:
 			emulated = EMULATE_FAIL;
 		}