From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: [RFC][PATCH 2/2] kvm: libkvm: In-kernel PIT model Date: Mon, 21 Jan 2008 17:18:27 +0800 Message-ID: <200801211718.27939.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_jNGlHlfXqIkILu6" Cc: Avi Kivity To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org --Boundary-00=_jNGlHlfXqIkILu6 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =46rom 5f7e9bf8856602cf8ffcb50ff744ee1d0058a850 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Mon, 21 Jan 2008 16:41:47 +0800 Subject: [PATCH] kvm: libkvm: In-kernel PIT model Signed-off-by: Sheng Yang =2D-- 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 =2D-- a/kernel/Kbuild +++ b/kernel/Kbuild @@ -1,7 +1,7 @@ EXTRA_CFLAGS :=3D -I$(src)/include -include $(src)/external-module-compat.h obj-m :=3D kvm.o kvm-intel.o kvm-amd.o kvm-objs :=3D kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i82= 59.o=20 \ =2D lapic.o ioapic.o preempt.o + lapic.o ioapic.o preempt.o i8254.o kvm-intel-objs :=3D vmx.o vmx-debug.o kvm-amd-objs :=3D svm.o =20 diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h index f4040be..bd9f1de 100644 =2D-- 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; }; =20 void init_slots(void); diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 45f58d6..15e7c0d 100644 =2D-- 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 =3D 1; } =20 +void kvm_disable_pit_creation(kvm_context_t kvm) +{ + kvm->no_pit_creation =3D 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 } =20 +void kvm_create_pit(kvm_context_t kvm) +{ + int r; + + if (!kvm->no_pit_creation) { + r =3D ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT); + if (r > 0) { + r =3D 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=20 **vm_mem) { int r; @@ -383,6 +402,7 @@ int kvm_create(kvm_context_t kvm, unsigned long=20 phys_mem_bytes, void **vm_mem) if (r < 0) return r; kvm_create_irqchip(kvm); + kvm_create_pit(kvm); r =3D 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 =2D-- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ =20 int kvm_allowed =3D KVM_ALLOWED_DEFAULT; int kvm_irqchip =3D 1; +int kvm_pit =3D 1; =20 #ifdef USE_KVM =20 @@ -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 =2D-- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -42,6 +42,7 @@ void kvm_arch_update_regs_for_sipi(CPUState *env); =20 extern int kvm_allowed; extern int kvm_irqchip; +extern int kvm_pit; =20 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 =2D-- 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=20 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[] =3D { #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 =3D 0; break; + case QEMU_OPTION_no_kvm_pit: + kvm_pit =3D 0; + break; #endif case QEMU_OPTION_usb: usb_enabled =3D 1; =2D-=20 debian.1.5.3.7.1-dirty --Boundary-00=_jNGlHlfXqIkILu6 Content-Type: text/x-diff; charset="utf-8"; name="0001-kvm-libkvm-In-kernel-PIT-model.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0001-kvm-libkvm-In-kernel-PIT-model.patch" =46rom 5f7e9bf8856602cf8ffcb50ff744ee1d0058a850 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Mon, 21 Jan 2008 16:41:47 +0800 Subject: [PATCH] kvm: libkvm: In-kernel PIT model Signed-off-by: Sheng Yang =2D-- 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 =2D-- a/kernel/Kbuild +++ b/kernel/Kbuild @@ -1,7 +1,7 @@ EXTRA_CFLAGS :=3D -I$(src)/include -include $(src)/external-module-compat.h obj-m :=3D kvm.o kvm-intel.o kvm-amd.o kvm-objs :=3D kvm_main.o x86.o mmu.o x86_emulate.o anon_inodes.o irq.o i82= 59.o \ =2D lapic.o ioapic.o preempt.o + lapic.o ioapic.o preempt.o i8254.o kvm-intel-objs :=3D vmx.o vmx-debug.o kvm-amd-objs :=3D svm.o =20 diff --git a/libkvm/kvm-common.h b/libkvm/kvm-common.h index f4040be..bd9f1de 100644 =2D-- 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; }; =20 void init_slots(void); diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index 45f58d6..15e7c0d 100644 =2D-- 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 =3D 1; } =20 +void kvm_disable_pit_creation(kvm_context_t kvm) +{ + kvm->no_pit_creation =3D 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 } =20 +void kvm_create_pit(kvm_context_t kvm) +{ + int r; + + if (!kvm->no_pit_creation) { + r =3D ioctl(kvm->fd, KVM_CHECK_EXTENSION, KVM_CAP_PIT); + if (r > 0) { + r =3D 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_me= m_bytes, void **vm_mem) if (r < 0) return r; kvm_create_irqchip(kvm); + kvm_create_pit(kvm); r =3D 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 =2D-- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ =20 int kvm_allowed =3D KVM_ALLOWED_DEFAULT; int kvm_irqchip =3D 1; +int kvm_pit =3D 1; =20 #ifdef USE_KVM =20 @@ -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 =2D-- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -42,6 +42,7 @@ void kvm_arch_update_regs_for_sipi(CPUState *env); =20 extern int kvm_allowed; extern int kvm_irqchip; +extern int kvm_pit; =20 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 =2D-- 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 E= xtensions\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[] =3D { #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 =3D 0; break; + case QEMU_OPTION_no_kvm_pit: + kvm_pit =3D 0; + break; #endif case QEMU_OPTION_usb: usb_enabled =3D 1; =2D-=20 debian.1.5.3.7.1-dirty --Boundary-00=_jNGlHlfXqIkILu6 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- 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/ --Boundary-00=_jNGlHlfXqIkILu6 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --Boundary-00=_jNGlHlfXqIkILu6--