Linux 4.1.18
[linux/fpc-iii.git] / arch / x86 / platform / efi / efi_stub_64.S
blob86d0f9e08dd95eb1023d5ac7ec4fb006aafb72c9
1 /*
2  * Function calling ABI conversion from Linux to EFI for x86_64
3  *
4  * Copyright (C) 2007 Intel Corp
5  *      Bibo Mao <bibo.mao@intel.com>
6  *      Huang Ying <ying.huang@intel.com>
7  */
9 #include <linux/linkage.h>
10 #include <asm/segment.h>
11 #include <asm/msr.h>
12 #include <asm/processor-flags.h>
13 #include <asm/page_types.h>
15 #define SAVE_XMM                        \
16         mov %rsp, %rax;                 \
17         subq $0x70, %rsp;               \
18         and $~0xf, %rsp;                \
19         mov %rax, (%rsp);               \
20         mov %cr0, %rax;                 \
21         clts;                           \
22         mov %rax, 0x8(%rsp);            \
23         movaps %xmm0, 0x60(%rsp);       \
24         movaps %xmm1, 0x50(%rsp);       \
25         movaps %xmm2, 0x40(%rsp);       \
26         movaps %xmm3, 0x30(%rsp);       \
27         movaps %xmm4, 0x20(%rsp);       \
28         movaps %xmm5, 0x10(%rsp)
30 #define RESTORE_XMM                     \
31         movaps 0x60(%rsp), %xmm0;       \
32         movaps 0x50(%rsp), %xmm1;       \
33         movaps 0x40(%rsp), %xmm2;       \
34         movaps 0x30(%rsp), %xmm3;       \
35         movaps 0x20(%rsp), %xmm4;       \
36         movaps 0x10(%rsp), %xmm5;       \
37         mov 0x8(%rsp), %rsi;            \
38         mov %rsi, %cr0;                 \
39         mov (%rsp), %rsp
41         /* stolen from gcc */
42         .macro FLUSH_TLB_ALL
43         movq %r15, efi_scratch(%rip)
44         movq %r14, efi_scratch+8(%rip)
45         movq %cr4, %r15
46         movq %r15, %r14
47         andb $0x7f, %r14b
48         movq %r14, %cr4
49         movq %r15, %cr4
50         movq efi_scratch+8(%rip), %r14
51         movq efi_scratch(%rip), %r15
52         .endm
54         .macro SWITCH_PGT
55         cmpb $0, efi_scratch+24(%rip)
56         je 1f
57         movq %r15, efi_scratch(%rip)            # r15
58         # save previous CR3
59         movq %cr3, %r15
60         movq %r15, efi_scratch+8(%rip)          # prev_cr3
61         movq efi_scratch+16(%rip), %r15         # EFI pgt
62         movq %r15, %cr3
63         1:
64         .endm
66         .macro RESTORE_PGT
67         cmpb $0, efi_scratch+24(%rip)
68         je 2f
69         movq efi_scratch+8(%rip), %r15
70         movq %r15, %cr3
71         movq efi_scratch(%rip), %r15
72         FLUSH_TLB_ALL
73         2:
74         .endm
76 ENTRY(efi_call)
77         SAVE_XMM
78         mov (%rsp), %rax
79         mov 8(%rax), %rax
80         subq $48, %rsp
81         mov %r9, 32(%rsp)
82         mov %rax, 40(%rsp)
83         mov %r8, %r9
84         mov %rcx, %r8
85         mov %rsi, %rcx
86         SWITCH_PGT
87         call *%rdi
88         RESTORE_PGT
89         addq $48, %rsp
90         RESTORE_XMM
91         ret
92 ENDPROC(efi_call)
94         .data
95 ENTRY(efi_scratch)
96         .fill 3,8,0
97         .byte 0
98         .quad 0