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