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>
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;
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 )