[kvm-unit-tests PATCH] x86/memory: pass host clwb and clflushopt support information

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

 



Intel VMX cannot intercept guest clwb and clflushopt. When clwb and
clflushopt are not exposed in guest cpuid, clwb and clflushopt
instructions in this test case can still succeed without #UD on the
host CPU which has clwb and clflushopt support, though failures with
UD are expected.

In order to avoid false alarms in such cases, introduce the following
two arguments "has_clwb" and "has_clflushopt" to allow users to
specify whether clwb and clflushopt are supported on the host CPU.

Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
---
 x86/memory.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/x86/memory.c b/x86/memory.c
index cd1eb46..03ff7d3 100644
--- a/x86/memory.c
+++ b/x86/memory.c
@@ -23,10 +23,29 @@ static void handle_ud(struct ex_regs *regs)
 	regs->rip += isize;
 }
 
+/*
+ * Intel VMX cannot intercept guest clwb and clflushopt. When clwb and
+ * clflushopt are not exposed in guest cpuid, clwb and clflushopt
+ * instructions in this test case can still succeed without #UD on
+ * the host CPU which has clwb and clflushopt support. In order to avoid
+ * false alarms in such cases, introduce the following two arguments
+ * to allow users to specify whether clwb and clflushopt are supported on
+ * the host CPU:
+ * - has_clwb:       indicates clwb is supported on the host CPU
+ * - has_clflushopt: indicates clflushopt is supported on the host CPU
+ */
 int main(int ac, char **av)
 {
 	struct cpuid cpuid7, cpuid1;
 	int xfail;
+	int host_has_clwb = 0, host_has_clflushopt = 0; /* 0: unknown */
+	int i;
+
+	for (i = 1; i < ac; i++)
+		if (!strcmp(av[i], "has_clwb"))
+			host_has_clwb = 1;
+		else if (!strcmp(av[i], "has_clflushopt"))
+			host_has_clflushopt = 1;
 
 	setup_idt();
 	handle_exception(UD_VECTOR, handle_ud);
@@ -63,13 +82,19 @@ int main(int ac, char **av)
 	ud = 0;
 	/* clflushopt (%rbx): */
 	asm volatile(".byte 0x66, 0x0f, 0xae, 0x3b" : : "b" (&target));
-	report_xfail("clflushopt", xfail, ud == 0);
+	if (host_has_clflushopt)
+		report("clflushopt", ud == 0);
+	else
+		report_xfail("clflushopt", xfail, ud == 0);
 
 	xfail = !(cpuid7.b & (1U << 24)); /* CLWB */
 	ud = 0;
 	/* clwb (%rbx): */
 	asm volatile(".byte 0x66, 0x0f, 0xae, 0x33" : : "b" (&target));
-	report_xfail("clwb", xfail, ud == 0);
+	if (host_has_clwb)
+		report("clwb", ud == 0);
+	else
+		report_xfail("clwb", xfail, ud == 0);
 
 	ud = 0;
 	/* clwb requires a memory operand, the following is NOT a valid
-- 
2.14.1




[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