\r
**/\r
\r
-#include <DxeMain.h>\r
+#include "DxeMain.h"\r
\r
\r
EFI_DEBUG_IMAGE_INFO_TABLE_HEADER mDebugInfoTableHeader = {\r
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
)\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
{\r
ASSERT(mDebugTable != NULL);\r
mDebugTable->Crc32 = 0;\r
- gDxeCoreBS->CalculateCrc32 ((VOID *)mDebugTable, sizeof (EFI_SYSTEM_TABLE_POINTER), &mDebugTable->Crc32);\r
+ gBS->CalculateCrc32 ((VOID *)mDebugTable, sizeof (EFI_SYSTEM_TABLE_POINTER), &mDebugTable->Crc32);\r
}\r
\r
\r
EFI_DEBUG_IMAGE_INFO *Table;\r
EFI_DEBUG_IMAGE_INFO *NewTable;\r
UINTN Index;\r
- UINTN MaxTableIndex;\r
UINTN TableSize;\r
\r
//\r
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
- NewTable = CoreAllocateZeroBootServicesPool (TableSize + EFI_PAGE_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
return;\r
//\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
- Table[Index].NormalImage = CoreAllocateZeroBootServicesPool (sizeof (EFI_DEBUG_IMAGE_INFO_NORMAL));\r
+ Table[Index].NormalImage = AllocateZeroPool (sizeof (EFI_DEBUG_IMAGE_INFO_NORMAL));\r
if (Table[Index].NormalImage != NULL) {\r
//\r
// Update the entry\r
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
\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
//\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