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

Re: [Xen-devel] [PATCH 1/2] amd-iommu: use a bitfield for PTE/PDE



On 2/13/19 3:45 AM, Paul Durrant wrote:
>> -----Original Message-----
>> From: Woods, Brian [mailto:Brian.Woods@xxxxxxx]
>> Sent: 12 February 2019 20:14
>> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
>> Cc: Suthikulpanit, Suravee <Suravee.Suthikulpanit@xxxxxxx>; Jan Beulich
>> <jbeulich@xxxxxxxx>; Andrew Cooper <Andrew.Cooper3@xxxxxxxxxx>; Wei Liu
>> <wei.liu2@xxxxxxxxxx>; Roger Pau Monne <roger.pau@xxxxxxxxxx>
>> Subject: Re: [PATCH 1/2] amd-iommu: use a bitfield for PTE/PDE
>>
>> On 2/4/19 5:19 AM, Paul Durrant wrote:
>>> The current use of get/set_field_from/in_reg_u32() is both inefficient
>> and
>>> requires some ugly casting.
>>>
>>> This patch defines a new bitfield structure (amd_iommu_pte) and uses
>> this
>>> structure in all PTE/PDE manipulation, resulting in much more readable
>>> and compact code.
>>>
>>> NOTE: This commit also fixes one malformed comment in
>>>         set_iommu_pte_present().
>>>
>>> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
>>
>> Sorry about the delay.
>>
>> Nitpick here, but I'd rather have !!IOMMUF_{writable,readable} than
>> true.
> 
> That's pretty ugly. How about I pass an OR of the flags through to lower 
> level functions rather than a pair of bools? If you're ok with that I'll send 
> a v2.
> 
>    Paul
> 

There's no need for a v2 based on that, that's just me nitpicking. 
There's no real nice way to do it without turning 
IOMMUF_{writable,readable} into bools or your suggested way which has 
more code to decode a flag.  Assuming everyone else is ok with the 
patches as are, it's fine.  If there's going to be a v2 for other 
reasons, I'll just leave it up to your discretion (other people may have 
stronger opinions about it anyway).

Brian

>>   Not worth a revision if there isn't anything else though (and is
>> debatable).
>>
>> Acked-by: Brian Woods <brian.woods@xxxxxxx>
>>
>>> ---
>>> Cc: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx>
>>> Cc: Brian Woods <brian.woods@xxxxxxx>
>>> Cc: Jan Beulich <jbeulich@xxxxxxxx>
>>> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>>> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
>>> Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>
>>> ---
>>>    xen/drivers/passthrough/amd/iommu_map.c       | 143 ++++--------------
>>>    xen/drivers/passthrough/amd/pci_amd_iommu.c   |  50 +++---
>>>    xen/include/asm-x86/hvm/svm/amd-iommu-defs.h  |  47 ++----
>>>    xen/include/asm-x86/hvm/svm/amd-iommu-proto.h |  15 --
>>>    4 files changed, 64 insertions(+), 191 deletions(-)
>>>
>>> diff --git a/xen/drivers/passthrough/amd/iommu_map.c
>> b/xen/drivers/passthrough/amd/iommu_map.c
>>> index 67329b0c95..5fda6063df 100644
>>> --- a/xen/drivers/passthrough/amd/iommu_map.c
>>> +++ b/xen/drivers/passthrough/amd/iommu_map.c
>>> @@ -38,100 +38,45 @@ static unsigned int pfn_to_pde_idx(unsigned long
>> pfn, unsigned int level)
>>>    static unsigned int clear_iommu_pte_present(unsigned long l1_mfn,
>>>                                                unsigned long dfn)
>>>    {
>>> -    uint64_t *table, *pte;
>>> +    struct amd_iommu_pte *table, *pte;
>>>        unsigned int flush_flags;
>>>
>>>        table = map_domain_page(_mfn(l1_mfn));
>>> +    pte = &table[pfn_to_pde_idx(dfn, 1)];
>>>
>>> -    pte = (table + pfn_to_pde_idx(dfn, 1));
>>> +    flush_flags = pte->pr ? IOMMU_FLUSHF_modified : 0;
>>> +    memset(pte, 0, sizeof(*pte));
>>>
>>> -    flush_flags = get_field_from_reg_u32(*pte, IOMMU_PTE_PRESENT_MASK,
>>> -                                         IOMMU_PTE_PRESENT_SHIFT) ?
>>> -                                         IOMMU_FLUSHF_modified : 0;
>>> -
>>> -    *pte = 0;
>>>        unmap_domain_page(table);
>>>
>>>        return flush_flags;
>>>    }
>>>
>>> -static unsigned int set_iommu_pde_present(uint32_t *pde,
>>> +static unsigned int set_iommu_pde_present(struct amd_iommu_pte *pte,
>>>                                              unsigned long next_mfn,
>>>                                              unsigned int next_level,
>> bool iw,
>>>                                              bool ir)
>>>    {
>>> -    uint64_t maddr_next;
>>> -    uint32_t addr_lo, addr_hi, entry;
>>> -    bool old_present;
>>>        unsigned int flush_flags = IOMMU_FLUSHF_added;
>>>
>>> -    maddr_next = __pfn_to_paddr(next_mfn);
>>> -
>>> -    old_present = get_field_from_reg_u32(pde[0],
>> IOMMU_PTE_PRESENT_MASK,
>>> -                                         IOMMU_PTE_PRESENT_SHIFT);
>>> -    if ( old_present )
>>> -    {
>>> -        bool old_r, old_w;
>>> -        unsigned int old_level;
>>> -        uint64_t maddr_old;
>>> -
>>> -        addr_hi = get_field_from_reg_u32(pde[1],
>>> -                                         IOMMU_PTE_ADDR_HIGH_MASK,
>>> -                                         IOMMU_PTE_ADDR_HIGH_SHIFT);
>>> -        addr_lo = get_field_from_reg_u32(pde[0],
>>> -                                         IOMMU_PTE_ADDR_LOW_MASK,
>>> -                                         IOMMU_PTE_ADDR_LOW_SHIFT);
>>> -        old_level = get_field_from_reg_u32(pde[0],
>>> -                                           IOMMU_PDE_NEXT_LEVEL_MASK,
>>> -                                           IOMMU_PDE_NEXT_LEVEL_SHIFT);
>>> -        old_w = get_field_from_reg_u32(pde[1],
>>> -
>> IOMMU_PTE_IO_WRITE_PERMISSION_MASK,
>>> -
>> IOMMU_PTE_IO_WRITE_PERMISSION_SHIFT);
>>> -        old_r = get_field_from_reg_u32(pde[1],
>>> -
>> IOMMU_PTE_IO_READ_PERMISSION_MASK,
>>> -
>> IOMMU_PTE_IO_READ_PERMISSION_SHIFT);
>>> -
>>> -        maddr_old = ((uint64_t)addr_hi << 32) |
>>> -                    ((uint64_t)addr_lo << PAGE_SHIFT);
>>> -
>>> -        if ( maddr_old != maddr_next || iw != old_w || ir != old_r ||
>>> -             old_level != next_level )
>>> +    if ( pte->pr &&
>>> +         (pte->mfn != next_mfn ||
>>> +          pte->iw != iw ||
>>> +          pte->ir != ir ||
>>> +          pte->next_level != next_level) )
>>>                flush_flags |= IOMMU_FLUSHF_modified;
>>> -    }
>>>
>>> -    addr_lo = maddr_next & DMA_32BIT_MASK;
>>> -    addr_hi = maddr_next >> 32;
>>> -
>>> -    /* enable read/write permissions,which will be enforced at the PTE
>> */
>>> -    set_field_in_reg_u32(addr_hi, 0,
>>> -                         IOMMU_PDE_ADDR_HIGH_MASK,
>>> -                         IOMMU_PDE_ADDR_HIGH_SHIFT, &entry);
>>> -    set_field_in_reg_u32(iw, entry,
>>> -                         IOMMU_PDE_IO_WRITE_PERMISSION_MASK,
>>> -                         IOMMU_PDE_IO_WRITE_PERMISSION_SHIFT, &entry);
>>> -    set_field_in_reg_u32(ir, entry,
>>> -                         IOMMU_PDE_IO_READ_PERMISSION_MASK,
>>> -                         IOMMU_PDE_IO_READ_PERMISSION_SHIFT, &entry);
>>> -
>>> -    /* FC bit should be enabled in PTE, this helps to solve potential
>>> +    /*
>>> +     * FC bit should be enabled in PTE, this helps to solve potential
>>>         * issues with ATS devices
>>>         */
>>> -    if ( next_level == 0 )
>>> -        set_field_in_reg_u32(IOMMU_CONTROL_ENABLED, entry,
>>> -                             IOMMU_PTE_FC_MASK, IOMMU_PTE_FC_SHIFT,
>> &entry);
>>> -    pde[1] = entry;
>>
>>
>>> +    pte->fc = !next_level;
>>>
>>> -    /* mark next level as 'present' */
>>> -    set_field_in_reg_u32(addr_lo >> PAGE_SHIFT, 0,
>>> -                         IOMMU_PDE_ADDR_LOW_MASK,
>>> -                         IOMMU_PDE_ADDR_LOW_SHIFT, &entry);
>>> -    set_field_in_reg_u32(next_level, entry,
>>> -                         IOMMU_PDE_NEXT_LEVEL_MASK,
>>> -                         IOMMU_PDE_NEXT_LEVEL_SHIFT, &entry);
>>> -    set_field_in_reg_u32(IOMMU_CONTROL_ENABLED, entry,
>>> -                         IOMMU_PDE_PRESENT_MASK,
>>> -                         IOMMU_PDE_PRESENT_SHIFT, &entry);
>>> -    pde[0] = entry;
>>> +    pte->mfn = next_mfn;
>>> +    pte->iw = iw;
>>> +    pte->ir = ir;
>>> +    pte->next_level = next_level;
>>> +    pte->pr = 1;
>>>
>>>        return flush_flags;
>>>    }
>>> @@ -142,13 +87,11 @@ static unsigned int set_iommu_pte_present(unsigned
>> long pt_mfn,
>>>                                              int pde_level,
>>>                                              bool iw, bool ir)
>>>    {
>>> -    uint64_t *table;
>>> -    uint32_t *pde;
>>> +    struct amd_iommu_pte *table, *pde;
>>>        unsigned int flush_flags;
>>>
>>>        table = map_domain_page(_mfn(pt_mfn));
>>> -
>>> -    pde = (uint32_t *)(table + pfn_to_pde_idx(dfn, pde_level));
>>> +    pde = &table[pfn_to_pde_idx(dfn, pde_level)];
>>>
>>>        flush_flags = set_iommu_pde_present(pde, next_mfn, 0, iw, ir);
>>>        unmap_domain_page(table);
>>> @@ -319,25 +262,6 @@ void iommu_dte_set_guest_cr3(uint32_t *dte,
>> uint16_t dom_id, uint64_t gcr3,
>>>        dte[1] = entry;
>>>    }
>>>
>>> -uint64_t amd_iommu_get_address_from_pte(void *pte)
>>> -{
>>> -    uint32_t *entry = pte;
>>> -    uint32_t addr_lo, addr_hi;
>>> -    uint64_t ptr;
>>> -
>>> -    addr_lo = get_field_from_reg_u32(entry[0],
>>> -                                     IOMMU_PTE_ADDR_LOW_MASK,
>>> -                                     IOMMU_PTE_ADDR_LOW_SHIFT);
>>> -
>>> -    addr_hi = get_field_from_reg_u32(entry[1],
>>> -                                     IOMMU_PTE_ADDR_HIGH_MASK,
>>> -                                     IOMMU_PTE_ADDR_HIGH_SHIFT);
>>> -
>>> -    ptr = ((uint64_t)addr_hi << 32) |
>>> -          ((uint64_t)addr_lo << PAGE_SHIFT);
>>> -    return ptr;
>>> -}
>>> -
>>>    /* Walk io page tables and build level page tables if necessary
>>>     * {Re, un}mapping super page frames causes re-allocation of io
>>>     * page tables.
>>> @@ -345,7 +269,7 @@ uint64_t amd_iommu_get_address_from_pte(void *pte)
>>>    static int iommu_pde_from_dfn(struct domain *d, unsigned long dfn,
>>>                                  unsigned long pt_mfn[])
>>>    {
>>> -    uint64_t *pde, *next_table_vaddr;
>>> +    struct amd_iommu_pte *pde, *next_table_vaddr;
>>>        unsigned long  next_table_mfn;
>>>        unsigned int level;
>>>        struct page_info *table;
>>> @@ -370,15 +294,13 @@ static int iommu_pde_from_dfn(struct domain *d,
>> unsigned long dfn,
>>>            pt_mfn[level] = next_table_mfn;
>>>
>>>            next_table_vaddr = map_domain_page(_mfn(next_table_mfn));
>>> -        pde = next_table_vaddr + pfn_to_pde_idx(dfn, level);
>>> +        pde = &next_table_vaddr[pfn_to_pde_idx(dfn, level)];
>>>
>>>            /* Here might be a super page frame */
>>> -        next_table_mfn = amd_iommu_get_address_from_pte(pde) >>
>> PAGE_SHIFT;
>>> +        next_table_mfn = pde->mfn;
>>>
>>>            /* Split super page frame into smaller pieces.*/
>>> -        if ( iommu_is_pte_present((uint32_t *)pde) &&
>>> -             (iommu_next_level((uint32_t *)pde) == 0) &&
>>> -             next_table_mfn != 0 )
>>> +        if ( pde->pr && !pde->next_level && next_table_mfn )
>>>            {
>>>                int i;
>>>                unsigned long mfn, pfn;
>>> @@ -398,13 +320,13 @@ static int iommu_pde_from_dfn(struct domain *d,
>> unsigned long dfn,
>>>                }
>>>
>>>                next_table_mfn = mfn_x(page_to_mfn(table));
>>> -            set_iommu_pde_present((uint32_t *)pde, next_table_mfn,
>> next_level,
>>> -                                  !!IOMMUF_writable,
>> !!IOMMUF_readable);
>>> +            set_iommu_pde_present(pde, next_table_mfn, next_level,
>> true,
>>> +                                  true);
>>>
>>>                for ( i = 0; i < PTE_PER_TABLE_SIZE; i++ )
>>>                {
>>>                    set_iommu_pte_present(next_table_mfn, pfn, mfn,
>> next_level,
>>> -                                      !!IOMMUF_writable,
>> !!IOMMUF_readable);
>>> +                                      true, true);
>>>                    mfn += page_sz;
>>>                    pfn += page_sz;
>>>                 }
>>> @@ -413,7 +335,7 @@ static int iommu_pde_from_dfn(struct domain *d,
>> unsigned long dfn,
>>>            }
>>>
>>>            /* Install lower level page table for non-present entries */
>>> -        else if ( !iommu_is_pte_present((uint32_t *)pde) )
>>> +        else if ( !pde->pr )
>>>            {
>>>                if ( next_table_mfn == 0 )
>>>                {
>>> @@ -425,9 +347,8 @@ static int iommu_pde_from_dfn(struct domain *d,
>> unsigned long dfn,
>>>                        return 1;
>>>                    }
>>>                    next_table_mfn = mfn_x(page_to_mfn(table));
>>> -                set_iommu_pde_present((uint32_t *)pde, next_table_mfn,
>>> -                                      next_level, !!IOMMUF_writable,
>>> -                                      !!IOMMUF_readable);
>>> +                set_iommu_pde_present(pde, next_table_mfn, next_level,
>> true,
>>> +                                      true);
>>>                }
>>>                else /* should never reach here */
>>>                {
>>> @@ -455,7 +376,7 @@ static int update_paging_mode(struct domain *d,
>> unsigned long dfn)
>>>        struct amd_iommu *iommu = NULL;
>>>        struct page_info *new_root = NULL;
>>>        struct page_info *old_root = NULL;
>>> -    void *new_root_vaddr;
>>> +    struct amd_iommu_pte *new_root_vaddr;
>>>        unsigned long old_root_mfn;
>>>        struct domain_iommu *hd = dom_iommu(d);
>>>
>>> @@ -484,7 +405,7 @@ static int update_paging_mode(struct domain *d,
>> unsigned long dfn)
>>>            new_root_vaddr = __map_domain_page(new_root);
>>>            old_root_mfn = mfn_x(page_to_mfn(old_root));
>>>            set_iommu_pde_present(new_root_vaddr, old_root_mfn, level,
>>> -                              !!IOMMUF_writable, !!IOMMUF_readable);
>>> +                              true, true);
>>>            level++;
>>>            old_root = new_root;
>>>            offset >>= PTE_PER_TABLE_SHIFT;
>>> diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c
>> b/xen/drivers/passthrough/amd/pci_amd_iommu.c
>>> index 33a3798f36..da6748320b 100644
>>> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
>>> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
>>> @@ -376,9 +376,8 @@ static void deallocate_next_page_table(struct
>> page_info *pg, int level)
>>>
>>>    static void deallocate_page_table(struct page_info *pg)
>>>    {
>>> -    void *table_vaddr, *pde;
>>> -    u64 next_table_maddr;
>>> -    unsigned int index, level = PFN_ORDER(pg), next_level;
>>> +    struct amd_iommu_pte *table_vaddr;
>>> +    unsigned int index, level = PFN_ORDER(pg);
>>>
>>>        PFN_ORDER(pg) = 0;
>>>
>>> @@ -392,17 +391,14 @@ static void deallocate_page_table(struct page_info
>> *pg)
>>>
>>>        for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
>>>        {
>>> -        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
>>> -        next_table_maddr = amd_iommu_get_address_from_pte(pde);
>>> -        next_level = iommu_next_level(pde);
>>> +        struct amd_iommu_pte *pde = &table_vaddr[index];
>>>
>>> -        if ( (next_table_maddr != 0) && (next_level != 0) &&
>>> -             iommu_is_pte_present(pde) )
>>> +        if ( pde->mfn && pde->next_level && pde->pr )
>>>            {
>>>                /* We do not support skip levels yet */
>>> -            ASSERT(next_level == level - 1);
>>> -            deallocate_next_page_table(maddr_to_page(next_table_maddr),
>>> -                                       next_level);
>>> +            ASSERT(pde->next_level == level - 1);
>>> +            deallocate_next_page_table(mfn_to_page(_mfn(pde->mfn)),
>>> +                                       pde->next_level);
>>>            }
>>>        }
>>>
>>> @@ -500,10 +496,8 @@ static void amd_dump_p2m_table_level(struct
>> page_info* pg, int level,
>>>                                         paddr_t gpa, int indent)
>>>    {
>>>        paddr_t address;
>>> -    void *table_vaddr, *pde;
>>> -    paddr_t next_table_maddr;
>>> -    int index, next_level, present;
>>> -    u32 *entry;
>>> +    struct amd_iommu_pte *table_vaddr;
>>> +    int index;
>>>
>>>        if ( level < 1 )
>>>            return;
>>> @@ -518,42 +512,32 @@ static void amd_dump_p2m_table_level(struct
>> page_info* pg, int level,
>>>
>>>        for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
>>>        {
>>> +        struct amd_iommu_pte *pde = &table_vaddr[index];
>>> +
>>>            if ( !(index % 2) )
>>>                process_pending_softirqs();
>>>
>>> -        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
>>> -        next_table_maddr = amd_iommu_get_address_from_pte(pde);
>>> -        entry = pde;
>>> -
>>> -        present = get_field_from_reg_u32(entry[0],
>>> -                                         IOMMU_PDE_PRESENT_MASK,
>>> -                                         IOMMU_PDE_PRESENT_SHIFT);
>>> -
>>> -        if ( !present )
>>> +        if ( !pde->pr )
>>>                continue;
>>>
>>> -        next_level = get_field_from_reg_u32(entry[0],
>>> -                                            IOMMU_PDE_NEXT_LEVEL_MASK,
>>> -
>> IOMMU_PDE_NEXT_LEVEL_SHIFT);
>>> -
>>> -        if ( next_level && (next_level != (level - 1)) )
>>> +        if ( pde->next_level && (pde->next_level != (level - 1)) )
>>>            {
>>>                printk("IOMMU p2m table error. next_level = %d, expected
>> %d\n",
>>> -                   next_level, level - 1);
>>> +                   pde->next_level, level - 1);
>>>
>>>                continue;
>>>            }
>>>
>>>            address = gpa + amd_offset_level_address(index, level);
>>> -        if ( next_level >= 1 )
>>> +        if ( pde->next_level >= 1 )
>>>                amd_dump_p2m_table_level(
>>> -                maddr_to_page(next_table_maddr), next_level,
>>> +                mfn_to_page(_mfn(pde->mfn)), pde->next_level,
>>>                    address, indent + 1);
>>>            else
>>>                printk("%*sdfn: %08lx  mfn: %08lx\n",
>>>                       indent, "",
>>>                       (unsigned long)PFN_DOWN(address),
>>> -                   (unsigned long)PFN_DOWN(next_table_maddr));
>>> +                   (unsigned long)PFN_DOWN(pfn_to_paddr(pde->mfn)));
>>>        }
>>>
>>>        unmap_domain_page(table_vaddr);
>>> diff --git a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
>> b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
>>> index a217245249..a3a49f91eb 100644
>>> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
>>> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
>>> @@ -413,38 +413,21 @@
>>>    #define IOMMU_PAGE_TABLE_U32_PER_ENTRY
>>      (IOMMU_PAGE_TABLE_ENTRY_SIZE / 4)
>>>    #define IOMMU_PAGE_TABLE_ALIGNMENT       4096
>>>
>>> -#define IOMMU_PTE_PRESENT_MASK                     0x00000001
>>> -#define IOMMU_PTE_PRESENT_SHIFT                    0
>>> -#define IOMMU_PTE_NEXT_LEVEL_MASK          0x00000E00
>>> -#define IOMMU_PTE_NEXT_LEVEL_SHIFT         9
>>> -#define IOMMU_PTE_ADDR_LOW_MASK                    0xFFFFF000
>>> -#define IOMMU_PTE_ADDR_LOW_SHIFT           12
>>> -#define IOMMU_PTE_ADDR_HIGH_MASK           0x000FFFFF
>>> -#define IOMMU_PTE_ADDR_HIGH_SHIFT          0
>>> -#define IOMMU_PTE_U_MASK                   0x08000000
>>> -#define IOMMU_PTE_U_SHIFT                  7
>>> -#define IOMMU_PTE_FC_MASK                  0x10000000
>>> -#define IOMMU_PTE_FC_SHIFT                 28
>>> -#define IOMMU_PTE_IO_READ_PERMISSION_MASK  0x20000000
>>> -#define IOMMU_PTE_IO_READ_PERMISSION_SHIFT 29
>>> -#define IOMMU_PTE_IO_WRITE_PERMISSION_MASK 0x40000000
>>> -#define IOMMU_PTE_IO_WRITE_PERMISSION_SHIFT        30
>>> -
>>> -/* I/O Page Directory */
>>> -#define IOMMU_PAGE_DIRECTORY_ENTRY_SIZE            8
>>> -#define IOMMU_PAGE_DIRECTORY_ALIGNMENT             4096
>>> -#define IOMMU_PDE_PRESENT_MASK                     0x00000001
>>> -#define IOMMU_PDE_PRESENT_SHIFT                    0
>>> -#define IOMMU_PDE_NEXT_LEVEL_MASK          0x00000E00
>>> -#define IOMMU_PDE_NEXT_LEVEL_SHIFT         9
>>> -#define IOMMU_PDE_ADDR_LOW_MASK                    0xFFFFF000
>>> -#define IOMMU_PDE_ADDR_LOW_SHIFT           12
>>> -#define IOMMU_PDE_ADDR_HIGH_MASK           0x000FFFFF
>>> -#define IOMMU_PDE_ADDR_HIGH_SHIFT          0
>>> -#define IOMMU_PDE_IO_READ_PERMISSION_MASK  0x20000000
>>> -#define IOMMU_PDE_IO_READ_PERMISSION_SHIFT 29
>>> -#define IOMMU_PDE_IO_WRITE_PERMISSION_MASK 0x40000000
>>> -#define IOMMU_PDE_IO_WRITE_PERMISSION_SHIFT        30
>>> +struct amd_iommu_pte {
>>> +    uint64_t pr:1;
>>> +    uint64_t ignored0:4;
>>> +    uint64_t a:1;
>>> +    uint64_t d:1;
>>> +    uint64_t ignored1:2;
>>> +    uint64_t next_level:3;
>>> +    uint64_t mfn:40;
>>> +    uint64_t reserved:7;
>>> +    uint64_t u:1;
>>> +    uint64_t fc:1;
>>> +    uint64_t ir:1;
>>> +    uint64_t iw:1;
>>> +    uint64_t ignored2:1;
>>> +};
>>>
>>>    /* Paging modes */
>>>    #define IOMMU_PAGING_MODE_DISABLED       0x0
>>> diff --git a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
>> b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
>>> index c5697565d6..1c1971bb7c 100644
>>> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
>>> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
>>> @@ -57,7 +57,6 @@ int __must_check amd_iommu_map_page(struct domain *d,
>> dfn_t dfn,
>>>                                        unsigned int *flush_flags);
>>>    int __must_check amd_iommu_unmap_page(struct domain *d, dfn_t dfn,
>>>                                          unsigned int *flush_flags);
>>> -uint64_t amd_iommu_get_address_from_pte(void *entry);
>>>    int __must_check amd_iommu_alloc_root(struct domain_iommu *hd);
>>>    int amd_iommu_reserve_domain_unity_map(struct domain *domain,
>>>                                           paddr_t phys_addr, unsigned
>> long size,
>>> @@ -280,18 +279,4 @@ static inline void
>> iommu_set_addr_hi_to_reg(uint32_t *reg, uint32_t addr)
>>>                             IOMMU_REG_BASE_ADDR_HIGH_SHIFT, reg);
>>>    }
>>>
>>> -static inline int iommu_is_pte_present(const u32 *entry)
>>> -{
>>> -    return get_field_from_reg_u32(entry[0],
>>> -                                  IOMMU_PDE_PRESENT_MASK,
>>> -                                  IOMMU_PDE_PRESENT_SHIFT);
>>> -}
>>> -
>>> -static inline unsigned int iommu_next_level(const u32 *entry)
>>> -{
>>> -    return get_field_from_reg_u32(entry[0],
>>> -                                  IOMMU_PDE_NEXT_LEVEL_MASK,
>>> -                                  IOMMU_PDE_NEXT_LEVEL_SHIFT);
>>> -}
>>> -
>>>    #endif /* _ASM_X86_64_AMD_IOMMU_PROTO_H */
>>>
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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