From 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Sun, 27 Jan 2008 11:25:29 +0800 Subject: [PATCH] kvm: libkvm/qemu: Support in-kernel PIT model Add QEMU parameter for in-kernel PIT. Also disable userspace PIT when we using the in-kernel one. Signed-off-by: Sheng Yang --- kernel/Kbuild | 2 +- libkvm/kvm-common.h | 2 ++ libkvm/libkvm.c | 20 ++++++++++++++++++++ qemu/hw/pc.c | 6 ++++++ qemu/qemu-kvm.c | 4 ++++ qemu/qemu-kvm.h | 1 + qemu/vl.c | 6 ++++++ 7 files changed, 40 insertions(+), 1 deletions(-) diff --git a/kernel/Kbuild b/kernel/Kbuild index ed02f5a..014cc17 100644 --- a/kernel/Kbuild +++ b/kernel/Kbuild @@ -1,7 +1,7 @@ EXTRA_CFLAGS := -I$(src)/include -include $(src)/external-module-compat.h obj-m := kvm.o kvm-intel.o kvm-amd.o kvm-objs := kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i8259.o \ - lapic.o ioapic.o preempt.o + lapic.o ioapic.o preempt.o i8254.o kvm-intel-objs := vmx.o vmx-debug.o kvm-amd-objs := svm.o diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h index f4040be..bd9f1de 100644 --- a/libkvm/kvm-common.h +++ b/libkvm/kvm-common.h @@ -47,6 +47,8 @@ struct kvm_context { int no_irqchip_creation; /// in-kernel irqchip status int irqchip_in_kernel; + /// do not create in-kernel pit if set + int no_pit_creation; }; void init_slots(void); diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 45f58d6..15e7c0d 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -271,6 +271,11 @@ void kvm_disable_irqchip_creation(kvm_context_t kvm) kvm->no_irqchip_creation = 1; } +void kvm_disable_pit_creation(kvm_context_t kvm) +{ + kvm->no_pit_creation = 1; +} + int kvm_create_vcpu(kvm_context_t kvm, int slot) { long mmap_size; @@ -368,6 +373,20 @@ void kvm_create_irqchip(kvm_context_t kvm) #endif } +void kvm_create_pit(kvm_context_t kvm) +{ + int r; + + if (!kvm->no_pit_creation) { + r = ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT); + if (r > 0) { + r = ioctl(kvm->vm_fd, KVM_CREATE_PIT); + if (r < 0) + printf("Create kernel PIC irqchip failed\n"); + } + } +} + int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem) { int r; @@ -383,6 +402,7 @@ int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem) if (r < 0) return r; kvm_create_irqchip(kvm); + kvm_create_pit(kvm); r = kvm_create_vcpu(kvm, 0); if (r < 0) return r; diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c index 652b263..b4aecfe 100644 --- a/qemu/hw/pc.c +++ b/qemu/hw/pc.c @@ -986,8 +986,14 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_size, if (pci_enabled) { ioapic = ioapic_init(); } +#ifdef USE_KVM + if (!kvm_allowed || !kvm_pit) { +#endif pit = pit_init(0x40, i8259[0]); pcspk_init(pit); +#ifdef USE_KVM + } +#endif if (pci_enabled) { pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic); } diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index ba4fd21..66eaf51 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ int kvm_allowed = KVM_ALLOWED_DEFAULT; int kvm_irqchip = 1; +int kvm_pit = 1; #ifdef USE_KVM @@ -535,6 +536,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 bda1c0b..56aae6e 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -46,6 +46,7 @@ void qemu_kvm_aio_wait_end(void); extern int kvm_allowed; extern int kvm_irqchip; +extern int kvm_pit; void kvm_tpr_opt_setup(CPUState *env); void kvm_tpr_access_report(CPUState *env, uint64_t rip, int is_write); diff --git a/qemu/vl.c b/qemu/vl.c index 756e13d..5b76c8d 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -8015,6 +8015,7 @@ static void help(int exitcode) #ifdef USE_KVM "-no-kvm disable KVM hardware virtualization\n" "-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" @@ -8131,6 +8132,7 @@ enum { QEMU_OPTION_no_acpi, 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, @@ -8213,6 +8215,7 @@ const QEMUOption qemu_options[] = { #ifdef USE_KVM { "no-kvm", 0, QEMU_OPTION_no_kvm }, { "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 }, @@ -9046,6 +9049,9 @@ int main(int argc, char **argv) case QEMU_OPTION_no_kvm_irqchip: kvm_irqchip = 0; break; + case QEMU_OPTION_no_kvm_pit: + kvm_pit = 0; + break; #endif case QEMU_OPTION_usb: usb_enabled = 1; -- debian.1.5.3.7.1-dirty