---
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)