From 022d50f6007d26cdcb9c8e41e180bc486b5eee3d Mon Sep 17 00:00:00 2001
From: espes <espes@pequalsnp.com>
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