| Submitter | Stefano Stabellini |
|---|---|
| Date | Nov. 15, 2011, 2:51 p.m. |
| Message ID | <1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com> |
| Download | mbox | patch |
| Permalink | /patch/125796/ |
| State | New |
| Headers | show |
Comments
On 11/15/2011 08:51 AM, stefano.stabellini@eu.citrix.com wrote: > From: Stefano Stabellini<stefano.stabellini@eu.citrix.com> > > Xen doesn't need full RTC emulation in Qemu because the RTC is already > emulated by the hypervisor. In particular we want to avoid the timers > initialization so that Qemu doesn't need to wake up needlessly. > > Signed-off-by: Stefano Stabellini<stefano.stabellini@eu.citrix.com> Yuck. There's got to be a better way to do this. I think it would be better to name timers and then in Xen specific machine code, disable the RTC timers. Regards, Anthony Liguori > --- > hw/mc146818rtc.c | 36 +++++++++++++++++++++++++++++++++++- > 1 files changed, 35 insertions(+), 1 deletions(-) > > diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c > index 2aaca2f..91242d0 100644 > --- a/hw/mc146818rtc.c > +++ b/hw/mc146818rtc.c > @@ -28,6 +28,7 @@ > #include "apic.h" > #include "isa.h" > #include "mc146818rtc.h" > +#include "arch_init.h" > > //#define DEBUG_CMOS > //#define DEBUG_COALESCED > @@ -614,6 +615,17 @@ static const MemoryRegionOps cmos_ops = { > .old_portio = cmos_portio > }; > > +static int rtcxen_initfn(ISADevice *dev) > +{ > + int base = 0x70; > + RTCState *s = DO_UPCAST(RTCState, dev, dev); > + > + memory_region_init_io(&s->io,&cmos_ops, s, "rtc", 2); > + isa_register_ioport(dev,&s->io, base); > + > + return 0; > +} > + > static int rtc_initfn(ISADevice *dev) > { > RTCState *s = DO_UPCAST(RTCState, dev, dev); > @@ -655,7 +667,11 @@ ISADevice *rtc_init(int base_year, qemu_irq intercept_irq) > ISADevice *dev; > RTCState *s; > > - dev = isa_create("mc146818rtc"); > + if (xen_available()) { > + dev = isa_create("mc146818rtcxen"); > + } else { > + dev = isa_create("mc146818rtc"); > + } > s = DO_UPCAST(RTCState, dev, dev); > qdev_prop_set_int32(&dev->qdev, "base_year", base_year); > qdev_init_nofail(&dev->qdev); > @@ -684,3 +700,21 @@ static void mc146818rtc_register(void) > isa_qdev_register(&mc146818rtc_info); > } > device_init(mc146818rtc_register) > + > +static ISADeviceInfo mc146818rtcxen_info = { > + .qdev.name = "mc146818rtcxen", > + .qdev.size = sizeof(RTCState), > + .qdev.no_user = 1, > + .qdev.vmsd =&vmstate_rtc, > + .init = rtcxen_initfn, > + .qdev.props = (Property[]) { > + DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980), > + DEFINE_PROP_END_OF_LIST(), > + } > +}; > + > +static void mc146818rtcxen_register(void) > +{ > + isa_qdev_register(&mc146818rtcxen_info); > +} > +device_init(mc146818rtcxen_register)
Patch
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index 2aaca2f..91242d0 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -28,6 +28,7 @@ #include "apic.h" #include "isa.h" #include "mc146818rtc.h" +#include "arch_init.h" //#define DEBUG_CMOS //#define DEBUG_COALESCED @@ -614,6 +615,17 @@ static const MemoryRegionOps cmos_ops = { .old_portio = cmos_portio }; +static int rtcxen_initfn(ISADevice *dev) +{ + int base = 0x70; + RTCState *s = DO_UPCAST(RTCState, dev, dev); + + memory_region_init_io(&s->io, &cmos_ops, s, "rtc", 2); + isa_register_ioport(dev, &s->io, base); + + return 0; +} + static int rtc_initfn(ISADevice *dev) { RTCState *s = DO_UPCAST(RTCState, dev, dev); @@ -655,7 +667,11 @@ ISADevice *rtc_init(int base_year, qemu_irq intercept_irq) ISADevice *dev; RTCState *s; - dev = isa_create("mc146818rtc"); + if (xen_available()) { + dev = isa_create("mc146818rtcxen"); + } else { + dev = isa_create("mc146818rtc"); + } s = DO_UPCAST(RTCState, dev, dev); qdev_prop_set_int32(&dev->qdev, "base_year", base_year); qdev_init_nofail(&dev->qdev); @@ -684,3 +700,21 @@ static void mc146818rtc_register(void) isa_qdev_register(&mc146818rtc_info); } device_init(mc146818rtc_register) + +static ISADeviceInfo mc146818rtcxen_info = { + .qdev.name = "mc146818rtcxen", + .qdev.size = sizeof(RTCState), + .qdev.no_user = 1, + .qdev.vmsd = &vmstate_rtc, + .init = rtcxen_initfn, + .qdev.props = (Property[]) { + DEFINE_PROP_INT32("base_year", RTCState, base_year, 1980), + DEFINE_PROP_END_OF_LIST(), + } +}; + +static void mc146818rtcxen_register(void) +{ + isa_qdev_register(&mc146818rtcxen_info); +} +device_init(mc146818rtcxen_register)