x86: Enumerate reserved eflags (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 1 Feb 2016 17:08:54 +0000 (12:08 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 2 Feb 2016 22:43:52 +0000 (17:43 -0500)
Eflags/rflags has a few reserved fields.  If you attempt a VM enter with a
reserved bit set incorrectly, vmlaunch/resume will fail due to the bad
state.  Interestingly enough, this won't happen if you attempt to popfl a
bad rflags.  So VMX is picky, but the regular hardware isn't.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/process64.c
kern/arch/x86/ros/mmu.h
kern/arch/x86/vmm/intel/vmx.c

index 362f5b1..bf2cb4b 100644 (file)
@@ -163,6 +163,8 @@ static void proc_secure_vmtf(struct vm_trapframe *tf)
        /* The user can say whatever it wants for the bulk of the TF, but the only
         * thing it can't fake is whether or not it is a partial context, which
         * other parts of the kernel rely on. */
+       tf->tf_rflags |= FL_RSVD_1;
+       tf->tf_rflags &= FL_RSVD_0;
        x86_vmtf_clear_partial(tf);
 }
 
index a747e67..d31beb3 100644 (file)
@@ -64,6 +64,8 @@
 #define FL_VIF         0x00080000      // Virtual Interrupt Flag
 #define FL_VIP         0x00100000      // Virtual Interrupt Pending
 #define FL_ID          0x00200000      // ID flag
+#define FL_RSVD_1      0x00000002      // These 1s must be 1, rflags |= this
+#define FL_RSVD_0      0x003f7fd7      // These 0s must be 0, rflags &= this
 
 // Page fault error codes
 #define FEC_PR         0x1     // Page fault caused by protection violation
index 317f68e..2f54ba7 100644 (file)
@@ -1021,7 +1021,7 @@ static int vmx_setup_initial_guest_state(struct proc *p,
        vmcs_writel(GUEST_IDTR_LIMIT, 0);
        vmcs_writel(GUEST_RIP, 0xdeadbeef);
        vmcs_writel(GUEST_RSP, 0xdeadbeef);
-       vmcs_writel(GUEST_RFLAGS, 0x02);
+       vmcs_writel(GUEST_RFLAGS, FL_RSVD_1);
        vmcs_writel(GUEST_DR7, 0);
 
        /* guest segment bases */