efi_loader: daylight saving time
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 23 Oct 2020 03:30:29 +0000 (05:30 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 27 Oct 2020 20:13:16 +0000 (21:13 +0100)
Adjust the SetTime() and GetTime() runtime services to correctly convert
the daylight saving time information when communicating with the RTC.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_runtime.c

index dea2b4e..1fa1595 100644 (file)
@@ -266,9 +266,13 @@ static efi_status_t EFIAPI efi_get_time_boottime(
        time->hour = tm.tm_hour;
        time->minute = tm.tm_min;
        time->second = tm.tm_sec;
-       if (tm.tm_isdst)
+       if (tm.tm_isdst > 0)
                time->daylight =
                        EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT;
+       else if (!tm.tm_isdst)
+               time->daylight = EFI_TIME_ADJUST_DAYLIGHT;
+       else
+               time->daylight = 0;
        time->timezone = EFI_UNSPECIFIED_TIMEZONE;
 
        if (capabilities) {
@@ -347,8 +351,17 @@ static efi_status_t EFIAPI efi_set_time_boottime(struct efi_time *time)
        tm.tm_hour = time->hour;
        tm.tm_min = time->minute;
        tm.tm_sec = time->second;
-       tm.tm_isdst = time->daylight ==
-                     (EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT);
+       switch (time->daylight) {
+       case EFI_TIME_ADJUST_DAYLIGHT:
+               tm.tm_isdst = 0;
+               break;
+       case EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT:
+               tm.tm_isdst = 1;
+               break;
+       default:
+               tm.tm_isdst = -1;
+               break;
+       }
        /* Calculate day of week */
        rtc_calc_weekday(&tm);