diff options
author | Zhi Jin <zhi.jin@intel.com> | 2024-01-04 13:23:23 +0800 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2024-01-12 02:57:15 +0000 |
commit | cfe48465724293abd0a7d92c2a72f8ee3cf15628 (patch) | |
tree | 159fbffb5cfa53d96ce1c56786580ff8c224535a | |
parent | 2bce85bd862e54cede2b59b48972c9f05e2e733d (diff) | |
download | edk2-cfe48465724293abd0a7d92c2a72f8ee3cf15628.tar.gz |
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.c | 97 |
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 ();
}
/**
|