if (!dpy->region.buffer.size) {
/* mmap region */
+ Error *error = NULL;
ret = vfio_region_setup(OBJECT(vdev), &vdev->vbasedev,
&dpy->region.buffer,
plane.region_index,
- "display");
+ "display", &error);
if (ret != 0) {
- error_report("%s: vfio_region_setup(%d): %s",
- __func__, plane.region_index, strerror(-ret));
+ error_report_err(error);
goto err;
}
ret = vfio_region_mmap(&dpy->region.buffer);
char *name = g_strdup_printf("%s BAR %d", vbasedev->name, i);
ret = vfio_region_setup(OBJECT(vdev), vbasedev,
- &vdev->bars[i].region, i, name);
+ &vdev->bars[i].region, i, name, errp);
g_free(name);
if (ret) {
- error_setg_errno(errp, -ret, "failed to get region %d info", i);
return false;
}
}
static int vfio_setup_region_sparse_mmaps(VFIORegion *region,
- struct vfio_region_info *info)
+ struct vfio_region_info *info,
+ Error **errp)
{
struct vfio_info_cap_header *hdr;
struct vfio_region_info_cap_sparse_mmap *sparse;
off_t prev_end = region->mmaps[i - 1].offset +
region->mmaps[i - 1].size;
if (prev_end > region->mmaps[i].offset) {
- error_report("%s: overlapping sparse mmap regions detected "
- "in region %d: [0x%"PRIx64"-0x%"PRIx64"] overlaps "
- "with [0x%"PRIx64"-0x%"PRIx64"]",
- __func__, region->nr, region->mmaps[i - 1].offset,
- prev_end - 1, region->mmaps[i].offset,
- region->mmaps[i].offset + region->mmaps[i].size - 1);
+ error_setg(errp, "%s: overlapping sparse mmap regions detected "
+ "in region %d: [0x%"PRIx64"-0x%"PRIx64"] overlaps "
+ "with [0x%"PRIx64"-0x%"PRIx64"]",
+ __func__, region->nr, region->mmaps[i - 1].offset,
+ prev_end - 1, region->mmaps[i].offset,
+ region->mmaps[i].offset + region->mmaps[i].size - 1);
g_free(region->mmaps);
region->mmaps = NULL;
region->nr_mmaps = 0;
}
int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,
- int index, const char *name)
+ int index, const char *name, Error **errp)
{
struct vfio_region_info *info = NULL;
int ret;
ret = vfio_device_get_region_info(vbasedev, index, &info);
if (ret) {
+ error_setg_errno(errp, -ret, "failed to get region %d info", index);
return ret;
}
if (!vbasedev->no_mmap &&
region->flags & VFIO_REGION_INFO_FLAG_MMAP) {
- ret = vfio_setup_region_sparse_mmaps(region, info);
+ ret = vfio_setup_region_sparse_mmaps(region, info, errp);
if (ret == -ENODEV) {
region->nr_mmaps = 1;
uint64_t vfio_region_read(void *opaque,
hwaddr addr, unsigned size);
int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,
- int index, const char *name);
+ int index, const char *name, Error **errp);
int vfio_region_mmap(VFIORegion *region);
void vfio_region_mmaps_set_enabled(VFIORegion *region, bool enabled);
void vfio_region_unmap(VFIORegion *region);