[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] nested EPT: fixing wrong handling for L2 guest's direct mmio access



On 17.01.14 07:35, Yang Zhang wrote:
> From: Yang Zhang <yang.z.zhang@xxxxxxxxx>
> 
> L2 guest will access the physical device directly(nested VT-d). For such 
> access,
> Shadow EPT table should point to device's MMIO. But in current logic, L0 
> doesn't
> distinguish the MMIO whether from qemu or physical device when building 
> shadow EPT table.
> This is wrong. This patch will setup the correct shadow EPT table for such 
> MMIO ranges.
> 
> Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx>
> ---
>  xen/arch/x86/mm/hap/nested_hap.c    |   10 ++++++++--
>  xen/include/asm-x86/hvm/nestedhvm.h |    1 +
>  2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/xen/arch/x86/mm/hap/nested_hap.c 
> b/xen/arch/x86/mm/hap/nested_hap.c
> index c2ef1d1..38e2327 100644
> --- a/xen/arch/x86/mm/hap/nested_hap.c
> +++ b/xen/arch/x86/mm/hap/nested_hap.c
> @@ -170,8 +170,11 @@ nestedhap_walk_L0_p2m(struct p2m_domain *p2m, paddr_t 
> L1_gpa, paddr_t *L0_gpa,
>      mfn = get_gfn_type_access(p2m, L1_gpa >> PAGE_SHIFT, p2mt, p2ma,
>                                0, page_order);
>  
> +    rc = NESTEDHVM_PAGEFAULT_DIRECT_MMIO;
> +    if ( *p2mt == p2m_mmio_direct )
> +        goto direct_mmio_out;
>      rc = NESTEDHVM_PAGEFAULT_MMIO;
> -    if ( p2m_is_mmio(*p2mt) )
> +    if ( *p2mt == p2m_mmio_dm )
>          goto out;

Why does p2m_is_mmio() not cover p2m_mmio_direct ?

Christoph

>      rc = NESTEDHVM_PAGEFAULT_L0_ERROR;
> @@ -184,8 +187,9 @@ nestedhap_walk_L0_p2m(struct p2m_domain *p2m, paddr_t 
> L1_gpa, paddr_t *L0_gpa,
>      if ( !mfn_valid(mfn) )
>          goto out;
>  
> -    *L0_gpa = (mfn_x(mfn) << PAGE_SHIFT) + (L1_gpa & ~PAGE_MASK);
>      rc = NESTEDHVM_PAGEFAULT_DONE;
> +direct_mmio_out:
> +    *L0_gpa = (mfn_x(mfn) << PAGE_SHIFT) + (L1_gpa & ~PAGE_MASK);
>  out:
>      __put_gfn(p2m, L1_gpa >> PAGE_SHIFT);
>      return rc;
> @@ -245,6 +249,8 @@ nestedhvm_hap_nested_page_fault(struct vcpu *v, paddr_t 
> *L2_gpa,
>          break;
>      case NESTEDHVM_PAGEFAULT_MMIO:
>          return rv;
> +    case NESTEDHVM_PAGEFAULT_DIRECT_MMIO:
> +        break;
>      default:
>          BUG();
>          break;
> diff --git a/xen/include/asm-x86/hvm/nestedhvm.h 
> b/xen/include/asm-x86/hvm/nestedhvm.h
> index d8124cf..cca41b3 100644
> --- a/xen/include/asm-x86/hvm/nestedhvm.h
> +++ b/xen/include/asm-x86/hvm/nestedhvm.h
> @@ -53,6 +53,7 @@ bool_t nestedhvm_vcpu_in_guestmode(struct vcpu *v);
>  #define NESTEDHVM_PAGEFAULT_L0_ERROR   3
>  #define NESTEDHVM_PAGEFAULT_MMIO       4
>  #define NESTEDHVM_PAGEFAULT_RETRY      5
> +#define NESTEDHVM_PAGEFAULT_DIRECT_MMIO 6
>  int nestedhvm_hap_nested_page_fault(struct vcpu *v, paddr_t *L2_gpa,
>      bool_t access_r, bool_t access_w, bool_t access_x);
>  
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.