Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
hw/display/virtio-gpu.c | 99 ++++++++++++++++++++++-------------------
1 file changed, 52 insertions(+), 47 deletions(-)
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index fbb6fec7a0a..1af640accdc 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -1308,13 +1308,13 @@ static const VMStateDescription
vmstate_virtio_gpu_scanouts = {
},
};
-static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
- const VMStateField *field, JSONWriter *vmdesc)
+static bool virtio_gpu_save(QEMUFile *f, void *opaque, size_t size,
+ const VMStateField *field, JSONWriter *vmdesc,
+ Error **errp)
{
VirtIOGPU *g = opaque;
struct virtio_gpu_simple_resource *res;
- Error *err = NULL;
- int i, ret;
+ int i;
/* in 2d mode we should never find unprocessed commands here */
assert(QTAILQ_EMPTY(&g->cmdq));
@@ -1337,12 +1337,7 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque,
size_t size,
}
qemu_put_be32(f, 0); /* end of list */
- ret = vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL,
- &err);
- if (ret < 0) {
- error_report_err(err);
- }
- return ret;
+ return vmstate_save_vmsd(f, &vmstate_virtio_gpu_scanouts, g, NULL, errp);
}
static bool virtio_gpu_load_restore_mapping(VirtIOGPU *g,
@@ -1374,14 +1369,13 @@ static bool virtio_gpu_load_restore_mapping(VirtIOGPU
*g,
return true;
}
-static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
- const VMStateField *field)
+static bool virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
+ const VMStateField *field, Error **errp)
{
VirtIOGPU *g = opaque;
- Error *err = NULL;
struct virtio_gpu_simple_resource *res;
uint32_t resource_id, pformat, hostmem, rowstride_bytes;
- int i, ret;
+ int i;
g->hostmem = 0;
@@ -1389,7 +1383,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque,
size_t size,
while (resource_id != 0) {
res = virtio_gpu_find_resource(g, resource_id);
if (res) {
- return -EINVAL;
+ error_setg(errp, "Failed to find resource %" PRIu32, resource_id);
+ return false;
}
res = g_new0(struct virtio_gpu_simple_resource, 1);
@@ -1402,14 +1397,16 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque,
size_t size,
/* allocate */
pformat = virtio_gpu_get_pixman_format(res->format);
if (!pformat) {
+ error_setg(errp, "Unknown pixman format %" PRIu32, res->format);
g_free(res);
- return -EINVAL;
+ return false;
}
if (!calc_image_hostmem(pformat, res->width, res->height,
&hostmem, &rowstride_bytes)) {
g_free(res);
- return -EINVAL;
+ error_setg(errp, "Failed to calculate image hostmem");
+ return false;
}
res->hostmem = hostmem;
if (!qemu_pixman_image_new_shareable(&res->image,
@@ -1419,10 +1416,9 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque,
size_t size,
res->width,
res->height,
rowstride_bytes,
- &err)) {
- warn_report_err(err);
+ errp)) {
g_free(res);
- return -EINVAL;
+ return false;
}
res->addrs = g_try_new(uint64_t, res->iov_cnt);
@@ -1432,7 +1428,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque,
size_t size,
g_free(res->addrs);
g_free(res->iov);
g_free(res);
- return -EINVAL;
+ error_setg(errp, "Failed to allocate iov arrays");
+ return false;
}
/* read data */
@@ -1446,22 +1443,20 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque,
size_t size,
if (!virtio_gpu_load_restore_mapping(g, res)) {
pixman_image_unref(res->image);
g_free(res);
- return -EINVAL;
+ error_setg(errp, "Failed to load restore mapping");
+ return false;
}
resource_id = qemu_get_be32(f);
}
/* load & apply scanout state */
- ret = vmstate_load_state(f, &vmstate_virtio_gpu_scanouts, g, 1, &err);
- if (ret < 0) {
- error_report_err(err);
- }
- return ret;
+ return vmstate_load_vmsd(f, &vmstate_virtio_gpu_scanouts, g, 1, errp);
}
-static int virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size,
- const VMStateField *field, JSONWriter *vmdesc)
+static bool virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size,
+ const VMStateField *field, JSONWriter *vmdesc,
+ Error **errp)
{
VirtIOGPU *g = opaque;
struct virtio_gpu_simple_resource *res;
@@ -1485,11 +1480,11 @@ static int virtio_gpu_blob_save(QEMUFile *f, void
*opaque, size_t size,
}
qemu_put_be32(f, 0); /* end of list */
- return 0;
+ return true;
}
-static int virtio_gpu_blob_load(QEMUFile *f, void *opaque, size_t size,
- const VMStateField *field)
+static bool virtio_gpu_blob_load(QEMUFile *f, void *opaque, size_t size,
+ const VMStateField *field, Error **errp)
{
VirtIOGPU *g = opaque;
struct virtio_gpu_simple_resource *res;
@@ -1500,7 +1495,8 @@ static int virtio_gpu_blob_load(QEMUFile *f, void
*opaque, size_t size,
while (resource_id != 0) {
res = virtio_gpu_find_resource(g, resource_id);
if (res) {
- return -EINVAL;
+ error_setg(errp, "Failed to find resource %" PRIu32, resource_id);
+ return false;
}
res = g_new0(struct virtio_gpu_simple_resource, 1);
@@ -1514,7 +1510,8 @@ static int virtio_gpu_blob_load(QEMUFile *f, void
*opaque, size_t size,
g_free(res->addrs);
g_free(res->iov);
g_free(res);
- return -EINVAL;
+ error_setg(errp, "Failed to allocate iov arrays");
+ return false;
}
/* read data */
@@ -1525,15 +1522,19 @@ static int virtio_gpu_blob_load(QEMUFile *f, void
*opaque, size_t size,
if (res->iov_cnt > 0 &&
iov_size(res->iov, res->iov_cnt) < res->blob_size) {
+ error_setg(errp, "iov size %" PRIu64 " < blob_size %" PRIu64,
+ (uint64_t)iov_size(res->iov, res->iov_cnt),
+ return false;
}
virtio_gpu_init_udmabuf(res);
@@ -1541,10 +1542,10 @@ static int virtio_gpu_blob_load(QEMUFile *f, void
*opaque, size_t size,
resource_id = qemu_get_be32(f);
}
- return 0;
+ return true;
}
-static int virtio_gpu_post_load(void *opaque, int version_id)
+static bool virtio_gpu_post_load(void *opaque, int version_id, Error **errp)
{
VirtIOGPU *g = opaque;
struct virtio_gpu_scanout *scanout;
@@ -1559,7 +1560,9 @@ static int virtio_gpu_post_load(void *opaque, int
version_id)
res = virtio_gpu_find_resource(g, scanout->resource_id);
if (!res) {
- return -EINVAL;
+ error_setg(errp, "Failed to find resource %" PRIu32,
+ scanout->resource_id);
+ return false;
}
if (scanout->fb.format != 0) {
@@ -1572,12 +1575,14 @@ static int virtio_gpu_post_load(void *opaque, int
version_id)
};
if (!virtio_gpu_do_set_scanout(g, i, &scanout->fb, res, &r,
&error)) {
- return -EINVAL;
+ error_setg(errp, "Failed to set scanout");
+ return false;
}
} else {
/* legacy v1 migration support */
if (!res->image) {
- return -EINVAL;
+ error_setg(errp, "No image");