From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH 1/4] xen: introduce mc146818rtcxen Date: Tue, 15 Nov 2011 08:54:05 -0600 Message-ID: <4EC27D0D.3040204@codemonkey.ws> References: <1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1321368671-1134-1-git-send-email-stefano.stabellini@eu.citrix.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org Sender: qemu-devel-bounces+gceq-qemu-devel=gmane.org@nongnu.org To: stefano.stabellini@eu.citrix.com Cc: xen-devel@lists.xensource.com, qemu-devel@nongnu.org, agraf@suse.de List-Id: xen-devel@lists.xenproject.org On 11/15/2011 08:51 AM, stefano.stabellini@eu.citrix.com wrote: > From: Stefano Stabellini > > 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 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)