1 ;------------------------------------------------------------------------------
3 ; Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.<BR>
4 ; SPDX-License-Identifier: BSD-2-Clause-Patent
12 ; Implementation of _LongJump() on IA-32.
14 ;------------------------------------------------------------------------------
20 extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))
22 ;------------------------------------------------------------------------------
26 ; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
29 ;------------------------------------------------------------------------------
30 global ASM_PFX(InternalLongJump)
31 ASM_PFX(InternalLongJump):
33 mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]
37 bt eax, 23 ; check if CET is enabled
40 mov edx, [esp + 4] ; edx = JumpBuffer
41 mov edx, [edx + 24] ; edx = target SSP
43 sub edx, eax ; edx = delta
44 mov eax, edx ; eax = delta
46 shr eax, 2 ; eax = delta/sizeof(UINT32)
51 pop eax ; skip return address
52 pop edx ; edx <- JumpBuffer
53 pop eax ; eax <- Value
59 jmp dword [edx + 20] ; restore "eip"