All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Huth <thuth@redhat.com>
To: Paul Mackerras <paulus@samba.org>, kvm-ppc@vger.kernel.org
Cc: kvm@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	Laurent Vivier <lvivier@redhat.com>
Subject: [PATCH] KVM: PPC: Book3S PR: Do not always inject facility unavailable exceptions
Date: Mon,  3 Apr 2017 13:28:34 +0200	[thread overview]
Message-ID: <1491218914-10992-1-git-send-email-thuth@redhat.com> (raw)

KVM should not inject a facility unavailable exception into the guest
when it tries to execute a mtspr/mfspr instruction for an SPR that
is unavailable, and the vCPU is *not* running in PRoblem state.

It's right that we inject an exception when the vCPU is in PR mode, since
chapter "6.2.10 Facility Status and Control Register" of the PowerISA
v2.07 says that "When the FSCR makes a facility unavailable, attempted
usage of the facility in *problem state* is treated as follows: [...]
Access of an SPR using mfspr/mtspr causes a Facility Unavailable
interrupt". But if the guest vCPU is not in PR mode, we should follow
the behavior that is described in chapter "4.4.4 Move To/From System
Register Instructions" instead and treat the instruction as a NOP.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 arch/powerpc/kvm/book3s_pr.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index d4dfc0c..3e6c0b3 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -27,6 +27,7 @@
 #include <asm/reg.h>
 #include <asm/cputable.h>
 #include <asm/cacheflush.h>
+#include <asm/disassemble.h>
 #include <asm/tlbflush.h>
 #include <linux/uaccess.h>
 #include <asm/io.h>
@@ -830,6 +831,31 @@ static void kvmppc_emulate_fac(struct kvm_vcpu *vcpu, ulong fac)
 	}
 }
 
+static void kvmppc_handle_fac_not_enabled(struct kvm_vcpu *vcpu, ulong fac)
+{
+	enum emulation_result er;
+	u32 inst;
+
+	if (kvmppc_get_msr(vcpu) & MSR_PR) {
+		kvmppc_trigger_fac_interrupt(vcpu, fac);
+		return;
+	}
+
+	er = kvmppc_get_last_inst(vcpu, INST_GENERIC, &inst);
+	if (er != EMULATE_DONE)
+		return;
+
+	if (get_op(inst) == 31 && (get_xop(inst) == OP_31_XOP_MTSPR ||
+				   get_xop(inst) == OP_31_XOP_MFSPR)) {
+		/* mtspr and mfspr are treated as NOP for unsupported SPRs */
+		kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) + 4);
+		pr_debug_ratelimited("%s: write/read of disabled SPR: %d\n",
+				     __func__, get_sprn(inst));
+	} else {
+		kvmppc_trigger_fac_interrupt(vcpu, fac);
+	}
+}
+
 /* Enable facilities (TAR, EBB, DSCR) for the guest */
 static int kvmppc_handle_fac(struct kvm_vcpu *vcpu, ulong fac)
 {
@@ -855,7 +881,7 @@ static int kvmppc_handle_fac(struct kvm_vcpu *vcpu, ulong fac)
 
 	if (!guest_fac_enabled) {
 		/* Facility not enabled by the guest */
-		kvmppc_trigger_fac_interrupt(vcpu, fac);
+		kvmppc_handle_fac_not_enabled(vcpu, fac);
 		return RESUME_GUEST;
 	}
 
-- 
1.8.3.1

WARNING: multiple messages have this Message-ID (diff)
From: Thomas Huth <thuth@redhat.com>
To: Paul Mackerras <paulus@samba.org>, kvm-ppc@vger.kernel.org
Cc: kvm@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	Laurent Vivier <lvivier@redhat.com>
Subject: [PATCH] KVM: PPC: Book3S PR: Do not always inject facility unavailable exceptions
Date: Mon, 03 Apr 2017 11:28:34 +0000	[thread overview]
Message-ID: <1491218914-10992-1-git-send-email-thuth@redhat.com> (raw)

KVM should not inject a facility unavailable exception into the guest
when it tries to execute a mtspr/mfspr instruction for an SPR that
is unavailable, and the vCPU is *not* running in PRoblem state.

It's right that we inject an exception when the vCPU is in PR mode, since
chapter "6.2.10 Facility Status and Control Register" of the PowerISA
v2.07 says that "When the FSCR makes a facility unavailable, attempted
usage of the facility in *problem state* is treated as follows: [...]
Access of an SPR using mfspr/mtspr causes a Facility Unavailable
interrupt". But if the guest vCPU is not in PR mode, we should follow
the behavior that is described in chapter "4.4.4 Move To/From System
Register Instructions" instead and treat the instruction as a NOP.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 arch/powerpc/kvm/book3s_pr.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index d4dfc0c..3e6c0b3 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -27,6 +27,7 @@
 #include <asm/reg.h>
 #include <asm/cputable.h>
 #include <asm/cacheflush.h>
+#include <asm/disassemble.h>
 #include <asm/tlbflush.h>
 #include <linux/uaccess.h>
 #include <asm/io.h>
@@ -830,6 +831,31 @@ static void kvmppc_emulate_fac(struct kvm_vcpu *vcpu, ulong fac)
 	}
 }
 
+static void kvmppc_handle_fac_not_enabled(struct kvm_vcpu *vcpu, ulong fac)
+{
+	enum emulation_result er;
+	u32 inst;
+
+	if (kvmppc_get_msr(vcpu) & MSR_PR) {
+		kvmppc_trigger_fac_interrupt(vcpu, fac);
+		return;
+	}
+
+	er = kvmppc_get_last_inst(vcpu, INST_GENERIC, &inst);
+	if (er != EMULATE_DONE)
+		return;
+
+	if (get_op(inst) = 31 && (get_xop(inst) = OP_31_XOP_MTSPR ||
+				   get_xop(inst) = OP_31_XOP_MFSPR)) {
+		/* mtspr and mfspr are treated as NOP for unsupported SPRs */
+		kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) + 4);
+		pr_debug_ratelimited("%s: write/read of disabled SPR: %d\n",
+				     __func__, get_sprn(inst));
+	} else {
+		kvmppc_trigger_fac_interrupt(vcpu, fac);
+	}
+}
+
 /* Enable facilities (TAR, EBB, DSCR) for the guest */
 static int kvmppc_handle_fac(struct kvm_vcpu *vcpu, ulong fac)
 {
@@ -855,7 +881,7 @@ static int kvmppc_handle_fac(struct kvm_vcpu *vcpu, ulong fac)
 
 	if (!guest_fac_enabled) {
 		/* Facility not enabled by the guest */
-		kvmppc_trigger_fac_interrupt(vcpu, fac);
+		kvmppc_handle_fac_not_enabled(vcpu, fac);
 		return RESUME_GUEST;
 	}
 
-- 
1.8.3.1


             reply	other threads:[~2017-04-03 11:28 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-03 11:28 Thomas Huth [this message]
2017-04-03 11:28 ` [PATCH] KVM: PPC: Book3S PR: Do not always inject facility unavailable exceptions Thomas Huth
2017-04-04  6:19 ` Paul Mackerras
2017-04-04  6:19   ` Paul Mackerras

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=1491218914-10992-1-git-send-email-thuth@redhat.com \
    --to=thuth@redhat.com \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=lvivier@redhat.com \
    --cc=paulus@samba.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.