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