From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: [patch 09/12] libkvm: in-kernel ACPI pmtimer interface Date: Thu, 29 May 2008 19:22:58 -0300 Message-ID: <20080529222829.078271521@localhost.localdomain> References: <20080529222249.563011248@localhost.localdomain> Cc: Chris Wright , Glauber Costa , Anthony Liguori , kvm@vger.kernel.org, Marcelo Tosatti To: Avi Kivity Return-path: Received: from mx1.redhat.com ([66.187.233.31]:52680 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754702AbYE2W3u (ORCPT ); Thu, 29 May 2008 18:29:50 -0400 Content-Disposition: inline; filename=inkernel-acpi-timer Sender: kvm-owner@vger.kernel.org List-ID: Signed-off-by: Marcelo Tosatti Index: kvm-userspace.realtip/libkvm/kvm-common.h =================================================================== --- kvm-userspace.realtip.orig/libkvm/kvm-common.h +++ kvm-userspace.realtip/libkvm/kvm-common.h @@ -49,6 +49,10 @@ struct kvm_context { int no_pit_creation; /// in-kernel pit status int pit_in_kernel; + // do not create in-kernel acpi timer if set + int no_acpi_timer_creation; + // in-kernel acpi timer status + int acpi_timer_in_kernel; }; void init_slots(void); Index: kvm-userspace.realtip/libkvm/libkvm-x86.c =================================================================== --- kvm-userspace.realtip.orig/libkvm/libkvm-x86.c +++ kvm-userspace.realtip/libkvm/libkvm-x86.c @@ -166,6 +166,29 @@ int kvm_create_pit(kvm_context_t kvm) return 0; } +int kvm_create_acpi_timer(kvm_context_t kvm) +{ +#ifdef KVM_CAP_ACPI_TIMER + int r; + + kvm->acpi_timer_in_kernel = 0; + if (!kvm->no_acpi_timer_creation) { + r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_ACPI_TIMER); + if (r > 0) { + r = ioctl(kvm->vm_fd, KVM_CREATE_ACPI_TIMER); + if (r >= 0) + kvm->acpi_timer_in_kernel = 1; + else { + fprintf(stderr, + "Create kernel pmtimer failed\n"); + return r; + } + } + } +#endif + return 0; +} + int kvm_arch_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem) { @@ -179,6 +202,10 @@ int kvm_arch_create(kvm_context_t kvm, u if (r < 0) return r; + r = kvm_create_acpi_timer(kvm); + if (r < 0) + return r; + return 0; } Index: kvm-userspace.realtip/libkvm/libkvm.c =================================================================== --- kvm-userspace.realtip.orig/libkvm/libkvm.c +++ kvm-userspace.realtip/libkvm/libkvm.c @@ -277,6 +277,11 @@ void kvm_disable_pit_creation(kvm_contex kvm->no_pit_creation = 1; } +void kvm_disable_acpi_timer_creation(kvm_context_t kvm) +{ + kvm->no_acpi_timer_creation = 1; +} + int kvm_create_vcpu(kvm_context_t kvm, int slot) { long mmap_size; @@ -994,3 +999,8 @@ int kvm_pit_in_kernel(kvm_context_t kvm) { return kvm->pit_in_kernel; } + +int kvm_acpi_timer_in_kernel(kvm_context_t kvm) +{ + return kvm->acpi_timer_in_kernel; +} Index: kvm-userspace.realtip/libkvm/libkvm.h =================================================================== --- kvm-userspace.realtip.orig/libkvm/libkvm.h +++ kvm-userspace.realtip/libkvm/libkvm.h @@ -117,6 +117,16 @@ void kvm_disable_irqchip_creation(kvm_co void kvm_disable_pit_creation(kvm_context_t kvm); /*! + * \brief Disable the in-kernel ACPI timer creation + * + * In-kernel acpi timer is enabled by default. If userspace acpi timer is to be used, + * this should be called prior to kvm_create(). + * + * \param kvm Pointer to the kvm_context + */ +void kvm_disable_acpi_timer_creation(kvm_context_t kvm); + +/*! * \brief Create new virtual machine * * This creates a new virtual machine, maps physical RAM to it, and creates a @@ -599,6 +609,13 @@ int kvm_set_pit(kvm_context_t kvm, struc #endif +/*! + * \brief Query whether in kernel acpi timer is used + * + * \param kvm Pointer to the current kvm_context + */ +int kvm_acpi_timer_in_kernel(kvm_context_t kvm); + #ifdef KVM_CAP_OPEN_IOPORT /*! --