Patchwork [3/3] acpi_piix4: Call KVM_SETSTATE_VCPU ioctl on cpu ejection

login
register
mail settings
Submitter Vasilis Liaskovitis
Date Jan. 13, 2012, 11:11 a.m.
Message ID <1326453092-4256-4-git-send-email-vasilis.liaskovitis@profitbricks.com>
Download mbox | patch
Permalink /patch/135835/
State New
Headers show

Comments

Vasilis Liaskovitis - Jan. 13, 2012, 11:11 a.m.
Signed-off-by: Vasilis Liaskovitis <vasilis.liaskovitis@profitbricks.com>
---
 hw/acpi_piix4.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

Patch

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 8bf30dd..12eef55 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -502,6 +502,27 @@  static uint32_t cpuej_read(void *opaque, uint32_t addr)
 
 static void cpuej_write(void *opaque, uint32_t addr, uint32_t val)
 {
+    struct kvm_vcpu_state state;
+    CPUState *env;
+    int cpu;
+    int ret;
+
+    cpu = ffs(val);
+    /* zero means no bit was set, i.e. no CPU ejection happened */
+    if (!cpu)
+       return;
+    cpu--;
+    env = cpu_phyid_to_cpu((uint64_t)cpu);
+    if (env != NULL) {
+        if (env->state == CPU_STATE_ZAPREQ) {
+            state.vcpu_id = env->cpu_index;
+            state.state = 1;
+            ret = kvm_vm_ioctl(env->kvm_state, KVM_SETSTATE_VCPU, &state);
+            if (ret)
+                fprintf(stderr, "KVM_SETSTATE_VCPU failed: %s\n",
+                        strerror(ret));
+        }
+    }
     PIIX4_DPRINTF("cpuej write %x <== %d\n", addr, val);
 }