Re: [kvm-unit-tests PATCH] x86: SEV-ES: add port string IO test case

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 25/10/21 07:28, Marc Orr wrote:
Add a test case to verify that string IO works as expected under SEV-ES.
This test case is based on the `test_stringio()` test case in emulator.c.
However, emulator.c does not currently run under UEFI.

Only the first half of the test case, which processes a string from
beginning to end, was taken for now. The second test case did not work
and is thus left out of the amd_sev.c setup for now.

Also, the first test case was modified to do port IO at word granularity
rather than byte granularity. The reason is to ensure that using the
port IO size in a calculation within the kernel does not multiply or
divide by 1. In particular, this tweak is useful to demonstrate that a
recent KVM patch [1] does not behave correctly.

* This patch is based on the `uefi` branch.

[1] https://patchwork.kernel.org/project/kvm/patch/20211013165616.19846-2-pbonzini@xxxxxxxxxx/

Signed-off-by: Marc Orr <marcorr@xxxxxxxxxx>
---
  x86/amd_sev.c | 22 ++++++++++++++++++++++
  1 file changed, 22 insertions(+)

diff --git a/x86/amd_sev.c b/x86/amd_sev.c
index 061c50514545..7757d4f85b7a 100644
--- a/x86/amd_sev.c
+++ b/x86/amd_sev.c
@@ -18,6 +18,10 @@
  #define EXIT_SUCCESS 0
  #define EXIT_FAILURE 1
+#define TESTDEV_IO_PORT 0xe0
+
+static char st1[] = "abcdefghijklmnop";
+
  static int test_sev_activation(void)
  {
  	struct cpuid cpuid_out;
@@ -65,11 +69,29 @@ static void test_sev_es_activation(void)
  	}
  }
+static void test_stringio(void)
+{
+	int st1_len = sizeof(st1) - 1;
+	u16 got;
+
+	asm volatile("cld \n\t"
+		     "movw %0, %%dx \n\t"
+		     "rep outsw \n\t"
+		     : : "i"((short)TESTDEV_IO_PORT),
+		         "S"(st1), "c"(st1_len / 2));
+
+	asm volatile("inw %1, %0\n\t" : "=a"(got) : "i"((short)TESTDEV_IO_PORT));
+
+	report((got & 0xff) == st1[sizeof(st1) - 3], "outsb nearly up");
+	report((got & 0xff00) >> 8 == st1[sizeof(st1) - 2], "outsb up");
+}
+
  int main(void)
  {
  	int rtn;
  	rtn = test_sev_activation();
  	report(rtn == EXIT_SUCCESS, "SEV activation test.");
  	test_sev_es_activation();
+	test_stringio();
  	return report_summary();
  }


Applied to uefi branch, thanks (and tested both before and after the patch I've sent with subject "[PATCH] KVM: SEV-ES: fix another issue with string I/O VMGEXITs").

Paolo




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux