]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c
1. Correct File header to ## @file
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / PeiDxeDebugLibReportStatusCode / DebugLib.c
index 4855c925c1249d6c049c5b07b7984832db392019..980255165dffcec0ec3d513564801e0fb654f1f0 100644 (file)
@@ -1,6 +1,9 @@
 /** @file\r
   Debug Library based on report status code library.\r
 \r
+  Note that if the debug message length is larger than the maximum allowable\r
+  record length, then the debug message will be ignored directly.\r
+\r
   Copyright (c) 2006 - 2009, Intel Corporation<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -12,9 +15,8 @@
 \r
 **/\r
 \r
-\r
-\r
 #include <FrameworkPei.h>\r
+\r
 #include <Guid/StatusCodeDataTypeId.h>\r
 #include <Guid/StatusCodeDataTypeDebug.h>\r
 \r
@@ -33,6 +35,9 @@
 \r
   If Format is NULL, then ASSERT().\r
 \r
+  If the length of the message string specificed by Format is larger than the maximum allowable\r
+  record length, then directly return and not print it.\r
+\r
   @param  ErrorLevel  The error level of the debug message.\r
   @param  Format      Format string for the debug message to print.\r
   @param  ...         Variable argument list whose contents are accessed \r
@@ -54,7 +59,6 @@ DebugPrint (
   BASE_LIST       BaseListMarker;\r
   CHAR8           *FormatString;\r
   BOOLEAN         Long;\r
-  BOOLEAN         Done;\r
 \r
   //\r
   // If Format is NULL, then ASSERT().\r
@@ -69,9 +73,23 @@ DebugPrint (
   }\r
 \r
   //\r
-  // Compute the total size of the record\r
+  // Compute the total size of the record.\r
+  // Note that the passing-in format string and variable parameters will be constructed to \r
+  // the following layout:\r
+  //\r
+  //         Buffer->|------------------------|\r
+  //                 |         Padding        | 4 bytes\r
+  //      DebugInfo->|------------------------|\r
+  //                 |      EFI_DEBUG_INFO    | sizeof(EFI_DEBUG_INFO)\r
+  // BaseListMarker->|------------------------|\r
+  //                 |           ...          |\r
+  //                 |   variable arguments   | 12 * sizeof (UINT64)\r
+  //                 |           ...          |\r
+  //                 |------------------------|\r
+  //                 |       Format String    |\r
+  //                 |------------------------|<- (UINT8 *)Buffer + sizeof(Buffer)\r
   //\r
-  TotalSize = sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrSize (Format);\r
+  TotalSize = 4 + sizeof (EFI_DEBUG_INFO) + 12 * sizeof (UINT64) + AsciiStrSize (Format);\r
 \r
   //\r
   // If the TotalSize is larger than the maximum record size, then return\r
@@ -86,7 +104,7 @@ DebugPrint (
   // Here we skip the first 4 bytes of Buffer, because we must ensure BaseListMarker is\r
   // 64-bit aligned, otherwise retrieving 64-bit parameter from BaseListMarker will cause\r
   // exception on IPF. Buffer starts at 64-bit aligned address, so skipping 4 types (sizeof(EFI_DEBUG_INFO))\r
-  // just makes addess of BaseListMarker, which follows DebugInfo, 64-bit aligned.\r
+  // just makes address of BaseListMarker, which follows DebugInfo, 64-bit aligned.\r
   //\r
   DebugInfo             = (EFI_DEBUG_INFO *)(Buffer) + 1;\r
   DebugInfo->ErrorLevel = (UINT32)ErrorLevel;\r
@@ -115,91 +133,66 @@ DebugPrint (
     //\r
     // Parse Flags and Width\r
     //\r
-    for (Done = FALSE; !Done; ) {\r
-      Format++;\r
-      switch (*Format) {\r
-      case '.': \r
-      case '-': \r
-      case '+': \r
-      case ' ': \r
-      case ',': \r
-      case '0':\r
-      case '1':\r
-      case '2':\r
-      case '3':\r
-      case '4':\r
-      case '5':\r
-      case '6':\r
-      case '7':\r
-      case '8':\r
-      case '9':\r
+    for (Format++; TRUE; Format++) {\r
+      if (*Format == '.' || *Format == '-' || *Format == '+' || *Format == ' ') {\r
         //\r
         // These characters in format field are omitted.\r
         //\r
-        break;\r
-      case 'L':\r
-      case 'l': \r
+        continue;\r
+      }\r
+      if (*Format >= '0' && *Format <= '9') {\r
+        //\r
+        // These characters in format field are omitted.\r
+        //\r
+        continue;\r
+      }\r
+      if (*Format == 'L' || *Format == 'l') {\r
         //\r
         // 'L" or "l" in format field means the number being printed is a UINT64\r
         //\r
         Long = TRUE;\r
-        break;\r
-      case '*':\r
+        continue;\r
+      }\r
+      if (*Format == '*') {\r
         //\r
         // '*' in format field means the precision of the field is specified by\r
         // a UINTN argument in the argument list.\r
         //\r
         BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
-        break;\r
-      case '\0':\r
+        continue;\r
+      }\r
+      if (*Format == '\0') {\r
         //\r
         // Make no output if Format string terminates unexpectedly when\r
         // looking up for flag, width, precision and type. \r
         //\r
         Format--;\r
-        //\r
-        // break skipped on purpose.\r
-        //\r
-      default:\r
-        //\r
-        // When valid argument type detected or format string terminates unexpectedly,\r
-        // the inner loop is done.\r
-        //\r
-        Done = TRUE;\r
-        break;\r
       }\r
-    } \r
-        \r
+      //\r
+      // When valid argument type detected or format string terminates unexpectedly,\r
+      // the inner loop is done.\r
+      //\r
+      break;\r
+    }\r
+    \r
     //\r
     // Pack variable arguments into the storage area following EFI_DEBUG_INFO.\r
     //\r
-    switch (*Format) {\r
-    case 'p':\r
-      if (sizeof (VOID *) > 4) {\r
-        Long = TRUE;\r
-      }\r
-    case 'X':\r
-    case 'x':\r
-    case 'd':\r
+    if ((*Format == 'p') && (sizeof (VOID *) > 4)) {\r
+      Long = TRUE;\r
+    }\r
+    if (*Format == 'p' || *Format == 'X' || *Format == 'x' || *Format == 'd') {\r
       if (Long) {\r
         BASE_ARG (BaseListMarker, INT64) = VA_ARG (VaListMarker, INT64);\r
       } else {\r
         BASE_ARG (BaseListMarker, int) = VA_ARG (VaListMarker, int);\r
       }\r
-      break;\r
-    case 's':\r
-    case 'S':\r
-    case 'a':\r
-    case 'g':\r
-    case 't':\r
+    } else if (*Format == 's' || *Format == 'S' || *Format == 'a' || *Format == 'g' || *Format == 't') {\r
       BASE_ARG (BaseListMarker, VOID *) = VA_ARG (VaListMarker, VOID *);\r
-      break;\r
-    case 'c':\r
+    } else if (*Format == 'c') {\r
       BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
-      break;\r
-    case 'r':\r
+    } else if (*Format == 'r') {\r
       BASE_ARG (BaseListMarker, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS);\r
-      break;\r
     }\r
 \r
     //\r