| /** @file | |
| SMM Relocation Lib for each processor. | |
| This Lib produces the SMM_BASE_HOB in HOB database which tells | |
| the PiSmmCpuDxeSmm driver (runs at a later phase) about the new | |
| SMBASE for each processor. PiSmmCpuDxeSmm driver installs the | |
| SMI handler at the SMM_BASE_HOB.SmBase[Index]+0x8000 for processor | |
| Index. | |
| Copyright (c) 2024, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef INTERNAL_SMM_RELOCATION_LIB_H_ | |
| #define INTERNAL_SMM_RELOCATION_LIB_H_ | |
| #include <Library/BaseLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/CpuExceptionHandlerLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/HobLib.h> | |
| #include <Library/LocalApicLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/PcdLib.h> | |
| #include <Library/PeimEntryPoint.h> | |
| #include <Library/PeiServicesLib.h> | |
| #include <Library/SmmRelocationLib.h> | |
| #include <Guid/SmramMemoryReserve.h> | |
| #include <Guid/SmmBaseHob.h> | |
| #include <Register/Intel/Cpuid.h> | |
| #include <Register/Intel/Msr.h> | |
| #include <Register/Intel/SmramSaveStateMap.h> | |
| #include <Protocol/MmCpu.h> | |
| extern IA32_DESCRIPTOR gcSmmInitGdtr; | |
| extern CONST UINT16 gcSmmInitSize; | |
| extern CONST UINT8 gcSmmInitTemplate[]; | |
| X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitCr0; | |
| X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitCr3; | |
| X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitCr4; | |
| X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitStack; | |
| // | |
| // The size 0x20 must be bigger than | |
| // the size of template code of SmmInit. Currently, | |
| // the size of SmmInit requires the 0x16 Bytes buffer | |
| // at least. | |
| // | |
| #define BACK_BUF_SIZE 0x20 | |
| #define CR4_CET_ENABLE BIT23 | |
| /** | |
| This function configures the SmBase on the currently executing CPU. | |
| @param[in] SmBase The SmBase on the currently executing CPU. | |
| **/ | |
| VOID | |
| EFIAPI | |
| ConfigureSmBase ( | |
| IN UINT64 SmBase | |
| ); | |
| /** | |
| Semaphore operation for all processor relocate SMMBase. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SmmRelocationSemaphoreComplete ( | |
| VOID | |
| ); | |
| /** | |
| Hook the code executed immediately after an RSM instruction on the currently | |
| executing CPU. The mode of code executed immediately after RSM must be | |
| detected, and the appropriate hook must be selected. Always clear the auto | |
| HALT restart flag if it is set. | |
| @param[in,out] CpuState Pointer to SMRAM Save State Map for the | |
| currently executing CPU. | |
| @param[in] NewInstructionPointer32 Instruction pointer to use if resuming to | |
| 32-bit mode from 64-bit SMM. | |
| @param[in] NewInstructionPointer Instruction pointer to use if resuming to | |
| same mode as SMM. | |
| @retval The value of the original instruction pointer before it was hooked. | |
| **/ | |
| UINT64 | |
| EFIAPI | |
| HookReturnFromSmm ( | |
| IN OUT SMRAM_SAVE_STATE_MAP *CpuState, | |
| IN UINT64 NewInstructionPointer32, | |
| IN UINT64 NewInstructionPointer | |
| ); | |
| /** | |
| Hook return address of SMM Save State so that semaphore code | |
| can be executed immediately after AP exits SMM to indicate to | |
| the BSP that an AP has exited SMM after SMBASE relocation. | |
| @param[in] RebasedFlag A pointer to a flag that is set to TRUE | |
| immediately after AP exits SMM. | |
| **/ | |
| VOID | |
| SemaphoreHook ( | |
| IN volatile BOOLEAN *RebasedFlag | |
| ); | |
| /** | |
| This function fixes up the address of the global variable or function | |
| referred in SmmInit assembly files to be the absolute address. | |
| **/ | |
| VOID | |
| EFIAPI | |
| SmmInitFixupAddress ( | |
| ); | |
| #endif |