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

Re: [Xen-devel] [PATCH 2 of 5] amd iommu: Fix iommu page size encoding when page order > 0



>>> On 03.11.11 at 16:48, Wei Wang <wei.wang2@xxxxxxx> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@xxxxxxx>
> # Date 1320334553 -3600
> # Node ID 1bf06c8d2c70e9af610e12a7592c466a799b0de1
> # Parent  ef46c471a11f83d07e256ad2e0b868828f45ef63
> amd iommu: Fix iommu page size encoding when page order > 0.
> Fix io address in invalid all pages command.
> 
> Signed-off-by: Wei Wang <wei.wang2@xxxxxxx>
> 
> diff -r ef46c471a11f -r 1bf06c8d2c70 xen/drivers/passthrough/amd/iommu_map.c
> --- a/xen/drivers/passthrough/amd/iommu_map.c Thu Nov 03 16:35:51 2011 +0100
> +++ b/xen/drivers/passthrough/amd/iommu_map.c Thu Nov 03 16:35:53 2011 +0100
> @@ -77,23 +77,24 @@ static void invalidate_iommu_pages(struc
>  {
>      u64 addr_lo, addr_hi;
>      u32 cmd[4], entry;
> -    u64 mask = 0;
>      int sflag = 0, pde = 0;
>  
> +    ASSERT ( order == 0 || order == 9 || order == 18 );
> +
> +    /* All pages associated with the domainID are invalidated */
> +    if ( order || (io_addr == INV_IOMMU_ALL_PAGES_ADDRESS ) )
> +    {
> +        sflag = 1;
> +        pde = 1;
> +    }
> +
>      /* If sflag == 1, the size of the invalidate command is determined
>       by the first zero bit in the address starting from Address[12] */
> -    if ( order == 9 || order == 18 )
> +    if ( order )
>      {
> -        mask = ((1ULL << (order - 1)) - 1) << PAGE_SHIFT;
> -        io_addr |= mask;
> -        sflag = 1;
> -    }
> -
> -    /* All pages associated with the domainID are invalidated */
> -    else if ( io_addr == 0x7FFFFFFFFFFFF000ULL )
> -    {
> -        sflag = 1;
> -        pde = 1;
> +        u64 mask = 1ULL << (order - 1 + PAGE_SHIFT);
> +        io_addr &= ~mask;
> +        io_addr |= mask - 1;
>      }
>  
>      addr_lo = io_addr & DMA_32BIT_MASK;
> @@ -917,7 +918,7 @@ static void _amd_iommu_flush_pages(struc
>  
>  void amd_iommu_flush_all_pages(struct domain *d)
>  {
> -    _amd_iommu_flush_pages(d, 0x7FFFFFFFFFFFFULL, 0);
> +    _amd_iommu_flush_pages(d, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
>  }
>  
>  void amd_iommu_flush_pages(struct domain *d,
> diff -r ef46c471a11f -r 1bf06c8d2c70 
> xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h    Thu Nov 03 16:35:51 
> 2011 +0100
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h    Thu Nov 03 16:35:53 
> 2011 
> +0100
> @@ -407,4 +407,6 @@
>  #define INT_REMAP_ENTRY_VECTOR_MASK     0x00FF0000
>  #define INT_REMAP_ENTRY_VECTOR_SHIFT    16
>  
> +#define INV_IOMMU_ALL_PAGES_ADDRESS      (1ULL << 63) - 1

Please parenthesize this properly.

> +
>  #endif /* _ASM_X86_64_AMD_IOMMU_DEFS_H */
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx 
> http://lists.xensource.com/xen-devel 




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


 


Rackspace

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