[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 20 of 20] n2 MSR handling and capability exposure
# HG changeset patch # User Eddie Dong <eddie.dong@xxxxxxxxx> # Date 1307003601 -28800 # Node ID ee55fa0471a6b72569b567286ae264bc1dcdbb4b # Parent c046b25135205ff58c0b729c0b94cd920cdbb7e2 n2 MSR handling and capability exposure Signed-off-by: Qing He <qing.he@xxxxxxxxx> Signed-off-by: Eddie Dong <eddie.dong@xxxxxxxxx> diff -r c046b2513520 -r ee55fa0471a6 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Thu Jun 02 16:33:21 2011 +0800 +++ b/xen/arch/x86/hvm/vmx/vmx.c Thu Jun 02 16:33:21 2011 +0800 @@ -1778,8 +1778,11 @@ static int vmx_msr_read_intercept(unsign *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. */ @@ -1940,8 +1943,11 @@ static int vmx_msr_write_intercept(unsig 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 c046b2513520 -r ee55fa0471a6 xen/arch/x86/hvm/vmx/vvmx.c --- a/xen/arch/x86/hvm/vmx/vvmx.c Thu Jun 02 16:33:21 2011 +0800 +++ b/xen/arch/x86/hvm/vmx/vvmx.c Thu Jun 02 16:33:21 2011 +0800 @@ -1256,6 +1256,94 @@ int nvmx_handle_vmwrite(struct cpu_user_ 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 c046b2513520 -r ee55fa0471a6 xen/include/asm-x86/hvm/vmx/vvmx.h --- a/xen/include/asm-x86/hvm/vmx/vvmx.h Thu Jun 02 16:33:21 2011 +0800 +++ b/xen/include/asm-x86/hvm/vmx/vvmx.h Thu Jun 02 16:33:21 2011 +0800 @@ -163,6 +163,10 @@ int nvmx_handle_vmread(struct cpu_user_r 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 |