]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. Set the EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED bit on insertion/deletion of entries...
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 27 Sep 2008 08:02:57 +0000 (08:02 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Sat, 27 Sep 2008 08:02:57 +0000 (08:02 +0000)
2. Change field EFI_DEBUG_IMAGE_INFO_TABLE_HEADER.TableSize to be the number of valid entries. Apply another global variable mMaxTableEntries to track the maximum of the allocated entires.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6051 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Dxe/Misc/DebugImageInfo.c

index 295f32f43e8eee0b2c71335f43504973f26033d6..aa93e3168fc7aee356e0b9a6dbf1af423bb8efb3 100644 (file)
@@ -22,6 +22,8 @@ EFI_DEBUG_IMAGE_INFO_TABLE_HEADER  mDebugInfoTableHeader = {
   NULL        // EFI_DEBUG_IMAGE_INFO            *EfiDebugImageInfoTable;\r
 };\r
 \r
+UINTN mMaxTableEntries = 0;\r
+\r
 EFI_SYSTEM_TABLE_POINTER *mDebugTable = NULL;\r
 \r
 #define FOUR_MEG_ALIGNMENT   0x400000\r
@@ -93,7 +95,6 @@ CoreNewDebugImageInfoEntry (
   EFI_DEBUG_IMAGE_INFO      *Table;\r
   EFI_DEBUG_IMAGE_INFO      *NewTable;\r
   UINTN                     Index;\r
-  UINTN                     MaxTableIndex;\r
   UINTN                     TableSize;\r
 \r
   //\r
@@ -102,21 +103,24 @@ CoreNewDebugImageInfoEntry (
   mDebugInfoTableHeader.UpdateStatus |= EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS;\r
 \r
   Table = mDebugInfoTableHeader.EfiDebugImageInfoTable;\r
-  MaxTableIndex = mDebugInfoTableHeader.TableSize;\r
-\r
-  for (Index = 0; Index < MaxTableIndex; Index++) {\r
-    if (Table[Index].NormalImage == NULL) {\r
-      //\r
-      // We have found a free entry so exit the loop\r
-      //\r
-      break;\r
+  \r
+  if (mDebugInfoTableHeader.TableSize < mMaxTableEntries) {\r
+    //\r
+    // We still have empty entires in the Table, find the first empty entry.\r
+    //\r
+    Index = 0;\r
+    while (Table[Index].NormalImage != NULL) {\r
+      Index++;\r
     }\r
-  }\r
-  if (Index == MaxTableIndex) {\r
+    //\r
+    // There must be an empty entry in the in the table.\r
+    //\r
+    ASSERT (Index < mMaxTableEntries);\r
+  } else {\r
     //\r
     //  Table is full, so re-allocate another page for a larger table...\r
     //\r
-    TableSize = MaxTableIndex * EFI_DEBUG_TABLE_ENTRY_SIZE;\r
+    TableSize = mMaxTableEntries * EFI_DEBUG_TABLE_ENTRY_SIZE;\r
     NewTable = AllocateZeroPool (TableSize + EFI_PAGE_SIZE);\r
     if (NewTable == NULL) {\r
       mDebugInfoTableHeader.UpdateStatus &= ~EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS;\r
@@ -135,8 +139,14 @@ CoreNewDebugImageInfoEntry (
     //\r
     Table = NewTable;\r
     mDebugInfoTableHeader.EfiDebugImageInfoTable = NewTable;\r
-    mDebugInfoTableHeader.TableSize += EFI_PAGE_SIZE / EFI_DEBUG_TABLE_ENTRY_SIZE;\r
+    //\r
+    // Enlarge the max table entries and set the first empty entry index to\r
+    // be the original max table entries.\r
+    //\r
+    Index             = mMaxTableEntries;\r
+    mMaxTableEntries += EFI_PAGE_SIZE / EFI_DEBUG_TABLE_ENTRY_SIZE;\r
   }\r
+\r
   //\r
   // Allocate data for new entry\r
   //\r
@@ -148,6 +158,11 @@ CoreNewDebugImageInfoEntry (
     Table[Index].NormalImage->ImageInfoType               = (UINT32) ImageInfoType;\r
     Table[Index].NormalImage->LoadedImageProtocolInstance = LoadedImage;\r
     Table[Index].NormalImage->ImageHandle                 = ImageHandle;\r
+    //\r
+    // Increase the number of EFI_DEBUG_IMAGE_INFO elements and set the mDebugInfoTable in modified status.\r
+    //\r
+    mDebugInfoTableHeader.TableSize++;\r
+    mDebugInfoTableHeader.UpdateStatus |= EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED;\r
   }\r
   mDebugInfoTableHeader.UpdateStatus &= ~EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS;\r
 }\r
@@ -172,7 +187,7 @@ CoreRemoveDebugImageInfoEntry (
 \r
   Table = mDebugInfoTableHeader.EfiDebugImageInfoTable;\r
 \r
-  for (Index = 0; Index < mDebugInfoTableHeader.TableSize; Index++) {\r
+  for (Index = 0; Index < mMaxTableEntries; Index++) {\r
     if (Table[Index].NormalImage != NULL && Table[Index].NormalImage->ImageHandle == ImageHandle) {\r
       //\r
       // Found a match. Free up the record, then NULL the pointer to indicate the slot\r
@@ -180,6 +195,11 @@ CoreRemoveDebugImageInfoEntry (
       //\r
       CoreFreePool (Table[Index].NormalImage);\r
       Table[Index].NormalImage = NULL;\r
+      //\r
+      // Decrease the number of EFI_DEBUG_IMAGE_INFO elements and set the mDebugInfoTable in modified status.\r
+      //\r
+      mDebugInfoTableHeader.TableSize--;\r
+      mDebugInfoTableHeader.UpdateStatus |= EFI_DEBUG_IMAGE_INFO_TABLE_MODIFIED;\r
       break;\r
     }\r
   }\r