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