From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Yang, Sheng" Subject: [PATCH 3/6] kvm: qemu: Add option for enable/disable in kernel PIT Date: Tue, 4 Mar 2008 18:22:52 +0800 Message-ID: <200803041822.52573.sheng.yang@intel.com> Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_8LSzHEHBnr/aUTf" To: kvm-devel@lists.sourceforge.net Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org --Boundary-00=_8LSzHEHBnr/aUTf Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =46rom 40cf60009d1031891a34685b690dad47290a0b04 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Tue, 4 Mar 2008 09:29:55 +0800 Subject: [PATCH] kvm: qemu: Add option for enable/disable in kernel PIT Signed-off-by: Sheng Yang =2D-- libkvm/libkvm-x86.c | 7 +++++++ qemu/hw/i8254.c | 12 +++++++++--- qemu/hw/pc.c | 6 ++++++ qemu/qemu-kvm.c | 4 ++++ qemu/qemu-kvm.h | 2 ++ qemu/vl.c | 8 ++++++++ 6 files changed, 36 insertions(+), 3 deletions(-) diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c index b3a241e..22a6283 100644 =2D-- a/libkvm/libkvm-x86.c +++ b/libkvm/libkvm-x86.c @@ -630,3 +630,10 @@ int kvm_disable_tpr_access_reporting(kvm_context_t kvm= ,=20 int vcpu) } #endif + +int kvm_pit_in_kernel(kvm_context_t kvm) +{ +#ifdef KVM_CAP_PIT + return kvm->pit_in_kernel; +#endif +} diff --git a/qemu/hw/i8254.c b/qemu/hw/i8254.c index c281680..0753ca9 100644 =2D-- 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 @@ -492,9 +494,13 @@ PITState *pit_init(int base, qemu_irq irq) PITChannelState *s; s =3D &pit->channels[0]; =2D /* the timer 0 is connected to an IRQ */ =2D s->irq_timer =3D qemu_new_timer(vm_clock, pit_irq_timer, s); =2D s->irq =3D irq; +#ifdef KVM_CAP_PIT + if (!kvm_enabled() || !qemu_kvm_pit_in_kernel()) { + /* the timer 0 is connected to an IRQ */ + s->irq_timer =3D qemu_new_timer(vm_clock, pit_irq_timer, s); + s->irq =3D irq; + } +#endif register_savevm("i8254", base, 1, pit_save, pit_load, pit); diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c index 1122b87..4587a5c 100644 =2D-- a/qemu/hw/pc.c +++ b/qemu/hw/pc.c @@ -984,7 +984,13 @@ static void pc_init1(ram_addr_t ram_size, int=20 vga_ram_size, ioapic =3D ioapic_init(); } pit =3D pit_init(0x40, i8259[0]); +#ifdef KVM_CAP_PIT + if (!kvm_enabled() || !qemu_kvm_pit_in_kernel()) { +#endif pcspk_init(pit); +#ifdef KVM_CAP_PIT + } +#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 051946e..196e38e 100644 =2D-- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ int kvm_allowed =3D 1; int kvm_irqchip =3D 1; +int kvm_pit =3D 1; #include #include "hw/hw.h" @@ -536,6 +537,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 =2D-- 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 f10fbd8..4c69ff4 100644 =2D-- a/qemu/vl.c +++ b/qemu/vl.c @@ -8059,6 +8059,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=20 Extensions\n" @@ -8177,6 +8178,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, @@ -8263,6 +8265,7 @@ const QEMUOption qemu_options[] =3D { { "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 }, @@ -9191,6 +9194,11 @@ int main(int argc, char **argv) kvm_irqchip =3D 0; break; } + case QEMU_OPTION_no_kvm_pit: { + extern int 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=_8LSzHEHBnr/aUTf Content-Type: text/x-diff; charset="utf-8"; name="0002-kvm-qemu-Add-option-for-enable-disable-in-kernel-P.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="0002-kvm-qemu-Add-option-for-enable-disable-in-kernel-P.patch" =46rom 40cf60009d1031891a34685b690dad47290a0b04 Mon Sep 17 00:00:00 2001 =46rom: Sheng Yang Date: Tue, 4 Mar 2008 09:29:55 +0800 Subject: [PATCH] kvm: qemu: Add option for enable/disable in kernel PIT Signed-off-by: Sheng Yang =2D-- libkvm/libkvm-x86.c | 7 +++++++ qemu/hw/i8254.c | 12 +++++++++--- qemu/hw/pc.c | 6 ++++++ qemu/qemu-kvm.c | 4 ++++ qemu/qemu-kvm.h | 2 ++ qemu/vl.c | 8 ++++++++ 6 files changed, 36 insertions(+), 3 deletions(-) diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c index b3a241e..22a6283 100644 =2D-- a/libkvm/libkvm-x86.c +++ b/libkvm/libkvm-x86.c @@ -630,3 +630,10 @@ int kvm_disable_tpr_access_reporting(kvm_context_t kvm= , int vcpu) } =20 #endif + +int kvm_pit_in_kernel(kvm_context_t kvm) +{ +#ifdef KVM_CAP_PIT + return kvm->pit_in_kernel; +#endif +} diff --git a/qemu/hw/i8254.c b/qemu/hw/i8254.c index c281680..0753ca9 100644 =2D-- a/qemu/hw/i8254.c +++ b/qemu/hw/i8254.c @@ -26,6 +26,8 @@ #include "isa.h" #include "qemu-timer.h" =20 +#include "qemu-kvm.h" + //#define DEBUG_PIT =20 #define RW_STATE_LSB 1 @@ -492,9 +494,13 @@ PITState *pit_init(int base, qemu_irq irq) PITChannelState *s; =20 s =3D &pit->channels[0]; =2D /* the timer 0 is connected to an IRQ */ =2D s->irq_timer =3D qemu_new_timer(vm_clock, pit_irq_timer, s); =2D s->irq =3D irq; +#ifdef KVM_CAP_PIT + if (!kvm_enabled() || !qemu_kvm_pit_in_kernel()) { + /* the timer 0 is connected to an IRQ */ + s->irq_timer =3D qemu_new_timer(vm_clock, pit_irq_timer, s); + s->irq =3D irq; + } +#endif =20 register_savevm("i8254", base, 1, pit_save, pit_load, pit); =20 diff --git a/qemu/hw/pc.c b/qemu/hw/pc.c index 1122b87..4587a5c 100644 =2D-- a/qemu/hw/pc.c +++ b/qemu/hw/pc.c @@ -984,7 +984,13 @@ static void pc_init1(ram_addr_t ram_size, int vga_ram_= size, ioapic =3D ioapic_init(); } pit =3D pit_init(0x40, i8259[0]); +#ifdef KVM_CAP_PIT + if (!kvm_enabled() || !qemu_kvm_pit_in_kernel()) { +#endif pcspk_init(pit); +#ifdef KVM_CAP_PIT + } +#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 051946e..196e38e 100644 =2D-- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -10,6 +10,7 @@ =20 int kvm_allowed =3D 1; int kvm_irqchip =3D 1; +int kvm_pit =3D 1; =20 #include #include "hw/hw.h" @@ -536,6 +537,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 =2D-- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -84,9 +84,11 @@ extern kvm_context_t kvm_context; =20 #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 =20 #endif diff --git a/qemu/vl.c b/qemu/vl.c index f10fbd8..4c69ff4 100644 =2D-- a/qemu/vl.c +++ b/qemu/vl.c @@ -8059,6 +8059,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 E= xtensions\n" @@ -8177,6 +8178,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, @@ -8263,6 +8265,7 @@ const QEMUOption qemu_options[] =3D { { "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 }, @@ -9191,6 +9194,11 @@ int main(int argc, char **argv) kvm_irqchip =3D 0; break; } + case QEMU_OPTION_no_kvm_pit: { + extern int 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=_8LSzHEHBnr/aUTf 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=_8LSzHEHBnr/aUTf Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel --Boundary-00=_8LSzHEHBnr/aUTf--