]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg PiSmmCore: Retrieve Smram base address from system table
authorLiming Gao <liming.gao@intel.com>
Mon, 12 Dec 2016 02:09:51 +0000 (10:09 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 12 Dec 2016 02:52:33 +0000 (10:52 +0800)
PiSmmIpl records LoadModuleAtFixAddressSmramBase in LMFAConfigurationTable.
Update PiSmmCore to directly get the address from this system table.

Cc: Star Zeng <star.zeng@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
MdeModulePkg/Core/PiSmmCore/PiSmmCore.h
MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf
MdeModulePkg/Core/PiSmmCore/Pool.c

index d1e77913023cbff46b47d7e8945fb6d33090ffea..58590d5f6169e6ad2e18fb8adae20b5be0a41f79 100644 (file)
@@ -37,6 +37,7 @@
 #include <Guid/EventGroup.h>\r
 #include <Guid/EventLegacyBios.h>\r
 #include <Guid/MemoryProfile.h>\r
+#include <Guid/LoadModuleAtFixedAddress.h>\r
 \r
 #include <Library/BaseLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
index c256e90a9baaf3968921839c7128e13bd4b1bf58..f380fc5f4bb3f3ecc73bf3e59d47217761dd4a4a 100644 (file)
@@ -98,6 +98,8 @@
   ## SOMETIMES_PRODUCES   ## GUID # Install protocol\r
   gEdkiiSmmMemoryProfileGuid\r
   gEdkiiPiSmmMemoryAttributesTableGuid          ## SOMETIMES_PRODUCES   ## SystemTable\r
+  ## SOMETIMES_CONSUMES   ## SystemTable\r
+  gLoadFixedAddressConfigurationTableGuid\r
 \r
 [UserExtensions.TianoCore."ExtraFiles"]\r
   PiSmmCoreExtra.uni\r
index 173650ae1dc820d5b2a839cc9547725f6133d4bc..f734b3f72db4508d950ee406dfdd8123f1c64be1 100644 (file)
@@ -59,10 +59,9 @@ SmmInitializeMemoryServices (
   )\r
 {\r
   UINTN                  Index;\r
-  UINT64                 SmmCodeSize;\r
-  UINTN                  CurrentSmramRangesIndex;\r
-  UINT64                 MaxSize;\r
+  EFI_STATUS             Status;\r
   UINTN                  SmmPoolTypeIndex;\r
+  EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE *LMFAConfigurationTable;\r
 \r
   //\r
   // Initialize Pool list\r
@@ -72,45 +71,15 @@ SmmInitializeMemoryServices (
       InitializeListHead (&mSmmPoolLists[SmmPoolTypeIndex][Index]);\r
     }\r
   }\r
-  CurrentSmramRangesIndex = 0;\r
-  //\r
-  // If Loading Module At fixed Address feature is enabled, cache the SMRAM base here\r
-  //\r
-  if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) {\r
-    //\r
-    // Build tool will calculate the smm code size and then patch the PcdLoadFixAddressSmmCodePageNumber\r
-    //\r
-    SmmCodeSize = LShiftU64 (PcdGet32(PcdLoadFixAddressSmmCodePageNumber), EFI_PAGE_SHIFT);\r
-    \r
-    //\r
-    // Find the largest SMRAM range between 1MB and 4GB that is at least 256KB - 4K in size\r
-    //\r
-    for (Index = 0, MaxSize = SIZE_256KB - EFI_PAGE_SIZE; Index < SmramRangeCount; Index++) {\r
-      //\r
-      // Skip any SMRAM region that is already allocated, needs testing, or needs ECC initialization\r
-      //\r
-      if ((SmramRanges[Index].RegionState & (EFI_ALLOCATED | EFI_NEEDS_TESTING | EFI_NEEDS_ECC_INITIALIZATION)) != 0) {\r
-        continue;\r
-      }\r
-\r
-      if (SmramRanges[Index].CpuStart >= BASE_1MB) {\r
-        if ((SmramRanges[Index].CpuStart + SmramRanges[Index].PhysicalSize - 1) <= MAX_ADDRESS) {\r
-          if (SmramRanges[Index].PhysicalSize >= MaxSize) {\r
-            MaxSize = SmramRanges[Index].PhysicalSize;\r
-            CurrentSmramRangesIndex = Index;\r
-          }\r
-        }\r
-      }\r
-    }\r
-    gLoadModuleAtFixAddressSmramBase = SmramRanges[CurrentSmramRangesIndex].CpuStart;\r
-    \r
-    //\r
-    // cut out a memory range from this SMRAM range with the size SmmCodeSize to hold SMM driver code\r
-    // A notable thing is that SMM core is already loaded into this range.\r
-    //\r
-    SmramRanges[CurrentSmramRangesIndex].CpuStart     = SmramRanges[CurrentSmramRangesIndex].CpuStart + SmmCodeSize; \r
-    SmramRanges[CurrentSmramRangesIndex].PhysicalSize = SmramRanges[CurrentSmramRangesIndex].PhysicalSize - SmmCodeSize;\r
+\r
+  Status = EfiGetSystemConfigurationTable (\r
+            &gLoadFixedAddressConfigurationTableGuid,\r
+           (VOID **) &LMFAConfigurationTable\r
+           );\r
+  if (!EFI_ERROR (Status) && LMFAConfigurationTable != NULL) {\r
+    gLoadModuleAtFixAddressSmramBase = LMFAConfigurationTable->SmramBase;\r
   }\r
+\r
   //\r
   // Add Free SMRAM regions\r
   // Need add Free memory at first, to let gSmmMemoryMap record data\r