]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Library/BaseCryptLib/SysCall/TimerWrapper.c
CryptoPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / TimerWrapper.c
CommitLineData
97f98500
HT
1/** @file\r
2 C Run-Time Libraries (CRT) Time Management Routines Wrapper Implementation\r
3 for OpenSSL-based Cryptographic Library (used in DXE & RUNTIME).\r
4\r
ab187ae2 5Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
2009f6b4 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
97f98500
HT
7\r
8**/\r
9\r
10#include <Uefi.h>\r
fc9fa685 11#include <CrtLibSupport.h>\r
97f98500
HT
12#include <Library/UefiRuntimeServicesTableLib.h>\r
13\r
14//\r
15// -- Time Management Routines --\r
16//\r
17\r
18#define IsLeap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))\r
b7d320f8 19#define SECSPERMIN (60)\r
97f98500
HT
20#define SECSPERHOUR (60 * 60)\r
21#define SECSPERDAY (24 * SECSPERHOUR)\r
22\r
23//\r
24// The arrays give the cumulative number of days up to the first of the\r
25// month number used as the index (1 -> 12) for regular and leap years.\r
26// The value at index 13 is for the whole year.\r
27//\r
28UINTN CumulativeDays[2][14] = {\r
29 {\r
30 0,\r
31 0,\r
32 31,\r
33 31 + 28,\r
34 31 + 28 + 31,\r
35 31 + 28 + 31 + 30,\r
36 31 + 28 + 31 + 30 + 31,\r
37 31 + 28 + 31 + 30 + 31 + 30,\r
38 31 + 28 + 31 + 30 + 31 + 30 + 31,\r
39 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,\r
40 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,\r
41 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,\r
42 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,\r
43 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31\r
44 },\r
45 {\r
46 0,\r
47 0,\r
48 31,\r
49 31 + 29,\r
50 31 + 29 + 31,\r
51 31 + 29 + 31 + 30,\r
52 31 + 29 + 31 + 30 + 31,\r
53 31 + 29 + 31 + 30 + 31 + 30,\r
54 31 + 29 + 31 + 30 + 31 + 30 + 31,\r
55 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31,\r
56 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30,\r
57 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,\r
58 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,\r
630f67dd 59 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31\r
97f98500
HT
60 }\r
61};\r
62\r
63/* Get the system time as seconds elapsed since midnight, January 1, 1970. */\r
64//INTN time(\r
65// INTN *timer\r
66// )\r
67time_t time (time_t *timer)\r
68{\r
ab187ae2
LQ
69 EFI_STATUS Status;\r
70 EFI_TIME Time;\r
71 time_t CalTime;\r
72 UINTN Year;\r
97f98500
HT
73\r
74 //\r
75 // Get the current time and date information\r
76 //\r
ab187ae2
LQ
77 Status = gRT->GetTime (&Time, NULL);\r
78 if (EFI_ERROR (Status) || (Time.Year < 1970)) {\r
79 return 0;\r
80 }\r
97f98500
HT
81\r
82 //\r
83 // Years Handling\r
84 // UTime should now be set to 00:00:00 on Jan 1 of the current year.\r
85 //\r
5e2318dd
JW
86 for (Year = 1970, CalTime = 0; Year != Time.Year; Year++) {\r
87 CalTime = CalTime + (time_t)(CumulativeDays[IsLeap(Year)][13] * SECSPERDAY);\r
97f98500
HT
88 }\r
89\r
90 //\r
91 // Add in number of seconds for current Month, Day, Hour, Minute, Seconds, and TimeZone adjustment\r
92 //\r
630f67dd 93 CalTime = CalTime +\r
5e2318dd 94 (time_t)((Time.TimeZone != EFI_UNSPECIFIED_TIMEZONE) ? (Time.TimeZone * 60) : 0) +\r
630f67dd
LG
95 (time_t)(CumulativeDays[IsLeap(Time.Year)][Time.Month] * SECSPERDAY) +\r
96 (time_t)(((Time.Day > 0) ? Time.Day - 1 : 0) * SECSPERDAY) +\r
97 (time_t)(Time.Hour * SECSPERHOUR) +\r
98 (time_t)(Time.Minute * 60) +\r
5e2318dd
JW
99 (time_t)Time.Second;\r
100\r
101 if (timer != NULL) {\r
102 *timer = CalTime;\r
103 }\r
104\r
105 return CalTime;\r
97f98500 106}\r
b7d320f8 107\r
108//\r
109// Convert a time value from type time_t to struct tm.\r
110//\r
111struct tm * gmtime (const time_t *timer)\r
112{\r
113 struct tm *GmTime;\r
114 UINT16 DayNo;\r
115 UINT16 DayRemainder;\r
116 time_t Year;\r
117 time_t YearNo;\r
118 UINT16 TotalDays;\r
119 UINT16 MonthNo;\r
120\r
121 if (timer == NULL) {\r
122 return NULL;\r
123 }\r
124\r
125 GmTime = malloc (sizeof (struct tm));\r
126 if (GmTime == NULL) {\r
127 return NULL;\r
128 }\r
129\r
130 ZeroMem ((VOID *) GmTime, (UINTN) sizeof (struct tm));\r
131\r
132 DayNo = (UINT16) (*timer / SECSPERDAY);\r
133 DayRemainder = (UINT16) (*timer % SECSPERDAY);\r
134\r
135 GmTime->tm_sec = (int) (DayRemainder % SECSPERMIN);\r
136 GmTime->tm_min = (int) ((DayRemainder % SECSPERHOUR) / SECSPERMIN);\r
137 GmTime->tm_hour = (int) (DayRemainder / SECSPERHOUR);\r
138 GmTime->tm_wday = (int) ((DayNo + 4) % 7);\r
139\r
140 for (Year = 1970, YearNo = 0; DayNo > 0; Year++) {\r
141 TotalDays = (UINT16) (IsLeap (Year) ? 366 : 365);\r
142 if (DayNo >= TotalDays) {\r
143 DayNo = (UINT16) (DayNo - TotalDays);\r
144 YearNo++;\r
145 } else {\r
146 break;\r
147 }\r
148 }\r
149\r
150 GmTime->tm_year = (int) (YearNo + (1970 - 1900));\r
151 GmTime->tm_yday = (int) DayNo;\r
152\r
153 for (MonthNo = 12; MonthNo > 1; MonthNo--) {\r
04a3cfa7 154 if (DayNo >= CumulativeDays[IsLeap(Year)][MonthNo]) {\r
b7d320f8 155 DayNo = (UINT16) (DayNo - (UINT16) (CumulativeDays[IsLeap(Year)][MonthNo]));\r
156 break;\r
157 }\r
158 }\r
159\r
04a3cfa7
GCPL
160 GmTime->tm_mon = (int) MonthNo - 1;\r
161 GmTime->tm_mday = (int) DayNo + 1;\r
b7d320f8 162\r
163 GmTime->tm_isdst = 0;\r
164 GmTime->tm_gmtoff = 0;\r
165 GmTime->tm_zone = NULL;\r
166\r
167 return GmTime;\r
168}\r