From: Sheng Yang <[EMAIL PROTECTED]> Signed-off-by: Sheng Yang <[EMAIL PROTECTED]> Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>
diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c index b3a241e..d19d17f 100644 --- a/libkvm/libkvm-x86.c +++ b/libkvm/libkvm-x86.c @@ -630,3 +630,12 @@ int kvm_disable_tpr_access_reporting(kvm_context_t kvm, int vcpu) } #endif + +int kvm_pit_in_kernel(kvm_context_t kvm) +{ +#ifdef KVM_CAP_PIT + return kvm->pit_in_kernel; +#else + return 0; +#endif +} diff --git a/qemu/hw/i8254.c b/qemu/hw/i8254.c index c281680..9e18ebc 100644 --- a/qemu/hw/i8254.c +++ b/qemu/hw/i8254.c @@ -26,6 +26,8 @@ #include "isa.h" #include "qemu-timer.h" +#include "qemu-kvm.h" + //#define DEBUG_PIT #define RW_STATE_LSB 1 @@ -491,10 +493,12 @@ PITState *pit_init(int base, qemu_irq irq) PITState *pit = &pit_state; PITChannelState *s; - s = &pit->channels[0]; - /* the timer 0 is connected to an IRQ */ - s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s); - s->irq = irq; + if (!kvm_enabled() || !qemu_kvm_pit_in_kernel()) { + s = &pit->channels[0]; + /* the timer 0 is connected to an IRQ */ + s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s); + s->irq = irq; + } register_savevm("i8254", base, 1, pit_save, pit_load, pit); diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index 45fddd3..4d59b39 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ int kvm_allowed = 1; int kvm_irqchip = 1; +int kvm_pit = 1; #include <string.h> #include "hw/hw.h" @@ -544,6 +545,9 @@ int kvm_qemu_create_context(void) if (!kvm_irqchip) { kvm_disable_irqchip_creation(kvm_context); } + if (!kvm_pit) { + kvm_disable_pit_creation(kvm_context); + } if (kvm_create(kvm_context, phys_ram_size, (void**)&phys_ram_base) < 0) { kvm_qemu_destroy(); return -1; diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h index 8e45f30..ff9c86e 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -84,9 +84,11 @@ extern kvm_context_t kvm_context; #define kvm_enabled() (kvm_allowed) #define qemu_kvm_irqchip_in_kernel() kvm_irqchip_in_kernel(kvm_context) +#define qemu_kvm_pit_in_kernel() kvm_pit_in_kernel(kvm_context) #else #define kvm_enabled() (0) #define qemu_kvm_irqchip_in_kernel() (0) +#define qemu_kvm_pit_in_kernel() (0) #endif #endif diff --git a/qemu/vl.c b/qemu/vl.c index 4762cb0..21c9b53 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -8097,6 +8097,7 @@ static void help(int exitcode) "-no-kvm disable KVM hardware virtualization\n" #endif "-no-kvm-irqchip disable KVM kernel mode PIC/IOAPIC/LAPIC\n" + "-no-kvm-pit disable KVM kernel mode PIT\n" #endif #ifdef TARGET_I386 "-std-vga simulate a standard VGA card with VESA Bochs Extensions\n" @@ -8219,6 +8220,7 @@ enum { QEMU_OPTION_curses, QEMU_OPTION_no_kvm, QEMU_OPTION_no_kvm_irqchip, + QEMU_OPTION_no_kvm_pit, QEMU_OPTION_no_reboot, QEMU_OPTION_show_cursor, QEMU_OPTION_daemonize, @@ -8305,6 +8307,7 @@ const QEMUOption qemu_options[] = { { "no-kvm", 0, QEMU_OPTION_no_kvm }, #endif { "no-kvm-irqchip", 0, QEMU_OPTION_no_kvm_irqchip }, + { "no-kvm-pit", 0, QEMU_OPTION_no_kvm_pit }, #endif #if defined(TARGET_PPC) || defined(TARGET_SPARC) { "g", 1, QEMU_OPTION_g }, @@ -9238,8 +9241,14 @@ int main(int argc, char **argv) kvm_allowed = 0; break; case QEMU_OPTION_no_kvm_irqchip: { - extern int kvm_irqchip; + extern int kvm_irqchip, kvm_pit; kvm_irqchip = 0; + kvm_pit = 0; + break; + } + case QEMU_OPTION_no_kvm_pit: { + extern int kvm_pit; + kvm_pit = 0; break; } #endif ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits