1 /** @file
2 Common library assistance routines.
3 
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #ifndef _EFI_COMMON_LIB_H
10 #define _EFI_COMMON_LIB_H
11 
12 #include <Common/UefiBaseTypes.h>
13 #include <Common/BuildVersion.h>
14 #include <assert.h>
15 #ifndef _WIN32
16 #include <limits.h>
17 #endif
18 
19 #define PRINTED_GUID_BUFFER_SIZE  37  // including null-termination
20 
21 #ifdef PATH_MAX
22 #define MAX_LONG_FILE_PATH PATH_MAX
23 #else
24 #define MAX_LONG_FILE_PATH 500
25 #endif
26 
27 #define MAX_UINT64 ((UINT64)0xFFFFFFFFFFFFFFFFULL)
28 #define MAX_UINT32 ((UINT32)0xFFFFFFFF)
29 #define MAX_UINT16  ((UINT16)0xFFFF)
30 #define MAX_UINT8   ((UINT8)0xFF)
31 #define ARRAY_SIZE(Array) (sizeof (Array) / sizeof ((Array)[0]))
32 #define ASCII_RSIZE_MAX 1000000
33 #undef RSIZE_MAX
34 #define RSIZE_MAX 1000000
35 
36 #define IS_COMMA(a)                ((a) == L',')
37 #define IS_HYPHEN(a)               ((a) == L'-')
38 #define IS_DOT(a)                  ((a) == L'.')
39 #define IS_LEFT_PARENTH(a)         ((a) == L'(')
40 #define IS_RIGHT_PARENTH(a)        ((a) == L')')
41 #define IS_SLASH(a)                ((a) == L'/')
42 #define IS_NULL(a)                 ((a) == L'\0')
43 
44 #define ASSERT(x) assert(x)
45 
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49 
50 //
51 // Function declarations
52 //
53 VOID
54 PeiZeroMem (
55   IN VOID   *Buffer,
56   IN UINTN  Size
57   )
58 ;
59 
60 VOID
61 PeiCopyMem (
62   IN VOID   *Destination,
63   IN VOID   *Source,
64   IN UINTN  Length
65   )
66 ;
67 
68 VOID
69 ZeroMem (
70   IN VOID   *Buffer,
71   IN UINTN  Size
72   )
73 ;
74 
75 VOID
76 CopyMem (
77   IN VOID   *Destination,
78   IN VOID   *Source,
79   IN UINTN  Length
80   )
81 ;
82 
83 INTN
84 CompareGuid (
85   IN EFI_GUID     *Guid1,
86   IN EFI_GUID     *Guid2
87   )
88 ;
89 
90 EFI_STATUS
91 GetFileImage (
92   IN CHAR8    *InputFileName,
93   OUT CHAR8   **InputFileImage,
94   OUT UINT32  *BytesRead
95   )
96 ;
97 
98 EFI_STATUS
99 PutFileImage (
100   IN CHAR8    *OutputFileName,
101   IN CHAR8    *OutputFileImage,
102   IN UINT32   BytesToWrite
103   )
104 ;
105 /*++
106 
107 Routine Description:
108 
109   This function opens a file and writes OutputFileImage into the file.
110 
111 Arguments:
112 
113   OutputFileName     The name of the file to write.
114   OutputFileImage    A pointer to the memory buffer.
115   BytesToWrite       The size of the memory buffer.
116 
117 Returns:
118 
119   EFI_SUCCESS              The function completed successfully.
120   EFI_INVALID_PARAMETER    One of the input parameters was invalid.
121   EFI_ABORTED              An error occurred.
122   EFI_OUT_OF_RESOURCES     No resource to complete operations.
123 
124 **/
125 
126 UINT8
127 CalculateChecksum8 (
128   IN UINT8        *Buffer,
129   IN UINTN        Size
130   )
131 ;
132 
133 UINT8
134 CalculateSum8 (
135   IN UINT8        *Buffer,
136   IN UINTN        Size
137   )
138 ;
139 
140 UINT16
141 CalculateChecksum16 (
142   IN UINT16       *Buffer,
143   IN UINTN        Size
144   )
145 ;
146 
147 UINT16
148 CalculateSum16 (
149   IN UINT16       *Buffer,
150   IN UINTN        Size
151   )
152 ;
153 
154 EFI_STATUS
155 PrintGuid (
156   IN EFI_GUID                     *Guid
157   )
158 ;
159 
160 #define PRINTED_GUID_BUFFER_SIZE  37  // including null-termination
161 EFI_STATUS
162 PrintGuidToBuffer (
163   IN EFI_GUID     *Guid,
164   IN OUT UINT8    *Buffer,
165   IN UINT32       BufferLen,
166   IN BOOLEAN      Uppercase
167   )
168 ;
169 
170 CHAR8 *
171 LongFilePath (
172  IN CHAR8 *FileName
173 );
174 
175 UINTN
176 StrLen (
177   CONST CHAR16   *String
178   );
179 
180 VOID *
181 AllocateCopyPool (
182   UINTN       AllocationSize,
183   CONST VOID  *Buffer
184   );
185 
186 INTN
187 StrnCmp (
188   CONST CHAR16              *FirstString,
189   CONST CHAR16              *SecondString,
190   UINTN                     Length
191   );
192 
193 RETURN_STATUS
194 StrToGuid (
195   CONST CHAR16       *String,
196   EFI_GUID               *Guid
197   );
198 
199 RETURN_STATUS
200 StrHexToBytes (
201   CONST CHAR16       *String,
202   UINTN              Length,
203   UINT8              *Buffer,
204   UINTN              MaxBufferSize
205   );
206 
207 UINTN
208 InternalHexCharToUintn (
209   CHAR16                    Char
210   );
211 
212 VOID *
213 InternalAllocateCopyPool (
214    UINTN            AllocationSize,
215    CONST VOID       *Buffer
216   );
217 
218 BOOLEAN
219 InternalIsDecimalDigitCharacter (
220         CHAR16                    Char
221   );
222 
223 UINT32
224 SwapBytes32 (
225         UINT32                    Value
226   );
227 
228 UINT16
229 SwapBytes16 (
230         UINT16                    Value
231   );
232 
233 EFI_GUID *
234 CopyGuid (
235    EFI_GUID       *DestinationGuid,
236    CONST EFI_GUID  *SourceGuid
237   );
238 
239 UINT64
240 WriteUnaligned64 (
241    UINT64                    *Buffer,
242    UINT64                    Value
243   );
244 
245 UINT64
246 ReadUnaligned64 (
247    CONST UINT64              *Buffer
248   );
249 
250 UINTN
251 StrSize (
252   CONST CHAR16              *String
253   );
254 
255 UINT64
256 StrHexToUint64 (
257   CONST CHAR16             *String
258   );
259 
260 UINT64
261 StrDecimalToUint64 (
262   CONST CHAR16              *String
263   );
264 
265 RETURN_STATUS
266 StrHexToUint64S (
267     CONST CHAR16       *String,
268     CHAR16             **EndPointer,
269     UINT64             *Data
270   );
271 
272 RETURN_STATUS
273 StrDecimalToUint64S (
274     CONST CHAR16             *String,
275          CHAR16             **EndPointer,  OPTIONAL
276          UINT64             *Data
277   );
278 
279 VOID *
280 ReallocatePool (
281    UINTN  OldSize,
282    UINTN  NewSize,
283    VOID   *OldBuffer  OPTIONAL
284   );
285 
286 VOID *
287 InternalReallocatePool (
288    UINTN            OldSize,
289    UINTN            NewSize,
290    VOID             *OldBuffer  OPTIONAL
291   );
292 
293 VOID *
294 InternalAllocateZeroPool (
295    UINTN            AllocationSize
296   ) ;
297 
298 VOID *
299 InternalAllocatePool (
300    UINTN            AllocationSize
301   );
302 
303 UINTN
304 StrnLenS (
305    CONST CHAR16              *String,
306    UINTN                     MaxSize
307   );
308 
309 CHAR16
310 InternalCharToUpper (
311         CHAR16                    Char
312   );
313 
314 INTN
315 StrCmp (
316   CONST CHAR16              *FirstString,
317   CONST CHAR16              *SecondString
318   );
319 
320 UINT64
321 SwapBytes64 (
322   UINT64                    Value
323   );
324 
325 UINT64
326 InternalMathSwapBytes64 (
327   UINT64                    Operand
328   );
329 
330 RETURN_STATUS
331 StrToIpv4Address (
332   CONST CHAR16       *String,
333   CHAR16             **EndPointer,
334   EFI_IPv4_ADDRESS       *Address,
335   UINT8              *PrefixLength
336   );
337 
338 RETURN_STATUS
339 StrToIpv6Address (
340   CONST CHAR16       *String,
341   CHAR16             **EndPointer,
342   EFI_IPv6_ADDRESS       *Address,
343   UINT8              *PrefixLength
344   );
345 
346 RETURN_STATUS
347 StrCpyS (
348   CHAR16       *Destination,
349   UINTN        DestMax,
350   CONST CHAR16 *Source
351   );
352 
353 RETURN_STATUS
354 UnicodeStrToAsciiStrS (
355   CONST CHAR16              *Source,
356   CHAR8                     *Destination,
357   UINTN                     DestMax
358   );
359 VOID *
360 AllocatePool (
361   UINTN  AllocationSize
362   );
363 
364 UINT16
365 WriteUnaligned16 (
366   UINT16                    *Buffer,
367   UINT16                    Value
368   );
369 
370 UINT16
371 ReadUnaligned16 (
372   CONST UINT16              *Buffer
373   );
374 
375 VOID *
376 AllocateZeroPool (
377   UINTN  AllocationSize
378   );
379 
380 BOOLEAN
381 InternalIsHexaDecimalDigitCharacter (
382   CHAR16                    Char
383   );
384 
385 BOOLEAN
386 InternalSafeStringIsOverlap (
387   IN VOID    *Base1,
388   IN UINTN   Size1,
389   IN VOID    *Base2,
390   IN UINTN   Size2
391   );
392 
393 BOOLEAN
394 InternalSafeStringNoStrOverlap (
395   IN CHAR16  *Str1,
396   IN UINTN   Size1,
397   IN CHAR16  *Str2,
398   IN UINTN   Size2
399   );
400 
401 BOOLEAN
402 IsHexStr (
403    CHAR16   *Str
404   );
405 
406 UINTN
407 Strtoi (
408    CHAR16  *Str
409   );
410 
411 VOID
412 Strtoi64 (
413     CHAR16  *Str,
414    UINT64  *Data
415   );
416 
417 VOID
418 StrToAscii (
419        CHAR16 *Str,
420     CHAR8  **AsciiStr
421   );
422 
423 CHAR16 *
424 SplitStr (
425     CHAR16 **List,
426        CHAR16 Separator
427   );
428 
429 /*++
430 
431 Routine Description:
432   Convert FileName to the long file path, which can support larger than 260 length.
433 
434 Arguments:
435   FileName         - FileName.
436 
437 Returns:
438   LongFilePath      A pointer to the converted long file path.
439 
440 --*/
441 
442 #ifdef __cplusplus
443 }
444 #endif
445 
446 #ifdef __GNUC__
447 #include <stdio.h>
448 #include <sys/stat.h>
449 #define stricmp strcasecmp
450 #define _stricmp strcasecmp
451 #define strnicmp strncasecmp
452 #define strcmpi strcasecmp
453 size_t _filelength(int fd);
454 #ifndef __CYGWIN__
455 char *strlwr(char *s);
456 #endif
457 #endif
458 
459 //
460 // On windows, mkdir only has one parameter.
461 // On unix, it has two parameters
462 //
463 #if defined(__GNUC__)
464 #define mkdir(dir, perm) mkdir(dir, perm)
465 #else
466 #define mkdir(dir, perm) mkdir(dir)
467 #endif
468 
469 #endif
470