Support functions for managing debug image info table when loading and unloading\r
images.\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
\r
UINTN mMaxTableEntries = 0;\r
\r
-EFI_SYSTEM_TABLE_POINTER *mDebugTable = NULL;\r
-\r
-#define FOUR_MEG_ALIGNMENT 0x400000\r
+EFI_SYSTEM_TABLE_POINTER *mDebugTable = NULL;\r
\r
#define EFI_DEBUG_TABLE_ENTRY_SIZE (sizeof (VOID *))\r
\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
+ UINTN Pages;\r
+ EFI_PHYSICAL_ADDRESS Memory;\r
+ UINTN AlignedMemory;\r
+ UINTN AlignmentMask;\r
+ UINTN UnalignedPages;\r
+ UINTN RealPages;\r
\r
//\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 = AllocateAlignedPages (EFI_SIZE_TO_PAGES (sizeof (EFI_SYSTEM_TABLE_POINTER)), FOUR_MEG_ALIGNMENT); \r
+ Pages = EFI_SIZE_TO_PAGES (sizeof (EFI_SYSTEM_TABLE_POINTER));\r
+ AlignmentMask = SIZE_4MB - 1;\r
+ RealPages = Pages + EFI_SIZE_TO_PAGES (SIZE_4MB);\r
+\r
+ //\r
+ // Attempt to allocate memory below PcdMaxEfiSystemTablePointerAddress\r
+ // If PcdMaxEfiSystemTablePointerAddress is 0, then allocate memory below\r
+ // MAX_ADDRESS\r
+ //\r
+ Memory = PcdGet64 (PcdMaxEfiSystemTablePointerAddress);\r
+ if (Memory == 0) {\r
+ Memory = MAX_ADDRESS;\r
+ }\r
+ Status = CoreAllocatePages (\r
+ AllocateMaxAddress,\r
+ EfiBootServicesData,\r
+ RealPages,\r
+ &Memory\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ if (PcdGet64 (PcdMaxEfiSystemTablePointerAddress) != 0) {\r
+ DEBUG ((EFI_D_INFO, "Allocate memory for EFI_SYSTEM_TABLE_POINTER below PcdMaxEfiSystemTablePointerAddress failed. \\r
+ Retry to allocate memroy as close to the top of memory as feasible.\n"));\r
+ }\r
+ //\r
+ // If the initial memory allocation fails, then reattempt allocation\r
+ // as close to the top of memory as feasible.\r
+ //\r
+ Status = CoreAllocatePages (\r
+ AllocateAnyPages,\r
+ EfiBootServicesData,\r
+ RealPages,\r
+ &Memory\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Free overallocated pages\r
+ //\r
+ AlignedMemory = ((UINTN) Memory + AlignmentMask) & ~AlignmentMask;\r
+ UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory);\r
+ if (UnalignedPages > 0) {\r
+ //\r
+ // Free first unaligned page(s).\r
+ //\r
+ Status = CoreFreePages (Memory, UnalignedPages);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+ Memory = AlignedMemory + EFI_PAGES_TO_SIZE (Pages);\r
+ UnalignedPages = RealPages - Pages - UnalignedPages;\r
+ if (UnalignedPages > 0) {\r
+ //\r
+ // Free last unaligned page(s).\r
+ //\r
+ Status = CoreFreePages (Memory, UnalignedPages);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r
+ //\r
+ // Set mDebugTable to the 4MB aligned allocated pages\r
+ //\r
+ mDebugTable = (EFI_SYSTEM_TABLE_POINTER *)(AlignedMemory);\r
ASSERT (mDebugTable != NULL);\r
- mDebugTable->Signature = EFI_SYSTEM_TABLE_SIGNATURE;\r
+\r
+ //\r
+ // Initialize EFI_SYSTEM_TABLE_POINTER structure\r
+ //\r
+ mDebugTable->Signature = EFI_SYSTEM_TABLE_SIGNATURE;\r
mDebugTable->EfiSystemTableBase = (EFI_PHYSICAL_ADDRESS) (UINTN) gDxeCoreST;\r
- mDebugTable->Crc32 = 0;\r
+ mDebugTable->Crc32 = 0;\r
+\r
+ //\r
+ // Install the EFI_SYSTEM_TABLE_POINTER structure in the EFI System\r
+ // Configuration Table\r
+ //\r
Status = CoreInstallConfigurationTable (&gEfiDebugImageInfoTableGuid, &mDebugInfoTableHeader);\r
ASSERT_EFI_ERROR (Status);\r
}\r
mDebugInfoTableHeader.UpdateStatus |= EFI_DEBUG_IMAGE_INFO_UPDATE_IN_PROGRESS;\r
\r
Table = mDebugInfoTableHeader.EfiDebugImageInfoTable;\r
- \r
+\r
if (mDebugInfoTableHeader.TableSize < mMaxTableEntries) {\r
//\r
// We still have empty entires in the Table, find the first empty entry.\r