Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt...
[linux-2.6] / arch / x86 / kernel / efi_stub_64.S
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)