static void rtc_copy_date(RTCState *s) { const struct tm *tm = &s->current_tm; int year; s->cmos_data[RTC_SECONDS] = rtc_to_bcd(s, tm->tm_sec); s->cmos_data[RTC_MINUTES] = rtc_to_bcd(s, tm->tm_min); if (s->cmos_data[RTC_REG_B] & REG_B_24H) { /* 24 hour format */ s->cmos_data[RTC_HOURS] = rtc_to_bcd(s, tm->tm_hour); } else { /* 12 hour format */ int h = (tm->tm_hour % 12) ? tm->tm_hour % 12 : 12; s->cmos_data[RTC_HOURS] = rtc_to_bcd(s, h); if (tm->tm_hour >= 12) s->cmos_data[RTC_HOURS] |= 0x80; } s->cmos_data[RTC_DAY_OF_WEEK] = rtc_to_bcd(s, tm->tm_wday + 1); s->cmos_data[RTC_DAY_OF_MONTH] = rtc_to_bcd(s, tm->tm_mday); s->cmos_data[RTC_MONTH] = rtc_to_bcd(s, tm->tm_mon + 1); year = (tm->tm_year - s->base_year) % 100; if (year < 0) year += 100; s->cmos_data[RTC_YEAR] = rtc_to_bcd(s, year); }
static void rtc_set_date_from_host(ISADevice *dev) { RTCState *s = DO_UPCAST(RTCState, dev, dev); struct tm tm; int val; /* set the CMOS date */ qemu_get_timedate(&tm, 0); rtc_set_date(dev, &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); }
static void rtc_set_cmos(RTCState *s, const struct tm *tm) { int year; s->cmos_data[RTC_SECONDS] = rtc_to_bcd(s, tm->tm_sec); s->cmos_data[RTC_MINUTES] = rtc_to_bcd(s, tm->tm_min); if (s->cmos_data[RTC_REG_B] & REG_B_24H) { /* 24 hour format */ s->cmos_data[RTC_HOURS] = rtc_to_bcd(s, tm->tm_hour); } else { /* 12 hour format */ int h = (tm->tm_hour % 12) ? tm->tm_hour % 12 : 12; s->cmos_data[RTC_HOURS] = rtc_to_bcd(s, h); if (tm->tm_hour >= 12) s->cmos_data[RTC_HOURS] |= 0x80; } s->cmos_data[RTC_DAY_OF_WEEK] = rtc_to_bcd(s, tm->tm_wday + 1); s->cmos_data[RTC_DAY_OF_MONTH] = rtc_to_bcd(s, tm->tm_mday); s->cmos_data[RTC_MONTH] = rtc_to_bcd(s, tm->tm_mon + 1); year = tm->tm_year + 1900 - s->base_year; s->cmos_data[RTC_YEAR] = rtc_to_bcd(s, year % 100); s->cmos_data[RTC_CENTURY] = rtc_to_bcd(s, year / 100); }