diff options
Diffstat (limited to 'arch/x86/platform/efi/efi_stub_64.S')
-rw-r--r-- | arch/x86/platform/efi/efi_stub_64.S | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/arch/x86/platform/efi/efi_stub_64.S b/arch/x86/platform/efi/efi_stub_64.S new file mode 100644 index 000000000000..4c07ccab8146 --- /dev/null +++ b/arch/x86/platform/efi/efi_stub_64.S | |||
@@ -0,0 +1,116 @@ | |||
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 | */ | ||
8 | |||
9 | #include <linux/linkage.h> | ||
10 | |||
11 | #define SAVE_XMM \ | ||
12 | mov %rsp, %rax; \ | ||
13 | subq $0x70, %rsp; \ | ||
14 | and $~0xf, %rsp; \ | ||
15 | mov %rax, (%rsp); \ | ||
16 | mov %cr0, %rax; \ | ||
17 | clts; \ | ||
18 | mov %rax, 0x8(%rsp); \ | ||
19 | movaps %xmm0, 0x60(%rsp); \ | ||
20 | movaps %xmm1, 0x50(%rsp); \ | ||
21 | movaps %xmm2, 0x40(%rsp); \ | ||
22 | movaps %xmm3, 0x30(%rsp); \ | ||
23 | movaps %xmm4, 0x20(%rsp); \ | ||
24 | movaps %xmm5, 0x10(%rsp) | ||
25 | |||
26 | #define RESTORE_XMM \ | ||
27 | movaps 0x60(%rsp), %xmm0; \ | ||
28 | movaps 0x50(%rsp), %xmm1; \ | ||
29 | movaps 0x40(%rsp), %xmm2; \ | ||
30 | movaps 0x30(%rsp), %xmm3; \ | ||
31 | movaps 0x20(%rsp), %xmm4; \ | ||
32 | movaps 0x10(%rsp), %xmm5; \ | ||
33 | mov 0x8(%rsp), %rsi; \ | ||
34 | mov %rsi, %cr0; \ | ||
35 | mov (%rsp), %rsp | ||
36 | |||
37 | ENTRY(efi_call0) | ||
38 | SAVE_XMM | ||
39 | subq $32, %rsp | ||
40 | call *%rdi | ||
41 | addq $32, %rsp | ||
42 | RESTORE_XMM | ||
43 | ret | ||
44 | ENDPROC(efi_call0) | ||
45 | |||
46 | ENTRY(efi_call1) | ||
47 | SAVE_XMM | ||
48 | subq $32, %rsp | ||
49 | mov %rsi, %rcx | ||
50 | call *%rdi | ||
51 | addq $32, %rsp | ||
52 | RESTORE_XMM | ||
53 | ret | ||
54 | ENDPROC(efi_call1) | ||
55 | |||
56 | ENTRY(efi_call2) | ||
57 | SAVE_XMM | ||
58 | subq $32, %rsp | ||
59 | mov %rsi, %rcx | ||
60 | call *%rdi | ||
61 | addq $32, %rsp | ||
62 | RESTORE_XMM | ||
63 | ret | ||
64 | ENDPROC(efi_call2) | ||
65 | |||
66 | ENTRY(efi_call3) | ||
67 | SAVE_XMM | ||
68 | subq $32, %rsp | ||
69 | mov %rcx, %r8 | ||
70 | mov %rsi, %rcx | ||
71 | call *%rdi | ||
72 | addq $32, %rsp | ||
73 | RESTORE_XMM | ||
74 | ret | ||
75 | ENDPROC(efi_call3) | ||
76 | |||
77 | ENTRY(efi_call4) | ||
78 | SAVE_XMM | ||
79 | subq $32, %rsp | ||
80 | mov %r8, %r9 | ||
81 | mov %rcx, %r8 | ||
82 | mov %rsi, %rcx | ||
83 | call *%rdi | ||
84 | addq $32, %rsp | ||
85 | RESTORE_XMM | ||
86 | ret | ||
87 | ENDPROC(efi_call4) | ||
88 | |||
89 | ENTRY(efi_call5) | ||
90 | SAVE_XMM | ||
91 | subq $48, %rsp | ||
92 | mov %r9, 32(%rsp) | ||
93 | mov %r8, %r9 | ||
94 | mov %rcx, %r8 | ||
95 | mov %rsi, %rcx | ||
96 | call *%rdi | ||
97 | addq $48, %rsp | ||
98 | RESTORE_XMM | ||
99 | ret | ||
100 | ENDPROC(efi_call5) | ||
101 | |||
102 | ENTRY(efi_call6) | ||
103 | SAVE_XMM | ||
104 | mov (%rsp), %rax | ||
105 | mov 8(%rax), %rax | ||
106 | subq $48, %rsp | ||
107 | mov %r9, 32(%rsp) | ||
108 | mov %rax, 40(%rsp) | ||
109 | mov %r8, %r9 | ||
110 | mov %rcx, %r8 | ||
111 | mov %rsi, %rcx | ||
112 | call *%rdi | ||
113 | addq $48, %rsp | ||
114 | RESTORE_XMM | ||
115 | ret | ||
116 | ENDPROC(efi_call6) | ||