]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
i386/xen: handle GNTTABOP_query_size
authorJoao Martins <joao.m.martins@oracle.com>
Fri, 21 Sep 2018 15:29:25 +0000 (11:29 -0400)
committerJoao Martins <joao.m.martins@oracle.com>
Tue, 19 Feb 2019 14:00:57 +0000 (09:00 -0500)
This allows guest to know how many frames are being used
and how much more can its grant table grow.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
target/i386/xen.c

index b112c50e4be98e0959ee30c8b28c5d834a680ca6..c342f6f3206485a7a796dec7c2c581d94765b6dc 100644 (file)
@@ -929,6 +929,7 @@ static int kvm_xen_hcall_gnttab_op(struct kvm_xen_exit *exit, X86CPU *cpu,
                                    int cmd, uint64_t arg, int count)
 {
     CPUState *cs = CPU(cpu);
+    XenState *xen = cs->xen_state;
     int err = -ENOSYS;
 
     switch (cmd) {
@@ -950,6 +951,27 @@ static int kvm_xen_hcall_gnttab_op(struct kvm_xen_exit *exit, X86CPU *cpu,
         err = 0;
         break;
     }
+    case GNTTABOP_query_size: {
+        struct gnttab_query_size *gqs;
+
+        gqs = gva_to_hva(cs, arg);
+        if (!gqs) {
+            err = -EFAULT;
+            break;
+        }
+
+        if (gqs->dom != DOMID_SELF) {
+            err = 0;
+            gqs->status = GNTST_permission_denied;
+            break;
+        }
+
+        gqs->nr_frames = xen->gnttab.nr_frames;
+        gqs->max_nr_frames = xen->gnttab.max_nr_frames;
+        gqs->status = GNTST_okay;
+        err = 0;
+        break;
+    }
     }
 
     exit->u.hcall.result = err;