// Since the memory range to load SMM CORE will be cut out in SMM core, so no need to allocate and free this range\r
//\r
PageCount = 0;\r
+ //\r
+ // Reserved Smram Region for SmmCore is not used, and remove it from SmramRangeCount.\r
+ //\r
+ gSmmCorePrivate->SmramRangeCount --;\r
} else {\r
DEBUG ((EFI_D_INFO, "LOADING MODULE FIXED ERROR: Loading module at fixed address at address failed\n"));\r
//\r
UINTN Index2;\r
EFI_SMRAM_DESCRIPTOR *FullSmramRanges;\r
UINTN TempSmramRangeCount;\r
+ UINTN AdditionSmramRangeCount;\r
EFI_SMRAM_DESCRIPTOR *TempSmramRanges;\r
UINTN SmramRangeCount;\r
EFI_SMRAM_DESCRIPTOR *SmramRanges;\r
}\r
}\r
\r
+ //\r
+ // Reserve one entry for SMM Core in the full SMRAM ranges.\r
+ //\r
+ AdditionSmramRangeCount = 1;\r
+ if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) {\r
+ //\r
+ // Reserve two entries for all SMM drivers and SMM Core in the full SMRAM ranges.\r
+ //\r
+ AdditionSmramRangeCount = 2;\r
+ }\r
+\r
if (SmramReservedCount == 0) {\r
//\r
// No reserved SMRAM entry from SMM Configuration Protocol.\r
- // Reserve one entry for SMM Core in the full SMRAM ranges.\r
//\r
- *FullSmramRangeCount = SmramRangeCount + 1;\r
+ *FullSmramRangeCount = SmramRangeCount + AdditionSmramRangeCount;\r
Size = (*FullSmramRangeCount) * sizeof (EFI_SMRAM_DESCRIPTOR);\r
FullSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocateZeroPool (Size);\r
ASSERT (FullSmramRanges != NULL);\r
ASSERT (TempSmramRangeCount <= MaxCount);\r
\r
//\r
- // Sort the entries,\r
- // and reserve one entry for SMM Core in the full SMRAM ranges.\r
+ // Sort the entries\r
//\r
- FullSmramRanges = AllocateZeroPool ((TempSmramRangeCount + 1) * sizeof (EFI_SMRAM_DESCRIPTOR));\r
+ FullSmramRanges = AllocateZeroPool ((TempSmramRangeCount + AdditionSmramRangeCount) * sizeof (EFI_SMRAM_DESCRIPTOR));\r
ASSERT (FullSmramRanges != NULL);\r
*FullSmramRangeCount = 0;\r
do {\r
TempSmramRanges[Index].PhysicalSize = 0;\r
} while (*FullSmramRangeCount < TempSmramRangeCount);\r
ASSERT (*FullSmramRangeCount == TempSmramRangeCount);\r
- *FullSmramRangeCount += 1;\r
+ *FullSmramRangeCount += AdditionSmramRangeCount;\r
\r
FreePool (SmramRanges);\r
FreePool (SmramReservedRanges);\r
EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE *LMFAConfigurationTable;\r
EFI_CPU_ARCH_PROTOCOL *CpuArch;\r
EFI_STATUS SetAttrStatus;\r
+ EFI_SMRAM_DESCRIPTOR *SmramRangeSmmDriver;\r
\r
//\r
// Fill in the image handle of the SMM IPL so the SMM Core can use this as the \r
//\r
DEBUG ((EFI_D_INFO, "LOADING MODULE FIXED INFO: TSEG BASE is %x. \n", LMFAConfigurationTable->SmramBase));\r
}\r
+\r
+ //\r
+ // Fill the Smram range for all SMM code\r
+ //\r
+ SmramRangeSmmDriver = &gSmmCorePrivate->SmramRanges[gSmmCorePrivate->SmramRangeCount - 2];\r
+ SmramRangeSmmDriver->CpuStart = mCurrentSmramRange->CpuStart;\r
+ SmramRangeSmmDriver->PhysicalStart = mCurrentSmramRange->PhysicalStart;\r
+ SmramRangeSmmDriver->RegionState = mCurrentSmramRange->RegionState | EFI_ALLOCATED;\r
+ SmramRangeSmmDriver->PhysicalSize = SmmCodeSize;\r
+\r
+ mCurrentSmramRange->PhysicalSize -= SmmCodeSize;\r
+ mCurrentSmramRange->CpuStart = mCurrentSmramRange->CpuStart + SmmCodeSize;\r
+ mCurrentSmramRange->PhysicalStart = mCurrentSmramRange->PhysicalStart + SmmCodeSize;\r
}\r
//\r
// Load SMM Core into SMRAM and execute it from SMRAM\r