[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/14] timer: ds1338 fix wday_offset handling
From: |
Michael Davidsaver |
Subject: |
[Qemu-devel] [PATCH 07/14] timer: ds1338 fix wday_offset handling |
Date: |
Sat, 24 Mar 2018 12:24:48 -0700 |
Correctly handle different real weekday in
guest and host timezones.
Allow guest to use any day as start of week
(day 1). eg. Monday instead of Sunday.
Signed-off-by: Michael Davidsaver <address@hidden>
---
hw/timer/ds1338.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/hw/timer/ds1338.c b/hw/timer/ds1338.c
index 071c031563..a969b5c8ba 100644
--- a/hw/timer/ds1338.c
+++ b/hw/timer/ds1338.c
@@ -108,7 +108,10 @@ static void capture_current_time(DS1338State *s)
} else {
ARRAY_FIELD_DP32(s->nvram, HOUR, HOUR24, to_bcd(now.tm_hour));
}
- s->nvram[R_WDAY] = (now.tm_wday + s->wday_offset) % 7 + 1;
+ s->nvram[R_WDAY] = (now.tm_wday + s->wday_offset) % 7;
+ if (s->nvram[R_WDAY] == 0) {
+ s->nvram[R_WDAY] = 7;
+ }
s->nvram[R_DATE] = to_bcd(now.tm_mday);
s->nvram[R_MONTH] = to_bcd(now.tm_mon + 1);
s->nvram[R_YEAR] = to_bcd(now.tm_year - 100);
@@ -182,17 +185,22 @@ static void ds1338_update(DS1338State *s)
} else {
now.tm_hour = from_bcd(ARRAY_FIELD_EX32(s->nvram, HOUR, HOUR24));
}
- {
- /* The day field is supposed to contain a value in
- the range 1-7. Otherwise behavior is undefined.
- */
- int user_wday = (s->nvram[R_WDAY] & 7) - 1;
- s->wday_offset = (user_wday - now.tm_wday + 7) % 7;
- }
+ now.tm_wday = from_bcd(s->nvram[R_WDAY]) - 1u;
now.tm_mday = from_bcd(s->nvram[R_DATE] & 0x3f);
now.tm_mon = from_bcd(s->nvram[R_MONTH] & 0x1f) - 1;
now.tm_year = from_bcd(s->nvram[R_YEAR]) + 100;
s->offset = qemu_timedate_diff(&now);
+
+ {
+ /* Round trip to get real wday_offset based on time delta and
+ * ref. timezone.
+ * Race if midnight (in ref. timezone) happens here.
+ */
+ int user_wday = now.tm_wday;
+ qemu_get_timedate(&now, s->offset);
+
+ s->wday_offset = (user_wday - now.tm_wday) % 7 + 1;
+ }
}
static int ds1338_send(I2CSlave *i2c, uint8_t data)
--
2.11.0
- [Qemu-devel] [PATCH 08/14] tests: ds-rtc test wday offset, (continued)
- [Qemu-devel] [PATCH 08/14] tests: ds-rtc test wday offset, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 12/14] timer: ds-rtc handle CENTURY bit, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 02/14] timer: ds1338 use registerfields.h, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 09/14] timer: rename ds1338 -> dsrtc, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 06/14] tests: ds-rtc test 12 hour mode, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 04/14] timer: ds1338 clarify HOUR handling, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 10/14] timer: rename file ds1338.c -> ds-rtc.c, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 01/14] tests: more thorough tests of ds1338, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 07/14] timer: ds1338 fix wday_offset handling,
Michael Davidsaver <=
- [Qemu-devel] [PATCH 13/14] timer: ds-rtc model ds1375, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 03/14] timer: ds1338 persist 12-hour mode selection, Michael Davidsaver, 2018/03/24
- [Qemu-devel] [PATCH 11/14] timer: generalize ds1338, Michael Davidsaver, 2018/03/24
- Re: [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2, no-reply, 2018/03/24
- Re: [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2, no-reply, 2018/03/24
- Re: [Qemu-devel] [PATCH 00/14] Generalize Dallas/Maxim I2C RTC devices v2, no-reply, 2018/03/26