Linux 4.18.10
[linux/fpc-iii.git] / arch / x86 / platform / efi / efi_stub_64.S
blob74628ec78f29713dd9121174b129768a553959d2
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Function calling ABI conversion from Linux to EFI for x86_64
4  *
5  * Copyright (C) 2007 Intel Corp
6  *      Bibo Mao <bibo.mao@intel.com>
7  *      Huang Ying <ying.huang@intel.com>
8  */
10 #include <linux/linkage.h>
11 #include <asm/segment.h>
12 #include <asm/msr.h>
13 #include <asm/processor-flags.h>
14 #include <asm/page_types.h>
16 #define SAVE_XMM                        \
17         mov %rsp, %rax;                 \
18         subq $0x70, %rsp;               \
19         and $~0xf, %rsp;                \
20         mov %rax, (%rsp);               \
21         mov %cr0, %rax;                 \
22         clts;                           \
23         mov %rax, 0x8(%rsp);            \
24         movaps %xmm0, 0x60(%rsp);       \
25         movaps %xmm1, 0x50(%rsp);       \
26         movaps %xmm2, 0x40(%rsp);       \
27         movaps %xmm3, 0x30(%rsp);       \
28         movaps %xmm4, 0x20(%rsp);       \
29         movaps %xmm5, 0x10(%rsp)
31 #define RESTORE_XMM                     \
32         movaps 0x60(%rsp), %xmm0;       \
33         movaps 0x50(%rsp), %xmm1;       \
34         movaps 0x40(%rsp), %xmm2;       \
35         movaps 0x30(%rsp), %xmm3;       \
36         movaps 0x20(%rsp), %xmm4;       \
37         movaps 0x10(%rsp), %xmm5;       \
38         mov 0x8(%rsp), %rsi;            \
39         mov %rsi, %cr0;                 \
40         mov (%rsp), %rsp
42 ENTRY(efi_call)
43         pushq %rbp
44         movq %rsp, %rbp
45         SAVE_XMM
46         mov 16(%rbp), %rax
47         subq $48, %rsp
48         mov %r9, 32(%rsp)
49         mov %rax, 40(%rsp)
50         mov %r8, %r9
51         mov %rcx, %r8
52         mov %rsi, %rcx
53         call *%rdi
54         addq $48, %rsp
55         RESTORE_XMM
56         popq %rbp
57         ret
58 ENDPROC(efi_call)