]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Misc/DebugImageInfo.c
Correct error status to EFI_NOT_FOUND when the image can't be got.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Misc / DebugImageInfo.c
index 50e44683996350e833f76919035a8513a6be56c5..6d5f5c0f896621de3f59eb039a1a9f78f7361498 100644 (file)
@@ -22,20 +22,18 @@ 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
 \r
+#define EFI_DEBUG_TABLE_ENTRY_SIZE       (sizeof (VOID *))\r
 \r
 /**\r
   Creates and initializes the DebugImageInfo Table.  Also creates the configuration\r
   table and registers it into the system table.\r
 \r
-  Note:\r
-    This function allocates memory, frees it, and then allocates memory at an\r
-    address within the initial allocation. Since this function is called early\r
-    in DXE core initialization (before drivers are dispatched), this should not\r
-    be a problem.\r
-\r
 **/\r
 VOID\r
 CoreInitializeDebugImageInfoTable (\r
@@ -43,44 +41,14 @@ CoreInitializeDebugImageInfoTable (
   )\r
 {\r
   EFI_STATUS                          Status;\r
-  EFI_PHYSICAL_ADDRESS                Mem;\r
-  UINTN                               NumberOfPages;\r
 \r
   //\r
-  // Allocate boot services memory for the structure. It's required to be aligned on\r
-  // a 4M boundary, so allocate a 4M block (plus what we require), free it up, calculate\r
-  // a 4M aligned address within the memory we just freed, and then allocate memory at that\r
-  // address for our initial structure.\r
-  //\r
-  NumberOfPages = FOUR_MEG_PAGES + EFI_SIZE_TO_PAGES(sizeof (EFI_SYSTEM_TABLE_POINTER));\r
-\r
-  Status = CoreAllocatePages (AllocateAnyPages, EfiBootServicesData, NumberOfPages , &Mem);\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (EFI_ERROR(Status)) {\r
-    return;\r
-  }\r
-  Status = CoreFreePages (Mem, NumberOfPages);\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (EFI_ERROR(Status)) {\r
-    return;\r
-  }\r
-  //\r
-  // Now get a 4M aligned address within the memory range we were given.\r
-  // Then allocate memory at that address\r
-  //\r
-  Mem = (Mem + FOUR_MEG_MASK) & (~FOUR_MEG_MASK);\r
-\r
-  Status = CoreAllocatePages (AllocateAddress, EfiBootServicesData, NumberOfPages - FOUR_MEG_PAGES, &Mem);\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (EFI_ERROR(Status)) {\r
-    return;\r
-  }\r
-  //\r
-  // We now have a 4M aligned page allocated, so fill in the data structure.\r
+  // Allocate 4M aligned page for the structure and fill in the data.\r
   // Ideally we would update the CRC now as well, but the service may not yet be available.\r
   // See comments in the CoreUpdateDebugTableCrc32() function below for details.\r
   //\r
-  mDebugTable = (EFI_SYSTEM_TABLE_POINTER *)(UINTN)Mem;\r
+  mDebugTable = AllocateAlignedPages (EFI_SIZE_TO_PAGES (sizeof (EFI_SYSTEM_TABLE_POINTER)), FOUR_MEG_ALIGNMENT); \r
+  ASSERT (mDebugTable != NULL);\r
   mDebugTable->Signature = EFI_SYSTEM_TABLE_SIGNATURE;\r
   mDebugTable->EfiSystemTableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) gDxeCoreST;\r
   mDebugTable->Crc32 = 0;\r
@@ -128,7 +96,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
@@ -137,21 +104,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
@@ -170,8 +140,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
@@ -183,6 +159,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
@@ -207,7 +188,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
@@ -215,6 +196,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