1;------------------------------------------------------------------------------
2;
3; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4; This program and the accompanying materials
5; are licensed and made available under the terms and conditions of the BSD License
6; which accompanies this distribution.  The full text of the license may be found at
7; http://opensource.org/licenses/bsd-license.php.
8;
9; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11;
12; Module Name:
13;
14;   SetJump.Asm
15;
16; Abstract:
17;
18;   Implementation of SetJump() on x64.
19;
20;------------------------------------------------------------------------------
21
22    .code
23
24EXTERNDEF   InternalAssertJumpBuffer:PROC
25
26;------------------------------------------------------------------------------
27; UINTN
28; EFIAPI
29; SetJump (
30;   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
31;   );
32;------------------------------------------------------------------------------
33SetJump     PROC
34    push    rcx
35    add     rsp, -20h
36    call    InternalAssertJumpBuffer
37    add     rsp, 20h
38    pop     rcx
39    pop     rdx
40    mov     [rcx], rbx
41    mov     [rcx + 8], rsp
42    mov     [rcx + 10h], rbp
43    mov     [rcx + 18h], rdi
44    mov     [rcx + 20h], rsi
45    mov     [rcx + 28h], r12
46    mov     [rcx + 30h], r13
47    mov     [rcx + 38h], r14
48    mov     [rcx + 40h], r15
49    mov     [rcx + 48h], rdx
50    ; save non-volatile fp registers
51    stmxcsr [rcx + 50h]
52    movdqu  [rcx + 58h], xmm6
53    movdqu  [rcx + 68h], xmm7
54    movdqu  [rcx + 78h], xmm8
55    movdqu  [rcx + 88h], xmm9
56    movdqu  [rcx + 98h], xmm10
57    movdqu  [rcx + 0A8h], xmm11
58    movdqu  [rcx + 0B8h], xmm12
59    movdqu  [rcx + 0C8h], xmm13
60    movdqu  [rcx + 0D8h], xmm14
61    movdqu  [rcx + 0E8h], xmm15
62    xor     rax, rax
63    jmp     rdx
64SetJump     ENDP
65
66    END
67