mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
VT-d: print_vtd_entries() should cope with superpages
Even if VT-d code alone (i.e. when not sharing tables with EPT) still
doesn't support superpages, this function - invoked upon DMA remapping
faults - needs to cope with such.
While at it also replace a few more plain numbers with suitable named
constants.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
master commit: 92cf6c2456
master date: 2015-03-09 14:00:19 +0100
This commit is contained in:
1 parent
4a49a29776
commit
b39e48d67a
2 files changed
+10
-4
No files matched your search
@@ -268,18 +268,22 @@ struct dma_pte {
|
||||
};
|
||||
#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 |= (1 << 7);} 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 & ~3) | ((prot) & 3); } 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_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 & 3) != 0)
|
||||
#define dma_pte_present(p) (((p).val & DMA_PTE_PROT) != 0)
|
||||
#define dma_pte_superpage(p) (((p).val & DMA_PTE_SP) != 0)
|
||||
|
||||
/* interrupt remap entry */
|
||||
struct iremap_entry {
|
||||
|
||||
@@ -179,6 +179,8 @@ void print_vtd_entries(struct iommu *iommu, int bus, int devfn, u64 gmfn)
|
||||
printk(" l%d[%x] not present\n", level, l_index);
|
||||
break;
|
||||
}
|
||||
if ( dma_pte_superpage(pte) )
|
||||
break;
|
||||
val = dma_pte_addr(pte);
|
||||
} while ( --level );
|
||||
}
|
||||
|
||||