When injecting an exception into L2 guest,
authorcegger <none@none>
Mon, 28 Feb 2011 11:21:52 +0000 (12:21 +0100)
committercegger <none@none>
Mon, 28 Feb 2011 11:21:52 +0000 (12:21 +0100)
inject a #VMEXIT if L1 guest intercepts the exception

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
Acked-by: Tim Deegan <Tim.Deegan@citrix.com>
Committed-by: Tim Deegan <Tim.Deegan@citrix.com>
xen/arch/x86/hvm/hvm.c
xen/include/asm-x86/hvm/hvm.h

index d52b4f8659786eae6d7aee8de68a02db9085766b..b1fe14bdaef2f8249407ead1201f10e747285133 100644 (file)
@@ -1117,6 +1117,47 @@ void hvm_triple_fault(void)
     domain_shutdown(v->domain, SHUTDOWN_reboot);
 }
 
+void hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2)
+{
+    struct vcpu *v = current;
+
+    if ( !nestedhvm_enabled(v->domain) ) {
+        hvm_funcs.inject_exception(trapnr, errcode, cr2);
+        return;
+    }
+
+    if ( nestedhvm_vmswitch_in_progress(v) ) {
+        hvm_funcs.inject_exception(trapnr, errcode, cr2);
+        return;
+    }
+
+    if ( !nestedhvm_vcpu_in_guestmode(v) ) {
+        hvm_funcs.inject_exception(trapnr, errcode, cr2);
+        return;
+    }
+
+    if ( nhvm_vmcx_guest_intercepts_trap(v, trapnr) )
+    {
+        enum nestedhvm_vmexits nsret;
+
+        nsret = nhvm_vcpu_vmexit_trap(v, trapnr, errcode, cr2);
+
+        switch (nsret) {
+        case NESTEDHVM_VMEXIT_DONE:
+        case NESTEDHVM_VMEXIT_ERROR: /* L1 guest will crash L2 guest */
+            return;
+        case NESTEDHVM_VMEXIT_HOST:
+        case NESTEDHVM_VMEXIT_CONTINUE:
+        case NESTEDHVM_VMEXIT_FATALERROR:
+        default:
+            gdprintk(XENLOG_ERR, "unexpected nestedhvm error %i\n", nsret);
+            return;
+        }
+    }
+
+    hvm_funcs.inject_exception(trapnr, errcode, cr2);
+}
+
 bool_t hvm_hap_nested_page_fault(unsigned long gpa,
                                  bool_t gla_valid,
                                  unsigned long gla,
index a01849af875b8cd5fb00e8e5a532bc316653d380..bf0679038965a59e65f60889a497d24513295812 100644 (file)
@@ -278,11 +278,7 @@ void hvm_migrate_timers(struct vcpu *v);
 void hvm_do_resume(struct vcpu *v);
 void hvm_migrate_pirqs(struct vcpu *v);
 
-static inline void
-hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2)
-{
-    hvm_funcs.inject_exception(trapnr, errcode, cr2);
-}
+void hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2);
 
 static inline int hvm_event_pending(struct vcpu *v)
 {