Revision 42fc73a1
b/hw/mc146818rtc.c | ||
---|---|---|
60 | 60 |
uint8_t cmos_data[128]; |
61 | 61 |
uint8_t cmos_index; |
62 | 62 |
struct tm current_tm; |
63 |
int base_year; |
|
63 | 64 |
qemu_irq irq; |
64 | 65 |
int it_shift; |
65 | 66 |
/* periodic timer */ |
... | ... | |
235 | 236 |
tm->tm_wday = from_bcd(s, s->cmos_data[RTC_DAY_OF_WEEK]) - 1; |
236 | 237 |
tm->tm_mday = from_bcd(s, s->cmos_data[RTC_DAY_OF_MONTH]); |
237 | 238 |
tm->tm_mon = from_bcd(s, s->cmos_data[RTC_MONTH]) - 1; |
238 |
tm->tm_year = from_bcd(s, s->cmos_data[RTC_YEAR]) + 100;
|
|
239 |
tm->tm_year = from_bcd(s, s->cmos_data[RTC_YEAR]) + s->base_year - 1900;
|
|
239 | 240 |
} |
240 | 241 |
|
241 | 242 |
static void rtc_copy_date(RTCState *s) |
242 | 243 |
{ |
243 | 244 |
const struct tm *tm = &s->current_tm; |
245 |
int year; |
|
244 | 246 |
|
245 | 247 |
s->cmos_data[RTC_SECONDS] = to_bcd(s, tm->tm_sec); |
246 | 248 |
s->cmos_data[RTC_MINUTES] = to_bcd(s, tm->tm_min); |
... | ... | |
256 | 258 |
s->cmos_data[RTC_DAY_OF_WEEK] = to_bcd(s, tm->tm_wday + 1); |
257 | 259 |
s->cmos_data[RTC_DAY_OF_MONTH] = to_bcd(s, tm->tm_mday); |
258 | 260 |
s->cmos_data[RTC_MONTH] = to_bcd(s, tm->tm_mon + 1); |
259 |
s->cmos_data[RTC_YEAR] = to_bcd(s, tm->tm_year % 100); |
|
261 |
year = (tm->tm_year - s->base_year) % 100; |
|
262 |
if (year < 0) |
|
263 |
year += 100; |
|
264 |
s->cmos_data[RTC_YEAR] = to_bcd(s, year); |
|
260 | 265 |
} |
261 | 266 |
|
262 | 267 |
/* month is between 0 and 11. */ |
... | ... | |
522 | 527 |
} |
523 | 528 |
#endif |
524 | 529 |
|
525 |
RTCState *rtc_init(int base, qemu_irq irq) |
|
530 |
RTCState *rtc_init(int base, qemu_irq irq, int base_year)
|
|
526 | 531 |
{ |
527 | 532 |
RTCState *s; |
528 | 533 |
|
... | ... | |
536 | 541 |
s->cmos_data[RTC_REG_C] = 0x00; |
537 | 542 |
s->cmos_data[RTC_REG_D] = 0x80; |
538 | 543 |
|
544 |
s->base_year = base_year; |
|
539 | 545 |
rtc_set_date_from_host(s); |
540 | 546 |
|
541 | 547 |
s->periodic_timer = qemu_new_timer(vm_clock, |
... | ... | |
631 | 637 |
&cmos_mm_writel, |
632 | 638 |
}; |
633 | 639 |
|
634 |
RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq) |
|
640 |
RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq, |
|
641 |
int base_year) |
|
635 | 642 |
{ |
636 | 643 |
RTCState *s; |
637 | 644 |
int io_memory; |
... | ... | |
646 | 653 |
s->cmos_data[RTC_REG_C] = 0x00; |
647 | 654 |
s->cmos_data[RTC_REG_D] = 0x80; |
648 | 655 |
|
656 |
s->base_year = base_year; |
|
649 | 657 |
rtc_set_date_from_host(s); |
650 | 658 |
|
651 | 659 |
s->periodic_timer = qemu_new_timer(vm_clock, |
b/hw/mips_jazz.c | ||
---|---|---|
241 | 241 |
fdctrl_init(rc4030[1], 0, 1, 0x80003000, fds); |
242 | 242 |
|
243 | 243 |
/* Real time clock */ |
244 |
rtc_init(0x70, i8259[8]); |
|
244 |
rtc_init(0x70, i8259[8], 1980);
|
|
245 | 245 |
s_rtc = cpu_register_io_memory(0, rtc_read, rtc_write, env); |
246 | 246 |
cpu_register_physical_memory(0x80004000, 0x00001000, s_rtc); |
247 | 247 |
|
b/hw/mips_malta.c | ||
---|---|---|
918 | 918 |
|
919 | 919 |
/* Super I/O */ |
920 | 920 |
i8042_init(i8259[1], i8259[12], 0x60); |
921 |
rtc_state = rtc_init(0x70, i8259[8]); |
|
921 |
rtc_state = rtc_init(0x70, i8259[8], 2000);
|
|
922 | 922 |
serial_init(0x3f8, i8259[4], 115200, serial_hds[0]); |
923 | 923 |
serial_init(0x2f8, i8259[3], 115200, serial_hds[1]); |
924 | 924 |
if (parallel_hds[0]) |
b/hw/mips_r4k.c | ||
---|---|---|
235 | 235 |
/* The PIC is attached to the MIPS CPU INT0 pin */ |
236 | 236 |
i8259 = i8259_init(env->irq[2]); |
237 | 237 |
|
238 |
rtc_state = rtc_init(0x70, i8259[8]); |
|
238 |
rtc_state = rtc_init(0x70, i8259[8], 2000);
|
|
239 | 239 |
|
240 | 240 |
/* Register 64 KB of ISA IO space at 0x14000000 */ |
241 | 241 |
isa_mmio_init(0x14000000, 0x00010000); |
b/hw/pc.c | ||
---|---|---|
968 | 968 |
} |
969 | 969 |
} |
970 | 970 |
|
971 |
rtc_state = rtc_init(0x70, i8259[8]); |
|
971 |
rtc_state = rtc_init(0x70, i8259[8], 2000);
|
|
972 | 972 |
|
973 | 973 |
qemu_register_boot_set(pc_boot_set, rtc_state); |
974 | 974 |
|
b/hw/pc.h | ||
---|---|---|
83 | 83 |
|
84 | 84 |
typedef struct RTCState RTCState; |
85 | 85 |
|
86 |
RTCState *rtc_init(int base, qemu_irq irq); |
|
87 |
RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq); |
|
86 |
RTCState *rtc_init(int base, qemu_irq irq, int base_year); |
|
87 |
RTCState *rtc_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq, |
|
88 |
int base_year); |
|
88 | 89 |
void rtc_set_memory(RTCState *s, int addr, int val); |
89 | 90 |
void rtc_set_date(RTCState *s, const struct tm *tm); |
90 | 91 |
void cmos_set_s3_resume(void); |
b/hw/ppc_prep.c | ||
---|---|---|
659 | 659 |
vga_ram_size, 0, 0); |
660 | 660 |
// openpic = openpic_init(0x00000000, 0xF0000000, 1); |
661 | 661 |
// pit = pit_init(0x40, i8259[0]); |
662 |
rtc_init(0x70, i8259[8]); |
|
662 |
rtc_init(0x70, i8259[8], 2000);
|
|
663 | 663 |
|
664 | 664 |
serial_init(0x3f8, i8259[4], 115200, serial_hds[0]); |
665 | 665 |
nb_nics1 = nb_nics; |
Also available in: Unified diff