]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/BaseLib/Ia32/LongJump.nasm
MdePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdePkg / Library / BaseLib / Ia32 / LongJump.nasm
CommitLineData
f493cf81
JJ
1;------------------------------------------------------------------------------\r
2;\r
0aac2f77 3; Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
9344f092 4; SPDX-License-Identifier: BSD-2-Clause-Patent\r
f493cf81
JJ
5;\r
6; Module Name:\r
7;\r
8; LongJump.Asm\r
9;\r
10; Abstract:\r
11;\r
12; Implementation of _LongJump() on IA-32.\r
13;\r
14;------------------------------------------------------------------------------\r
15\r
0aac2f77
JY
16%include "Nasm.inc"\r
17\r
f493cf81
JJ
18 SECTION .text\r
19\r
0aac2f77
JY
20extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))\r
21\r
f493cf81
JJ
22;------------------------------------------------------------------------------\r
23; VOID\r
24; EFIAPI\r
25; InternalLongJump (\r
26; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,\r
27; IN UINTN Value\r
28; );\r
29;------------------------------------------------------------------------------\r
30global ASM_PFX(InternalLongJump)\r
31ASM_PFX(InternalLongJump):\r
0aac2f77
JY
32\r
33 mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]\r
34 test eax, eax\r
35 jz CetDone\r
36 mov eax, cr4\r
37 bt eax, 23 ; check if CET is enabled\r
38 jnc CetDone\r
39\r
40 mov edx, [esp + 4] ; edx = JumpBuffer\r
41 mov edx, [edx + 24] ; edx = target SSP\r
42 READSSP_EAX\r
43 sub edx, eax ; edx = delta\r
44 mov eax, edx ; eax = delta\r
45\r
46 shr eax, 2 ; eax = delta/sizeof(UINT32)\r
47 INCSSP_EAX\r
48\r
49CetDone:\r
50\r
f493cf81
JJ
51 pop eax ; skip return address\r
52 pop edx ; edx <- JumpBuffer\r
53 pop eax ; eax <- Value\r
54 mov ebx, [edx]\r
55 mov esi, [edx + 4]\r
56 mov edi, [edx + 8]\r
57 mov ebp, [edx + 12]\r
58 mov esp, [edx + 16]\r
59 jmp dword [edx + 20] ; restore "eip"\r
60\r