Patchwork [1.1,1/4] xen: do not initialize the interval timer and PCSPK emulator

login
register
mail settings
Submitter Stefano Stabellini
Date May 9, 2012, 12:44 p.m.
Message ID <1336567456-20202-1-git-send-email-stefano.stabellini@eu.citrix.com>
Download mbox | patch
Permalink /patch/157939/
State New
Headers show

Comments

Stefano Stabellini - May 9, 2012, 12:44 p.m.
PIT and PCSPK are emulated by the hypervisor so we don't need to emulate
them in Qemu: this patch prevents Qemu from waking up needlessly at
PIT_FREQ on Xen.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
 hw/pc.c |   23 +++++++++++++----------
 1 files changed, 13 insertions(+), 10 deletions(-)
Anthony Liguori - May 14, 2012, 4:38 p.m.
On 05/09/2012 07:44 AM, Stefano Stabellini wrote:
> PIT and PCSPK are emulated by the hypervisor so we don't need to emulate
> them in Qemu: this patch prevents Qemu from waking up needlessly at
> PIT_FREQ on Xen.
>
> Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
> ---
>   hw/pc.c |   23 +++++++++++++----------
>   1 files changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/hw/pc.c b/hw/pc.c
> index 4d34a33..c52caf6 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -47,6 +47,7 @@
>   #include "ui/qemu-spice.h"
>   #include "memory.h"
>   #include "exec-memory.h"
> +#include "arch_init.h"
>
>   /* output Bochs bios info messages */
>   //#define DEBUG_BIOS
> @@ -1097,7 +1098,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
>       qemu_irq pit_alt_irq = NULL;
>       qemu_irq rtc_irq = NULL;
>       qemu_irq *a20_line;
> -    ISADevice *i8042, *port92, *vmmouse, *pit;
> +    ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
>       qemu_irq *cpu_exit_irq;
>
>       register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
> @@ -1126,16 +1127,18 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
>
>       qemu_register_boot_set(pc_boot_set, *rtc_state);
>
> -    if (kvm_irqchip_in_kernel()) {
> -        pit = kvm_pit_init(isa_bus, 0x40);
> -    } else {
> -        pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
> -    }
> -    if (hpet) {
> -        /* connect PIT to output control line of the HPET */
> -        qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
> +    if (!xen_available()) {

Shouldn't this be xen_enabled()?

Regards,

Anthony Liguori

> +        if (kvm_irqchip_in_kernel()) {
> +            pit = kvm_pit_init(isa_bus, 0x40);
> +        } else {
> +            pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
> +        }
> +        if (hpet) {
> +            /* connect PIT to output control line of the HPET */
> +            qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
> +        }
> +        pcspk_init(isa_bus, pit);
>       }
> -    pcspk_init(isa_bus, pit);
>
>       for(i = 0; i<  MAX_SERIAL_PORTS; i++) {
>           if (serial_hds[i]) {
Stefano Stabellini - May 14, 2012, 5 p.m.
On Mon, 14 May 2012, Anthony Liguori wrote:
> On 05/09/2012 07:44 AM, Stefano Stabellini wrote:
> > PIT and PCSPK are emulated by the hypervisor so we don't need to emulate
> > them in Qemu: this patch prevents Qemu from waking up needlessly at
> > PIT_FREQ on Xen.
> >
> > Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com>
> > ---
> >   hw/pc.c |   23 +++++++++++++----------
> >   1 files changed, 13 insertions(+), 10 deletions(-)
> >
> > diff --git a/hw/pc.c b/hw/pc.c
> > index 4d34a33..c52caf6 100644
> > --- a/hw/pc.c
> > +++ b/hw/pc.c
> > @@ -47,6 +47,7 @@
> >   #include "ui/qemu-spice.h"
> >   #include "memory.h"
> >   #include "exec-memory.h"
> > +#include "arch_init.h"
> >
> >   /* output Bochs bios info messages */
> >   //#define DEBUG_BIOS
> > @@ -1097,7 +1098,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
> >       qemu_irq pit_alt_irq = NULL;
> >       qemu_irq rtc_irq = NULL;
> >       qemu_irq *a20_line;
> > -    ISADevice *i8042, *port92, *vmmouse, *pit;
> > +    ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
> >       qemu_irq *cpu_exit_irq;
> >
> >       register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
> > @@ -1126,16 +1127,18 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
> >
> >       qemu_register_boot_set(pc_boot_set, *rtc_state);
> >
> > -    if (kvm_irqchip_in_kernel()) {
> > -        pit = kvm_pit_init(isa_bus, 0x40);
> > -    } else {
> > -        pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
> > -    }
> > -    if (hpet) {
> > -        /* connect PIT to output control line of the HPET */
> > -        qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
> > +    if (!xen_available()) {
> 
> Shouldn't this be xen_enabled()?

Yes, it should!

Patch

diff --git a/hw/pc.c b/hw/pc.c
index 4d34a33..c52caf6 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -47,6 +47,7 @@ 
 #include "ui/qemu-spice.h"
 #include "memory.h"
 #include "exec-memory.h"
+#include "arch_init.h"
 
 /* output Bochs bios info messages */
 //#define DEBUG_BIOS
@@ -1097,7 +1098,7 @@  void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
     qemu_irq pit_alt_irq = NULL;
     qemu_irq rtc_irq = NULL;
     qemu_irq *a20_line;
-    ISADevice *i8042, *port92, *vmmouse, *pit;
+    ISADevice *i8042, *port92, *vmmouse, *pit = NULL;
     qemu_irq *cpu_exit_irq;
 
     register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
@@ -1126,16 +1127,18 @@  void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
 
     qemu_register_boot_set(pc_boot_set, *rtc_state);
 
-    if (kvm_irqchip_in_kernel()) {
-        pit = kvm_pit_init(isa_bus, 0x40);
-    } else {
-        pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
-    }
-    if (hpet) {
-        /* connect PIT to output control line of the HPET */
-        qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
+    if (!xen_available()) {
+        if (kvm_irqchip_in_kernel()) {
+            pit = kvm_pit_init(isa_bus, 0x40);
+        } else {
+            pit = pit_init(isa_bus, 0x40, pit_isa_irq, pit_alt_irq);
+        }
+        if (hpet) {
+            /* connect PIT to output control line of the HPET */
+            qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
+        }
+        pcspk_init(isa_bus, pit);
     }
-    pcspk_init(isa_bus, pit);
 
     for(i = 0; i < MAX_SERIAL_PORTS; i++) {
         if (serial_hds[i]) {