summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhi Jin <zhi.jin@intel.com>2024-01-04 13:23:23 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2024-01-12 02:57:15 +0000
commitcfe48465724293abd0a7d92c2a72f8ee3cf15628 (patch)
tree159fbffb5cfa53d96ce1c56786580ff8c224535a
parent2bce85bd862e54cede2b59b48972c9f05e2e733d (diff)
downloadedk2-cfe48465724293abd0a7d92c2a72f8ee3cf15628.tar.gz
edk2-cfe48465724293abd0a7d92c2a72f8ee3cf15628.tar.bz2
edk2-cfe48465724293abd0a7d92c2a72f8ee3cf15628.zip
UefiCpuPkg/PiSmmCpuDxeSmm: Optimize PatchSmmSaveStateMap and FlushTlbForAll
PatchSmmSaveStateMap patches the SMM entry (code) and SmmSaveState region (data) for each core, which can be improved to flush TLB once after all the memory entries have been patched. FlushTlbForAll flushes TLB for each core in serial, which can be improved to flush TLB in parallel. Reviewed-by: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Signed-off-by: Zhi Jin <zhi.jin@intel.com>
-rw-r--r--UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c97
1 files changed, 65 insertions, 32 deletions
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c
index 15f998e501..12f3c0b8e8 100644
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c
@@ -547,17 +547,14 @@ FlushTlbForAll (
VOID
)
{
- UINTN Index;
-
FlushTlbOnCurrentProcessor (NULL);
-
- for (Index = 0; Index < gSmst->NumberOfCpus; Index++) {
- if (Index != gSmst->CurrentlyExecutingCpu) {
- // Force to start up AP in blocking mode,
- SmmBlockingStartupThisAp (FlushTlbOnCurrentProcessor, Index, NULL);
- // Do not check return status, because AP might not be present in some corner cases.
- }
- }
+ InternalSmmStartupAllAPs (
+ (EFI_AP_PROCEDURE2)FlushTlbOnCurrentProcessor,
+ 0,
+ NULL,
+ NULL,
+ NULL
+ );
}
/**
@@ -799,72 +796,108 @@ PatchSmmSaveStateMap (
UINTN TileCodeSize;
UINTN TileDataSize;
UINTN TileSize;
+ UINTN PageTableBase;
- TileCodeSize = GetSmiHandlerSize ();
- TileCodeSize = ALIGN_VALUE (TileCodeSize, SIZE_4KB);
- TileDataSize = (SMRAM_SAVE_STATE_MAP_OFFSET - SMM_PSD_OFFSET) + sizeof (SMRAM_SAVE_STATE_MAP);
- TileDataSize = ALIGN_VALUE (TileDataSize, SIZE_4KB);
- TileSize = TileDataSize + TileCodeSize - 1;
- TileSize = 2 * GetPowerOfTwo32 ((UINT32)TileSize);
+ TileCodeSize = GetSmiHandlerSize ();
+ TileCodeSize = ALIGN_VALUE (TileCodeSize, SIZE_4KB);
+ TileDataSize = (SMRAM_SAVE_STATE_MAP_OFFSET - SMM_PSD_OFFSET) + sizeof (SMRAM_SAVE_STATE_MAP);
+ TileDataSize = ALIGN_VALUE (TileDataSize, SIZE_4KB);
+ TileSize = TileDataSize + TileCodeSize - 1;
+ TileSize = 2 * GetPowerOfTwo32 ((UINT32)TileSize);
+ PageTableBase = AsmReadCr3 () & PAGING_4K_ADDRESS_MASK_64;
DEBUG ((DEBUG_INFO, "PatchSmmSaveStateMap:\n"));
for (Index = 0; Index < mMaxNumberOfCpus - 1; Index++) {
//
// Code
//
- SmmSetMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[Index] + SMM_HANDLER_OFFSET,
TileCodeSize,
- EFI_MEMORY_RO
+ EFI_MEMORY_RO,
+ TRUE,
+ NULL
);
- SmmClearMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[Index] + SMM_HANDLER_OFFSET,
TileCodeSize,
- EFI_MEMORY_XP
+ EFI_MEMORY_XP,
+ FALSE,
+ NULL
);
//
// Data
//
- SmmClearMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[Index] + SMM_HANDLER_OFFSET + TileCodeSize,
TileSize - TileCodeSize,
- EFI_MEMORY_RO
+ EFI_MEMORY_RO,
+ FALSE,
+ NULL
);
- SmmSetMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[Index] + SMM_HANDLER_OFFSET + TileCodeSize,
TileSize - TileCodeSize,
- EFI_MEMORY_XP
+ EFI_MEMORY_XP,
+ TRUE,
+ NULL
);
}
//
// Code
//
- SmmSetMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[mMaxNumberOfCpus - 1] + SMM_HANDLER_OFFSET,
TileCodeSize,
- EFI_MEMORY_RO
+ EFI_MEMORY_RO,
+ TRUE,
+ NULL
);
- SmmClearMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[mMaxNumberOfCpus - 1] + SMM_HANDLER_OFFSET,
TileCodeSize,
- EFI_MEMORY_XP
+ EFI_MEMORY_XP,
+ FALSE,
+ NULL
);
//
// Data
//
- SmmClearMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[mMaxNumberOfCpus - 1] + SMM_HANDLER_OFFSET + TileCodeSize,
SIZE_32KB - TileCodeSize,
- EFI_MEMORY_RO
+ EFI_MEMORY_RO,
+ FALSE,
+ NULL
);
- SmmSetMemoryAttributes (
+ ConvertMemoryPageAttributes (
+ PageTableBase,
+ mPagingMode,
mCpuHotPlugData.SmBase[mMaxNumberOfCpus - 1] + SMM_HANDLER_OFFSET + TileCodeSize,
SIZE_32KB - TileCodeSize,
- EFI_MEMORY_XP
+ EFI_MEMORY_XP,
+ TRUE,
+ NULL
);
+
+ FlushTlbForAll ();
}
/**