EfiTimeToEpoch() calls EfiGetEpochDays() internally, which (reasonably) returns a UINTN. But then EfiTimeToEpoch() truncates the EfiGetEpochDays() retval to UINT32 for no good reason, effectively restricting Time->Year under 2106. This truncation was pointed out with a valid warning (= build error) by VS2019. Allow EfiTimeToEpoch() to return / propagate a UINTN value. Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20201221113657.6779-3-lersek@redhat.com> Acked-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| *
 | |
| *  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
 | |
| *  Copyright (c) 2016-2019, Linaro Limited. All rights reserved.
 | |
| *
 | |
| *  SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| *
 | |
| **/
 | |
| 
 | |
| #ifndef _TIME_BASE_LIB_H_
 | |
| #define _TIME_BASE_LIB_H_
 | |
| 
 | |
| #include <Uefi/UefiBaseType.h>
 | |
| 
 | |
| //
 | |
| // Convenience macros to obtain a build date
 | |
| //
 | |
| // These macros should work for any compiler that follows ISO/IEC 9899,
 | |
| // in which case __DATE__ is defined as a "Mmm dd yyyy" 11 chars string,
 | |
| // but add an explicit filter for compilers that have been validated.
 | |
| //
 | |
| #if (defined(__GNUC__) || defined(_MSC_VER) || defined(__clang__))
 | |
| #define TIME_BUILD_YEAR  (__DATE__[7] == '?' ? 1900 \
 | |
|           : (((__DATE__[7] - '0') * 1000 )          \
 | |
|           + (__DATE__[8] - '0') * 100               \
 | |
|           + (__DATE__[9] - '0') * 10                \
 | |
|           + __DATE__[10] - '0'))
 | |
| #define TIME_BUILD_MONTH ( __DATE__ [2] == '?' ? 1  \
 | |
|           : __DATE__ [2] == 'n' ? (                 \
 | |
|             __DATE__ [1] == 'a' ? 1 : 6)            \
 | |
|           : __DATE__ [2] == 'b' ? 2                 \
 | |
|           : __DATE__ [2] == 'r' ? (                 \
 | |
|             __DATE__ [0] == 'M' ? 3 : 4)            \
 | |
|           : __DATE__ [2] == 'y' ? 5                 \
 | |
|           : __DATE__ [2] == 'l' ? 7                 \
 | |
|           : __DATE__ [2] == 'g' ? 8                 \
 | |
|           : __DATE__ [2] == 'p' ? 9                 \
 | |
|           : __DATE__ [2] == 't' ? 10                \
 | |
|           : __DATE__ [2] == 'v' ? 11                \
 | |
|           : 12)
 | |
| #define TIME_BUILD_DAY ( __DATE__[4] == '?' ? 1     \
 | |
|           : ((__DATE__[4] == ' ' ? 0 :              \
 | |
|             ((__DATE__[4] - '0') * 10))             \
 | |
|           + __DATE__[5] - '0'))
 | |
| #endif
 | |
| 
 | |
| // Define EPOCH (1970-JANUARY-01) in the Julian Date representation
 | |
| #define EPOCH_JULIAN_DATE                               2440588
 | |
| 
 | |
| // Seconds per unit
 | |
| #define SEC_PER_MIN                                     ((UINTN)    60)
 | |
| #define SEC_PER_HOUR                                    ((UINTN)  3600)
 | |
| #define SEC_PER_DAY                                     ((UINTN) 86400)
 | |
| 
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| IsLeapYear (
 | |
|   IN  EFI_TIME  *Time
 | |
|   );
 | |
| 
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| IsDayValid (
 | |
|   IN  EFI_TIME  *Time
 | |
|   );
 | |
| 
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| IsTimeValid (
 | |
|   IN  EFI_TIME  *Time
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME
 | |
|  **/
 | |
| VOID
 | |
| EFIAPI
 | |
| EpochToEfiTime (
 | |
|   IN  UINTN     EpochSeconds,
 | |
|   OUT EFI_TIME  *Time
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC)
 | |
|  **/
 | |
| UINTN
 | |
| EFIAPI
 | |
| EfiTimeToEpoch (
 | |
|   IN  EFI_TIME  *Time
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   returns Day of the week [0-6] 0=Sunday
 | |
|  **/
 | |
| UINTN
 | |
| EfiTimeToWday (
 | |
|   IN  EFI_TIME  *Time
 | |
|   );
 | |
| 
 | |
| #endif
 |