12287f237eea173b36c703bca8840783c27d5f45fklu/** @file 29ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli Debug Library based on report status code library. 32287f237eea173b36c703bca8840783c27d5f45fklu 4a1158366091c74f831da8232d8bbb39dc2befda9eric_tian Note that if the debug message length is larger than the maximum allowable 5a1158366091c74f831da8232d8bbb39dc2befda9eric_tian record length, then the debug message will be ignored directly. 6a1158366091c74f831da8232d8bbb39dc2befda9eric_tian 730aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> 8180a5a35cb49699bd249dee19e41cee34c856a58hhtian This program and the accompanying materials 92287f237eea173b36c703bca8840783c27d5f45fklu are licensed and made available under the terms and conditions of the BSD License 102287f237eea173b36c703bca8840783c27d5f45fklu which accompanies this distribution. The full text of the license may be found at 112287f237eea173b36c703bca8840783c27d5f45fklu http://opensource.org/licenses/bsd-license.php 122287f237eea173b36c703bca8840783c27d5f45fklu 132287f237eea173b36c703bca8840783c27d5f45fklu THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 142287f237eea173b36c703bca8840783c27d5f45fklu WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 152287f237eea173b36c703bca8840783c27d5f45fklu 162287f237eea173b36c703bca8840783c27d5f45fklu**/ 172287f237eea173b36c703bca8840783c27d5f45fklu 184569c9e655638592b6a8cd75109f8c33cf6939c4Liming Gao#include <PiPei.h> 1979bc7a89f7da2c5c17332a55e514dd69e849ce87mdkinney 202287f237eea173b36c703bca8840783c27d5f45fklu#include <Guid/StatusCodeDataTypeId.h> 213a6064fa3b4b371476cce682d298923b06bd2745mdkinney#include <Guid/StatusCodeDataTypeDebug.h> 222287f237eea173b36c703bca8840783c27d5f45fklu 232287f237eea173b36c703bca8840783c27d5f45fklu#include <Library/DebugLib.h> 242287f237eea173b36c703bca8840783c27d5f45fklu#include <Library/BaseLib.h> 252287f237eea173b36c703bca8840783c27d5f45fklu#include <Library/BaseMemoryLib.h> 262287f237eea173b36c703bca8840783c27d5f45fklu#include <Library/ReportStatusCodeLib.h> 272287f237eea173b36c703bca8840783c27d5f45fklu#include <Library/PcdLib.h> 28c77b88d627f1624fb4bdf3c92b8122556b753c80mdkinney#include <Library/DebugPrintErrorLevelLib.h> 292287f237eea173b36c703bca8840783c27d5f45fklu 302287f237eea173b36c703bca8840783c27d5f45fklu/** 312287f237eea173b36c703bca8840783c27d5f45fklu Prints a debug message to the debug output device if the specified error level is enabled. 322287f237eea173b36c703bca8840783c27d5f45fklu 33c77b88d627f1624fb4bdf3c92b8122556b753c80mdkinney If any bit in ErrorLevel is also set in DebugPrintErrorLevelLib function 34c77b88d627f1624fb4bdf3c92b8122556b753c80mdkinney GetDebugPrintErrorLevel (), then print the message specified by Format and the 35c77b88d627f1624fb4bdf3c92b8122556b753c80mdkinney associated variable argument list to the debug output device. 362287f237eea173b36c703bca8840783c27d5f45fklu 372287f237eea173b36c703bca8840783c27d5f45fklu If Format is NULL, then ASSERT(). 382287f237eea173b36c703bca8840783c27d5f45fklu 39a1158366091c74f831da8232d8bbb39dc2befda9eric_tian If the length of the message string specificed by Format is larger than the maximum allowable 40a1158366091c74f831da8232d8bbb39dc2befda9eric_tian record length, then directly return and not print it. 41a1158366091c74f831da8232d8bbb39dc2befda9eric_tian 422287f237eea173b36c703bca8840783c27d5f45fklu @param ErrorLevel The error level of the debug message. 432287f237eea173b36c703bca8840783c27d5f45fklu @param Format Format string for the debug message to print. 44967c09fa7c13a6b88fcb690d167269e797058c51qwang @param ... Variable argument list whose contents are accessed 45967c09fa7c13a6b88fcb690d167269e797058c51qwang based on the format string specified by Format. 462287f237eea173b36c703bca8840783c27d5f45fklu 472287f237eea173b36c703bca8840783c27d5f45fklu**/ 482287f237eea173b36c703bca8840783c27d5f45fkluVOID 492287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 502287f237eea173b36c703bca8840783c27d5f45fkluDebugPrint ( 512287f237eea173b36c703bca8840783c27d5f45fklu IN UINTN ErrorLevel, 522287f237eea173b36c703bca8840783c27d5f45fklu IN CONST CHAR8 *Format, 532287f237eea173b36c703bca8840783c27d5f45fklu ... 542287f237eea173b36c703bca8840783c27d5f45fklu ) 552287f237eea173b36c703bca8840783c27d5f45fklu{ 566916d99cb74bb4c19cd1fef68c0c09386e76fbf0mdkinney UINT64 Buffer[(EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)) + 1]; 572287f237eea173b36c703bca8840783c27d5f45fklu EFI_DEBUG_INFO *DebugInfo; 582287f237eea173b36c703bca8840783c27d5f45fklu UINTN TotalSize; 59d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu UINTN DestBufferSize; 60ca9938b842347769618f84a2d53af63d6edf48e6mdkinney VA_LIST VaListMarker; 61ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_LIST BaseListMarker; 62ca9938b842347769618f84a2d53af63d6edf48e6mdkinney CHAR8 *FormatString; 63ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BOOLEAN Long; 642287f237eea173b36c703bca8840783c27d5f45fklu 652287f237eea173b36c703bca8840783c27d5f45fklu // 662287f237eea173b36c703bca8840783c27d5f45fklu // If Format is NULL, then ASSERT(). 672287f237eea173b36c703bca8840783c27d5f45fklu // 682287f237eea173b36c703bca8840783c27d5f45fklu ASSERT (Format != NULL); 692287f237eea173b36c703bca8840783c27d5f45fklu 702287f237eea173b36c703bca8840783c27d5f45fklu // 712287f237eea173b36c703bca8840783c27d5f45fklu // Check driver Debug Level value and global debug level 722287f237eea173b36c703bca8840783c27d5f45fklu // 73c77b88d627f1624fb4bdf3c92b8122556b753c80mdkinney if ((ErrorLevel & GetDebugPrintErrorLevel ()) == 0) { 742287f237eea173b36c703bca8840783c27d5f45fklu return; 752287f237eea173b36c703bca8840783c27d5f45fklu } 762287f237eea173b36c703bca8840783c27d5f45fklu 77ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 780fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // Compute the total size of the record. 790fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // Note that the passing-in format string and variable parameters will be constructed to 800fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // the following layout: 81ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 820fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // Buffer->|------------------------| 833d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // | Padding | 4 bytes 840fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // DebugInfo->|------------------------| 850fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // | EFI_DEBUG_INFO | sizeof(EFI_DEBUG_INFO) 860fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // BaseListMarker->|------------------------| 870fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // | ... | 880fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // | variable arguments | 12 * sizeof (UINT64) 890fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // | ... | 900fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // |------------------------| 910fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // | Format String | 920fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // |------------------------|<- (UINT8 *)Buffer + sizeof(Buffer) 930fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian // 940fac539f37c79acd4211e6afeb9a7904d81bbf58eric_tian TotalSize = 4 + sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrSize (Format); 95ca9938b842347769618f84a2d53af63d6edf48e6mdkinney 96ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 97ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // If the TotalSize is larger than the maximum record size, then return 98ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 991ca88083d42d1284ac7547cbed6699777c490241mdkinney if (TotalSize > sizeof (Buffer)) { 1002287f237eea173b36c703bca8840783c27d5f45fklu return; 1012287f237eea173b36c703bca8840783c27d5f45fklu } 1022287f237eea173b36c703bca8840783c27d5f45fklu 1032287f237eea173b36c703bca8840783c27d5f45fklu // 104ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // Fill in EFI_DEBUG_INFO 1052287f237eea173b36c703bca8840783c27d5f45fklu // 1069ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // Here we skip the first 4 bytes of Buffer, because we must ensure BaseListMarker is 1079ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 64-bit aligned, otherwise retrieving 64-bit parameter from BaseListMarker will cause 1089ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // exception on IPF. Buffer starts at 64-bit aligned address, so skipping 4 types (sizeof(EFI_DEBUG_INFO)) 1093d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // just makes address of BaseListMarker, which follows DebugInfo, 64-bit aligned. 1109ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 1116916d99cb74bb4c19cd1fef68c0c09386e76fbf0mdkinney DebugInfo = (EFI_DEBUG_INFO *)(Buffer) + 1; 1122287f237eea173b36c703bca8840783c27d5f45fklu DebugInfo->ErrorLevel = (UINT32)ErrorLevel; 113ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BaseListMarker = (BASE_LIST)(DebugInfo + 1); 1143d7dfb3886b172f1656987dbdce49743e18e4cbfmdkinney FormatString = (CHAR8 *)((UINT64 *)(DebugInfo + 1) + 12); 115ca9938b842347769618f84a2d53af63d6edf48e6mdkinney 116ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 117ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // Copy the Format string into the record 118ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 119d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu // According to the content structure of Buffer shown above, the size of 120d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu // the FormatString buffer is the size of Buffer minus the Padding 121d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu // (4 bytes), minus the size of EFI_DEBUG_INFO, minus the size of 122d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu // variable arguments (12 * sizeof (UINT64)). 123d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu // 124d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu DestBufferSize = sizeof (Buffer) - 4 - sizeof (EFI_DEBUG_INFO) - 12 * sizeof (UINT64); 125d5cbc27b005522a4c0f40c0b14c32def8e1bae9cHao Wu AsciiStrCpyS (FormatString, DestBufferSize / sizeof (CHAR8), Format); 1262287f237eea173b36c703bca8840783c27d5f45fklu 1272287f237eea173b36c703bca8840783c27d5f45fklu // 1289ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // The first 12 * sizeof (UINT64) bytes following EFI_DEBUG_INFO are for variable arguments 1299ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // of format in DEBUG string, which is followed by the DEBUG format string. 1309ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // Here we will process the variable arguments and pack them in this area. 1312287f237eea173b36c703bca8840783c27d5f45fklu // 132ca9938b842347769618f84a2d53af63d6edf48e6mdkinney VA_START (VaListMarker, Format); 133ca9938b842347769618f84a2d53af63d6edf48e6mdkinney for (; *Format != '\0'; Format++) { 1349ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 1359ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // Only format with prefix % is processed. 1369ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 137ca9938b842347769618f84a2d53af63d6edf48e6mdkinney if (*Format != '%') { 138ca9938b842347769618f84a2d53af63d6edf48e6mdkinney continue; 139ca9938b842347769618f84a2d53af63d6edf48e6mdkinney } 140ca9938b842347769618f84a2d53af63d6edf48e6mdkinney Long = FALSE; 141ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 142ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // Parse Flags and Width 143ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 1443d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang for (Format++; TRUE; Format++) { 1453d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang if (*Format == '.' || *Format == '-' || *Format == '+' || *Format == ' ') { 1469ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 1479ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // These characters in format field are omitted. 1489ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 1493d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang continue; 1503d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } 1513d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang if (*Format >= '0' && *Format <= '9') { 1523d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // 1533d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // These characters in format field are omitted. 1543d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // 1553d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang continue; 1563d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } 1573d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang if (*Format == 'L' || *Format == 'l') { 1589ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 1599ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 'L" or "l" in format field means the number being printed is a UINT64 1609ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 161ca9938b842347769618f84a2d53af63d6edf48e6mdkinney Long = TRUE; 1623d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang continue; 1633d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } 1643d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang if (*Format == '*') { 1659ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 1669ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // '*' in format field means the precision of the field is specified by 1679ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // a UINTN argument in the argument list. 1689ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // 169ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN); 1703d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang continue; 1713d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } 1723d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang if (*Format == '\0') { 173ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 174ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // Make no output if Format string terminates unexpectedly when 175ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // looking up for flag, width, precision and type. 176ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 177ca9938b842347769618f84a2d53af63d6edf48e6mdkinney Format--; 178ca9938b842347769618f84a2d53af63d6edf48e6mdkinney } 1793d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // 1803d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // When valid argument type detected or format string terminates unexpectedly, 1813d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // the inner loop is done. 1823d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang // 1833d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang break; 1843d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } 1853d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang 186ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 1879ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli // Pack variable arguments into the storage area following EFI_DEBUG_INFO. 188ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 1893d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang if ((*Format == 'p') && (sizeof (VOID *) > 4)) { 1903d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang Long = TRUE; 1913d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } 19294e3eee6e827aa971228044a3b826efa4ebaf1f7Qiu Shumin if (*Format == 'p' || *Format == 'X' || *Format == 'x' || *Format == 'd' || *Format == 'u') { 193ca9938b842347769618f84a2d53af63d6edf48e6mdkinney if (Long) { 194ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_ARG (BaseListMarker, INT64) = VA_ARG (VaListMarker, INT64); 195ca9938b842347769618f84a2d53af63d6edf48e6mdkinney } else { 196ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_ARG (BaseListMarker, int) = VA_ARG (VaListMarker, int); 197ca9938b842347769618f84a2d53af63d6edf48e6mdkinney } 1983d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } else if (*Format == 's' || *Format == 'S' || *Format == 'a' || *Format == 'g' || *Format == 't') { 199ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_ARG (BaseListMarker, VOID *) = VA_ARG (VaListMarker, VOID *); 2003d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } else if (*Format == 'c') { 201ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN); 2023d747a890f9e792dc78ca07c7dc4dd571af2e323qhuang } else if (*Format == 'r') { 203ca9938b842347769618f84a2d53af63d6edf48e6mdkinney BASE_ARG (BaseListMarker, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS); 204ca9938b842347769618f84a2d53af63d6edf48e6mdkinney } 205ca9938b842347769618f84a2d53af63d6edf48e6mdkinney 206ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 207ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) allocated bytes, then ASSERT() 208ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // This indicates that the DEBUG() macro is passing in more argument than can be handled by 209ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // the EFI_DEBUG_INFO record 210ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 2113d7dfb3886b172f1656987dbdce49743e18e4cbfmdkinney ASSERT ((CHAR8 *)BaseListMarker <= FormatString); 212ca9938b842347769618f84a2d53af63d6edf48e6mdkinney 213ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 214ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) allocated bytes, then return 215ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 2163d7dfb3886b172f1656987dbdce49743e18e4cbfmdkinney if ((CHAR8 *)BaseListMarker > FormatString) { 2173bbe68a3627e7c75474955352f27b923c5831ad7rsun VA_END (VaListMarker); 218ca9938b842347769618f84a2d53af63d6edf48e6mdkinney return; 219ca9938b842347769618f84a2d53af63d6edf48e6mdkinney } 2202287f237eea173b36c703bca8840783c27d5f45fklu } 221ca9938b842347769618f84a2d53af63d6edf48e6mdkinney VA_END (VaListMarker); 2222287f237eea173b36c703bca8840783c27d5f45fklu 223ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 224ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // Send the DebugInfo record 225ca9938b842347769618f84a2d53af63d6edf48e6mdkinney // 2262287f237eea173b36c703bca8840783c27d5f45fklu REPORT_STATUS_CODE_EX ( 2272287f237eea173b36c703bca8840783c27d5f45fklu EFI_DEBUG_CODE, 2282287f237eea173b36c703bca8840783c27d5f45fklu (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_DC_UNSPECIFIED), 2292287f237eea173b36c703bca8840783c27d5f45fklu 0, 2302287f237eea173b36c703bca8840783c27d5f45fklu NULL, 2312287f237eea173b36c703bca8840783c27d5f45fklu &gEfiStatusCodeDataTypeDebugGuid, 2322287f237eea173b36c703bca8840783c27d5f45fklu DebugInfo, 2332287f237eea173b36c703bca8840783c27d5f45fklu TotalSize 2342287f237eea173b36c703bca8840783c27d5f45fklu ); 2352287f237eea173b36c703bca8840783c27d5f45fklu} 2362287f237eea173b36c703bca8840783c27d5f45fklu 2372287f237eea173b36c703bca8840783c27d5f45fklu/** 2389ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli Prints an assert message containing a filename, line number, and description. 2392287f237eea173b36c703bca8840783c27d5f45fklu This may be followed by a breakpoint or a dead loop. 2402287f237eea173b36c703bca8840783c27d5f45fklu 2412287f237eea173b36c703bca8840783c27d5f45fklu Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n" 2429ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of 2439ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if 2449ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then 2459ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli CpuDeadLoop() is called. If neither of these bits are set, then this function 2462287f237eea173b36c703bca8840783c27d5f45fklu returns immediately after the message is printed to the debug output device. 247584125bcba104b165a9886fb90d73fed03c6ec55eric_tian DebugAssert() must actively prevent recursion. If DebugAssert() is called while 2482287f237eea173b36c703bca8840783c27d5f45fklu processing another DebugAssert(), then DebugAssert() must return immediately. 2492287f237eea173b36c703bca8840783c27d5f45fklu 2502287f237eea173b36c703bca8840783c27d5f45fklu If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed. 2512287f237eea173b36c703bca8840783c27d5f45fklu If Description is NULL, then a <Description> string of "(NULL) Description" is printed. 2522287f237eea173b36c703bca8840783c27d5f45fklu 2532287f237eea173b36c703bca8840783c27d5f45fklu @param FileName Pointer to the name of the source file that generated the assert condition. 2542287f237eea173b36c703bca8840783c27d5f45fklu @param LineNumber The line number in the source file that generated the assert condition 2552287f237eea173b36c703bca8840783c27d5f45fklu @param Description Pointer to the description of the assert condition. 2562287f237eea173b36c703bca8840783c27d5f45fklu 2572287f237eea173b36c703bca8840783c27d5f45fklu**/ 2582287f237eea173b36c703bca8840783c27d5f45fkluVOID 2592287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 2602287f237eea173b36c703bca8840783c27d5f45fkluDebugAssert ( 2612287f237eea173b36c703bca8840783c27d5f45fklu IN CONST CHAR8 *FileName, 2622287f237eea173b36c703bca8840783c27d5f45fklu IN UINTN LineNumber, 2632287f237eea173b36c703bca8840783c27d5f45fklu IN CONST CHAR8 *Description 2642287f237eea173b36c703bca8840783c27d5f45fklu ) 2652287f237eea173b36c703bca8840783c27d5f45fklu{ 2662287f237eea173b36c703bca8840783c27d5f45fklu UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof(UINT64)]; 2672287f237eea173b36c703bca8840783c27d5f45fklu EFI_DEBUG_ASSERT_DATA *AssertData; 268ea1b39e617f93f2dd674eb111f101759ea2274b7lgao UINTN HeaderSize; 2692287f237eea173b36c703bca8840783c27d5f45fklu UINTN TotalSize; 2702287f237eea173b36c703bca8840783c27d5f45fklu CHAR8 *Temp; 2711ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan UINTN ModuleNameSize; 2729ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli UINTN FileNameSize; 2739ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli UINTN DescriptionSize; 2742287f237eea173b36c703bca8840783c27d5f45fklu 2752287f237eea173b36c703bca8840783c27d5f45fklu // 276ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // Get string size 2772287f237eea173b36c703bca8840783c27d5f45fklu // 278ea1b39e617f93f2dd674eb111f101759ea2274b7lgao HeaderSize = sizeof (EFI_DEBUG_ASSERT_DATA); 2791ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 2801ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // Compute string size of module name enclosed by [] 2811ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 2821ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan ModuleNameSize = 2 + AsciiStrSize (gEfiCallerBaseName); 283ea1b39e617f93f2dd674eb111f101759ea2274b7lgao FileNameSize = AsciiStrSize (FileName); 284ea1b39e617f93f2dd674eb111f101759ea2274b7lgao DescriptionSize = AsciiStrSize (Description); 2852287f237eea173b36c703bca8840783c27d5f45fklu 286ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 287ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // Make sure it will all fit in the passed in buffer. 288ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 2891ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan if (HeaderSize + ModuleNameSize + FileNameSize + DescriptionSize > sizeof (Buffer)) { 2902287f237eea173b36c703bca8840783c27d5f45fklu // 2911ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // remove module name if it's too long to be filled into buffer 2922287f237eea173b36c703bca8840783c27d5f45fklu // 2931ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan ModuleNameSize = 0; 2941ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan if (HeaderSize + FileNameSize + DescriptionSize > sizeof (Buffer)) { 295ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 2961ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // FileName + Description is too long to be filled into buffer. 297ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 2981ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan if (HeaderSize + FileNameSize < sizeof (Buffer)) { 2991ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 3001ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // Description has enough buffer to be truncated. 3011ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 3021ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan DescriptionSize = sizeof (Buffer) - HeaderSize - FileNameSize; 3031ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan } else { 3041ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 3051ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // FileName is too long to be filled into buffer. 3061ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // FileName will be truncated. Reserved one byte for Description NULL terminator. 3071ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 3081ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan DescriptionSize = 1; 3091ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan FileNameSize = sizeof (Buffer) - HeaderSize - DescriptionSize; 3101ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan } 311ea1b39e617f93f2dd674eb111f101759ea2274b7lgao } 3122287f237eea173b36c703bca8840783c27d5f45fklu } 313ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 314ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // Fill in EFI_DEBUG_ASSERT_DATA 315ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 316ea1b39e617f93f2dd674eb111f101759ea2274b7lgao AssertData = (EFI_DEBUG_ASSERT_DATA *)Buffer; 317ea1b39e617f93f2dd674eb111f101759ea2274b7lgao AssertData->LineNumber = (UINT32)LineNumber; 318ea1b39e617f93f2dd674eb111f101759ea2274b7lgao TotalSize = sizeof (EFI_DEBUG_ASSERT_DATA); 319ea1b39e617f93f2dd674eb111f101759ea2274b7lgao 3201ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan Temp = (CHAR8 *)(AssertData + 1); 3211ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan 3221ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 3231ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // Copy Ascii [ModuleName]. 3241ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan // 3251ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan if (ModuleNameSize != 0) { 3261ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan CopyMem(Temp, "[", 1); 3271ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan CopyMem(Temp + 1, gEfiCallerBaseName, ModuleNameSize - 3); 3281ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan CopyMem(Temp + ModuleNameSize - 2, "] ", 2); 3291ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan } 3301ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan 331ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 332ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // Copy Ascii FileName including NULL terminator. 333ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 3341ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan Temp = CopyMem (Temp + ModuleNameSize, FileName, FileNameSize); 335ea1b39e617f93f2dd674eb111f101759ea2274b7lgao Temp[FileNameSize - 1] = 0; 3361ffe7cc56281fda7c714d32d569b533925d37edeBaraneedharan Anbazhagan TotalSize += (ModuleNameSize + FileNameSize); 337ea1b39e617f93f2dd674eb111f101759ea2274b7lgao 338ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 339ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // Copy Ascii Description include NULL terminator. 340ea1b39e617f93f2dd674eb111f101759ea2274b7lgao // 341856d643816fc04c5645bba4eafce4de675649c4flgao Temp = CopyMem (Temp + FileNameSize, Description, DescriptionSize); 342ea1b39e617f93f2dd674eb111f101759ea2274b7lgao Temp[DescriptionSize - 1] = 0; 343ea1b39e617f93f2dd674eb111f101759ea2274b7lgao TotalSize += DescriptionSize; 344ea1b39e617f93f2dd674eb111f101759ea2274b7lgao 345ea1b39e617f93f2dd674eb111f101759ea2274b7lgao REPORT_STATUS_CODE_EX ( 346ea1b39e617f93f2dd674eb111f101759ea2274b7lgao (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), 347ea1b39e617f93f2dd674eb111f101759ea2274b7lgao (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), 348ea1b39e617f93f2dd674eb111f101759ea2274b7lgao 0, 349ea1b39e617f93f2dd674eb111f101759ea2274b7lgao NULL, 350ea1b39e617f93f2dd674eb111f101759ea2274b7lgao NULL, 351ea1b39e617f93f2dd674eb111f101759ea2274b7lgao AssertData, 352ea1b39e617f93f2dd674eb111f101759ea2274b7lgao TotalSize 353ea1b39e617f93f2dd674eb111f101759ea2274b7lgao ); 3542287f237eea173b36c703bca8840783c27d5f45fklu 3552287f237eea173b36c703bca8840783c27d5f45fklu // 3562287f237eea173b36c703bca8840783c27d5f45fklu // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings 3572287f237eea173b36c703bca8840783c27d5f45fklu // 3589ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli if ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) { 3592287f237eea173b36c703bca8840783c27d5f45fklu CpuBreakpoint (); 3609ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli } else if ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) { 3612287f237eea173b36c703bca8840783c27d5f45fklu CpuDeadLoop (); 3622287f237eea173b36c703bca8840783c27d5f45fklu } 3632287f237eea173b36c703bca8840783c27d5f45fklu} 3642287f237eea173b36c703bca8840783c27d5f45fklu 3652287f237eea173b36c703bca8840783c27d5f45fklu 3662287f237eea173b36c703bca8840783c27d5f45fklu/** 3672287f237eea173b36c703bca8840783c27d5f45fklu Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer. 3682287f237eea173b36c703bca8840783c27d5f45fklu 3699ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli This function fills Length bytes of Buffer with the value specified by 3702287f237eea173b36c703bca8840783c27d5f45fklu PcdDebugClearMemoryValue, and returns Buffer. 3712287f237eea173b36c703bca8840783c27d5f45fklu 3722287f237eea173b36c703bca8840783c27d5f45fklu If Buffer is NULL, then ASSERT(). 3739ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 3742287f237eea173b36c703bca8840783c27d5f45fklu 3759ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli @param Buffer Pointer to the target buffer to be filled with PcdDebugClearMemoryValue. 3769ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. 3772287f237eea173b36c703bca8840783c27d5f45fklu 3789ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli @return Buffer Pointer to the target buffer filled with PcdDebugClearMemoryValue. 3792287f237eea173b36c703bca8840783c27d5f45fklu 3802287f237eea173b36c703bca8840783c27d5f45fklu**/ 3812287f237eea173b36c703bca8840783c27d5f45fkluVOID * 3822287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 3832287f237eea173b36c703bca8840783c27d5f45fkluDebugClearMemory ( 3842287f237eea173b36c703bca8840783c27d5f45fklu OUT VOID *Buffer, 3852287f237eea173b36c703bca8840783c27d5f45fklu IN UINTN Length 3862287f237eea173b36c703bca8840783c27d5f45fklu ) 3872287f237eea173b36c703bca8840783c27d5f45fklu{ 3882287f237eea173b36c703bca8840783c27d5f45fklu ASSERT (Buffer != NULL); 3892287f237eea173b36c703bca8840783c27d5f45fklu 3909ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli return SetMem (Buffer, Length, PcdGet8 (PcdDebugClearMemoryValue)); 3912287f237eea173b36c703bca8840783c27d5f45fklu} 3922287f237eea173b36c703bca8840783c27d5f45fklu 3932287f237eea173b36c703bca8840783c27d5f45fklu 3942287f237eea173b36c703bca8840783c27d5f45fklu/** 3952287f237eea173b36c703bca8840783c27d5f45fklu Returns TRUE if ASSERT() macros are enabled. 3962287f237eea173b36c703bca8840783c27d5f45fklu 3979ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of 3982287f237eea173b36c703bca8840783c27d5f45fklu PcdDebugProperyMask is set. Otherwise FALSE is returned. 3992287f237eea173b36c703bca8840783c27d5f45fklu 4002287f237eea173b36c703bca8840783c27d5f45fklu @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set. 4012287f237eea173b36c703bca8840783c27d5f45fklu @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear. 4022287f237eea173b36c703bca8840783c27d5f45fklu 4032287f237eea173b36c703bca8840783c27d5f45fklu**/ 4042287f237eea173b36c703bca8840783c27d5f45fkluBOOLEAN 4052287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 4062287f237eea173b36c703bca8840783c27d5f45fkluDebugAssertEnabled ( 4072287f237eea173b36c703bca8840783c27d5f45fklu VOID 4082287f237eea173b36c703bca8840783c27d5f45fklu ) 4092287f237eea173b36c703bca8840783c27d5f45fklu{ 4109ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli return (BOOLEAN) ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0); 4112287f237eea173b36c703bca8840783c27d5f45fklu} 4122287f237eea173b36c703bca8840783c27d5f45fklu 4132287f237eea173b36c703bca8840783c27d5f45fklu 4149ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli/** 4159ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli Returns TRUE if DEBUG() macros are enabled. 4162287f237eea173b36c703bca8840783c27d5f45fklu 4179ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of 4182287f237eea173b36c703bca8840783c27d5f45fklu PcdDebugProperyMask is set. Otherwise FALSE is returned. 4192287f237eea173b36c703bca8840783c27d5f45fklu 4202287f237eea173b36c703bca8840783c27d5f45fklu @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set. 4212287f237eea173b36c703bca8840783c27d5f45fklu @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear. 4222287f237eea173b36c703bca8840783c27d5f45fklu 4232287f237eea173b36c703bca8840783c27d5f45fklu**/ 4242287f237eea173b36c703bca8840783c27d5f45fkluBOOLEAN 4252287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 4262287f237eea173b36c703bca8840783c27d5f45fkluDebugPrintEnabled ( 4272287f237eea173b36c703bca8840783c27d5f45fklu VOID 4282287f237eea173b36c703bca8840783c27d5f45fklu ) 4292287f237eea173b36c703bca8840783c27d5f45fklu{ 4309ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli return (BOOLEAN) ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0); 4312287f237eea173b36c703bca8840783c27d5f45fklu} 4322287f237eea173b36c703bca8840783c27d5f45fklu 4332287f237eea173b36c703bca8840783c27d5f45fklu 4349ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli/** 4359ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli Returns TRUE if DEBUG_CODE() macros are enabled. 4362287f237eea173b36c703bca8840783c27d5f45fklu 4379ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of 4382287f237eea173b36c703bca8840783c27d5f45fklu PcdDebugProperyMask is set. Otherwise FALSE is returned. 4392287f237eea173b36c703bca8840783c27d5f45fklu 4402287f237eea173b36c703bca8840783c27d5f45fklu @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set. 4412287f237eea173b36c703bca8840783c27d5f45fklu @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear. 4422287f237eea173b36c703bca8840783c27d5f45fklu 4432287f237eea173b36c703bca8840783c27d5f45fklu**/ 4442287f237eea173b36c703bca8840783c27d5f45fkluBOOLEAN 4452287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 4462287f237eea173b36c703bca8840783c27d5f45fkluDebugCodeEnabled ( 4472287f237eea173b36c703bca8840783c27d5f45fklu VOID 4482287f237eea173b36c703bca8840783c27d5f45fklu ) 4492287f237eea173b36c703bca8840783c27d5f45fklu{ 4509ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli return (BOOLEAN) ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0); 4512287f237eea173b36c703bca8840783c27d5f45fklu} 4522287f237eea173b36c703bca8840783c27d5f45fklu 4532287f237eea173b36c703bca8840783c27d5f45fklu 4549ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli/** 4559ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli Returns TRUE if DEBUG_CLEAR_MEMORY() macro is enabled. 4562287f237eea173b36c703bca8840783c27d5f45fklu 4579ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of 4582287f237eea173b36c703bca8840783c27d5f45fklu PcdDebugProperyMask is set. Otherwise FALSE is returned. 4592287f237eea173b36c703bca8840783c27d5f45fklu 4609ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set. 4619ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear. 4622287f237eea173b36c703bca8840783c27d5f45fklu 4632287f237eea173b36c703bca8840783c27d5f45fklu**/ 4642287f237eea173b36c703bca8840783c27d5f45fkluBOOLEAN 4652287f237eea173b36c703bca8840783c27d5f45fkluEFIAPI 4662287f237eea173b36c703bca8840783c27d5f45fkluDebugClearMemoryEnabled ( 4672287f237eea173b36c703bca8840783c27d5f45fklu VOID 4682287f237eea173b36c703bca8840783c27d5f45fklu ) 4692287f237eea173b36c703bca8840783c27d5f45fklu{ 4709ba6cd30facae4a9e6e8fe79b8962cba21aecae2xli return (BOOLEAN) ((PcdGet8 (PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0); 4712287f237eea173b36c703bca8840783c27d5f45fklu} 47230aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao 47330aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao/** 47430aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao Returns TRUE if any one of the bit is set both in ErrorLevel and PcdFixedDebugPrintErrorLevel. 47530aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao 47630aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao This function compares the bit mask of ErrorLevel and PcdFixedDebugPrintErrorLevel. 47730aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao 47830aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao @retval TRUE Current ErrorLevel is supported. 47930aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao @retval FALSE Current ErrorLevel is not supported. 48030aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao 48130aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao**/ 48230aba8d3345455b27f3a16ba4f82bff510c747e4Liming GaoBOOLEAN 48330aba8d3345455b27f3a16ba4f82bff510c747e4Liming GaoEFIAPI 48430aba8d3345455b27f3a16ba4f82bff510c747e4Liming GaoDebugPrintLevelEnabled ( 48530aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao IN CONST UINTN ErrorLevel 48630aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao ) 48730aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao{ 48830aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao return (BOOLEAN) ((ErrorLevel & PcdGet32(PcdFixedDebugPrintErrorLevel)) != 0); 48930aba8d3345455b27f3a16ba4f82bff510c747e4Liming Gao} 490