From: Joao Martins Date: Tue, 24 Jul 2018 16:46:00 +0000 (-0400) Subject: i386/xen: handle register_runstate_memory_area X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c6923a4fda2c24b51547a30a596fb0c0de31d818;p=users%2Fdwmw2%2Fqemu.git i386/xen: handle register_runstate_memory_area Allow guest to setup the vcpu runstates which is used as steal clock. Signed-off-by: Joao Martins --- diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h index 496e1a77aa..249c606a0a 100644 --- a/linux-headers/linux/kvm.h +++ b/linux-headers/linux/kvm.h @@ -1474,6 +1474,7 @@ struct kvm_xen_hvm_attr { #define KVM_XEN_ATTR_TYPE_SHARED_INFO 0x0 #define KVM_XEN_ATTR_TYPE_VCPU_INFO 0x1 #define KVM_XEN_ATTR_TYPE_VCPU_TIME_INFO 0x2 +#define KVM_XEN_ATTR_TYPE_VCPU_RUNSTATE 0x3 /* Secure Encrypted Virtualization command */ enum sev_cmd_id { diff --git a/target/i386/xen.c b/target/i386/xen.c index 92a4134517..e8ce552298 100644 --- a/target/i386/xen.c +++ b/target/i386/xen.c @@ -286,6 +286,27 @@ static int vcpuop_register_vcpu_time_info(CPUState *cs, CPUState *target, return xen_set_vcpu_attr(target, KVM_XEN_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_ATTR_TYPE_VCPU_RUNSTATE, gpa); +} + static int kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, int vcpu_id, uint64_t arg) { @@ -294,6 +315,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;