void memory_region_iommu_replay(MemoryRegion *mr, IOMMUNotifier *n,

                                bool is_write)

{

    hwaddr addr, granularity;

    IOMMUTLBEntry iotlb;

    IOMMUAccessFlags flag = is_write ? IOMMU_WO : IOMMU_RO;



    /* If the IOMMU has its own replay callback, override */

    if (mr->iommu_ops->replay) {

        mr->iommu_ops->replay(mr, n);

        return;

    }



    granularity = memory_region_iommu_get_min_page_size(mr);



    for (addr = 0; addr < memory_region_size(mr); addr += granularity) {

        iotlb = mr->iommu_ops->translate(mr, addr, flag);

        if (iotlb.perm != IOMMU_NONE) {

            n->notify(n, &iotlb);

        }



        /* if (2^64 - MR size) < granularity, it's possible to get an

         * infinite loop here.  This should catch such a wraparound */

        if ((addr + granularity) < addr) {

            break;

        }

    }

}

void memory_region_iommu_replay(MemoryRegion *mr, IOMMUNotifier *n,

                                bool is_write)

{

    hwaddr addr, granularity;

    IOMMUTLBEntry iotlb;

    IOMMUAccessFlags flag = is_write ? IOMMU_WO : IOMMU_RO;



    

    if (mr->iommu_ops->replay) {

        mr->iommu_ops->replay(mr, n);

        return;

    }



    granularity = memory_region_iommu_get_min_page_size(mr);



    for (addr = 0; addr < memory_region_size(mr); addr += granularity) {

        iotlb = mr->iommu_ops->translate(mr, addr, flag);

        if (iotlb.perm != IOMMU_NONE) {

            n->notify(n, &iotlb);

        }



        



        if ((addr + granularity) < addr) {

            break;

        }

    }

}

void FUNC_0(MemoryRegion *VAR_0, IOMMUNotifier *VAR_1,

                                bool VAR_2)

{

    hwaddr addr, granularity;

    IOMMUTLBEntry iotlb;

    IOMMUAccessFlags flag = VAR_2 ? IOMMU_WO : IOMMU_RO;



    

    if (VAR_0->iommu_ops->replay) {

        VAR_0->iommu_ops->replay(VAR_0, VAR_1);

        return;

    }



    granularity = memory_region_iommu_get_min_page_size(VAR_0);



    for (addr = 0; addr < memory_region_size(VAR_0); addr += granularity) {

        iotlb = VAR_0->iommu_ops->translate(VAR_0, addr, flag);

        if (iotlb.perm != IOMMU_NONE) {

            VAR_1->notify(VAR_1, &iotlb);

        }



        



        if ((addr + granularity) < addr) {

            break;

        }

    }

}

void FUNC_0(MemoryRegion *VAR_0, IOMMUNotifier *VAR_1,
bool VAR_2)
{ hwaddr addr, granularity; IOMMUTLBEntry iotlb; IOMMUAccessFlags flag = VAR_2 ? IOMMU_WO : IOMMU_RO; if (VAR_0->iommu_ops->replay) { VAR_0->iommu_ops->replay(VAR_0, VAR_1); return; } granularity = memory_region_iommu_get_min_page_size(VAR_0); for (addr = 0; addr < memory_region_size(VAR_0); addr += granularity) { iotlb = VAR_0->iommu_ops->translate(VAR_0, addr, flag); if (iotlb.perm != IOMMU_NONE) { VAR_1->notify(VAR_1, &iotlb); } if ((addr + granularity) < addr) { break; } } }