All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2] x86/sev-es: Fix SEV-ES #VC handler for string port IO
@ 2021-01-10  7:11 Hyunwook (Wooky) Baek
  2021-01-11 11:47 ` [tip: x86/seves] x86/sev-es: Handle string port IO to kernel memory properly tip-bot2 for Hyunwook (Wooky) Baek
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Hyunwook (Wooky) Baek @ 2021-01-10  7:11 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Borislav Petkov
  Cc: Joerg Roedel, Tom Lendacky, David Rientjes, Sean Christopherson,
	linux-kernel, x86, Hyunwook (Wooky) Baek

Don't assume dest/source buffers are userspace addresses when manually
copying data for string I/O or MOVS MMIO, as {get,put}_user() will fail
if handed a kernel address and ultimately lead to a kernel panic.

Signed-off-by: Hyunwook (Wooky) Baek <baekhw@google.com>
Acked-by: David Rientjes <rientjes@google.com>
---

This patch is tested by invoking INSB/OUTSB instructions in kernel space in a
SEV-ES-enabled VM. Without the patch, the kernel crashed with the following
message:
  "SEV-ES: Unsupported exception in #VC instruction emulation - can't continue"
With the patch, the instructions successfully read/wrote the string from/to
the I/O port.

 arch/x86/kernel/sev-es.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/arch/x86/kernel/sev-es.c b/arch/x86/kernel/sev-es.c
index 0bd1a0fc587e..ab31c34ba508 100644
--- a/arch/x86/kernel/sev-es.c
+++ b/arch/x86/kernel/sev-es.c
@@ -286,6 +286,12 @@ static enum es_result vc_write_mem(struct es_em_ctxt *ctxt,
 	u16 d2;
 	u8  d1;

+	/* If instruction ran in kernel mode and the I/O buffer is in kernel space */
+	if (!user_mode(ctxt->regs) && !access_ok(target, size)) {
+		memcpy(dst, buf, size);
+		return ES_OK;
+	}
+
 	switch (size) {
 	case 1:
 		memcpy(&d1, buf, 1);
@@ -335,6 +341,12 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
 	u16 d2;
 	u8  d1;

+	/* If instruction ran in kernel mode and the I/O buffer is in kernel space */
+	if (!user_mode(ctxt->regs) && !access_ok(s, size)) {
+		memcpy(buf, src, size);
+		return ES_OK;
+	}
+
 	switch (size) {
 	case 1:
 		if (get_user(d1, s))
--
2.30.0.284.gd98b1dd5eaa7-goog


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-11 19:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-10  7:11 [PATCH V2] x86/sev-es: Fix SEV-ES #VC handler for string port IO Hyunwook (Wooky) Baek
2021-01-11 11:47 ` [tip: x86/seves] x86/sev-es: Handle string port IO to kernel memory properly tip-bot2 for Hyunwook (Wooky) Baek
2021-01-11 18:29 ` [PATCH V2] x86/sev-es: Fix SEV-ES #VC handler for string port IO Tom Lendacky
2021-01-11 18:55   ` David Rientjes
2021-01-11 18:59   ` Borislav Petkov
2021-01-11 19:14 ` [tip: x86/urgent] x86/sev-es: Handle string port IO to kernel memory properly tip-bot2 for Hyunwook (Wooky) Baek

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.