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