if ( !(v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS) )
{
if ( v != current )
- hw_cr0_mask |= X86_CR0_TS;
+ {
+ if ( !v->arch.fully_eager_fpu )
+ hw_cr0_mask |= X86_CR0_TS;
+ }
else if ( vmcb_get_cr0(vmcb) & X86_CR0_TS )
svm_fpu_enter(v);
}
if ( unlikely((read_efer() & EFER_SVME) == 0) )
return;
- svm_fpu_leave(v);
+ if ( !v->arch.fully_eager_fpu )
+ svm_fpu_leave(v);
svm_save_dr(v);
svm_lwp_save(v);
paging_update_paging_modes(v);
vmcb->_exception_intercepts =
- HVM_TRAP_MASK
- | (1U << TRAP_no_device);
+ HVM_TRAP_MASK |
+ (v->arch.fully_eager_fpu ? 0 : (1U << TRAP_no_device));
if ( paging_mode_hap(v->domain) )
{
__vmwrite(HOST_GS_BASE, 0);
/* Host control registers. */
- v->arch.hvm_vmx.host_cr0 = read_cr0() | X86_CR0_TS;
+ v->arch.hvm_vmx.host_cr0 = read_cr0() & ~X86_CR0_TS;
+ if ( !v->arch.fully_eager_fpu )
+ v->arch.hvm_vmx.host_cr0 |= X86_CR0_TS;
__vmwrite(HOST_CR0, v->arch.hvm_vmx.host_cr0);
__vmwrite(HOST_CR4, mmu_cr4_features);
v->arch.hvm_vmx.exception_bitmap = HVM_TRAP_MASK
| (paging_mode_hap(d) ? 0 : (1U << TRAP_page_fault))
- | (1U << TRAP_no_device);
+ | (v->arch.fully_eager_fpu ? 0 : (1U << TRAP_no_device));
vmx_update_exception_bitmap(v);
/*
vmx_vmcs_reload(v);
}
- vmx_fpu_leave(v);
+ if ( !v->arch.fully_eager_fpu )
+ vmx_fpu_leave(v);
vmx_save_guest_msrs(v);
vmx_restore_host_msrs();
vmx_save_dr(v);
if ( !(v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS) )
{
if ( v != current )
- hw_cr0_mask |= X86_CR0_TS;
+ {
+ if ( !v->arch.fully_eager_fpu )
+ hw_cr0_mask |= X86_CR0_TS;
+ }
else if ( v->arch.hvm_vcpu.hw_cr[0] & X86_CR0_TS )
vmx_fpu_enter(v);
}