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;   SetJump.Asm
9;
10; Abstract:
11;
12;   Implementation of SetJump() on x64.
13;
14;------------------------------------------------------------------------------
15
16%include "Nasm.inc"
17
18    DEFAULT REL
19    SECTION .text
20
21extern ASM_PFX(InternalAssertJumpBuffer)
22extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))
23
24;------------------------------------------------------------------------------
25; UINTN
26; EFIAPI
27; SetJump (
28;   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
29;   );
30;------------------------------------------------------------------------------
31global ASM_PFX(SetJump)
32ASM_PFX(SetJump):
33    push    rcx
34    add     rsp, -0x20
35    call    ASM_PFX(InternalAssertJumpBuffer)
36    add     rsp, 0x20
37    pop     rcx
38    pop     rdx
39
40    xor     rax, rax
41    mov     [rcx + 0xF8], rax            ; save 0 to SSP
42
43    mov     eax, [ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))]
44    test    eax, eax
45    jz      CetDone
46    mov     rax, cr4
47    bt      eax, 23                      ; check if CET is enabled
48    jnc     CetDone
49
50    mov     rax, 1
51    INCSSP_RAX                           ; to read original SSP
52    READSSP_RAX
53    mov     [rcx + 0xF8], rax            ; save SSP
54
55CetDone:
56
57    mov     [rcx], rbx
58    mov     [rcx + 8], rsp
59    mov     [rcx + 0x10], rbp
60    mov     [rcx + 0x18], rdi
61    mov     [rcx + 0x20], rsi
62    mov     [rcx + 0x28], r12
63    mov     [rcx + 0x30], r13
64    mov     [rcx + 0x38], r14
65    mov     [rcx + 0x40], r15
66    mov     [rcx + 0x48], rdx
67    ; save non-volatile fp registers
68    stmxcsr [rcx + 0x50]
69    movdqu  [rcx + 0x58], xmm6
70    movdqu  [rcx + 0x68], xmm7
71    movdqu  [rcx + 0x78], xmm8
72    movdqu  [rcx + 0x88], xmm9
73    movdqu  [rcx + 0x98], xmm10
74    movdqu  [rcx + 0xA8], xmm11
75    movdqu  [rcx + 0xB8], xmm12
76    movdqu  [rcx + 0xC8], xmm13
77    movdqu  [rcx + 0xD8], xmm14
78    movdqu  [rcx + 0xE8], xmm15
79    xor     rax, rax
80    jmp     rdx
81
82