rtc: map CMOS index 0x37 to 0x32 on read and writes
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 <pbonzini@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
							parent
							
								
									b6db4aca20
								
							
						
					
					
						commit
						e67edb943f
					
				@ -399,6 +399,10 @@ static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data)
 | 
				
			|||||||
            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:
 | 
				
			||||||
 | 
					            s->cmos_index = RTC_CENTURY;
 | 
				
			||||||
 | 
					            /* fall through */
 | 
				
			||||||
 | 
					        case RTC_CENTURY:
 | 
				
			||||||
        case RTC_SECONDS:
 | 
					        case RTC_SECONDS:
 | 
				
			||||||
        case RTC_MINUTES:
 | 
					        case RTC_MINUTES:
 | 
				
			||||||
        case RTC_HOURS:
 | 
					        case RTC_HOURS:
 | 
				
			||||||
@ -598,6 +602,10 @@ static uint32_t cmos_ioport_read(void *opaque, uint32_t addr)
 | 
				
			|||||||
        return 0xff;
 | 
					        return 0xff;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        switch(s->cmos_index) {
 | 
					        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_SECONDS:
 | 
				
			||||||
        case RTC_MINUTES:
 | 
					        case RTC_MINUTES:
 | 
				
			||||||
        case RTC_HOURS:
 | 
					        case RTC_HOURS:
 | 
				
			||||||
@ -661,10 +669,6 @@ void rtc_set_memory(ISADevice *dev, int addr, int val)
 | 
				
			|||||||
        s->cmos_data[addr] = 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)
 | 
					static void rtc_set_date_from_host(ISADevice *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    RTCState *s = DO_UPCAST(RTCState, dev, 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);
 | 
					    rtc_set_cmos(s, &tm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    val = rtc_to_bcd(s, (tm.tm_year / 100) + 19);
 | 
					    val = rtc_to_bcd(s, (tm.tm_year / 100) + 19);
 | 
				
			||||||
    rtc_set_memory(dev, REG_IBM_CENTURY_BYTE, val);
 | 
					    rtc_set_memory(dev, RTC_CENTURY, val);
 | 
				
			||||||
    rtc_set_memory(dev, REG_IBM_PS2_CENTURY_BYTE, val);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int rtc_post_load(void *opaque, int version_id)
 | 
					static int rtc_post_load(void *opaque, int version_id)
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,10 @@
 | 
				
			|||||||
#define RTC_REG_C               12
 | 
					#define RTC_REG_C               12
 | 
				
			||||||
#define RTC_REG_D               13
 | 
					#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_A_UIP 0x80
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define REG_B_SET  0x80
 | 
					#define REG_B_SET  0x80
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user