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