hw/xen: Implement GNTTABOP_query_size

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
David Woodhouse 2022-12-16 23:49:48 +00:00
parent 28b7ae94a2
commit b46f9745b1
3 changed files with 36 additions and 1 deletions

View File

@ -211,3 +211,22 @@ int xen_gnttab_get_version_op(struct gnttab_get_version *get)
get->version = 1;
return 0;
}
int xen_gnttab_query_size_op(struct gnttab_query_size *size)
{
XenGnttabState *s = xen_gnttab_singleton;
if (!s) {
return -ENOTSUP;
}
if (size->dom != DOMID_SELF && size->dom != xen_domid) {
size->status = GNTST_bad_domain;
return 0;
}
size->status = GNTST_okay;
size->nr_frames = s->nr_frames;
size->max_nr_frames = s->max_frames;
return 0;
}

View File

@ -17,7 +17,9 @@ int xen_gnttab_map_page(uint64_t idx, uint64_t gfn);
struct gnttab_set_version;
struct gnttab_get_version;
struct gnttab_query_size;
int xen_gnttab_set_version_op(struct gnttab_set_version *set);
int xen_gnttab_get_version_op(struct gnttab_get_version *get);
int xen_gnttab_query_size_op(struct gnttab_query_size *size);
#endif /* QEMU_XEN_GNTTAB_H */

View File

@ -1207,7 +1207,21 @@ static bool kvm_xen_hcall_gnttab_op(struct kvm_xen_exit *exit, X86CPU *cpu,
}
break;
}
case GNTTABOP_query_size:
case GNTTABOP_query_size: {
struct gnttab_query_size size;
qemu_build_assert(sizeof(size) == 16);
if (kvm_copy_from_gva(cs, arg, &size, sizeof(size))) {
err = -EFAULT;
break;
}
err = xen_gnttab_query_size_op(&size);
if (!err && kvm_copy_to_gva(cs, arg, &size, sizeof(size))) {
err = -EFAULT;
}
break;
}
case GNTTABOP_setup_table:
case GNTTABOP_copy:
case GNTTABOP_map_grant_ref: