# @file DebugMacroDataSet.py # # Contains a debug macro test data set for verifying debug macros are # recognized and parsed properly. # # This data is automatically converted into test cases. Just add the new # data object here and run the tests. # # Copyright (c) Microsoft Corporation. All rights reserved. # SPDX-License-Identifier: BSD-2-Clause-Patent ## from .MacroTest import (NoSpecifierNoArgumentMacroTest, EqualSpecifierEqualArgumentMacroTest, MoreSpecifiersThanArgumentsMacroTest, LessSpecifiersThanArgumentsMacroTest, IgnoredSpecifiersMacroTest, SpecialParsingMacroTest, CodeSnippetMacroTest) # Ignore flake8 linter errors for lines that are too long (E501) # flake8: noqa: E501 # Data Set of DEBUG macros and expected results. # macro: A string representing a DEBUG macro. # result: A tuple with the following value representations. # [0]: Count of total formatting errors # [1]: Count of print specifiers found # [2]: Count of macro arguments found DEBUG_MACROS = [ ##################################################################### # Section: No Print Specifiers No Arguments ##################################################################### NoSpecifierNoArgumentMacroTest( r'', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_ERROR, "\\"));', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_EVENT, ""));', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_EVENT, "\n"));', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_EVENT, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"));', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_EVENT, "GCD:Initial GCD Memory Space Map\n"));', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_GCD, "GCD:Initial GCD Memory Space Map\n"));', (0, 0, 0) ), NoSpecifierNoArgumentMacroTest( r'DEBUG ((DEBUG_INFO, " Retuning TimerCnt Disabled\n"));', (0, 0, 0) ), ##################################################################### # Section: Equal Print Specifiers to Arguments ##################################################################### EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_INFO, "%d", Number));', (0, 1, 1) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReset(MediaId=0x%x)\n", This->Media->MediaId));', (0, 1, 1) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_INFO, " Retuning TimerCnt %dseconds\n", 2 * (Capability->TimerCount - 1)));', (0, 1, 1) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_ERROR, "UsbEnumerateNewDev: failed to reset port %d - %r\n", Port, Status));', (0, 2, 2) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_ERROR, "UsbEnumerateNewDev: failed to reset port %d - %r\n", Port, Status));', (0, 2, 2) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_INFO, "Find GPT Partition [0x%lx", PartitionEntryBuffer[Index].StartingLBA));', (0, 1, 1) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_ERROR, "Failed to locate gEdkiiBootLogo2ProtocolGuid Status = %r. No Progress bar support. \n", Status));', (0, 1, 1) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_LOAD, " (%s)", Image->ExitData));', (0, 1, 1) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_DISPATCH, "%a%r%s%lx%p%c%g", Ascii, Status, Unicode, Hex, Pointer, Character, Guid));', (0, 7, 7) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_INFO, "LoadCapsuleOnDisk - LoadRecoveryCapsule (%d) - %r\n", CapsuleInstance, Status));', (0, 2, 2) ), EqualSpecifierEqualArgumentMacroTest( r'DEBUG ((DEBUG_DISPATCH, "%a%r%s%lx%p%c%g%a%r%s%lx%p%c%g%a%r%s%lx%p%c%g%a%r%s%lx%p%c%g", Ascii, Status, Unicode, Hex, Pointer, Character, Guid, Ascii, Status, Unicode, Hex, Pointer, Character, Guid, Ascii, Status, Unicode, Hex, Pointer, Character, Guid, Ascii, Status, Unicode, Hex, Pointer, Character, Guid));', (0, 28, 28) ), ##################################################################### # Section: More Print Specifiers Than Arguments ##################################################################### MoreSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_BLKIO, "NorFlashBlockIoReadBlocks(MediaId=0x%x, Lba=%ld, BufferSize=0x%x bytes (%d kB), BufferPtr @ 0x%08x)\n", MediaId, Lba, BufferSizeInBytes, Buffer));', (1, 5, 4) ), MoreSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_INFO, "%a: Request=%s\n", __func__));', (1, 2, 1) ), MoreSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_ERROR, "%a: Invalid request format %d for %d\n", CertFormat, CertRequest));', (1, 3, 2) ), ##################################################################### # Section: Less Print Specifiers Than Arguments ##################################################################### LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_INFO, "Find GPT Partition [0x%lx", PartitionEntryBuffer[Index].StartingLBA, BlockDevPtr->LastBlock));', (1, 1, 2) ), LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_INFO, " Retuning TimerCnt Disabled\n", 2 * (Capability->TimerCount - 1)));', (1, 0, 1) ), LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_ERROR, "Failed to locate gEdkiiBootLogo2ProtocolGuid. No Progress bar support. \n", Status));', (1, 0, 1) ), LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_ERROR, "UsbEnumeratePort: Critical Over Current\n", Port));', (1, 0, 1) ), LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_ERROR, "[TPM2] Submit PP Request failure! Sync PPRQ/PPRM with PP variable.\n", Status));', (1, 0, 1) ), LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_ERROR, ": Failed to update debug log index file: %r !\n", __func__, Status));', (1, 1, 2) ), LessSpecifiersThanArgumentsMacroTest( r'DEBUG ((DEBUG_ERROR, "%a - Failed to extract nonce from policy blob with return status %r\n", __func__, gPolicyBlobFieldName[MFCI_POLICY_TARGET_NONCE], Status));', (1, 2, 3) ), ##################################################################### # Section: Macros with Ignored Specifiers ##################################################################### IgnoredSpecifiersMacroTest( r'DEBUG ((DEBUG_INIT, "%HEmuOpenBlock: opened %a%N\n", Private->Filename));', (0, 1, 1) ), IgnoredSpecifiersMacroTest( r'DEBUG ((DEBUG_LOAD, " (%hs)", Image->ExitData));', (0, 1, 1) ), IgnoredSpecifiersMacroTest( r'DEBUG ((DEBUG_LOAD, "%H%s%N: Unknown flag - ''%H%s%N''\r\n", String1, String2));', (0, 2, 2) ), ##################################################################### # Section: Macros with Special Parsing Scenarios ##################################################################### SpecialParsingMacroTest( r'DEBUG ((DEBUG_INFO, " File Name: %a\n", "Document.txt"))', (0, 1, 1), "Malformatted Macro - Missing Semicolon" ), SpecialParsingMacroTest( r'DEBUG (DEBUG_INFO, " File Name: %a\n", "Document.txt");', (0, 0, 0), "Malformatted Macro - Missing Two Parentheses" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_INFO, "%a\n", "Removable Slot"));', (0, 1, 1), "Single String Argument in Quotes" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_INFO, " SDR50 Tuning %a\n", Capability->TuningSDR50 ? "TRUE" : "FALSE"));', (0, 1, 1), "Ternary Operator Present" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_INFO, " SDR50 Tuning %a\n", Capability->TuningSDR50 ? "TRUE" : "FALSE"));', (0, 1, 1), "Ternary Operator Present" ), SpecialParsingMacroTest( r''' DEBUG ((DEBUG_ERROR, "\\")); DEBUG ((DEBUG_ERROR, "\\")); DEBUG ((DEBUG_ERROR, "\\")); DEBUG ((DEBUG_ERROR, "\\")); ''', (0, 0, 0), "Multiple Macros with an Escaped Character" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_INFO, "UsbEnumerateNewDev: device uses translator (%d, %d)\n", Child->Translator.TranslatorHubAddress, Child->Translator.TranslatorPortNumber )); ''', (0, 2, 2), "Multi-line Macro" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_INFO, "UsbEnumeratePort: port %d state - %02x, change - %02x on %p\n", Port, PortState.PortStatus, PortState.PortChangeStatus, HubIf )); ''', (0, 4, 4), "Multi-line Macro" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, "%a:%a: failed to allocate reserved pages: " "BufferSize=%Lu LoadFile=\"%s\" FilePath=\"%s\"\n", gEfiCallerBaseName, __func__, (UINT64)BufferSize, LoadFileText, FileText )); ''', (0, 5, 5), "Multi-line Macro with Compiler String Concatenation" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, "ERROR: GTDT: GT Block Frame Info Structures %d and %d have the same " \ "frame number: 0x%x.\n", Index1, Index2, FrameNumber1 )); ''', (0, 3, 3), "Multi-line Macro with Backslash String Concatenation" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, "ERROR: PPTT: Too many private resources. Count = %d. " \ "Maximum supported Processor Node size exceeded. " \ "Token = %p. Status = %r\n", ProcInfoNode->NoOfPrivateResources, ProcInfoNode->ParentToken, Status )); ''', (0, 3, 3), "Multi-line Macro with Backslash String Concatenation" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_VERBOSE, "% 20a % 20a % 20a % 20a\n", "PhysicalStart(0x)", "PhysicalSize(0x)", "CpuStart(0x)", "RegionState(0x)" )); ''', (0, 4, 4), "Multi-line Macro with Quoted String Arguments" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, "XenPvBlk: " "%a error %d on %a at sector %Lx, num bytes %Lx\n", Response->operation == BLKIF_OP_READ ? "read" : "write", Status, IoData->Dev->NodeName, (UINT64)IoData->Sector, (UINT64)IoData->Size )); ''', (0, 5, 5), "Multi-line Macro with Ternary Operator and Quoted String Arguments" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, "%a: Label=\"%s\" OldParentNodeId=%Lu OldName=\"%a\" " "NewParentNodeId=%Lu NewName=\"%a\" Errno=%d\n", __func__, VirtioFs->Label, OldParentNodeId, OldName, NewParentNodeId, NewName, CommonResp.Error )); ''', (0, 7, 7), "Multi-line Macro with Escaped Quotes and String Concatenation" ), SpecialParsingMacroTest( r''' DEBUG ((DEBUG_WARN, "Failed to retrieve Variable:\"MebxData\", Status = %r\n", Status)); ''', (0, 1, 1), "Escaped Parentheses in Debug Message" ), SpecialParsingMacroTest( r''' DEBUG((DEBUG_INFO, "%0d %s", XbB_ddr4[1][bankBit][xorBit], xorBit == (XaB_NUM_OF_BITS-1) ? "]": ", ")); ''', (0, 2, 2), "Parentheses in Ternary Operator Expression" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_INFO | DEBUG_EVENT | DEBUG_WARN, " %u\n", &Structure->Block.Value));', (0, 1, 1), "Multiple Print Specifier Levels Present" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString()));', (0, 1, 1), "Function Call Argument No Params" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1)));', (0, 1, 1), "Function Call Argument 1 Param" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1, Param2)));', (0, 1, 1), "Function Call Argument Multiple Params" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1, ReturnParam())));', (0, 1, 1), "Function Call Argument 2-Level Depth No 2nd-Level Param" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1, ReturnParam(*Param))));', (0, 1, 1), "Function Call Argument 2-Level Depth 1 2nd-Level Param" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1, ReturnParam(*Param, &ParamNext))));', (0, 1, 1), "Function Call Argument 2-Level Depth Multiple 2nd-Level Param" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1, ReturnParam(*Param, GetParam(1, 2, 3)))));', (0, 1, 1), "Function Call Argument 3-Level Depth Multiple Params" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1, ReturnParam(*Param, GetParam(1, 2, 3), NextParam))));', (0, 1, 1), "Function Call Argument 3-Level Depth Multiple Params with Param After Function Call" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s-%a\n", ReturnString(&Param1), ReturnString2(&ParamN)));', (0, 2, 2), "Multiple Function Call Arguments" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ReturnString(&Param1), ReturnString2(&ParamN)));', (1, 1, 2), "Multiple Function Call Arguments with Imbalance" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s%s\n", (ReturnString(&Param1)), (ReturnString2(&ParamN))));', (0, 2, 2), "Multiple Function Call Arguments Surrounded with Parentheses" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, " %s\n", ((((ReturnString(&Param1)))))));', (0, 1, 1), "Multiple Function Call Arguments Surrounded with Many Parentheses" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, ""%B%08X%N: %-48a %V*%a*%N"", HexNumber, ReturnString(Array[Index]), &AsciiString[0]));', (0, 3, 3), "Complex String Print Specifier 1" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, "0x%-8x:%H%s%N % -64s(%73-.73s){%g}<%H% -70s%N>\n. Size: 0x%-16x (%-,d) bytes.\n\n", HexNumber, GetUnicodeString (), &UnicodeString[4], UnicodeString2, &Guid, AnotherUnicodeString, Struct.SomeSize, CommaDecimalValue));', (0, 8, 8), "Multiple Complex Print Specifiers 1" ), SpecialParsingMacroTest( r'DEBUG ((DEBUG_WARN, "0x%-8x:%H%s%N % -64s(%73-.73s){%g}<%H% -70s%N%r>\n. Size: 0x%-16x (%-,d) bytes.\n\n", HexNumber, GetUnicodeString (), &UnicodeString[4], UnicodeString2, &Guid, AnotherUnicodeString, Struct.SomeSize, CommaDecimalValue));', (1, 9, 8), "Multiple Complex Print Specifiers Imbalance 1" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, ("%a: Label=\"%s\" CanonicalPathname=\"%a\" FileName=\"%s\" " "OpenMode=0x%Lx Attributes=0x%Lx: nonsensical request to possibly " "create a file marked read-only, for read-write access\n"), __func__, VirtioFs->Label, VirtioFsFile->CanonicalPathname, FileName, OpenMode, Attributes )); ''', (0, 6, 6), "Multi-Line with Parentheses Around Debug String Compiler String Concat" ), SpecialParsingMacroTest( r''' DEBUG ( (DEBUG_INFO, " %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n", (UINTN)Index, (UINTN)LocalBbsTable[Index].BootPriority, (UINTN)LocalBbsTable[Index].Bus, (UINTN)LocalBbsTable[Index].Device, (UINTN)LocalBbsTable[Index].Function, (UINTN)LocalBbsTable[Index].Class, (UINTN)LocalBbsTable[Index].SubClass, (UINTN)LocalBbsTable[Index].DeviceType, (UINTN)*(UINT16 *)&LocalBbsTable[Index].StatusFlags, (UINTN)LocalBbsTable[Index].BootHandlerSegment, (UINTN)LocalBbsTable[Index].BootHandlerOffset, (UINTN)((LocalBbsTable[Index].MfgStringSegment << 4) + LocalBbsTable[Index].MfgStringOffset), (UINTN)((LocalBbsTable[Index].DescStringSegment << 4) + LocalBbsTable[Index].DescStringOffset)) ); ''', (1, 11, 13), "Multi-line Macro with Many Arguments And Multi-Line Parentheses" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_WARN, "0x%-8x:%H%s%N % -64s(%73-.73s){%g}<%H% -70s%N>\n. Size: 0x%-16x (%-,d) bytes.\n\n", HexNumber, GetUnicodeString (InnerFunctionCall(Arg1, &Arg2)), &UnicodeString[4], UnicodeString2, &Guid, AnotherUnicodeString, Struct.SomeSize, CommaDecimalValue )); ''', (0, 8, 8), "Multi-line Macro with Multiple Complex Print Specifiers 1 and 2-Depth Function Calls" ), SpecialParsingMacroTest( r''' DEBUG ( (DEBUG_NET, "TcpFastRecover: enter fast retransmission for TCB %p, recover point is %d\n", Tcb, Tcb->Recover) ); ''', (0, 2, 2), "Multi-line Macro with Parentheses Separated" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_VERBOSE, "%a: APIC ID " FMT_APIC_ID " was hot-plugged " "before; ignoring it\n", __func__, NewApicId )); ''', (1, 1, 2), "Multi-line Imbalanced Macro with Indented String Concatenation" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_VERBOSE, "%a: APIC ID was hot-plugged - %a", __func__, "String with , inside" )); ''', (0, 2, 2), "Multi-line with Quoted String Argument Containing Comma" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_VERBOSE, "%a: APIC ID was hot-plugged - %a", __func__, "St,ring, with , ins,ide" )); ''', (0, 2, 2), "Multi-line with Quoted String Argument Containing Multiple Commas" ), SpecialParsingMacroTest( r''' DEBUG ((DEBUG_VERBOSE, "%a: APIC ID was hot-plugged, \"%a\"", __func__, "S\"t,\"ring, with , ins,i\"de")); ''', (0, 2, 2), "Quoted String Argument with Escaped Quotes and Multiple Commas" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_ERROR, "%a: AddProcessor(" FMT_APIC_ID "): %r\n", __func__, Status )); ''', (0, 2, 2), "Quoted Parenthesized String Inside Debug Message String" ), SpecialParsingMacroTest( r''' DEBUG (( DEBUG_INFO, "%a: hot-added APIC ID " FMT_APIC_ID ", SMBASE 0x%Lx, " "EFI_SMM_CPU_SERVICE_PROTOCOL assigned number %Lu\n", __func__, (UINT64)mCpuHotPlugData->SmBase[NewSlot], (UINT64)NewProcessorNumberByProtocol )); ''', (0, 3, 3), "Quoted String with Concatenation Inside Debug Message String" ), SpecialParsingMacroTest( r''' DEBUG ((DEBUG_INFO, Index == COLUMN_SIZE/2 ? "0" : " %02x", (UINTN)Data[Index])); ''', (0, 1, 1), "Ternary Operating in Debug Message String" ), ##################################################################### # Section: Code Snippet Tests ##################################################################### CodeSnippetMacroTest( r''' /** Print the BBS Table. @param LocalBbsTable The BBS table. @param BbsCount The count of entry in BBS table. **/ VOID LegacyBmPrintBbsTable ( IN BBS_TABLE *LocalBbsTable, IN UINT16 BbsCount ) { UINT16 Index; DEBUG ((DEBUG_INFO, "\n")); DEBUG ((DEBUG_INFO, " NO Prio bb/dd/ff cl/sc Type Stat segm:offs\n")); DEBUG ((DEBUG_INFO, "=============================================\n")); for (Index = 0; Index < BbsCount; Index++) { if (!LegacyBmValidBbsEntry (&LocalBbsTable[Index])) { continue; } DEBUG ( (DEBUG_INFO, " %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n", (UINTN)Index, (UINTN)LocalBbsTable[Index].BootPriority, (UINTN)LocalBbsTable[Index].Bus, (UINTN)LocalBbsTable[Index].Device, (UINTN)LocalBbsTable[Index].Function, (UINTN)LocalBbsTable[Index].Class, (UINTN)LocalBbsTable[Index].SubClass, (UINTN)LocalBbsTable[Index].DeviceType, (UINTN)*(UINT16 *)&LocalBbsTable[Index].StatusFlags, (UINTN)LocalBbsTable[Index].BootHandlerSegment, (UINTN)LocalBbsTable[Index].BootHandlerOffset, (UINTN)((LocalBbsTable[Index].MfgStringSegment << 4) + LocalBbsTable[Index].MfgStringOffset), (UINTN)((LocalBbsTable[Index].DescStringSegment << 4) + LocalBbsTable[Index].DescStringOffset)) ); } DEBUG ((DEBUG_INFO, "\n")); ''', (1, 0, 0), "Code Section with An Imbalanced Macro" ), CodeSnippetMacroTest( r''' if (*Buffer == AML_ROOT_CHAR) { // // RootChar // Buffer++; DEBUG ((DEBUG_ERROR, "\\")); } else if (*Buffer == AML_PARENT_PREFIX_CHAR) { // // ParentPrefixChar // do { Buffer++; DEBUG ((DEBUG_ERROR, "^")); } while (*Buffer == AML_PARENT_PREFIX_CHAR); } DEBUG ((DEBUG_WARN, "Failed to retrieve Variable:\"MebxData\", Status = %r\n", Status)); ''', (0, 1, 1), "Code Section with Escaped Backslash and Escaped Quotes" ), CodeSnippetMacroTest( r''' if (EFI_ERROR (Status)) { UINTN Offset; UINTN Start; DEBUG (( DEBUG_INFO, "Variable FV header is not valid. It will be reinitialized.\n" )); // // Get FvbInfo to provide in FwhInstance. // Status = GetFvbInfo (Length, &GoodFwVolHeader); ASSERT (!EFI_ERROR (Status)); } ''', (0, 0, 0), "Code Section with Multi-Line Macro with No Arguments" ) ]