From patchwork Fri Jan 13 11:11:32 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3/3] acpi_piix4: Call KVM_SETSTATE_VCPU ioctl on cpu ejection From: Vasilis Liaskovitis X-Patchwork-Id: 135835 Message-Id: <1326453092-4256-4-git-send-email-vasilis.liaskovitis@profitbricks.com> To: kvm@vger.kernel.org, qemu-devel@nongnu.org, seabios@seabios.org Cc: Vasilis Liaskovitis , yamahata@valinux.co.jp, gleb@redhat.com, kernelfans@gmail.com, avi@redhat.com Date: Fri, 13 Jan 2012 12:11:32 +0100 Signed-off-by: Vasilis Liaskovitis --- hw/acpi_piix4.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) 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); }