Commit ea55ffb37378dcb16972aef6ef898b3d0ba17fb0
1 parent
aa328add
Move date/time init to the RTC implementation.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2229 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
25 additions
and
22 deletions
hw/mc146818rtc.c
| @@ -380,6 +380,29 @@ void rtc_set_date(RTCState *s, const struct tm *tm) | @@ -380,6 +380,29 @@ void rtc_set_date(RTCState *s, const struct tm *tm) | ||
| 380 | rtc_copy_date(s); | 380 | rtc_copy_date(s); |
| 381 | } | 381 | } |
| 382 | 382 | ||
| 383 | +/* PC cmos mappings */ | ||
| 384 | +#define REG_IBM_CENTURY_BYTE 0x32 | ||
| 385 | +#define REG_IBM_PS2_CENTURY_BYTE 0x37 | ||
| 386 | + | ||
| 387 | +void rtc_set_date_from_host(RTCState *s) | ||
| 388 | +{ | ||
| 389 | + time_t ti; | ||
| 390 | + struct tm *tm; | ||
| 391 | + int val; | ||
| 392 | + | ||
| 393 | + /* set the CMOS date */ | ||
| 394 | + time(&ti); | ||
| 395 | + if (rtc_utc) | ||
| 396 | + tm = gmtime(&ti); | ||
| 397 | + else | ||
| 398 | + tm = localtime(&ti); | ||
| 399 | + rtc_set_date(s, tm); | ||
| 400 | + | ||
| 401 | + val = to_bcd(s, (tm->tm_year / 100) + 19); | ||
| 402 | + rtc_set_memory(s, REG_IBM_CENTURY_BYTE, val); | ||
| 403 | + rtc_set_memory(s, REG_IBM_PS2_CENTURY_BYTE, val); | ||
| 404 | +} | ||
| 405 | + | ||
| 383 | static void rtc_save(QEMUFile *f, void *opaque) | 406 | static void rtc_save(QEMUFile *f, void *opaque) |
| 384 | { | 407 | { |
| 385 | RTCState *s = opaque; | 408 | RTCState *s = opaque; |
| @@ -444,6 +467,8 @@ RTCState *rtc_init(int base, int irq) | @@ -444,6 +467,8 @@ RTCState *rtc_init(int base, int irq) | ||
| 444 | s->cmos_data[RTC_REG_C] = 0x00; | 467 | s->cmos_data[RTC_REG_C] = 0x00; |
| 445 | s->cmos_data[RTC_REG_D] = 0x80; | 468 | s->cmos_data[RTC_REG_D] = 0x80; |
| 446 | 469 | ||
| 470 | + rtc_set_date_from_host(s); | ||
| 471 | + | ||
| 447 | s->periodic_timer = qemu_new_timer(vm_clock, | 472 | s->periodic_timer = qemu_new_timer(vm_clock, |
| 448 | rtc_periodic_timer, s); | 473 | rtc_periodic_timer, s); |
| 449 | s->second_timer = qemu_new_timer(vm_clock, | 474 | s->second_timer = qemu_new_timer(vm_clock, |
hw/pc.c
| @@ -111,14 +111,6 @@ static void pic_irq_request(void *opaque, int level) | @@ -111,14 +111,6 @@ static void pic_irq_request(void *opaque, int level) | ||
| 111 | /* PC cmos mappings */ | 111 | /* PC cmos mappings */ |
| 112 | 112 | ||
| 113 | #define REG_EQUIPMENT_BYTE 0x14 | 113 | #define REG_EQUIPMENT_BYTE 0x14 |
| 114 | -#define REG_IBM_CENTURY_BYTE 0x32 | ||
| 115 | -#define REG_IBM_PS2_CENTURY_BYTE 0x37 | ||
| 116 | - | ||
| 117 | - | ||
| 118 | -static inline int to_bcd(RTCState *s, int a) | ||
| 119 | -{ | ||
| 120 | - return ((a / 10) << 4) | (a % 10); | ||
| 121 | -} | ||
| 122 | 114 | ||
| 123 | static int cmos_get_fd_drive_type(int fd0) | 115 | static int cmos_get_fd_drive_type(int fd0) |
| 124 | { | 116 | { |
| @@ -167,22 +159,8 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table | @@ -167,22 +159,8 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table | ||
| 167 | RTCState *s = rtc_state; | 159 | RTCState *s = rtc_state; |
| 168 | int val; | 160 | int val; |
| 169 | int fd0, fd1, nb; | 161 | int fd0, fd1, nb; |
| 170 | - time_t ti; | ||
| 171 | - struct tm *tm; | ||
| 172 | int i; | 162 | int i; |
| 173 | 163 | ||
| 174 | - /* set the CMOS date */ | ||
| 175 | - time(&ti); | ||
| 176 | - if (rtc_utc) | ||
| 177 | - tm = gmtime(&ti); | ||
| 178 | - else | ||
| 179 | - tm = localtime(&ti); | ||
| 180 | - rtc_set_date(s, tm); | ||
| 181 | - | ||
| 182 | - val = to_bcd(s, (tm->tm_year / 100) + 19); | ||
| 183 | - rtc_set_memory(s, REG_IBM_CENTURY_BYTE, val); | ||
| 184 | - rtc_set_memory(s, REG_IBM_PS2_CENTURY_BYTE, val); | ||
| 185 | - | ||
| 186 | /* various important CMOS locations needed by PC/Bochs bios */ | 164 | /* various important CMOS locations needed by PC/Bochs bios */ |
| 187 | 165 | ||
| 188 | /* memory size */ | 166 | /* memory size */ |