From: Fabiano Rosas <farosas@linux.ibm.com>
To: kvm-ppc@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org, npiggin@gmail.com, aik@ozlabs.ru
Subject: [PATCH v4 5/5] KVM: PPC: mmio: Deliver DSI after emulation failure
Date: Fri, 21 Jan 2022 19:26:26 -0300 [thread overview]
Message-ID: <20220121222626.972495-6-farosas@linux.ibm.com> (raw)
In-Reply-To: <20220121222626.972495-1-farosas@linux.ibm.com>
MMIO emulation can fail if the guest uses an instruction that we are
not prepared to emulate. Since these instructions can be and most
likely are valid ones, this is (slightly) closer to an access fault
than to an illegal instruction, so deliver a Data Storage interrupt
instead of a Program interrupt.
Suggested-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
---
arch/powerpc/kvm/emulate_loadstore.c | 10 +++-------
arch/powerpc/kvm/powerpc.c | 12 ++++++++++++
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c
index 48272a9b9c30..cfc9114b87d0 100644
--- a/arch/powerpc/kvm/emulate_loadstore.c
+++ b/arch/powerpc/kvm/emulate_loadstore.c
@@ -73,7 +73,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
{
u32 inst;
enum emulation_result emulated = EMULATE_FAIL;
- int advance = 1;
struct instruction_op op;
/* this default type might be overwritten by subcategories */
@@ -98,6 +97,8 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
int type = op.type & INSTR_TYPE_MASK;
int size = GETSIZE(op.type);
+ vcpu->mmio_is_write = OP_IS_STORE(type);
+
switch (type) {
case LOAD: {
int instr_byte_swap = op.type & BYTEREV;
@@ -355,15 +356,10 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
}
}
- if (emulated == EMULATE_FAIL) {
- advance = 0;
- kvmppc_core_queue_program(vcpu, 0);
- }
-
trace_kvm_ppc_instr(inst, kvmppc_get_pc(vcpu), emulated);
/* Advance past emulated instruction. */
- if (advance)
+ if (emulated != EMULATE_FAIL)
kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) + 4);
return emulated;
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 214602c58f13..9befb121dddb 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -305,10 +305,22 @@ int kvmppc_emulate_mmio(struct kvm_vcpu *vcpu)
case EMULATE_FAIL:
{
u32 last_inst;
+ ulong store_bit = DSISR_ISSTORE;
+ ulong cause = DSISR_BADACCESS;
+#ifdef CONFIG_BOOKE
+ store_bit = ESR_ST;
+ cause = 0;
+#endif
kvmppc_get_last_inst(vcpu, INST_GENERIC, &last_inst);
pr_info_ratelimited("KVM: guest access to device memory using unsupported instruction (PID: %d opcode: %#08x)\n",
current->pid, last_inst);
+
+ if (vcpu->mmio_is_write)
+ cause |= store_bit;
+
+ kvmppc_core_queue_data_storage(vcpu, vcpu->arch.vaddr_accessed,
+ cause);
r = RESUME_GUEST;
break;
}
--
2.34.1
next prev parent reply other threads:[~2022-01-21 22:30 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-21 22:26 [PATCH v4 0/5] KVM: PPC: MMIO fixes Fabiano Rosas
2022-01-21 22:26 ` [PATCH v4 1/5] KVM: PPC: Book3S HV: Stop returning internal values to userspace Fabiano Rosas
2022-01-21 22:26 ` [PATCH v4 2/5] KVM: PPC: Fix vmx/vsx mixup in mmio emulation Fabiano Rosas
2022-01-21 22:26 ` [PATCH v4 3/5] KVM: PPC: mmio: Reject instructions that access more than mmio.data size Fabiano Rosas
2022-01-25 3:06 ` Nicholas Piggin
2022-01-21 22:26 ` [PATCH v4 4/5] KVM: PPC: mmio: Return to guest after emulation failure Fabiano Rosas
2022-01-25 3:26 ` Nicholas Piggin
2022-01-21 22:26 ` Fabiano Rosas [this message]
2022-01-25 3:39 ` [PATCH v4 5/5] KVM: PPC: mmio: Deliver DSI " Nicholas Piggin
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=20220121222626.972495-6-farosas@linux.ibm.com \
--to=farosas@linux.ibm.com \
--cc=aik@ozlabs.ru \
--cc=kvm-ppc@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=npiggin@gmail.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).