]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.c
ArmPkg/PlatformBootManagerLib: load platform boot options
[mirror_edk2.git] / EmbeddedPkg / Library / TimeBaseLib / TimeBaseLib.c
CommitLineData
b4895995
LL
1/** @file\r
2*\r
3* Copyright (c) 2016, Hisilicon Limited. All rights reserved.\r
4* Copyright (c) 2016, Linaro Limited. All rights reserved.\r
5*\r
6* This program and the accompanying materials\r
7* are licensed and made available under the terms and conditions of the BSD License\r
8* which accompanies this distribution. The full text of the license may be found at\r
9* http://opensource.org/licenses/bsd-license.php\r
10*\r
11* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13*\r
14**/\r
15\r
16#include <Uefi/UefiBaseType.h>\r
17#include <Uefi/UefiSpec.h>\r
18#include <Library/DebugLib.h>\r
19#include <Library/TimeBaseLib.h>\r
20\r
21/**\r
22 Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to EFI_TIME\r
23 **/\r
24VOID\r
25EFIAPI\r
26EpochToEfiTime (\r
27 IN UINTN EpochSeconds,\r
28 OUT EFI_TIME *Time\r
29 )\r
30{\r
31 UINTN a;\r
32 UINTN b;\r
33 UINTN c;\r
34 UINTN d;\r
35 UINTN g;\r
36 UINTN j;\r
37 UINTN m;\r
38 UINTN y;\r
39 UINTN da;\r
40 UINTN db;\r
41 UINTN dc;\r
42 UINTN dg;\r
43 UINTN hh;\r
44 UINTN mm;\r
45 UINTN ss;\r
46 UINTN J;\r
47\r
48 J = (EpochSeconds / 86400) + 2440588;\r
49 j = J + 32044;\r
50 g = j / 146097;\r
51 dg = j % 146097;\r
52 c = (((dg / 36524) + 1) * 3) / 4;\r
53 dc = dg - (c * 36524);\r
54 b = dc / 1461;\r
55 db = dc % 1461;\r
56 a = (((db / 365) + 1) * 3) / 4;\r
57 da = db - (a * 365);\r
58 y = (g * 400) + (c * 100) + (b * 4) + a;\r
59 m = (((da * 5) + 308) / 153) - 2;\r
60 d = da - (((m + 4) * 153) / 5) + 122;\r
61\r
62 Time->Year = y - 4800 + ((m + 2) / 12);\r
63 Time->Month = ((m + 2) % 12) + 1;\r
64 Time->Day = d + 1;\r
65\r
66 ss = EpochSeconds % 60;\r
67 a = (EpochSeconds - ss) / 60;\r
68 mm = a % 60;\r
69 b = (a - mm) / 60;\r
70 hh = b % 24;\r
71\r
72 Time->Hour = hh;\r
73 Time->Minute = mm;\r
74 Time->Second = ss;\r
75 Time->Nanosecond = 0;\r
76\r
77}\r
78\r
79/**\r
80 Converts EFI_TIME to Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC)\r
81 **/\r
82UINTN\r
83EFIAPI\r
84EfiTimeToEpoch (\r
85 IN EFI_TIME *Time\r
86 )\r
87{\r
88 UINTN a;\r
89 UINTN y;\r
90 UINTN m;\r
91 UINTN JulianDate; // Absolute Julian Date representation of the supplied Time\r
92 UINTN EpochDays; // Number of days elapsed since EPOCH_JULIAN_DAY\r
93 UINTN EpochSeconds;\r
94\r
95 a = (14 - Time->Month) / 12 ;\r
96 y = Time->Year + 4800 - a;\r
97 m = Time->Month + (12*a) - 3;\r
98\r
99 JulianDate = Time->Day + ((153*m + 2)/5) + (365*y) + (y/4) - (y/100) + (y/400) - 32045;\r
100\r
101 ASSERT (JulianDate >= EPOCH_JULIAN_DATE);\r
102 EpochDays = JulianDate - EPOCH_JULIAN_DATE;\r
103\r
104 EpochSeconds = (EpochDays * SEC_PER_DAY) + ((UINTN)Time->Hour * SEC_PER_HOUR) + (Time->Minute * SEC_PER_MIN) + Time->Second;\r
105\r
106 return EpochSeconds;\r
107}\r
108\r
109BOOLEAN\r
110EFIAPI\r
111IsLeapYear (\r
112 IN EFI_TIME *Time\r
113 )\r
114{\r
115 if (Time->Year % 4 == 0) {\r
116 if (Time->Year % 100 == 0) {\r
117 if (Time->Year % 400 == 0) {\r
118 return TRUE;\r
119 } else {\r
120 return FALSE;\r
121 }\r
122 } else {\r
123 return TRUE;\r
124 }\r
125 } else {\r
126 return FALSE;\r
127 }\r
128}\r
129\r
130BOOLEAN\r
131EFIAPI\r
132IsDayValid (\r
133 IN EFI_TIME *Time\r
134 )\r
135{\r
136 STATIC CONST INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };\r
137\r
138 if (Time->Day < 1 ||\r
139 Time->Day > DayOfMonth[Time->Month - 1] ||\r
140 (Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28))\r
141 ) {\r
142 return FALSE;\r
143 }\r
144\r
145 return TRUE;\r
146}\r
147\r
148BOOLEAN\r
149EFIAPI\r
150IsTimeValid(\r
151 IN EFI_TIME *Time\r
152 )\r
153{\r
154 // Check the input parameters are within the range specified by UEFI\r
155 if ((Time->Year < 2000) ||\r
156 (Time->Year > 2099) ||\r
157 (Time->Month < 1 ) ||\r
158 (Time->Month > 12 ) ||\r
159 (!IsDayValid (Time) ) ||\r
160 (Time->Hour > 23 ) ||\r
161 (Time->Minute > 59 ) ||\r
162 (Time->Second > 59 ) ||\r
163 (Time->Nanosecond > 999999999) ||\r
164 (!((Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) || ((Time->TimeZone >= -1440) && (Time->TimeZone <= 1440)))) ||\r
165 (Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT)))\r
166 ) {\r
167 return FALSE;\r
168 }\r
169\r
170 return TRUE;\r
171}\r