From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: [PATCH 2/2] kvm: libkvm/qemu: Support in-kernel PIT model Date: Mon, 28 Jan 2008 14:46:30 +0800 Message-ID: <200801281446.30147.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_GpXnHHp3KDLPm44" 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=_GpXnHHp3KDLPm44 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =46rom 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001 =46rom: 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 us= ing=20 the in-kernel one. Signed-off-by: Sheng Yang =2D-- 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 =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 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; }; 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; } +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 } +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/hw/pc.c b/qemu/hw/pc.c index 652b263..b4aecfe 100644 =2D-- a/qemu/hw/pc.c +++ b/qemu/hw/pc.c @@ -986,8 +986,14 @@ static void pc_init1(ram_addr_t ram_size, int=20 vga_ram_size, if (pci_enabled) { ioapic =3D ioapic_init(); } +#ifdef USE_KVM + if (!kvm_allowed || !kvm_pit) { +#endif pit =3D 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 =2D-- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ int kvm_allowed =3D KVM_ALLOWED_DEFAULT; int kvm_irqchip =3D 1; +int kvm_pit =3D 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 =2D-- 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 =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- debian.1.5.3.7.1-dirty --Boundary-00=_GpXnHHp3KDLPm44 Content-Type: text/x-diff; charset="utf-8"; name="0001-kvm-libkvm-qemu-Support-in-kernel-PIT-model.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0001-kvm-libkvm-qemu-Support-in-kernel-PIT-model.patch" =46rom 953edae7758f8414cc8de7edfc21699e6edc39cf Mon Sep 17 00:00:00 2001 =46rom: 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 us= ing the in-kernel one. Signed-off-by: Sheng Yang =2D-- 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 =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/hw/pc.c b/qemu/hw/pc.c index 652b263..b4aecfe 100644 =2D-- 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 =3D ioapic_init(); } +#ifdef USE_KVM + if (!kvm_allowed || !kvm_pit) { +#endif pit =3D 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 =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 @@ -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 =2D-- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -46,6 +46,7 @@ void qemu_kvm_aio_wait_end(void); =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=_GpXnHHp3KDLPm44 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=_GpXnHHp3KDLPm44 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=_GpXnHHp3KDLPm44--