KVM: Activate fpu on clts
Assume that if the guest executes clts, it knows what it's doing, and load the guest fpu to prevent an #NM exception. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
Родитель
e5bb40251a
Коммит
6b52d18605
|
@ -511,6 +511,7 @@ struct kvm_x86_ops {
|
|||
void (*cache_reg)(struct kvm_vcpu *vcpu, enum kvm_reg reg);
|
||||
unsigned long (*get_rflags)(struct kvm_vcpu *vcpu);
|
||||
void (*set_rflags)(struct kvm_vcpu *vcpu, unsigned long rflags);
|
||||
void (*fpu_activate)(struct kvm_vcpu *vcpu);
|
||||
void (*fpu_deactivate)(struct kvm_vcpu *vcpu);
|
||||
|
||||
void (*tlb_flush)(struct kvm_vcpu *vcpu);
|
||||
|
|
|
@ -1259,12 +1259,17 @@ static int ud_interception(struct vcpu_svm *svm)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int nm_interception(struct vcpu_svm *svm)
|
||||
static void svm_fpu_activate(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
svm->vmcb->control.intercept_exceptions &= ~(1 << NM_VECTOR);
|
||||
svm->vcpu.fpu_active = 1;
|
||||
update_cr0_intercept(svm);
|
||||
}
|
||||
|
||||
static int nm_interception(struct vcpu_svm *svm)
|
||||
{
|
||||
svm_fpu_activate(&svm->vcpu);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2977,6 +2982,7 @@ static struct kvm_x86_ops svm_x86_ops = {
|
|||
.cache_reg = svm_cache_reg,
|
||||
.get_rflags = svm_get_rflags,
|
||||
.set_rflags = svm_set_rflags,
|
||||
.fpu_activate = svm_fpu_activate,
|
||||
.fpu_deactivate = svm_fpu_deactivate,
|
||||
|
||||
.tlb_flush = svm_flush_tlb,
|
||||
|
|
|
@ -3002,6 +3002,7 @@ static int handle_cr(struct kvm_vcpu *vcpu)
|
|||
vmx_set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~X86_CR0_TS));
|
||||
trace_kvm_cr_write(0, kvm_read_cr0(vcpu));
|
||||
skip_emulated_instruction(vcpu);
|
||||
vmx_fpu_activate(vcpu);
|
||||
return 1;
|
||||
case 1: /*mov from cr*/
|
||||
switch (cr) {
|
||||
|
|
|
@ -3269,6 +3269,7 @@ int emulate_invlpg(struct kvm_vcpu *vcpu, gva_t address)
|
|||
int emulate_clts(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
kvm_x86_ops->set_cr0(vcpu, kvm_read_cr0_bits(vcpu, ~X86_CR0_TS));
|
||||
kvm_x86_ops->fpu_activate(vcpu);
|
||||
return X86EMUL_CONTINUE;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче