From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:44739) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TIf17-00051a-BA for qemu-devel@nongnu.org; Mon, 01 Oct 2012 08:22:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TIf12-0005rp-Pe for qemu-devel@nongnu.org; Mon, 01 Oct 2012 08:22:33 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:48830) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TIf12-0005rb-KR for qemu-devel@nongnu.org; Mon, 01 Oct 2012 08:22:28 -0400 Received: by pbbrp2 with SMTP id rp2so7732085pbb.4 for ; Mon, 01 Oct 2012 05:22:28 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 1 Oct 2012 14:22:07 +0200 Message-Id: <1349094128-32332-3-git-send-email-pbonzini@redhat.com> In-Reply-To: <1349094128-32332-1-git-send-email-pbonzini@redhat.com> References: <1349094128-32332-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 2/3] rtc: map CMOS index 0x37 to 0x32 on read and writes List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: lookkas@gmail.com QEMU's attempt to implement the century byte cover two possible places for the byte. A common one on modern chipsets is 0x32, but QEMU also stores the value in 0x37 (apparently for IBM PS/2 compatibility---it's only been 25 years). To simplify the implementation of the century byte, store it only at 0x32 but remap transparently 0x37 to 0x32 when reading and writing from CMOS. Signed-off-by: Paolo Bonzini --- hw/mc146818rtc.c | 15 +++++++++------ hw/mc146818rtc_regs.h | 4 ++++ 2 file modificati, 13 inserzioni(+), 6 rimozioni(-) diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c index d63554f..a7d20d5 100644 --- a/hw/mc146818rtc.c +++ b/hw/mc146818rtc.c @@ -399,6 +399,10 @@ static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data) s->cmos_data[s->cmos_index] = data; check_update_timer(s); break; + case RTC_IBM_PS2_CENTURY_BYTE: + s->cmos_index = RTC_CENTURY; + /* fall through */ + case RTC_CENTURY: case RTC_SECONDS: case RTC_MINUTES: case RTC_HOURS: @@ -598,6 +602,10 @@ static uint32_t cmos_ioport_read(void *opaque, uint32_t addr) return 0xff; } else { switch(s->cmos_index) { + case RTC_IBM_PS2_CENTURY_BYTE: + s->cmos_index = RTC_CENTURY; + /* fall through */ + case RTC_CENTURY: case RTC_SECONDS: case RTC_MINUTES: case RTC_HOURS: @@ -661,10 +669,6 @@ void rtc_set_memory(ISADevice *dev, int addr, int val) s->cmos_data[addr] = val; } -/* PC cmos mappings */ -#define REG_IBM_CENTURY_BYTE 0x32 -#define REG_IBM_PS2_CENTURY_BYTE 0x37 - static void rtc_set_date_from_host(ISADevice *dev) { RTCState *s = DO_UPCAST(RTCState, dev, dev); @@ -681,8 +685,7 @@ static void rtc_set_date_from_host(ISADevice *dev) rtc_set_cmos(s, &tm); val = rtc_to_bcd(s, (tm.tm_year / 100) + 19); - rtc_set_memory(dev, REG_IBM_CENTURY_BYTE, val); - rtc_set_memory(dev, REG_IBM_PS2_CENTURY_BYTE, val); + rtc_set_memory(dev, RTC_CENTURY, val); } static int rtc_post_load(void *opaque, int version_id) diff --git a/hw/mc146818rtc_regs.h b/hw/mc146818rtc_regs.h index fc10076..ccdee42 100644 --- a/hw/mc146818rtc_regs.h +++ b/hw/mc146818rtc_regs.h @@ -44,6 +44,10 @@ #define RTC_REG_C 12 #define RTC_REG_D 13 +/* PC cmos mappings */ +#define RTC_CENTURY 0x32 +#define RTC_IBM_PS2_CENTURY_BYTE 0x37 + #define REG_A_UIP 0x80 #define REG_B_SET 0x80 -- 1.7.12