[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 1/4] intel_iommu: fix VTD_PAGE_MASK
From: |
Peter Xu |
Subject: |
Re: [Qemu-devel] [PATCH v3 1/4] intel_iommu: fix VTD_PAGE_MASK |
Date: |
Fri, 14 Jul 2017 12:27:15 +0800 |
User-agent: |
Mutt/1.5.24 (2015-08-30) |
On Thu, Jul 13, 2017 at 04:41:32PM +0800, Jason Wang wrote:
>
>
> On 2017年07月12日 16:13, Peter Xu wrote:
> >IOMMUTLBEntry.iova is returned incorrectly in one PT path (though mostly
> >we cannot really trigger this path, even if we do, we are mostly
> >disgarding this value, so it didn't break anything). Fix it by
> >converting the VTD_PAGE_MASK into normal definition (normally it should
> >be pfn mask, not offset mask), then switch the other user of it.
> >
> >Fixes: b93130 ("intel_iommu: cleanup vtd_{do_}iommu_translate()")
> >Signed-off-by: Peter Xu <address@hidden>
> >---
> > hw/i386/intel_iommu.c | 2 +-
> > hw/i386/intel_iommu_internal.h | 2 +-
> > 2 files changed, 2 insertions(+), 2 deletions(-)
> >
> >diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> >index 88dc042..392da45 100644
> >--- a/hw/i386/intel_iommu.c
> >+++ b/hw/i386/intel_iommu.c
> >@@ -1141,7 +1141,7 @@ static bool vtd_do_iommu_translate(VTDAddressSpace
> >*vtd_as, PCIBus *bus,
> > if (vtd_ce_get_type(&ce) == VTD_CONTEXT_TT_PASS_THROUGH) {
> > entry->iova = addr & VTD_PAGE_MASK;
> > entry->translated_addr = entry->iova;
> >- entry->addr_mask = VTD_PAGE_MASK;
> >+ entry->addr_mask = ~VTD_PAGE_MASK;
> > entry->perm = IOMMU_RW;
> > trace_vtd_translate_pt(source_id, entry->iova);
> >diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
> >index f50ecd8..754cf8a 100644
> >--- a/hw/i386/intel_iommu_internal.h
> >+++ b/hw/i386/intel_iommu_internal.h
> >@@ -384,7 +384,7 @@ typedef struct VTDIOTLBPageInvInfo VTDIOTLBPageInvInfo;
> > /* Pagesize of VTD paging structures, including root and context tables */
> > #define VTD_PAGE_SHIFT 12
> > #define VTD_PAGE_SIZE (1ULL << VTD_PAGE_SHIFT)
> >-#define VTD_PAGE_MASK (VTD_PAGE_SIZE - 1)
> >+#define VTD_PAGE_MASK (~(VTD_PAGE_SIZE - 1))
> > #define VTD_PAGE_SHIFT_4K 12
> > #define VTD_PAGE_MASK_4K (~((1ULL << VTD_PAGE_SHIFT_4K) - 1))
>
> I wonder whether or not using VTD_PAGE_MASK_4K is more than enough.
Sure. Let me remove VTD_PAGE_SIZE/MASK. Thanks.
--
Peter Xu