xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Egger <Christoph.Egger@amd.com>
To: xen-devel@lists.xensource.com
Subject: [PATCH 07/14] Nested Virtualization: trap
Date: Thu, 5 Aug 2010 17:02:34 +0200	[thread overview]
Message-ID: <201008051702.35039.Christoph.Egger@amd.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 322 bytes --]


Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

[-- Attachment #2: xen_nh07_trap.diff --]
[-- Type: text/x-diff, Size: 2814 bytes --]

# HG changeset patch
# User cegger
# Date 1281003849 -7200
When injecting an exception into L2 guest,
inject a #VMEXIT if L1 guest intercepts the exception

diff -r b1a356e5658d -r 7789f1d7d7e7 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -965,6 +965,63 @@ void hvm_triple_fault(void)
     domain_shutdown(v->domain, SHUTDOWN_reboot);
 }
 
+int hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2)
+{
+    uint64_t exitcode;
+    bool_t is_intercepted;
+    struct vcpu *v = current;
+    struct nestedhvm *hvm = &VCPU_NESTEDHVM(v);
+
+    if ( !nestedhvm_enabled(v->domain) ) {
+        hvm_funcs.inject_exception(trapnr, errcode, cr2);
+        return 0;
+    }
+
+    if ( nestedhvm_vmentry_emulate(v) ) {
+        hvm_funcs.inject_exception(trapnr, errcode, cr2);
+        return 0;
+    }
+
+    if ( !nestedhvm_vcpu_in_guestmode(v) ) {
+        hvm_funcs.inject_exception(trapnr, errcode, cr2);
+        return 0;
+    }
+
+    exitcode = nestedhvm_exception2exitcode(trapnr);
+    hvm->nh_hostflags.fields.forcevmexit = 1;
+    hvm->nh_forcevmexit.exitcode = exitcode;
+    is_intercepted = hvm_nestedhvm_vm_intercepted_by_guest(v, exitcode);
+    hvm->nh_hostflags.fields.forcevmexit = 0;
+
+    if ( is_intercepted )
+    {
+        enum nestedhvm_vmexits nsret;
+
+        hvm->nh_forcevmexit.exitcode = exitcode;
+        hvm->nh_forcevmexit.exitinfo1 = errcode;
+        hvm->nh_forcevmexit.exitinfo2 = cr2;
+
+        hvm->nh_hostflags.fields.forcevmexit = 1;
+        nsret = nestedhvm_vcpu_vmexit(v, guest_cpu_user_regs(), 0 /* dummy */);
+        hvm->nh_hostflags.fields.forcevmexit = 0;
+
+        switch (nsret) {
+        case NESTEDHVM_VMEXIT_DONE:
+        case NESTEDHVM_VMEXIT_ERROR: /* L1 guest will crash L2 guest */
+            return 1;
+        case NESTEDHVM_VMEXIT_HOST:
+        case NESTEDHVM_VMEXIT_CONTINUE:
+        case NESTEDHVM_VMEXIT_FATALERROR:
+        default:
+            gdprintk(XENLOG_ERR, "unexpected nestedhvm error %i\n", nsret);
+            return -1;
+        }
+    }
+
+    hvm_funcs.inject_exception(trapnr, errcode, cr2);
+    return 0;
+}
+
 bool_t hvm_hap_nested_page_fault(unsigned long gfn)
 {
     p2m_type_t p2mt;
diff -r b1a356e5658d -r 7789f1d7d7e7 xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -279,11 +279,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);
-}
+int hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2);
 
 static inline int hvm_event_pending(struct vcpu *v)
 {

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

             reply	other threads:[~2010-08-05 15:02 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-05 15:02 Christoph Egger [this message]
2010-08-09 12:44 ` [PATCH 07/14] Nested Virtualization: trap Tim Deegan
2010-08-10  8:55   ` Christoph Egger
2010-08-10 10:48     ` Tim Deegan
2010-08-10 12:25       ` Christoph Egger
2010-08-10 12:56         ` Tim Deegan
2010-08-10 13:37           ` Christoph Egger
     [not found] <1A42CE6F5F474C41B63392A5F80372B22A3E5B97@shsmsx501.ccr.corp.intel.com>
2010-08-19  2:44 ` Dong, Eddie
2010-08-19  8:35   ` Tim Deegan
2010-08-19 10:32     ` Christoph Egger
2010-08-19 14:12       ` Dong, Eddie
2010-08-19 13:53     ` Dong, Eddie
2010-08-19 14:30       ` Tim Deegan
2010-08-23  3:12         ` Dong, Eddie
2010-08-31 10:34           ` Tim Deegan
2010-08-23 16:03         ` Christoph Egger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201008051702.35039.Christoph.Egger@amd.com \
    --to=christoph.egger@amd.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).