From 39eccb9c66be7329eaf564d18f8f3cfb9add82e9 Mon Sep 17 00:00:00 2001
From: Baraneedharan Anbazhagan <anbazhagan@hp.com>
Date: Mon, 7 Dec 2015 03:06:30 +0000
Subject: [PATCH] MdeModulePkg: DebugAssert enhancement

If the assert happens in a library, then it's hard to determine which module
using that library is generating that assert. Use gEfiCallerBaseName in
DebugAssert to display the module name.

V2: Updated code to use copy mem and ModuleNameSize calculation.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Baraneedharan Anbazhagan <anbazhagan@hp.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19128 6f19259b-4bc3-4df7-8a09-765794883524
---
 .../PeiDxeDebugLibReportStatusCode/DebugLib.c | 51 +++++++++++++------
 1 file changed, 36 insertions(+), 15 deletions(-)

diff --git a/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c b/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c
index f1d98277a3..163d530ae5 100644
--- a/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c
+++ b/MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c
@@ -261,6 +261,7 @@ DebugAssert (
   UINTN                  HeaderSize;
   UINTN                  TotalSize;
   CHAR8                  *Temp;
+  UINTN                  ModuleNameSize;
   UINTN                  FileNameSize;
   UINTN                  DescriptionSize;
 
@@ -268,31 +269,40 @@ DebugAssert (
   // Get string size
   //
   HeaderSize       = sizeof (EFI_DEBUG_ASSERT_DATA);
+  //
+  // Compute string size of module name enclosed by []
+  //
+  ModuleNameSize   = 2 + AsciiStrSize (gEfiCallerBaseName);
   FileNameSize     = AsciiStrSize (FileName);
   DescriptionSize  = AsciiStrSize (Description);
 
   //
   // Make sure it will all fit in the passed in buffer.
   //
-  if (HeaderSize + FileNameSize + DescriptionSize > sizeof (Buffer)) {
+  if (HeaderSize + ModuleNameSize + FileNameSize + DescriptionSize > sizeof (Buffer)) {
     //
-    // FileName + Description is too long to be filled into buffer. 
+    // remove module name if it's too long to be filled into buffer
     //
-    if (HeaderSize + FileNameSize < sizeof (Buffer)) {
+    ModuleNameSize = 0;
+    if (HeaderSize + FileNameSize + DescriptionSize > sizeof (Buffer)) {
       //
-      // Description has enough buffer to be truncated. 
+      // FileName + Description is too long to be filled into buffer.
       //
-      DescriptionSize = sizeof (Buffer) - HeaderSize - FileNameSize;
-    } else {
-      //
-      // FileName is too long to be filled into buffer.
-      // FileName will be truncated. Reserved one byte for Description NULL terminator.
-      //
-      DescriptionSize = 1;
-      FileNameSize    = sizeof (Buffer) - HeaderSize - DescriptionSize;
+      if (HeaderSize + FileNameSize < sizeof (Buffer)) {
+        //
+        // Description has enough buffer to be truncated.
+        //
+        DescriptionSize = sizeof (Buffer) - HeaderSize - FileNameSize;
+      } else {
+        //
+        // FileName is too long to be filled into buffer.
+        // FileName will be truncated. Reserved one byte for Description NULL terminator.
+        //
+        DescriptionSize = 1;
+        FileNameSize    = sizeof (Buffer) - HeaderSize - DescriptionSize;
+      }
     }
   }
- 
   //
   // Fill in EFI_DEBUG_ASSERT_DATA
   //
@@ -300,12 +310,23 @@ DebugAssert (
   AssertData->LineNumber = (UINT32)LineNumber;
   TotalSize  = sizeof (EFI_DEBUG_ASSERT_DATA);
 
+  Temp = (CHAR8 *)(AssertData + 1);
+
+  //
+  // Copy Ascii [ModuleName].
+  //
+  if (ModuleNameSize != 0) {
+    CopyMem(Temp, "[", 1);
+    CopyMem(Temp + 1, gEfiCallerBaseName, ModuleNameSize - 3);
+    CopyMem(Temp + ModuleNameSize - 2, "] ", 2);
+  }
+
   //
   // Copy Ascii FileName including NULL terminator.
   //
-  Temp = CopyMem (AssertData + 1, FileName, FileNameSize);
+  Temp = CopyMem (Temp + ModuleNameSize, FileName, FileNameSize);
   Temp[FileNameSize - 1] = 0;
-  TotalSize += FileNameSize;
+  TotalSize += (ModuleNameSize + FileNameSize);
 
   //
   // Copy Ascii Description include NULL terminator.