# HG changeset patch # User cegger # Date 1275382031 -7200 Emulate MSRs needed for Nested Virtualization diff -r c3ca485ecfbe -r 11f96c916410 xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -2148,14 +2148,21 @@ int hvm_msr_read_intercept(struct cpu_us break; default: + ret = nestedhvm_rdmsr(v, ecx, &msr_content); + if ( ret < 0 ) + goto gp_fault; + else if ( ret ) + break; + + BUG_ON( ret ); ret = vmce_rdmsr(ecx, &msr_content); if ( ret < 0 ) goto gp_fault; else if ( ret ) break; - /* ret == 0, This is not an MCE MSR, see other MSRs */ - else if (!ret) - return hvm_funcs.msr_read_intercept(regs); + + BUG_ON( ret ); + return hvm_funcs.msr_read_intercept(regs); } regs->eax = (uint32_t)msr_content; @@ -2247,13 +2254,21 @@ int hvm_msr_write_intercept(struct cpu_u break; default: + ret = nestedhvm_wrmsr(v, ecx, msr_content); + if ( ret < 0 ) + goto gp_fault; + else if ( ret ) + break; + + BUG_ON( ret ); ret = vmce_wrmsr(ecx, msr_content); if ( ret < 0 ) goto gp_fault; else if ( ret ) break; - else if (!ret) - return hvm_funcs.msr_write_intercept(regs); + + BUG_ON( ret ); + return hvm_funcs.msr_write_intercept(regs); } return X86EMUL_OKAY;