nestedhvm: handle l2 guest MMIO access
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.
Signed-off-by Christoph Egger <[email protected]>
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
@@ -1208,6 +1208,10 @@ int hvm_hap_nested_page_fault(unsigned lreturn 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
@@ -1165,6 +1165,15 @@ enum hvm_intblk nsvm_intr_blocked(structif ( 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
@@ -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 vreturn rv;case NESTEDHVM_PAGEFAULT_DONE :break ; +case NESTEDHVM_PAGEFAULT_MMIO : +return rv;default :BUG ();break ;
xen/include/asm-x86/hvm/nestedhvm.h +1 -0
@@ -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 3int 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
Tim Deegan
AppliedQuoted 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.
Signed-off-by Christoph Egger <[email protected]>
Applied, thanks.
Tim.