/** @file | |
* | |
* Copyright (c) 2016, Hisilicon Limited. All rights reserved. | |
* Copyright (c) 2016-2019, Linaro Limited. All rights reserved. | |
* Copyright (c) 2021, Ampere Computing LLC. 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) | |
/** | |
Check if it is a leap year. | |
@param Time The UEFI time to be checked. | |
@retval TRUE It is a leap year. | |
@retval FALSE It is NOT a leap year. | |
**/ | |
BOOLEAN | |
EFIAPI | |
IsLeapYear ( | |
IN EFI_TIME *Time | |
); | |
/** | |
Check if the day in the UEFI time is valid. | |
@param Time The UEFI time to be checked. | |
@retval TRUE Valid. | |
@retval FALSE Invalid. | |
**/ | |
BOOLEAN | |
EFIAPI | |
IsDayValid ( | |
IN EFI_TIME *Time | |
); | |
/** | |
Check if the time zone is valid. | |
Valid values are between -1440 and 1440 or 2047 (EFI_UNSPECIFIED_TIMEZONE). | |
@param TimeZone The time zone to be checked. | |
@retval TRUE Valid. | |
@retval FALSE Invalid. | |
**/ | |
BOOLEAN | |
EFIAPI | |
IsValidTimeZone ( | |
IN INT16 TimeZone | |
); | |
/** | |
Check if the daylight is valid. | |
Valid values are: | |
0 : Time is not affected. | |
1 : Time is affected, and has not been adjusted for daylight savings. | |
3 : Time is affected, and has been adjusted for daylight savings. | |
All other values are invalid. | |
@param Daylight The daylight to be checked. | |
@retval TRUE Valid. | |
@retval FALSE Invalid. | |
**/ | |
BOOLEAN | |
EFIAPI | |
IsValidDaylight ( | |
IN INT8 Daylight | |
); | |
/** | |
Check if the UEFI time is valid. | |
@param Time The UEFI time to be checked. | |
@retval TRUE Valid. | |
@retval FALSE Invalid. | |
**/ | |
BOOLEAN | |
EFIAPI | |
IsTimeValid ( | |
IN EFI_TIME *Time | |
); | |
/** | |
Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME. | |
@param EpochSeconds Epoch seconds. | |
@param Time The time converted to UEFI format. | |
**/ | |
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). | |
@param Time The UEFI time to be converted. | |
@return Number of seconds. | |
**/ | |
UINTN | |
EFIAPI | |
EfiTimeToEpoch ( | |
IN EFI_TIME *Time | |
); | |
/** | |
Get the day of the week from the UEFI time. | |
@param Time The UEFI time to be calculated. | |
@return The day of the week: Sunday=0, Monday=1, ... Saturday=6 | |
**/ | |
UINTN | |
EfiTimeToWday ( | |
IN EFI_TIME *Time | |
); | |
#endif |