From: Shenglei Zhang Date: Tue, 5 Mar 2019 03:08:29 +0000 (+0800) Subject: MdePkg/BaseLib: Remove LongJump.c and SetJump.c X-Git-Tag: edk2-stable201905~294 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=174232fa9a90cfc224432ff5cb05872cb86daa3f;hp=34131e1b5c09b92c2801749212d9c3595e5f62d7 MdePkg/BaseLib: Remove LongJump.c and SetJump.c MdePkg BaseLib still uses the inline X86 assembly code in C code files.For now, inline SetJump/LongJump() can be removed. https://bugzilla.tianocore.org/show_bug.cgi?id=1163 Cc: Michael D Kinney Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Shenglei Zhang Reviewed-by: Liming Gao --- diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf index c82a6decf8..44ad37ac7e 100644 --- a/MdePkg/Library/BaseLib/BaseLib.inf +++ b/MdePkg/Library/BaseLib/BaseLib.inf @@ -91,7 +91,6 @@ Ia32/WriteCr0.c | MSFT Ia32/WriteMsr64.c | MSFT Ia32/SwapBytes64.c | MSFT - Ia32/SetJump.c | MSFT Ia32/RRotU64.c | MSFT Ia32/RShiftU64.c | MSFT Ia32/ReadPmc.c | MSFT @@ -135,7 +134,6 @@ Ia32/MultU64x32.c | MSFT Ia32/LShiftU64.c | MSFT Ia32/LRotU64.c | MSFT - Ia32/LongJump.c | MSFT Ia32/Invd.c | MSFT Ia32/FxRestore.c | MSFT Ia32/FxSave.c | MSFT @@ -185,7 +183,6 @@ Ia32/WriteCr0.nasm| INTEL Ia32/WriteMsr64.nasm| INTEL Ia32/SwapBytes64.nasm| INTEL - Ia32/SetJump.nasm| INTEL Ia32/RRotU64.nasm| INTEL Ia32/RShiftU64.nasm| INTEL Ia32/ReadPmc.nasm| INTEL @@ -229,7 +226,6 @@ Ia32/MultU64x32.nasm| INTEL Ia32/LShiftU64.nasm| INTEL Ia32/LRotU64.nasm| INTEL - Ia32/LongJump.nasm| INTEL Ia32/Invd.nasm| INTEL Ia32/FxRestore.nasm| INTEL Ia32/FxSave.nasm| INTEL @@ -263,8 +259,8 @@ Ia32/Monitor.nasm| GCC Ia32/CpuIdEx.nasm| GCC Ia32/CpuId.nasm| GCC - Ia32/LongJump.nasm| GCC - Ia32/SetJump.nasm| GCC + Ia32/LongJump.nasm + Ia32/SetJump.nasm Ia32/SwapBytes64.nasm| GCC Ia32/DivU64x64Remainder.nasm| GCC Ia32/DivU64x32Remainder.nasm| GCC diff --git a/MdePkg/Library/BaseLib/Ia32/LongJump.c b/MdePkg/Library/BaseLib/Ia32/LongJump.c deleted file mode 100644 index cf5fc5b58d..0000000000 --- a/MdePkg/Library/BaseLib/Ia32/LongJump.c +++ /dev/null @@ -1,70 +0,0 @@ -/** @file - Implementation of _LongJump() on IA-32. - - Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - - -#include "BaseLibInternals.h" - - -/** - Restores the CPU context that was saved with SetJump(). - - Restores the CPU context from the buffer specified by JumpBuffer. - This function never returns to the caller. - Instead is resumes execution based on the state of JumpBuffer. - - @param JumpBuffer A pointer to CPU context buffer. - @param Value The value to return when the SetJump() context is restored. - -**/ -__declspec (naked) -VOID -EFIAPI -InternalLongJump ( - IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, - IN UINTN Value - ) -{ - _asm { - mov eax, [PcdGet32 (PcdControlFlowEnforcementPropertyMask)] - test eax, eax - jz CetDone - _emit 0x0F - _emit 0x20 - _emit 0xE0 ; mov eax, cr4 - bt eax, 23 ; check if CET is enabled - jnc CetDone - - mov edx, [esp + 4] ; edx = JumpBuffer - mov edx, [edx + 24] ; edx = target SSP - _emit 0xF3 - _emit 0x0F - _emit 0x1E - _emit 0xC8 ; READSSP EAX - sub edx, eax ; edx = delta - mov eax, edx ; eax = delta - - shr eax, 2 ; eax = delta/sizeof(UINT32) - _emit 0xF3 - _emit 0x0F - _emit 0xAE - _emit 0xE8 ; INCSSP EAX - -CetDone: - - pop eax ; skip return address - pop edx ; edx <- JumpBuffer - pop eax ; eax <- Value - mov ebx, [edx] - mov esi, [edx + 4] - mov edi, [edx + 8] - mov ebp, [edx + 12] - mov esp, [edx + 16] - jmp dword ptr [edx + 20] - } -} - diff --git a/MdePkg/Library/BaseLib/Ia32/SetJump.c b/MdePkg/Library/BaseLib/Ia32/SetJump.c deleted file mode 100644 index 4a28490418..0000000000 --- a/MdePkg/Library/BaseLib/Ia32/SetJump.c +++ /dev/null @@ -1,95 +0,0 @@ -/** @file - Implementation of SetJump() on IA-32. - - Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - - -#include "BaseLibInternals.h" - -/** - Worker function that checks ASSERT condition for JumpBuffer - - Checks ASSERT condition for JumpBuffer. - - If JumpBuffer is NULL, then ASSERT(). - For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT(). - - @param JumpBuffer A pointer to CPU context buffer. - -**/ -VOID -EFIAPI -InternalAssertJumpBuffer ( - IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer - ); - -/** - Saves the current CPU context that can be restored with a call to LongJump() - and returns 0. - - Saves the current CPU context in the buffer specified by JumpBuffer and - returns 0. The initial call to SetJump() must always return 0. Subsequent - calls to LongJump() cause a non-zero value to be returned by SetJump(). - - If JumpBuffer is NULL, then ASSERT(). - For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT(). - - @param JumpBuffer A pointer to CPU context buffer. - - @retval 0 Indicates a return from SetJump(). - -**/ -_declspec (naked) -RETURNS_TWICE -UINTN -EFIAPI -SetJump ( - OUT BASE_LIBRARY_JUMP_BUFFER *JumpBuffer - ) -{ - _asm { - push [esp + 4] - call InternalAssertJumpBuffer - pop ecx - pop ecx - mov edx, [esp] - - xor eax, eax - mov [edx + 24], eax ; save 0 to SSP - - mov eax, [PcdGet32 (PcdControlFlowEnforcementPropertyMask)] - test eax, eax - jz CetDone - _emit 0x0F - _emit 0x20 - _emit 0xE0 ; mov eax, cr4 - bt eax, 23 ; check if CET is enabled - jnc CetDone - - mov eax, 1 - _emit 0xF3 - _emit 0x0F - _emit 0xAE - _emit 0xE8 ; INCSSP EAX to read original SSP - _emit 0xF3 - _emit 0x0F - _emit 0x1E - _emit 0xC8 ; READSSP EAX - mov [edx + 0x24], eax ; save SSP - -CetDone: - - mov [edx], ebx - mov [edx + 4], esi - mov [edx + 8], edi - mov [edx + 12], ebp - mov [edx + 16], esp - mov [edx + 20], ecx - xor eax, eax - jmp ecx - } -} -