[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] RFC: Nested VMX patch series 18: capability
Thx, Eddie Signed-off-by: Qing He <qing.he@xxxxxxxxx> Signed-off-by: Eddie Dong <eddie.dong@xxxxxxxxx> diff -r 6391fb6a41fb xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Fri May 27 12:06:01 2011 +0800 +++ b/xen/arch/x86/hvm/vmx/vmx.c Fri May 27 12:53:09 2011 +0800 @@ -1728,8 +1728,11 @@ *msr_content |= (u64)__vmread(GUEST_IA32_DEBUGCTL_HIGH) << 32; #endif break; - case MSR_IA32_VMX_BASIC...MSR_IA32_VMX_PROCBASED_CTLS2: - goto gp_fault; + case IA32_FEATURE_CONTROL_MSR: + case MSR_IA32_VMX_BASIC...MSR_IA32_VMX_TRUE_ENTRY_CTLS: + if ( !nvmx_msr_read_intercept(msr, msr_content) ) + goto gp_fault; + break; case MSR_IA32_MISC_ENABLE: rdmsrl(MSR_IA32_MISC_ENABLE, *msr_content); /* Debug Trace Store is not supported. */ @@ -1890,8 +1893,11 @@ break; } - case MSR_IA32_VMX_BASIC...MSR_IA32_VMX_PROCBASED_CTLS2: - goto gp_fault; + case IA32_FEATURE_CONTROL_MSR: + case MSR_IA32_VMX_BASIC...MSR_IA32_VMX_TRUE_ENTRY_CTLS: + if ( !nvmx_msr_write_intercept(msr, msr_content) ) + goto gp_fault; + break; default: if ( vpmu_do_wrmsr(msr, msr_content) ) return X86EMUL_OKAY; diff -r 6391fb6a41fb xen/arch/x86/hvm/vmx/vvmx.c --- a/xen/arch/x86/hvm/vmx/vvmx.c Fri May 27 12:06:01 2011 +0800 +++ b/xen/arch/x86/hvm/vmx/vvmx.c Fri May 27 12:53:09 2011 +0800 @@ -1186,6 +1186,94 @@ return X86EMUL_OKAY; } +/* + * Capability reporting + */ +int nvmx_msr_read_intercept(unsigned int msr, u64 *msr_content) +{ + u32 eax, edx; + u64 data = 0; + int r = 1; + u32 mask = 0; + + if ( !nestedhvm_enabled(current->domain) ) + return 0; + + switch (msr) { + case MSR_IA32_VMX_BASIC: + rdmsr(msr, eax, edx); + data = edx; + data = (data & ~0x1fff) | 0x1000; /* request 4KB for guest VMCS */ + data &= ~(1 << 23); /* disable TRUE_xxx_CTLS */ + data = (data << 32) | VVMCS_REVISION; /* VVMCS revision */ + break; + case MSR_IA32_VMX_PINBASED_CTLS: +#define REMOVED_PIN_CONTROL_CAP (PIN_BASED_PREEMPT_TIMER) + rdmsr(msr, eax, edx); + data = edx; + data = (data << 32) | eax; + break; + case MSR_IA32_VMX_PROCBASED_CTLS: + rdmsr(msr, eax, edx); +#define REMOVED_EXEC_CONTROL_CAP (CPU_BASED_TPR_SHADOW \ + | CPU_BASED_ACTIVATE_MSR_BITMAP \ + | CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) + data = edx & ~REMOVED_EXEC_CONTROL_CAP; + data = (data << 32) | eax; + break; + case MSR_IA32_VMX_EXIT_CTLS: + rdmsr(msr, eax, edx); +#define REMOVED_EXIT_CONTROL_CAP (VM_EXIT_SAVE_GUEST_PAT \ + | VM_EXIT_LOAD_HOST_PAT \ + | VM_EXIT_SAVE_GUEST_EFER \ + | VM_EXIT_LOAD_HOST_EFER \ + | VM_EXIT_SAVE_PREEMPT_TIMER) + data = edx & ~REMOVED_EXIT_CONTROL_CAP; + data = (data << 32) | eax; + break; + case MSR_IA32_VMX_ENTRY_CTLS: + rdmsr(msr, eax, edx); +#define REMOVED_ENTRY_CONTROL_CAP (VM_ENTRY_LOAD_GUEST_PAT \ + | VM_ENTRY_LOAD_GUEST_EFER) + data = edx & ~REMOVED_ENTRY_CONTROL_CAP; + data = (data << 32) | eax; + break; + case MSR_IA32_VMX_PROCBASED_CTLS2: + mask = 0; + + rdmsr(msr, eax, edx); + data = edx & mask; + data = (data << 32) | eax; + break; + + /* pass through MSRs */ + case IA32_FEATURE_CONTROL_MSR: + case MSR_IA32_VMX_MISC: + case MSR_IA32_VMX_CR0_FIXED0: + case MSR_IA32_VMX_CR0_FIXED1: + case MSR_IA32_VMX_CR4_FIXED0: + case MSR_IA32_VMX_CR4_FIXED1: + case MSR_IA32_VMX_VMCS_ENUM: + rdmsr(msr, eax, edx); + data = edx; + data = (data << 32) | eax; + break; + + default: + r = 0; + break; + } + + *msr_content = data; + return r; +} + +int nvmx_msr_write_intercept(unsigned int msr, u64 msr_content) +{ + /* silently ignore for now */ + return 1; +} + void nvmx_idtv_handling(void) { struct vcpu *v = current; diff -r 6391fb6a41fb xen/include/asm-x86/hvm/vmx/vvmx.h --- a/xen/include/asm-x86/hvm/vmx/vvmx.h Fri May 27 12:06:01 2011 +0800 +++ b/xen/include/asm-x86/hvm/vmx/vvmx.h Fri May 27 12:53:09 2011 +0800 @@ -108,6 +108,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs); int nvmx_handle_vmresume(struct cpu_user_regs *regs); int nvmx_handle_vmlaunch(struct cpu_user_regs *regs); +int nvmx_msr_read_intercept(unsigned int msr, + u64 *msr_content); +int nvmx_msr_write_intercept(unsigned int msr, + u64 msr_content); void nvmx_update_exec_control(struct vcpu *v, unsigned long value); void nvmx_update_secondary_exec_control(struct vcpu *v, _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |