diff mbox series

[RFC,17/21] i386/xen: handle register_runstate_memory_area

Message ID 20221205173137.607044-18-dwmw2@infradead.org (mailing list archive)
State New, archived
Headers show
Series Xen HVM support under KVM | expand

Commit Message

David Woodhouse Dec. 5, 2022, 5:31 p.m. UTC
From: Joao Martins <joao.m.martins@oracle.com>

Allow guest to setup the vcpu runstates which is used as
steal clock.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
 target/i386/xen.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
diff mbox series

Patch

diff --git a/target/i386/xen.c b/target/i386/xen.c
index 1def526e08..6f0c46c018 100644
--- a/target/i386/xen.c
+++ b/target/i386/xen.c
@@ -270,6 +270,27 @@  static int vcpuop_register_vcpu_time_info(CPUState *cs, CPUState *target,
     return xen_set_vcpu_attr(target, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, gpa);
 }
 
+static int vcpuop_register_runstate_info(CPUState *cs, CPUState *target,
+                                         uint64_t arg)
+{
+    struct vcpu_register_runstate_memory_area *rma;
+    uint64_t gpa;
+    void *hva;
+
+    rma = gva_to_hva(cs, arg);
+    if (!rma) {
+        return -EFAULT;
+    }
+
+    hva = gva_to_hva(cs, rma->addr.p);
+    if (!hva || !rma->addr.p) {
+        return -EFAULT;
+    }
+
+    gpa = gva_to_gpa(cs, rma->addr.p);
+    return xen_set_vcpu_attr(target, KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR, gpa);
+}
+
 static int kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu,
                                  int cmd, int vcpu_id, uint64_t arg)
 {
@@ -278,6 +299,10 @@  static int kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu,
     int err = -ENOSYS;
 
     switch (cmd) {
+    case VCPUOP_register_runstate_memory_area: {
+            err = vcpuop_register_runstate_info(cs, dest, arg);
+            break;
+        }
     case VCPUOP_register_vcpu_time_memory_area: {
             err = vcpuop_register_vcpu_time_info(cs, dest, arg);
             break;