inmates cannot use X86_FEATURE_VMX from regular cpuid
as vcpu maks the bit explicitely on non-root cells.

create the equivalent bit (same register, same position)
in the JAILHOUSE_CPUID_FEATURES cpuid leaf

Signed-off-by: Francois-Frederic Ozog <f...@ozog.com>
---
 hypervisor/arch/x86/vcpu.c                 | 13 +++++++++++++
 include/arch/x86/asm/jailhouse_hypercall.h |  5 +++++
 inmates/lib/x86/hypercall.c                |  2 +-
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/hypervisor/arch/x86/vcpu.c b/hypervisor/arch/x86/vcpu.c
index 21da0592..2bfbff94 100644
--- a/hypervisor/arch/x86/vcpu.c
+++ b/hypervisor/arch/x86/vcpu.c
@@ -331,6 +331,17 @@ bool vcpu_handle_msr_write(void)
        return true;
 }

+static bool is_vmx(void)
+{
+       u32 eax, ebx, ecx, edx;
+
+       eax=1;
+       ebx = ecx = edx =0;
+       cpuid(&eax, &ebx, &ecx, &edx);
+
+       return ecx & X86_FEATURE_VMX;
+}
+
 void vcpu_handle_cpuid(void)
 {
        static const char signature[12] = "Jailhouse";
@@ -350,6 +361,8 @@ void vcpu_handle_cpuid(void)
                guest_regs->rax = 0;
                guest_regs->rbx = 0;
                guest_regs->rcx = 0;
+               if (is_vmx())
+                       guest_regs->rcx |= X86_FEATURE_VMX;
                guest_regs->rdx = 0;
                break;
        default:
diff --git a/include/arch/x86/asm/jailhouse_hypercall.h b/include/arch/x86/asm/jailhouse_hypercall.h
index 3a52599f..052b9255 100644
--- a/include/arch/x86/asm/jailhouse_hypercall.h
+++ b/include/arch/x86/asm/jailhouse_hypercall.h
@@ -68,6 +68,11 @@
 #define JAILHOUSE_CPUID_SIGNATURE              0x40000000
 #define JAILHOUSE_CPUID_FEATURES               0x40000001

+/*
+ * ECX
+ * bit 5: 1=VMX
+*/
+#define JAILHOUSE_CPUID_FEATURE_VMX            (1ULL << 0)
 /**
  * @defgroup Hypercalls Hypercall Subsystem
  *
diff --git a/inmates/lib/x86/hypercall.c b/inmates/lib/x86/hypercall.c
index ac99f0c3..4a356390 100644
--- a/inmates/lib/x86/hypercall.c
+++ b/inmates/lib/x86/hypercall.c
@@ -44,7 +44,7 @@ bool jailhouse_use_vmcall;

 void hypercall_init(void)
 {
-       u32 eax = 1, ecx = 0;
+       u32 eax = JAILHOUSE_CPUID_FEATURES, ecx = 0;

        asm volatile(
                "cpuid"
--
2.11.0

--
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jailhouse-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to