| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Function calling ABI conversion from Linux to EFI for x86_64 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2007 Intel Corp | 
					
						
							|  |  |  |  *	Bibo Mao <bibo.mao@intel.com>
 | 
					
						
							|  |  |  |  *	Huang Ying <ying.huang@intel.com>
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/linkage.h> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SAVE_XMM			\ | 
					
						
							|  |  |  | 	mov %rsp, %rax;			\
 | 
					
						
							|  |  |  | 	subq $0x70, %rsp;		\
 | 
					
						
							|  |  |  | 	and $~0xf, %rsp;		\
 | 
					
						
							|  |  |  | 	mov %rax, (%rsp);		\
 | 
					
						
							|  |  |  | 	mov %cr0, %rax;			\
 | 
					
						
							|  |  |  | 	clts;				\
 | 
					
						
							|  |  |  | 	mov %rax, 0x8(%rsp);		\
 | 
					
						
							|  |  |  | 	movaps %xmm0, 0x60(%rsp);	\
 | 
					
						
							|  |  |  | 	movaps %xmm1, 0x50(%rsp);	\
 | 
					
						
							|  |  |  | 	movaps %xmm2, 0x40(%rsp);	\
 | 
					
						
							|  |  |  | 	movaps %xmm3, 0x30(%rsp);	\
 | 
					
						
							|  |  |  | 	movaps %xmm4, 0x20(%rsp);	\
 | 
					
						
							|  |  |  | 	movaps %xmm5, 0x10(%rsp) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define RESTORE_XMM			\ | 
					
						
							|  |  |  | 	movaps 0x60(%rsp), %xmm0;	\
 | 
					
						
							|  |  |  | 	movaps 0x50(%rsp), %xmm1;	\
 | 
					
						
							|  |  |  | 	movaps 0x40(%rsp), %xmm2;	\
 | 
					
						
							|  |  |  | 	movaps 0x30(%rsp), %xmm3;	\
 | 
					
						
							|  |  |  | 	movaps 0x20(%rsp), %xmm4;	\
 | 
					
						
							|  |  |  | 	movaps 0x10(%rsp), %xmm5;	\
 | 
					
						
							|  |  |  | 	mov 0x8(%rsp), %rsi;		\
 | 
					
						
							|  |  |  | 	mov %rsi, %cr0;			\
 | 
					
						
							|  |  |  | 	mov (%rsp), %rsp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call0) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	subq $32, %rsp | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $32, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call0) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call1) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	subq $32, %rsp | 
					
						
							|  |  |  | 	mov  %rsi, %rcx | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $32, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call1) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call2) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	subq $32, %rsp | 
					
						
							|  |  |  | 	mov  %rsi, %rcx | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $32, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call2) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call3) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	subq $32, %rsp | 
					
						
							|  |  |  | 	mov  %rcx, %r8 | 
					
						
							|  |  |  | 	mov  %rsi, %rcx | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $32, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call3) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call4) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	subq $32, %rsp | 
					
						
							|  |  |  | 	mov %r8, %r9 | 
					
						
							|  |  |  | 	mov %rcx, %r8 | 
					
						
							|  |  |  | 	mov %rsi, %rcx | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $32, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call4) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call5) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	subq $48, %rsp | 
					
						
							|  |  |  | 	mov %r9, 32(%rsp) | 
					
						
							|  |  |  | 	mov %r8, %r9 | 
					
						
							|  |  |  | 	mov %rcx, %r8 | 
					
						
							|  |  |  | 	mov %rsi, %rcx | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $48, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call5) | 
					
						
							| 
									
										
										
										
											2008-01-30 13:31:19 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | ENTRY(efi_call6) | 
					
						
							|  |  |  | 	SAVE_XMM | 
					
						
							|  |  |  | 	mov (%rsp), %rax | 
					
						
							|  |  |  | 	mov 8(%rax), %rax | 
					
						
							|  |  |  | 	subq $48, %rsp | 
					
						
							|  |  |  | 	mov %r9, 32(%rsp) | 
					
						
							|  |  |  | 	mov %rax, 40(%rsp) | 
					
						
							|  |  |  | 	mov %r8, %r9 | 
					
						
							|  |  |  | 	mov %rcx, %r8 | 
					
						
							|  |  |  | 	mov %rsi, %rcx | 
					
						
							|  |  |  | 	call *%rdi | 
					
						
							|  |  |  | 	addq $48, %rsp | 
					
						
							|  |  |  | 	RESTORE_XMM | 
					
						
							|  |  |  | 	ret | 
					
						
							| 
									
										
										
										
											2009-02-23 22:57:02 +03:00
										 |  |  | ENDPROC(efi_call6) |