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; | ||||
|             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) | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paolo Bonzini
						Paolo Bonzini