Skip to contentSkip to conversation

nestedhvm: handle l2 guest MMIO access

PATCH Applied Christoph Egger 2 participants 2 messages Oct 21, 2011 – Oct 24, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 nestedhvm: handle l2 guest MMIO access

Hyper-V starts a root domain which effectively an l2 guest. Hyper-V passes its devices through to the root domain and let it do the MMIO accesses. The emulation is done by Xen (host) and Hyper-V forwards the interrupts to the l2 guest.

Signature · 6 lines
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
xen/arch/x86/hvm/hvm.c +4 -0
diff -r 55b3a1acb259 xen/arch/x86/hvm/hvm.c
@@ -1208,6 +1208,10 @@ int hvm_hap_nested_page_fault(unsigned l
             return 0;
         case NESTEDHVM_PAGEFAULT_INJECT:
             return -1;
+        case NESTEDHVM_PAGEFAULT_MMIO:
+            if ( !handle_mmio() )
+                hvm_inject_exception(TRAP_gp_fault, 0, 0);
+            return 1;
         }
     }
 
xen/arch/x86/hvm/svm/nestedsvm.c +9 -0
diff -r 55b3a1acb259 xen/arch/x86/hvm/svm/nestedsvm.c
@@ -1165,6 +1165,15 @@ enum hvm_intblk nsvm_intr_blocked(struct
         if ( svm->ns_hostflags.fields.vintrmask )
             if ( !svm->ns_hostflags.fields.rflagsif )
                 return hvm_intblk_rflags_ie;
+
+        /* when l1 guest passes its devices through to the l2 guest
+         * and l2 guest does an MMIO access then we may want to
+         * inject an VMEXIT(#INTR) exitcode into the l1 guest.
+         * Delay the injection because this would result in delivering
+         * an interrupt *within* the execution of an instruction.
+         */
+        if ( v->arch.hvm_vcpu.io_state != HVMIO_none )
+            return hvm_intblk_shadow;
     }
 
     if ( nv->nv_vmexit_pending ) {
xen/arch/x86/mm/hap/nested_hap.c +5 -0
diff -r 55b3a1acb259 xen/arch/x86/mm/hap/nested_hap.c
@@ -151,6 +151,9 @@ nestedhap_walk_L0_p2m(struct p2m_domain 
     mfn = gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2ma, 
                               p2m_query, page_order);
 
+    if ( p2m_is_mmio(p2mt) )
+        return NESTEDHVM_PAGEFAULT_MMIO;
+
     if ( p2m_is_paging(p2mt) || p2m_is_shared(p2mt) || !p2m_is_ram(p2mt) )
         return NESTEDHVM_PAGEFAULT_ERROR;
 
@@ -228,6 +231,8 @@ nestedhvm_hap_nested_page_fault(struct v
         return rv;
     case NESTEDHVM_PAGEFAULT_DONE:
         break;
+    case NESTEDHVM_PAGEFAULT_MMIO:
+        return rv;
     default:
         BUG();
         break;
xen/include/asm-x86/hvm/nestedhvm.h +1 -0
diff -r 55b3a1acb259 xen/include/asm-x86/hvm/nestedhvm.h
@@ -50,6 +50,7 @@ bool_t nestedhvm_vcpu_in_guestmode(struc
 #define NESTEDHVM_PAGEFAULT_DONE   0
 #define NESTEDHVM_PAGEFAULT_INJECT 1
 #define NESTEDHVM_PAGEFAULT_ERROR  2
+#define NESTEDHVM_PAGEFAULT_MMIO   3
 int nestedhvm_hap_nested_page_fault(struct vcpu *v, paddr_t L2_gpa);
 
 /* IO permission map */

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

Applied
#1 lore raw
Quoted 6 lines · Christoph Egger

Hyper-V starts a root domain which effectively an l2 guest. Hyper-V passes its devices through to the root domain and let it do the MMIO accesses. The emulation is done by Xen (host) and Hyper-V forwards the interrupts to the l2 guest.

Applied, thanks.

Tim.