KVM: x86: Enable XSAVE/XRSTOR for guest
PATCH v6 1/1 KVM: x86: Enable XSAVE/XRSTOR for guest
From: Dexuan Cui <[email protected]>
This patch enable guest to use XSAVE/XRSTOR instructions.
We assume that host_xcr0 would use all possible bits that OS supported.
And we loaded xcr0 in the same way we handled fpu - do it as late as we can.
--- arch/x86/include/asm/kvm_host.h | 2 + arch/x86/include/asm/vmx.h | 1 + arch/x86/kvm/kvm_cache_regs.h | 6 ++ arch/x86/kvm/vmx.c | 16 +++++ arch/x86/kvm/x86.c | 120 ++++++++++++++++++++++++++++++++++++-- include/linux/kvm_host.h | 2 +- 6 files changed, 139 insertions(+), 8 deletions(-)
arch/x86/include/asm/kvm_host.h +2 -0
@@ -302,6 +302,7 @@ struct kvm_vcpu_arch { } update_pte;struct fpu guest_fpu; +u64 xcr0;gva_t mmio_fault_cr2;struct kvm_pio_request pio;
@@ -605,6 +606,7 @@ int kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val);unsigned long kvm_get_cr8 (struct kvm_vcpu *vcpu);void kvm_lmsw (struct kvm_vcpu *vcpu,unsigned long msw);void kvm_get_cs_db_l_bits (struct kvm_vcpu *vcpu,int *db,int *l); +void kvm_set_xcr0 (struct kvm_vcpu *vcpu,u64 xcr0);int kvm_get_msr_common (struct kvm_vcpu *vcpu,u32 msr,u64 *pdata);int kvm_set_msr_common (struct kvm_vcpu *vcpu,u32 msr,u64 data);
arch/x86/include/asm/vmx.h +1 -0
@@ -266,6 +266,7 @@ enum vmcs_field {#define EXIT_REASON_EPT_VIOLATION 48#define EXIT_REASON_EPT_MISCONFIG 49#define EXIT_REASON_WBINVD 54 +#define EXIT_REASON_XSETBV 55/* * Interruption-information format
arch/x86/kvm/kvm_cache_regs.h +6 -0
@@ -71,4 +71,10 @@ static inline ulong kvm_read_cr4(struct kvm_vcpu *vcpu) return kvm_read_cr4_bits(vcpu, ~0UL); } +static inline u64 kvm_read_edx_eax (struct kvm_vcpu *vcpu) +{ +return (kvm_register_read (vcpu,VCPU_REGS_RAX ) &-1u ) + | ((u64)(kvm_register_read (vcpu,VCPU_REGS_RDX ) &-1u ) <<32 ); +} +#endif
arch/x86/kvm/vmx.c +16 -0
@@ -36,6 +36,8 @@#include <asm/vmx.h> #include <asm/virtext.h> #include <asm/mce.h> +#include <asm/i387.h> +#include <asm/xcr.h> #include "trace.h"
@@ -3354,6 +3356,19 @@ static int handle_wbinvd(struct kvm_vcpu *vcpu)return 1 ; } +static int handle_xsetbv (struct kvm_vcpu *vcpu) +{ +u64 new_bv =kvm_read_edx_eax (vcpu); + +if (kvm_register_read (vcpu,VCPU_REGS_RCX ) !=0 ) { +kvm_inject_gp (vcpu,0 ); +return 1 ; + } +kvm_set_xcr0 (vcpu, new_bv); +skip_emulated_instruction (vcpu); +return 1 ; +} +static int handle_apic_access (struct kvm_vcpu *vcpu) {return emulate_instruction (vcpu,0 ,0 ,0 ) ==EMULATE_DONE ;
@@ -3632,6 +3647,7 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { [EXIT_REASON_TPR_BELOW_THRESHOLD] = handle_tpr_below_threshold, [EXIT_REASON_APIC_ACCESS] = handle_apic_access, [EXIT_REASON_WBINVD] = handle_wbinvd, + [EXIT_REASON_XSETBV] = handle_xsetbv, [EXIT_REASON_TASK_SWITCH] = handle_task_switch, [EXIT_REASON_MCE_DURING_VMENTRY] = handle_machine_check, [EXIT_REASON_EPT_VIOLATION] = handle_ept_violation,
arch/x86/kvm/x86.c +113 -7
222 lines not on this page · raw message
include/linux/kvm_host.h +1 -1
@@ -88,7 +88,7 @@ struct kvm_vcpu {int srcu_idx;int fpu_active; -int guest_fpu_loaded; +int guest_fpu_loaded, guest_xcr0_loaded;wait_queue_head_t wq;int sigset_active;sigset_t sigset;
Signature · 1 line
1.7.0.1
Quoted 9 lines · Sheng Yang
From: Dexuan Cui<[email protected]>
This patch enable guest to use XSAVE/XRSTOR instructions.
We assume that
host_xcr0would use all possible bits that OS supported.And we loaded xcr0 in the same way we handled fpu - do it as late as we can.
Looks good.
What's the outlook on a unit test?
Signature · 1 line
error compiling committee.c: too many arguments to function
Quoted 5 lines · On Thursday 27 May 2010 17:52:36 Avi Kivity wrote:
Quoted 4 lines · Sheng Yang
From: Dexuan Cui<[email protected]>
This patch enable guest to use XSAVE/XRSTOR instructions.
Quoted 8 lines
Quoted 4 lines
We assume that
host_xcr0would use all possible bits that OS supported.And we loaded xcr0 in the same way we handled fpu - do it as late as we can.
Looks good.
What's the outlook on a unit test?
Working on it now...
--
regards
Yang, Sheng