diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c index 6dbcb086aa..87f595ddb8 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c @@ -15,8 +15,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "PiSmmCpuDxeSmm.h" -extern UINT32 mSmmRelocationOriginalAddressPtr32; -extern UINT32 mRebasedFlagAddr32; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmRelocationOriginalAddressPtr32; +X86_ASSEMBLY_PATCH_LABEL gPatchRebasedFlagAddr32; UINTN mSmmRelocationOriginalAddress; volatile BOOLEAN *mRebasedFlag; @@ -49,7 +49,11 @@ SemaphoreHook ( UINTN TempValue; mRebasedFlag = RebasedFlag; - mRebasedFlagAddr32 = (UINT32)(UINTN)mRebasedFlag; + PatchInstructionX86 ( + gPatchRebasedFlagAddr32, + (UINT32)(UINTN)mRebasedFlag, + 4 + ); CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); mSmmRelocationOriginalAddress = HookReturnFromSmm ( @@ -63,5 +67,9 @@ SemaphoreHook ( // Use temp value to fix ICC complier warning // TempValue = (UINTN)&mSmmRelocationOriginalAddress; - mSmmRelocationOriginalAddressPtr32 = (UINT32)TempValue; + PatchInstructionX86 ( + gPatchSmmRelocationOriginalAddressPtr32, + (UINT32)TempValue, + 4 + ); } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm index eae14c0549..0b0c3f28e5 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm @@ -29,8 +29,8 @@ global ASM_PFX(gPatchSmmInitStack) global ASM_PFX(gcSmiInitGdtr) global ASM_PFX(gcSmmInitSize) global ASM_PFX(gcSmmInitTemplate) -global ASM_PFX(mRebasedFlagAddr32) -global ASM_PFX(mSmmRelocationOriginalAddressPtr32) +global ASM_PFX(gPatchRebasedFlagAddr32) +global ASM_PFX(gPatchSmmRelocationOriginalAddressPtr32) %define LONG_MODE_CS 0x38 @@ -125,20 +125,18 @@ ASM_PFX(SmmRelocationSemaphoreComplete): ; ; Semaphore code running in 32-bit mode ; +BITS 32 global ASM_PFX(SmmRelocationSemaphoreComplete32) ASM_PFX(SmmRelocationSemaphoreComplete32): - ; - ; mov byte ptr [], 1 - ; - db 0xc6, 0x5 -ASM_PFX(mRebasedFlagAddr32): dd 0 - db 1 - ; - ; jmp dword ptr [] - ; - db 0xff, 0x25 -ASM_PFX(mSmmRelocationOriginalAddressPtr32): dd 0 + push eax + mov eax, strict dword 0 ; source operand will be patched +ASM_PFX(gPatchRebasedFlagAddr32): + mov byte [eax], 1 + pop eax + jmp dword [dword 0] ; destination will be patched +ASM_PFX(gPatchSmmRelocationOriginalAddressPtr32): +BITS 64 global ASM_PFX(PiSmmCpuSmmInitFixupAddress) ASM_PFX(PiSmmCpuSmmInitFixupAddress): lea rax, [@LongMode]