mirror of https://github.com/acidanthera/audk.git
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 <michael.d.kinney@intel.com> Cc: Liming Gao <liming.gao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
parent
34131e1b5c
commit
174232fa9a
|
@ -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
|
||||
|
|
|
@ -1,70 +0,0 @@
|
|||
/** @file
|
||||
Implementation of _LongJump() on IA-32.
|
||||
|
||||
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
/** @file
|
||||
Implementation of SetJump() on IA-32.
|
||||
|
||||
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||
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
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue