[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4 14/14] vtd: use a bit field for dma_pte
From: Paul Durrant <pdurrant@xxxxxxxxxx> As with a prior patch for context_entry, this removes the need for much shifting, masking and several magic numbers. Signed-off-by: Paul Durrant <pdurrant@xxxxxxxxxx> --- Cc: Kevin Tian <kevin.tian@xxxxxxxxx> v4: - New in v4 --- xen/drivers/passthrough/vtd/iommu.c | 9 ++--- xen/drivers/passthrough/vtd/iommu.h | 55 +++++++++++++++++------------ 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 766d33058e..2d60cebe67 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1772,13 +1772,14 @@ static int __must_check intel_iommu_map_page(struct domain *d, dfn_t dfn, old = *pte; dma_set_pte_addr(new, mfn_to_maddr(mfn)); - dma_set_pte_prot(new, - ((flags & IOMMUF_readable) ? DMA_PTE_READ : 0) | - ((flags & IOMMUF_writable) ? DMA_PTE_WRITE : 0)); + if ( flags & IOMMUF_readable ) + dma_set_pte_readable(new); + if ( flags & IOMMUF_writable ) + dma_set_pte_writable(new); /* Set the SNP on leaf page table if Snoop Control available */ if ( iommu_snoop ) - dma_set_pte_snp(new); + dma_set_pte_snoop(new); if ( old.val == new.val ) { diff --git a/xen/drivers/passthrough/vtd/iommu.h b/xen/drivers/passthrough/vtd/iommu.h index 509d13918a..017286b0e1 100644 --- a/xen/drivers/passthrough/vtd/iommu.h +++ b/xen/drivers/passthrough/vtd/iommu.h @@ -283,29 +283,40 @@ struct context_entry { * 12-63: Host physcial address */ struct dma_pte { - u64 val; + union { + uint64_t val; + struct { + uint64_t r:1; + uint64_t w:1; + uint64_t reserved0:1; + uint64_t ignored0:4; + uint64_t ps:1; + uint64_t ignored1:3; + uint64_t snp:1; + uint64_t addr:52; + }; + }; }; -#define DMA_PTE_READ (1) -#define DMA_PTE_WRITE (2) -#define DMA_PTE_PROT (DMA_PTE_READ | DMA_PTE_WRITE) -#define DMA_PTE_SP (1 << 7) -#define DMA_PTE_SNP (1 << 11) -#define dma_clear_pte(p) do {(p).val = 0;} while(0) -#define dma_set_pte_readable(p) do {(p).val |= DMA_PTE_READ;} while(0) -#define dma_set_pte_writable(p) do {(p).val |= DMA_PTE_WRITE;} while(0) -#define dma_set_pte_superpage(p) do {(p).val |= DMA_PTE_SP;} while(0) -#define dma_set_pte_snp(p) do {(p).val |= DMA_PTE_SNP;} while(0) -#define dma_set_pte_prot(p, prot) do { \ - (p).val = ((p).val & ~DMA_PTE_PROT) | ((prot) & DMA_PTE_PROT); \ - } while (0) -#define dma_pte_prot(p) ((p).val & DMA_PTE_PROT) -#define dma_pte_read(p) (dma_pte_prot(p) & DMA_PTE_READ) -#define dma_pte_write(p) (dma_pte_prot(p) & DMA_PTE_WRITE) -#define dma_pte_addr(p) ((p).val & PADDR_MASK & PAGE_MASK_4K) -#define dma_set_pte_addr(p, addr) do {\ - (p).val |= ((addr) & PAGE_MASK_4K); } while (0) -#define dma_pte_present(p) (((p).val & DMA_PTE_PROT) != 0) -#define dma_pte_superpage(p) (((p).val & DMA_PTE_SP) != 0) + +#define dma_pte_read(p) ((p).r) +#define dma_set_pte_readable(p) do { (p).r = 1; } while (0) + +#define dma_pte_write(p) ((p).w) +#define dma_set_pte_writable(p) do { (p).w = 1; } while (0) + +#define dma_pte_addr(p) ((p).addr << PAGE_SHIFT_4K) +#define dma_set_pte_addr(p, val) \ + do { (p).addr = (val) >> PAGE_SHIFT_4K; } while (0) + +#define dma_pte_present(p) ((p).r || (p).w) + +#define dma_pte_superpage(p) ((p).ps) +#define dma_set_pte_superpage(p) do { (p).ps = 1; } while (0) + +#define dma_pte_snoop(p) ((p).snp) +#define dma_set_pte_snoop(p) do { (p).snp = 1; } while (0) + +#define dma_clear_pte(p) do { (p).val = 0; } while (0) /* interrupt remap entry */ struct iremap_entry { -- 2.20.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |