REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3790 Replace Opcode with the corresponding instructions. The code changes have been verified with CompareBuild.py tool, which can be used to compare the results of two different EDK II builds to determine if they generate the same binaries. (tool link: https://github.com/mdkinney/edk2/tree/sandbox/CompareBuild) Signed-off-by: Jason Lou <yun.lou@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
61 lines
1.8 KiB
NASM
61 lines
1.8 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
; Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
; Module Name:
|
|
;
|
|
; LongJump.Asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; Implementation of _LongJump() on IA-32.
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
%include "Nasm.inc"
|
|
|
|
SECTION .text
|
|
|
|
extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))
|
|
|
|
;------------------------------------------------------------------------------
|
|
; VOID
|
|
; EFIAPI
|
|
; InternalLongJump (
|
|
; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
|
|
; IN UINTN Value
|
|
; );
|
|
;------------------------------------------------------------------------------
|
|
global ASM_PFX(InternalLongJump)
|
|
ASM_PFX(InternalLongJump):
|
|
|
|
mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]
|
|
test eax, eax
|
|
jz CetDone
|
|
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
|
|
rdsspd eax
|
|
sub edx, eax ; edx = delta
|
|
mov eax, edx ; eax = delta
|
|
|
|
shr eax, 2 ; eax = delta/sizeof(UINT32)
|
|
incsspd 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 [edx + 20] ; restore "eip"
|
|
|