CR8 is only availabe when in long mode.

Signed-off-by: Jason Wang <jasow...@redhat.com>
---
 x86/vmexit.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/x86/vmexit.c b/x86/vmexit.c
index 819c24b..34b0af4 100644
--- a/x86/vmexit.c
+++ b/x86/vmexit.c
@@ -48,6 +48,7 @@ static void vmcall(void)
 
 #define MSR_EFER 0xc0000080
 #define EFER_NX_MASK            (1ull << 11)
+#define EFER_LMA_MASK           (1ull << 10)
 
 static void mov_from_cr8(void)
 {
@@ -68,6 +69,15 @@ static int is_smp(void)
        return cpu_count() > 1;
 }
 
+static int is_long_mode(void)
+{
+#ifdef __i386__
+        return 0;
+#else
+        return rdmsr(MSR_EFER) | EFER_LMA_MASK;
+#endif
+}
+
 static void nop(void *junk)
 {
 }
@@ -100,8 +110,8 @@ static struct test {
 } tests[] = {
        { cpuid_test, "cpuid", .parallel = 1,  },
        { vmcall, "vmcall", .parallel = 1, },
-       { mov_from_cr8, "mov_from_cr8", .parallel = 1, },
-       { mov_to_cr8, "mov_to_cr8" , .parallel = 1, },
+       { mov_from_cr8, "mov_from_cr8", is_long_mode, .parallel = 1, },
+       { mov_to_cr8, "mov_to_cr8" , is_long_mode, .parallel = 1, },
        { inl_pmtimer, "inl_from_pmtimer", .parallel = 1, },
        { ipi, "ipi", is_smp, .parallel = 0, },
        { ipi_halt, "ipi+halt", is_smp, .parallel = 0, },

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to