File 5a32bd79-x86-vmx-dont-use-hvm_inject_hw_exception-in-.patch of Package xen.openSUSE_Leap_42.3_Update
# Commit 896ee3980e72866b602e743396751384de301fb0
# Date 2017-12-14 18:05:45 +0000
# Author Andrew Cooper <andrew.cooper3@citrix.com>
# Committer Andrew Cooper <andrew.cooper3@citrix.com>
x86/vmx: Don't use hvm_inject_hw_exception() in long_mode_do_msr_write()
Since c/s 49de10f3c1718 "x86/hvm: Don't raise #GP behind the emulators back
for MSR accesses", returning X86EMUL_EXCEPTION has pushed the exception
generation to the top of the call tree.
Using hvm_inject_hw_exception() and returning X86EMUL_EXCEPTION causes a
double #GP injection, which combines to #DF.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -541,7 +541,7 @@ long_mode_do_msr_write(unsigned int msr,
case MSR_GS_BASE:
case MSR_SHADOW_GS_BASE:
if ( !is_canonical_address(msr_content) )
- goto uncanonical_address;
+ return HNDL_exception_raised;
if ( msr == MSR_FS_BASE )
__vmwrite(GUEST_FS_BASE, msr_content);
@@ -559,14 +559,14 @@ long_mode_do_msr_write(unsigned int msr,
case MSR_LSTAR:
if ( !is_canonical_address(msr_content) )
- goto uncanonical_address;
+ return HNDL_exception_raised;
v->arch.hvm_vmx.lstar = msr_content;
wrmsrl(MSR_LSTAR, msr_content);
break;
case MSR_CSTAR:
if ( !is_canonical_address(msr_content) )
- goto uncanonical_address;
+ return HNDL_exception_raised;
v->arch.hvm_vmx.cstar = msr_content;
break;
@@ -580,11 +580,6 @@ long_mode_do_msr_write(unsigned int msr,
}
return HNDL_done;
-
- uncanonical_address:
- HVM_DBG_LOG(DBG_LEVEL_MSR, "Not cano address of msr write %x", msr);
- hvm_inject_hw_exception(TRAP_gp_fault, 0);
- return HNDL_exception_raised;
}
/*