Prevent infinite recursion when ASSERT(), DEBUG(), or any other use of ReportStatusCo...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 4 Nov 2010 20:58:23 +0000 (20:58 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 4 Nov 2010 20:58:23 +0000 (20:58 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11003 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c
MdeModulePkg/Library/PeiReportStatusCodeLib/ReportStatusCodeLib.c

index f5789c1a71bedcbe4813140e19be85d1099b9c98..70b40b9c8a37d5edc45eaa395df390b1f48c89e4 100644 (file)
 #include <Guid/StatusCodeDataTypeId.h>\r
 #include <Guid/StatusCodeDataTypeDebug.h>\r
 \r
+//\r
+// Define the maximum extended data size that is supported when a status code is \r
+// reported at TPL_HIGH_LEVEL.\r
+//\r
+#define MAX_EXTENDED_DATA_SIZE  0x200\r
+\r
 EFI_STATUS_CODE_PROTOCOL  *mReportStatusCodeLibStatusCodeProtocol = NULL;\r
 \r
 /**\r
@@ -484,6 +490,8 @@ ReportStatusCodeEx (
 {\r
   EFI_STATUS            Status;\r
   EFI_STATUS_CODE_DATA  *StatusCodeData;\r
+  EFI_TPL               Tpl;\r
+  UINT64                Buffer[MAX_EXTENDED_DATA_SIZE / sizeof (UINT64)];\r
 \r
   ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0)));\r
   ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0)));\r
@@ -493,12 +501,32 @@ ReportStatusCodeEx (
   }\r
 \r
   //\r
-  // Allocate space for the Status Code Header and its buffer\r
+  // Retrieve the current TPL\r
   //\r
+  Tpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+  gBS->RestoreTPL (Tpl);\r
+  \r
   StatusCodeData = NULL;\r
-  gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
+  if (Tpl <= TPL_NOTIFY) {\r
+    //\r
+    // Allocate space for the Status Code Header and its buffer\r
+    //\r
+    gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
+  }\r
+\r
   if (StatusCodeData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+    //\r
+    // If a buffer could not be allocated, then see if the local variable Buffer can be used\r
+    //\r
+    if (ExtendedDataSize > (MAX_EXTENDED_DATA_SIZE - sizeof (EFI_STATUS_CODE_DATA))) {\r
+      //\r
+      // The local variable Buffer not large enough to hold the extended data associated\r
+      // with the status code being  reported.\r
+      //\r
+      ASSERT (FALSE);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    StatusCodeData = (EFI_STATUS_CODE_DATA  *)Buffer;\r
   }\r
 \r
   //\r
@@ -529,7 +557,9 @@ ReportStatusCodeEx (
   //\r
   // Free the allocated buffer\r
   //\r
-  gBS->FreePool (StatusCodeData);\r
+  if (StatusCodeData != (EFI_STATUS_CODE_DATA  *)Buffer) {\r
+    gBS->FreePool (StatusCodeData);\r
+  }\r
 \r
   return Status;\r
 }\r
index 896c286834ae9bc3c28b9e86529084fee7e1881c..176c7ada4d5d33396eb716025e1a020f49bd3d3f 100644 (file)
@@ -470,6 +470,11 @@ ReportStatusCodeEx (
   ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0)));\r
 \r
   if (ExtendedDataSize > (MAX_EXTENDED_DATA_SIZE - sizeof (EFI_STATUS_CODE_DATA))) {\r
+    //\r
+    // The local variable Buffer not large enough to hold the extended data associated\r
+    // with the status code being  reported.\r
+    //\r
+    ASSERT (FALSE);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
   StatusCodeData = (EFI_STATUS_CODE_DATA  *) Buffer;\r