int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,

                      int index, const char *name)

{

    struct vfio_region_info *info;

    int ret;



    ret = vfio_get_region_info(vbasedev, index, &info);

    if (ret) {

        return ret;

    }



    region->vbasedev = vbasedev;

    region->flags = info->flags;

    region->size = info->size;

    region->fd_offset = info->offset;

    region->nr = index;



    if (region->size) {

        region->mem = g_new0(MemoryRegion, 1);

        memory_region_init_io(region->mem, obj, &vfio_region_ops,

                              region, name, region->size);



        if (!vbasedev->no_mmap &&

            region->flags & VFIO_REGION_INFO_FLAG_MMAP &&

            !(region->size & ~qemu_real_host_page_mask)) {



            ret = vfio_setup_region_sparse_mmaps(region, info);



            if (ret) {

                region->nr_mmaps = 1;

                region->mmaps = g_new0(VFIOMmap, region->nr_mmaps);

                region->mmaps[0].offset = 0;

                region->mmaps[0].size = region->size;

            }

        }

    }



    g_free(info);



    trace_vfio_region_setup(vbasedev->name, index, name,

                            region->flags, region->fd_offset, region->size);

    return 0;

}

int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,

                      int index, const char *name)

{

    struct vfio_region_info *info;

    int ret;



    ret = vfio_get_region_info(vbasedev, index, &info);

    if (ret) {

        return ret;

    }



    region->vbasedev = vbasedev;

    region->flags = info->flags;

    region->size = info->size;

    region->fd_offset = info->offset;

    region->nr = index;



    if (region->size) {

        region->mem = g_new0(MemoryRegion, 1);

        memory_region_init_io(region->mem, obj, &vfio_region_ops,

                              region, name, region->size);



        if (!vbasedev->no_mmap &&

            region->flags & VFIO_REGION_INFO_FLAG_MMAP &&

            !(region->size & ~qemu_real_host_page_mask)) {



            ret = vfio_setup_region_sparse_mmaps(region, info);



            if (ret) {

                region->nr_mmaps = 1;

                region->mmaps = g_new0(VFIOMmap, region->nr_mmaps);

                region->mmaps[0].offset = 0;

                region->mmaps[0].size = region->size;

            }

        }

    }



    g_free(info);



    trace_vfio_region_setup(vbasedev->name, index, name,

                            region->flags, region->fd_offset, region->size);

    return 0;

}

int FUNC_0(Object *VAR_0, VFIODevice *VAR_1, VFIORegion *VAR_2,

                      int VAR_3, const char *VAR_4)

{

    struct vfio_region_info *VAR_5;

    int VAR_6;



    VAR_6 = vfio_get_region_info(VAR_1, VAR_3, &VAR_5);

    if (VAR_6) {

        return VAR_6;

    }



    VAR_2->VAR_1 = VAR_1;

    VAR_2->flags = VAR_5->flags;

    VAR_2->size = VAR_5->size;

    VAR_2->fd_offset = VAR_5->offset;

    VAR_2->nr = VAR_3;



    if (VAR_2->size) {

        VAR_2->mem = g_new0(MemoryRegion, 1);

        memory_region_init_io(VAR_2->mem, VAR_0, &vfio_region_ops,

                              VAR_2, VAR_4, VAR_2->size);



        if (!VAR_1->no_mmap &&

            VAR_2->flags & VFIO_REGION_INFO_FLAG_MMAP &&

            !(VAR_2->size & ~qemu_real_host_page_mask)) {



            VAR_6 = vfio_setup_region_sparse_mmaps(VAR_2, VAR_5);



            if (VAR_6) {

                VAR_2->nr_mmaps = 1;

                VAR_2->mmaps = g_new0(VFIOMmap, VAR_2->nr_mmaps);

                VAR_2->mmaps[0].offset = 0;

                VAR_2->mmaps[0].size = VAR_2->size;

            }

        }

    }



    g_free(VAR_5);



    trace_vfio_region_setup(VAR_1->VAR_4, VAR_3, VAR_4,

                            VAR_2->flags, VAR_2->fd_offset, VAR_2->size);

    return 0;

}

int FUNC_0(Object *VAR_0, VFIODevice *VAR_1, VFIORegion *VAR_2,
int VAR_3, const char *VAR_4)
{ struct vfio_region_info *VAR_5; int VAR_6; VAR_6 = vfio_get_region_info(VAR_1, VAR_3, &VAR_5); if (VAR_6) { return VAR_6; } VAR_2->VAR_1 = VAR_1; VAR_2->flags = VAR_5->flags; VAR_2->size = VAR_5->size; VAR_2->fd_offset = VAR_5->offset; VAR_2->nr = VAR_3; if (VAR_2->size) { VAR_2->mem = g_new0(MemoryRegion, 1); memory_region_init_io(VAR_2->mem, VAR_0, &vfio_region_ops,
VAR_2, VAR_4, VAR_2->size); if (!VAR_1->no_mmap &&
VAR_2->flags & VFIO_REGION_INFO_FLAG_MMAP &&
!(VAR_2->size & ~qemu_real_host_page_mask)) { VAR_6 = vfio_setup_region_sparse_mmaps(VAR_2, VAR_5); if (VAR_6) { VAR_2->nr_mmaps = 1; VAR_2->mmaps = g_new0(VFIOMmap, VAR_2->nr_mmaps); VAR_2->mmaps[0].offset = 0; VAR_2->mmaps[0].size = VAR_2->size; } } } g_free(VAR_5); trace_vfio_region_setup(VAR_1->VAR_4, VAR_3, VAR_4,
VAR_2->flags, VAR_2->fd_offset, VAR_2->size); return 0; }