vmx: Allow restore of context from a non-Intel processor. In
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 16 Jun 2008 14:22:41 +0000 (15:22 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 16 Jun 2008 14:22:41 +0000 (15:22 +0100)
particular, VMX requires segment 'granularity' to be set correctly, so
we force it if need be in vmx_set_segment_register().

Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/hvm/vmx/vmx.c

index 3292dc2d230c5534bad632417bb614cab851e0eb..fe5c2ece942232dbb5b80eaf2fae846f64125a3e 100644 (file)
@@ -616,7 +616,7 @@ static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
     struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
 
     /* restore msrs */
-    guest_state->flags = data->msr_flags;
+    guest_state->flags = data->msr_flags & 7;
     guest_state->msrs[VMX_INDEX_MSR_LSTAR]        = data->msr_lstar;
     guest_state->msrs[VMX_INDEX_MSR_STAR]         = data->msr_star;
     guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] = data->msr_syscall_mask;
@@ -791,6 +791,9 @@ static void vmx_set_segment_register(struct vcpu *v, enum x86_segment seg,
     if ( !reg->attr.fields.p )
         attr |= (1u << 16);
 
+    /* VMX has strict consistency requirement for flag G. */
+    attr |= !!(reg->limit >> 20) << 15;
+
     vmx_vmcs_enter(v);
 
     switch ( seg )