the rebase forgot the rtc fixes

This commit is contained in:
espes 2018-09-26 18:31:16 +08:00
parent 3d33d8101b
commit 022d50f600
2 changed files with 27 additions and 8 deletions

View File

@ -39,7 +39,7 @@
#include "hw/i386/apic.h" #include "hw/i386/apic.h"
#endif #endif
//#define DEBUG_CMOS #define DEBUG_CMOS
//#define DEBUG_COALESCED //#define DEBUG_COALESCED
#ifdef DEBUG_CMOS #ifdef DEBUG_CMOS
@ -70,7 +70,7 @@ typedef struct RTCState {
ISADevice parent_obj; ISADevice parent_obj;
MemoryRegion io; MemoryRegion io;
uint8_t cmos_data[128]; uint8_t cmos_data[256];
uint8_t cmos_index; uint8_t cmos_index;
int32_t base_year; int32_t base_year;
uint64_t base_rtc; uint64_t base_rtc;
@ -473,8 +473,10 @@ static void cmos_ioport_write(void *opaque, hwaddr addr,
uint32_t old_period; uint32_t old_period;
bool update_periodic_timer; bool update_periodic_timer;
if ((addr & 1) == 0) { if (addr == 0) {
s->cmos_index = data & 0x7f; s->cmos_index = data & 0x7f;
} else if (addr == 2) {
s->cmos_index = data;
} else { } else {
CMOS_DPRINTF("cmos: write index=0x%02x val=0x%02" PRIx64 "\n", CMOS_DPRINTF("cmos: write index=0x%02x val=0x%02" PRIx64 "\n",
s->cmos_index, data); s->cmos_index, data);
@ -485,10 +487,14 @@ static void cmos_ioport_write(void *opaque, hwaddr addr,
s->cmos_data[s->cmos_index] = data; s->cmos_data[s->cmos_index] = data;
check_update_timer(s); check_update_timer(s);
break; 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; s->cmos_index = RTC_CENTURY;
/* fall through */ /* fall through */
case RTC_CENTURY: case RTC_CENTURY:
#endif
case RTC_SECONDS: case RTC_SECONDS:
case RTC_MINUTES: case RTC_MINUTES:
case RTC_HOURS: 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_mon = rtc_from_bcd(s, s->cmos_data[RTC_MONTH]) - 1;
tm->tm_year = tm->tm_year =
rtc_from_bcd(s, s->cmos_data[RTC_YEAR]) + s->base_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; rtc_from_bcd(s, s->cmos_data[RTC_CENTURY]) * 100 - 1900;
#endif
} }
static void rtc_set_time(RTCState *s) 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); s->cmos_data[RTC_MONTH] = rtc_to_bcd(s, tm->tm_mon + 1);
year = tm->tm_year + 1900 - s->base_year; year = tm->tm_year + 1900 - s->base_year;
s->cmos_data[RTC_YEAR] = rtc_to_bcd(s, year % 100); 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); s->cmos_data[RTC_CENTURY] = rtc_to_bcd(s, year / 100);
#endif
} }
static void rtc_update_time(RTCState *s) static void rtc_update_time(RTCState *s)
@ -713,10 +727,14 @@ static uint64_t cmos_ioport_read(void *opaque, hwaddr addr,
return 0xff; return 0xff;
} else { } else {
switch(s->cmos_index) { 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; s->cmos_index = RTC_CENTURY;
/* fall through */ /* fall through */
case RTC_CENTURY: case RTC_CENTURY:
#endif
case RTC_SECONDS: case RTC_SECONDS:
case RTC_MINUTES: case RTC_MINUTES:
case RTC_HOURS: 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) void rtc_set_memory(ISADevice *dev, int addr, int val)
{ {
RTCState *s = MC146818_RTC(dev); RTCState *s = MC146818_RTC(dev);
if (addr >= 0 && addr <= 127) if (addr >= 0 && addr < sizeof(s->cmos_data))
s->cmos_data[addr] = val; s->cmos_data[addr] = val;
} }
int rtc_get_memory(ISADevice *dev, int addr) int rtc_get_memory(ISADevice *dev, int addr)
{ {
RTCState *s = MC146818_RTC(dev); RTCState *s = MC146818_RTC(dev);
assert(addr >= 0 && addr <= 127); assert(addr >= 0 && addr < sizeof(s->cmos_data));
return s->cmos_data[addr]; return s->cmos_data[addr];
} }
@ -987,7 +1005,7 @@ static void rtc_realizefn(DeviceState *dev, Error **errp)
s->suspend_notifier.notify = rtc_notify_suspend; s->suspend_notifier.notify = rtc_notify_suspend;
qemu_register_suspend_notifier(&s->suspend_notifier); 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); isa_register_ioport(isadev, &s->io, base);
qdev_set_legacy_instance_id(dev, base, 3); qdev_set_legacy_instance_id(dev, base, 3);

View File

@ -48,6 +48,7 @@
/* PC cmos mappings */ /* PC cmos mappings */
#define RTC_CENTURY 0x32 #define RTC_CENTURY 0x32
#define RTC_IBM_PS2_CENTURY_BYTE 0x37 #define RTC_IBM_PS2_CENTURY_BYTE 0x37
#define RTC_XBOX_CENTURY 0x7f
#define REG_A_UIP 0x80 #define REG_A_UIP 0x80