Loading drivers/kvm/kvm.h +3 −0 Original line number Diff line number Diff line Loading @@ -304,6 +304,7 @@ struct kvm_vcpu { char *host_fx_image; char *guest_fx_image; int fpu_active; int guest_fpu_loaded; int mmio_needed; int mmio_read_completed; Loading Loading @@ -508,6 +509,8 @@ void fx_init(struct kvm_vcpu *vcpu); void load_msrs(struct vmx_msr_entry *e, int n); void save_msrs(struct vmx_msr_entry *e, int n); void kvm_resched(struct kvm_vcpu *vcpu); void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); int kvm_read_guest(struct kvm_vcpu *vcpu, gva_t addr, Loading drivers/kvm/kvm_main.c +22 −0 Original line number Diff line number Diff line Loading @@ -253,6 +253,28 @@ int kvm_write_guest(struct kvm_vcpu *vcpu, gva_t addr, unsigned long size, } EXPORT_SYMBOL_GPL(kvm_write_guest); void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) { if (!vcpu->fpu_active || vcpu->guest_fpu_loaded) return; vcpu->guest_fpu_loaded = 1; fx_save(vcpu->host_fx_image); fx_restore(vcpu->guest_fx_image); } EXPORT_SYMBOL_GPL(kvm_load_guest_fpu); void kvm_put_guest_fpu(struct kvm_vcpu *vcpu) { if (!vcpu->guest_fpu_loaded) return; vcpu->guest_fpu_loaded = 0; fx_save(vcpu->guest_fx_image); fx_restore(vcpu->host_fx_image); } EXPORT_SYMBOL_GPL(kvm_put_guest_fpu); /* * Switches to specified vcpu, until a matching vcpu_put() */ Loading drivers/kvm/vmx.c +3 −9 Original line number Diff line number Diff line Loading @@ -280,6 +280,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu) static void vmx_vcpu_put(struct kvm_vcpu *vcpu) { kvm_put_guest_fpu(vcpu); put_cpu(); } Loading Loading @@ -1847,10 +1848,8 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) if (vcpu->guest_debug.enabled) kvm_guest_debug_pre(vcpu); if (vcpu->fpu_active) { fx_save(vcpu->host_fx_image); fx_restore(vcpu->guest_fx_image); } kvm_load_guest_fpu(vcpu); /* * Loading guest fpu may have cleared host cr0.ts */ Loading Loading @@ -2012,11 +2011,6 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) } #endif if (vcpu->fpu_active) { fx_save(vcpu->guest_fx_image); fx_restore(vcpu->host_fx_image); } vcpu->interrupt_window_open = (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & 3) == 0; asm ("mov %0, %%ds; mov %0, %%es" : : "r"(__USER_DS)); Loading Loading
drivers/kvm/kvm.h +3 −0 Original line number Diff line number Diff line Loading @@ -304,6 +304,7 @@ struct kvm_vcpu { char *host_fx_image; char *guest_fx_image; int fpu_active; int guest_fpu_loaded; int mmio_needed; int mmio_read_completed; Loading Loading @@ -508,6 +509,8 @@ void fx_init(struct kvm_vcpu *vcpu); void load_msrs(struct vmx_msr_entry *e, int n); void save_msrs(struct vmx_msr_entry *e, int n); void kvm_resched(struct kvm_vcpu *vcpu); void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); int kvm_read_guest(struct kvm_vcpu *vcpu, gva_t addr, Loading
drivers/kvm/kvm_main.c +22 −0 Original line number Diff line number Diff line Loading @@ -253,6 +253,28 @@ int kvm_write_guest(struct kvm_vcpu *vcpu, gva_t addr, unsigned long size, } EXPORT_SYMBOL_GPL(kvm_write_guest); void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) { if (!vcpu->fpu_active || vcpu->guest_fpu_loaded) return; vcpu->guest_fpu_loaded = 1; fx_save(vcpu->host_fx_image); fx_restore(vcpu->guest_fx_image); } EXPORT_SYMBOL_GPL(kvm_load_guest_fpu); void kvm_put_guest_fpu(struct kvm_vcpu *vcpu) { if (!vcpu->guest_fpu_loaded) return; vcpu->guest_fpu_loaded = 0; fx_save(vcpu->guest_fx_image); fx_restore(vcpu->host_fx_image); } EXPORT_SYMBOL_GPL(kvm_put_guest_fpu); /* * Switches to specified vcpu, until a matching vcpu_put() */ Loading
drivers/kvm/vmx.c +3 −9 Original line number Diff line number Diff line Loading @@ -280,6 +280,7 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu) static void vmx_vcpu_put(struct kvm_vcpu *vcpu) { kvm_put_guest_fpu(vcpu); put_cpu(); } Loading Loading @@ -1847,10 +1848,8 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) if (vcpu->guest_debug.enabled) kvm_guest_debug_pre(vcpu); if (vcpu->fpu_active) { fx_save(vcpu->host_fx_image); fx_restore(vcpu->guest_fx_image); } kvm_load_guest_fpu(vcpu); /* * Loading guest fpu may have cleared host cr0.ts */ Loading Loading @@ -2012,11 +2011,6 @@ static int vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) } #endif if (vcpu->fpu_active) { fx_save(vcpu->guest_fx_image); fx_restore(vcpu->host_fx_image); } vcpu->interrupt_window_open = (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & 3) == 0; asm ("mov %0, %%ds; mov %0, %%es" : : "r"(__USER_DS)); Loading