]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/BaseLib/X64/LongJump.nasm
MdePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdePkg / Library / BaseLib / X64 / LongJump.nasm
CommitLineData
56244b92
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
56244b92
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 x64.\r
13;\r
14;------------------------------------------------------------------------------\r
15\r
0aac2f77
JY
16%include "Nasm.inc"\r
17\r
56244b92
JJ
18 DEFAULT REL\r
19 SECTION .text\r
20\r
0aac2f77
JY
21extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))\r
22\r
56244b92
JJ
23;------------------------------------------------------------------------------\r
24; VOID\r
25; EFIAPI\r
26; InternalLongJump (\r
27; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,\r
28; IN UINTN Value\r
29; );\r
30;------------------------------------------------------------------------------\r
31global ASM_PFX(InternalLongJump)\r
32ASM_PFX(InternalLongJump):\r
0aac2f77
JY
33\r
34 mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]\r
35 test eax, eax\r
36 jz CetDone\r
37 mov rax, cr4\r
38 bt eax, 23 ; check if CET is enabled\r
39 jnc CetDone\r
40\r
41 push rdx ; save rdx\r
42\r
43 mov rdx, [rcx + 0xF8] ; rdx = target SSP\r
44 READSSP_RAX\r
45 sub rdx, rax ; rdx = delta\r
46 mov rax, rdx ; rax = delta\r
47\r
48 shr rax, 3 ; rax = delta/sizeof(UINT64)\r
49 INCSSP_RAX\r
50\r
51 pop rdx ; restore rdx\r
52CetDone:\r
53\r
56244b92
JJ
54 mov rbx, [rcx]\r
55 mov rsp, [rcx + 8]\r
56 mov rbp, [rcx + 0x10]\r
57 mov rdi, [rcx + 0x18]\r
58 mov rsi, [rcx + 0x20]\r
59 mov r12, [rcx + 0x28]\r
60 mov r13, [rcx + 0x30]\r
61 mov r14, [rcx + 0x38]\r
62 mov r15, [rcx + 0x40]\r
63 ; load non-volatile fp registers\r
64 ldmxcsr [rcx + 0x50]\r
65 movdqu xmm6, [rcx + 0x58]\r
66 movdqu xmm7, [rcx + 0x68]\r
67 movdqu xmm8, [rcx + 0x78]\r
68 movdqu xmm9, [rcx + 0x88]\r
69 movdqu xmm10, [rcx + 0x98]\r
70 movdqu xmm11, [rcx + 0xA8]\r
71 movdqu xmm12, [rcx + 0xB8]\r
72 movdqu xmm13, [rcx + 0xC8]\r
73 movdqu xmm14, [rcx + 0xD8]\r
74 movdqu xmm15, [rcx + 0xE8]\r
75 mov rax, rdx ; set return value\r
76 jmp qword [rcx + 0x48]\r
77\r