linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
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 v2 7/7] KVM: PPC: mmio: Reject instructions that access more than mmio.data size
Date: Thu,  6 Jan 2022 17:03:04 -0300	[thread overview]
Message-ID: <20220106200304.4070825-8-farosas@linux.ibm.com> (raw)
In-Reply-To: <20220106200304.4070825-1-farosas@linux.ibm.com>

The MMIO interface between the kernel and userspace uses a structure
that supports a maximum of 8-bytes of data. Instructions that access
more than that need to be emulated in parts.

We currently don't have generic support for splitting the emulation in
parts and each set of instructions needs to be explicitly included.

There's already an error message being printed when a load or store
exceeds the mmio.data buffer but we don't fail the emulation until
later at kvmppc_complete_mmio_load and even then we allow userspace to
make a partial copy of the data, which ends up overwriting some fields
of the mmio structure.

This patch makes the emulation fail earlier at kvmppc_handle_load|store,
which will send a Program interrupt to the guest. This is better than
allowing the guest to proceed with partial data.

Note that this was caught in a somewhat artificial scenario using
quadword instructions (lq/stq), there's no account of an actual guest
in the wild running instructions that are not properly emulated.

Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
---
 arch/powerpc/kvm/powerpc.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 50e08635e18a..a1643ca988e0 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -1247,6 +1247,7 @@ static int __kvmppc_handle_load(struct kvm_vcpu *vcpu,
 	if (bytes > sizeof(run->mmio.data)) {
 		printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__,
 		       bytes);
+		return EMULATE_FAIL;
 	}
 
 	run->mmio.phys_addr = vcpu->arch.paddr_accessed;
@@ -1336,6 +1337,7 @@ int kvmppc_handle_store(struct kvm_vcpu *vcpu,
 	if (bytes > sizeof(run->mmio.data)) {
 		printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__,
 		       bytes);
+		return EMULATE_FAIL;
 	}
 
 	run->mmio.phys_addr = vcpu->arch.paddr_accessed;
-- 
2.33.1


  parent reply	other threads:[~2022-01-06 20:08 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-06 20:02 [PATCH v2 0/7] KVM: PPC: MMIO fixes Fabiano Rosas
2022-01-06 20:02 ` [PATCH v2 1/7] KVM: PPC: Book3S HV: Stop returning internal values to userspace Fabiano Rosas
2022-01-06 20:02 ` [PATCH v2 2/7] KVM: PPC: Fix vmx/vsx mixup in mmio emulation Fabiano Rosas
2022-01-06 20:03 ` [PATCH v2 3/7] KVM: PPC: Fix mmio length message Fabiano Rosas
2022-01-07  0:19   ` Alexey Kardashevskiy
2022-01-06 20:03 ` [PATCH v2 4/7] KVM: PPC: Don't use pr_emerg when mmio emulation fails Fabiano Rosas
2022-01-06 20:03 ` [PATCH v2 5/7] KVM: PPC: mmio: Queue interrupt at kvmppc_emulate_mmio Fabiano Rosas
2022-01-07  0:24   ` Alexey Kardashevskiy
2022-01-06 20:03 ` [PATCH v2 6/7] KVM: PPC: mmio: Return to guest after emulation failure Fabiano Rosas
2022-01-07  1:08   ` Alexey Kardashevskiy
2022-01-07 13:07     ` Fabiano Rosas
2022-01-06 20:03 ` Fabiano Rosas [this message]
2022-01-07  0:30   ` [PATCH v2 7/7] KVM: PPC: mmio: Reject instructions that access more than mmio.data size Alexey Kardashevskiy

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=20220106200304.4070825-8-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).