From 5f7e9bf8856602cf8ffcb50ff744ee1d0058a850 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Mon, 21 Jan 2008 16:41:47 +0800 Subject: [PATCH] kvm: libkvm: In-kernel PIT model Signed-off-by: Sheng Yang --- kernel/Kbuild | 2 +- libkvm/kvm-common.h | 2 ++ libkvm/libkvm.c | 20 ++++++++++++++++++++ qemu/qemu-kvm.c | 4 ++++ qemu/qemu-kvm.h | 1 + qemu/vl.c | 6 ++++++ 6 files changed, 34 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/qemu-kvm.c b/qemu/qemu-kvm.c index fddbbd6..a4f4761 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 @@ -556,6 +557,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 c4514bb..883a4da 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -42,6 +42,7 @@ void kvm_arch_update_regs_for_sipi(CPUState *env); 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