mirror of https://github.com/xemu-project/xemu.git
the rebase forgot the rtc fixes
This commit is contained in:
parent
3d33d8101b
commit
022d50f600
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue