1 ;------------------------------------------------------------------------------
3 ; Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
4 ; SPDX-License-Identifier: BSD-2-Clause-Patent
12 ; Implementation of _LongJump() on x64.
14 ;------------------------------------------------------------------------------
21 extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))
23 ;------------------------------------------------------------------------------
27 ; IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
30 ;------------------------------------------------------------------------------
31 global ASM_PFX(InternalLongJump)
32 ASM_PFX(InternalLongJump):
34 mov eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]
38 bt eax, 23 ; check if CET is enabled
43 mov rdx, [rcx + 0xF8] ; rdx = target SSP
45 sub rdx, rax ; rdx = delta
46 mov rax, rdx ; rax = delta
48 shr rax, 3 ; rax = delta/sizeof(UINT64)
63 ; load non-volatile fp registers
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]