[xen master] x86/vmx: Don't use hvm_inject_hw_exception() in long_mode_do_msr_write()

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen master] x86/vmx: Don't use hvm_inject_hw_exception() in long_mode_do_msr_write()

patchbot
commit 896ee3980e72866b602e743396751384de301fb0
Author:     Andrew Cooper <[hidden email]>
AuthorDate: Wed Dec 6 17:46:20 2017 +0000
Commit:     Andrew Cooper <[hidden email]>
CommitDate: Thu Dec 14 18:05:45 2017 +0000

    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 <[hidden email]>
    Acked-by: Kevin Tian <[hidden email]>
    Reviewed-by: Jan Beulich <[hidden email]>
---
 xen/arch/x86/hvm/vmx/vmx.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index b18ccea..73254bf 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -542,7 +542,7 @@ long_mode_do_msr_write(unsigned int msr, uint64_t msr_content)
     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);
@@ -560,14 +560,14 @@ long_mode_do_msr_write(unsigned int msr, uint64_t msr_content)
 
     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;
 
@@ -581,11 +581,6 @@ long_mode_do_msr_write(unsigned int msr, uint64_t msr_content)
     }
 
     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;
 }
 
 /*
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog