From 022d50f6007d26cdcb9c8e41e180bc486b5eee3d Mon Sep 17 00:00:00 2001 From: espes Date: Wed, 26 Sep 2018 18:31:16 +0800 Subject: [PATCH] the rebase forgot the rtc fixes --- hw/timer/mc146818rtc.c | 34 ++++++++++++++++++++++------- include/hw/timer/mc146818rtc_regs.h | 1 + 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 6f1f723b1f..0237487f95 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -39,7 +39,7 @@ #include "hw/i386/apic.h" #endif -//#define DEBUG_CMOS +#define DEBUG_CMOS //#define DEBUG_COALESCED #ifdef DEBUG_CMOS @@ -70,7 +70,7 @@ typedef struct RTCState { ISADevice parent_obj; MemoryRegion io; - uint8_t cmos_data[128]; + uint8_t cmos_data[256]; uint8_t cmos_index; int32_t base_year; uint64_t base_rtc; @@ -473,8 +473,10 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, uint32_t old_period; bool update_periodic_timer; - if ((addr & 1) == 0) { + if (addr == 0) { s->cmos_index = data & 0x7f; + } else if (addr == 2) { + s->cmos_index = data; } else { CMOS_DPRINTF("cmos: write index=0x%02x val=0x%02" PRIx64 "\n", s->cmos_index, data); @@ -485,10 +487,14 @@ static void cmos_ioport_write(void *opaque, hwaddr addr, s->cmos_data[s->cmos_index] = data; check_update_timer(s); break; - case RTC_IBM_PS2_CENTURY_BYTE: +#ifdef XBOX + case RTC_XBOX_CENTURY: +#else + case RTC_IBM_PS2_CENTURY_BYTE: s->cmos_index = RTC_CENTURY; /* fall through */ case RTC_CENTURY: +#endif case RTC_SECONDS: case RTC_MINUTES: case RTC_HOURS: @@ -624,7 +630,11 @@ static void rtc_get_time(RTCState *s, struct tm *tm) tm->tm_mon = rtc_from_bcd(s, s->cmos_data[RTC_MONTH]) - 1; tm->tm_year = rtc_from_bcd(s, s->cmos_data[RTC_YEAR]) + s->base_year + +#ifdef XBOX + rtc_from_bcd(s, s->cmos_data[RTC_XBOX_CENTURY]) * 100 - 1900; +#else rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900; +#endif } static void rtc_set_time(RTCState *s) @@ -659,7 +669,11 @@ static void rtc_set_cmos(RTCState *s, const struct tm *tm) s->cmos_data[RTC_MONTH] = rtc_to_bcd(s, tm->tm_mon + 1); year = tm->tm_year + 1900 - s->base_year; s->cmos_data[RTC_YEAR] = rtc_to_bcd(s, year % 100); +#ifdef XBOX + s->cmos_data[RTC_XBOX_CENTURY] = rtc_to_bcd(s, year / 100); +#else s->cmos_data[RTC_CENTURY] = rtc_to_bcd(s, year / 100); +#endif } static void rtc_update_time(RTCState *s) @@ -713,10 +727,14 @@ static uint64_t cmos_ioport_read(void *opaque, hwaddr addr, return 0xff; } else { switch(s->cmos_index) { - case RTC_IBM_PS2_CENTURY_BYTE: +#ifdef XBOX + case RTC_XBOX_CENTURY: +#else + case RTC_IBM_PS2_CENTURY_BYTE: s->cmos_index = RTC_CENTURY; /* fall through */ case RTC_CENTURY: +#endif case RTC_SECONDS: case RTC_MINUTES: case RTC_HOURS: @@ -771,14 +789,14 @@ static uint64_t cmos_ioport_read(void *opaque, hwaddr addr, void rtc_set_memory(ISADevice *dev, int addr, int val) { RTCState *s = MC146818_RTC(dev); - if (addr >= 0 && addr <= 127) + if (addr >= 0 && addr < sizeof(s->cmos_data)) s->cmos_data[addr] = val; } int rtc_get_memory(ISADevice *dev, int addr) { RTCState *s = MC146818_RTC(dev); - assert(addr >= 0 && addr <= 127); + assert(addr >= 0 && addr < sizeof(s->cmos_data)); return s->cmos_data[addr]; } @@ -987,7 +1005,7 @@ static void rtc_realizefn(DeviceState *dev, Error **errp) s->suspend_notifier.notify = rtc_notify_suspend; qemu_register_suspend_notifier(&s->suspend_notifier); - memory_region_init_io(&s->io, OBJECT(s), &cmos_ops, s, "rtc", 2); + memory_region_init_io(&s->io, OBJECT(s), &cmos_ops, s, "rtc", 4); isa_register_ioport(isadev, &s->io, base); qdev_set_legacy_instance_id(dev, base, 3); diff --git a/include/hw/timer/mc146818rtc_regs.h b/include/hw/timer/mc146818rtc_regs.h index c62f17bf2d..346192a5c1 100644 --- a/include/hw/timer/mc146818rtc_regs.h +++ b/include/hw/timer/mc146818rtc_regs.h @@ -48,6 +48,7 @@ /* PC cmos mappings */ #define RTC_CENTURY 0x32 #define RTC_IBM_PS2_CENTURY_BYTE 0x37 +#define RTC_XBOX_CENTURY 0x7f #define REG_A_UIP 0x80