linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: <kvm-ppc@vger.kernel.org> <kvm-ppc@vger.kernel.org>
Cc: Scott Wood <scottwood@freescale.com>,
	linuxppc-dev <linuxppc-dev@lists.ozlabs.org>,
	list <kvm@vger.kernel.org>
Subject: [PATCH 11/30] KVM: PPC: e500: emulate tlbilx
Date: Fri, 17 Feb 2012 17:56:39 +0100	[thread overview]
Message-ID: <1329497818-9729-12-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1329497818-9729-1-git-send-email-agraf@suse.de>

From: Scott Wood <scottwood@freescale.com>

tlbilx is the new, preferred invalidation instruction.  It is not
found on e500 prior to e500mc, but there should be no harm in
supporting it on all e500.

Based on code from Ashish Kalra <Ashish.Kalra@freescale.com>.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/kvm/e500.h         |    1 +
 arch/powerpc/kvm/e500_emulate.c |    9 ++++++
 arch/powerpc/kvm/e500_tlb.c     |   52 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kvm/e500.h b/arch/powerpc/kvm/e500.h
index f4dee55..ce3f163 100644
--- a/arch/powerpc/kvm/e500.h
+++ b/arch/powerpc/kvm/e500.h
@@ -124,6 +124,7 @@ int kvmppc_e500_emul_mt_mmucsr0(struct kvmppc_vcpu_e500 *vcpu_e500,
 int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu);
 int kvmppc_e500_emul_tlbre(struct kvm_vcpu *vcpu);
 int kvmppc_e500_emul_tlbivax(struct kvm_vcpu *vcpu, int ra, int rb);
+int kvmppc_e500_emul_tlbilx(struct kvm_vcpu *vcpu, int rt, int ra, int rb);
 int kvmppc_e500_emul_tlbsx(struct kvm_vcpu *vcpu, int rb);
 int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500);
 void kvmppc_e500_tlb_uninit(struct kvmppc_vcpu_e500 *vcpu_e500);
diff --git a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c
index c80794d..af02c18 100644
--- a/arch/powerpc/kvm/e500_emulate.c
+++ b/arch/powerpc/kvm/e500_emulate.c
@@ -22,6 +22,7 @@
 #define XOP_TLBSX   914
 #define XOP_TLBRE   946
 #define XOP_TLBWE   978
+#define XOP_TLBILX  18
 
 int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                            unsigned int inst, int *advance)
@@ -29,6 +30,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	int emulated = EMULATE_DONE;
 	int ra;
 	int rb;
+	int rt;
 
 	switch (get_op(inst)) {
 	case 31:
@@ -47,6 +49,13 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
 			emulated = kvmppc_e500_emul_tlbsx(vcpu,rb);
 			break;
 
+		case XOP_TLBILX:
+			ra = get_ra(inst);
+			rb = get_rb(inst);
+			rt = get_rt(inst);
+			emulated = kvmppc_e500_emul_tlbilx(vcpu, rt, ra, rb);
+			break;
+
 		case XOP_TLBIVAX:
 			ra = get_ra(inst);
 			rb = get_rb(inst);
diff --git a/arch/powerpc/kvm/e500_tlb.c b/arch/powerpc/kvm/e500_tlb.c
index c8ce51d..6eb5d65 100644
--- a/arch/powerpc/kvm/e500_tlb.c
+++ b/arch/powerpc/kvm/e500_tlb.c
@@ -631,6 +631,58 @@ int kvmppc_e500_emul_tlbivax(struct kvm_vcpu *vcpu, int ra, int rb)
 	return EMULATE_DONE;
 }
 
+static void tlbilx_all(struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel,
+		       int pid, int rt)
+{
+	struct kvm_book3e_206_tlb_entry *tlbe;
+	int tid, esel;
+
+	/* invalidate all entries */
+	for (esel = 0; esel < vcpu_e500->gtlb_params[tlbsel].entries; esel++) {
+		tlbe = get_entry(vcpu_e500, tlbsel, esel);
+		tid = get_tlb_tid(tlbe);
+		if (rt == 0 || tid == pid) {
+			inval_gtlbe_on_host(vcpu_e500, tlbsel, esel);
+			kvmppc_e500_gtlbe_invalidate(vcpu_e500, tlbsel, esel);
+		}
+	}
+}
+
+static void tlbilx_one(struct kvmppc_vcpu_e500 *vcpu_e500, int pid,
+		       int ra, int rb)
+{
+	int tlbsel, esel;
+	gva_t ea;
+
+	ea = kvmppc_get_gpr(&vcpu_e500->vcpu, rb);
+	if (ra)
+		ea += kvmppc_get_gpr(&vcpu_e500->vcpu, ra);
+
+	for (tlbsel = 0; tlbsel < 2; tlbsel++) {
+		esel = kvmppc_e500_tlb_index(vcpu_e500, ea, tlbsel, pid, -1);
+		if (esel >= 0) {
+			inval_gtlbe_on_host(vcpu_e500, tlbsel, esel);
+			kvmppc_e500_gtlbe_invalidate(vcpu_e500, tlbsel, esel);
+			break;
+		}
+	}
+}
+
+int kvmppc_e500_emul_tlbilx(struct kvm_vcpu *vcpu, int rt, int ra, int rb)
+{
+	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
+	int pid = get_cur_spid(vcpu);
+
+	if (rt == 0 || rt == 1) {
+		tlbilx_all(vcpu_e500, 0, pid, rt);
+		tlbilx_all(vcpu_e500, 1, pid, rt);
+	} else if (rt == 3) {
+		tlbilx_one(vcpu_e500, pid, ra, rb);
+	}
+
+	return EMULATE_DONE;
+}
+
 int kvmppc_e500_emul_tlbre(struct kvm_vcpu *vcpu)
 {
 	struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
-- 
1.6.0.2

  parent reply	other threads:[~2012-02-17 16:57 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-17 16:56 [PATCH 00/30] KVM: PPC: e500mc support Alexander Graf
2012-02-17 16:56 ` [PATCH 01/30] powerpc/booke: Set CPU_FTR_DEBUG_LVL_EXC on 32-bit Alexander Graf
2012-02-17 16:56 ` [PATCH 02/30] powerpc/e500: split CPU_FTRS_ALWAYS/CPU_FTRS_POSSIBLE Alexander Graf
2012-02-17 16:56 ` [PATCH 03/30] KVM: PPC: factor out lpid allocator from book3s_64_mmu_hv Alexander Graf
2012-02-17 16:56 ` [PATCH 04/30] KVM: PPC: booke: add booke-level vcpu load/put Alexander Graf
2012-02-17 16:56 ` [PATCH 05/30] KVM: PPC: booke: Move vm core init/destroy out of booke.c Alexander Graf
2012-02-17 16:56 ` [PATCH 06/30] KVM: PPC: e500: rename e500_tlb.h to e500.h Alexander Graf
2012-02-17 16:56 ` [PATCH 07/30] KVM: PPC: e500: merge <asm/kvm_e500.h> into arch/powerpc/kvm/e500.h Alexander Graf
2012-02-17 16:56 ` [PATCH 08/30] KVM: PPC: e500: clean up arch/powerpc/kvm/e500.h Alexander Graf
2012-02-17 16:56 ` [PATCH 09/30] KVM: PPC: e500: refactor core-specific TLB code Alexander Graf
2012-02-17 16:56 ` [PATCH 10/30] KVM: PPC: e500: Track TLB1 entries with a bitmap Alexander Graf
2012-02-17 16:56 ` Alexander Graf [this message]
2012-02-17 16:56 ` [PATCH 12/30] powerpc/booke: Provide exception macros with interrupt name Alexander Graf
2012-02-17 16:56 ` [PATCH 13/30] KVM: PPC: booke: category E.HV (GS-mode) support Alexander Graf
2012-02-17 16:56 ` [PATCH 14/30] KVM: PPC: booke: standard PPC floating point support Alexander Graf
2012-02-17 16:56 ` [PATCH 15/30] KVM: PPC: e500mc support Alexander Graf
2012-02-17 16:56 ` [PATCH 16/30] KVM: PPC: e500mc: Add doorbell emulation support Alexander Graf
2012-02-17 16:56 ` [PATCH 17/30] KVM: PPC: e500mc: implicitly set MSR_GS Alexander Graf
2012-02-17 16:56 ` [PATCH 18/30] KVM: PPC: e500mc: Move r1/r2 restoration very early Alexander Graf
2012-02-17 16:56 ` [PATCH 19/30] KVM: PPC: e500mc: add load inst fixup Alexander Graf
2012-02-17 16:56 ` [PATCH 20/30] KVM: PPC: rename CONFIG_KVM_E500 -> CONFIG_KVM_E500V2 Alexander Graf
2012-02-17 16:56 ` [PATCH 21/30] KVM: PPC: make e500v2 and e500mc mutually exclusive Alexander Graf
2012-02-17 22:32   ` Tabi Timur-B04825
2012-02-17 23:27     ` Alexander Graf
2012-02-17 16:56 ` [PATCH 22/30] KVM: PPC: booke: remove leftover debugging Alexander Graf
2012-02-17 16:56 ` [PATCH 23/30] KVM: PPC: booke: deliver program int on emulation failure Alexander Graf
2012-02-17 16:56 ` [PATCH 24/30] KVM: PPC: booke: call resched after every exit Alexander Graf
2012-02-17 16:56 ` [PATCH 25/30] KVM: PPC: booke: BOOKE_IRQPRIO_MAX is n+1 Alexander Graf
2012-02-17 16:56 ` [PATCH 26/30] KVM: PPC: bookehv: fix exit timing Alexander Graf
2012-02-17 16:56 ` [PATCH 27/30] KVM: PPC: bookehv: remove negation for CONFIG_64BIT Alexander Graf
2012-02-17 16:56 ` [PATCH 28/30] KVM: PPC: bookehv: remove SET_VCPU Alexander Graf
2012-02-17 16:56 ` [PATCH 29/30] KVM: PPC: bookehv: disable MAS register updates early Alexander Graf
2012-02-17 16:56 ` [PATCH 30/30] KVM: PPC: bookehv: add comment about shadow_msr Alexander Graf
2012-02-17 17:13 [PATCH 00/30] KVM: PPC: e500mc support Alexander Graf
2012-02-17 17:13 ` [PATCH 11/30] KVM: PPC: e500: emulate tlbilx Alexander Graf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1329497818-9729-12-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=scottwood@freescale.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).