8b5a9e0
diff -urpN gnu-efi-3.0d/lib/x86_64/callwrap.c.uefi_wrap gnu-efi-3.0d/lib/x86_64/callwrap.c
8b5a9e0
--- gnu-efi-3.0d/lib/x86_64/callwrap.c.uefi_wrap	2007-05-11 13:03:05.000000000 -0400
8b5a9e0
+++ gnu-efi-3.0d/lib/x86_64/callwrap.c	2008-01-11 16:02:40.000000000 -0500
3708703
@@ -1,28 +1,328 @@
3708703
-/*++
3708703
-
3708703
-Copyright (c) 2006  Intel Corporation
3708703
-
3708703
-Module Name:
3708703
-
3708703
-    hw.c
3708703
-
3708703
-Abstract:
3708703
+/*
3708703
+ *  Copyright (C) 2006 Giridhar Pemmasani
3708703
+ *  Copyright (C) 2007-2010 Intel Corp
3708703
+ *  	Contributed by Chandramouli Narayanan<mouli@linux.intel.com>
3708703
+ *	Adapted wrapper macros for Linux to windows calls from
3708703
+ *	NDIS wrapper project (http:/ndiswrapper.sourceforge.net)
3708703
+ *	
3708703
+ *
3708703
+ *  This program is free software; you can redistribute it and/or modify
3708703
+ *  it under the terms of the GNU General Public License as published by
3708703
+ *  the Free Software Foundation; either version 2 of the License, or
3708703
+ *  (at your option) any later version.
3708703
+ *
3708703
+ *  This program is distributed in the hope that it will be useful,
3708703
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
3708703
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3708703
+ *  GNU General Public License for more details.
3708703
+ *
3708703
+ */
3708703
+#include "efi.h"
3708703
+#include "efistdarg.h"
3708703
 
3708703
-    Debug library functions for Hardware IO access
3708703
+#define EFI_ARG_NUM_MAX 10
3708703
 
3708703
+#define alloc_win_stack_frame(argc)		\
3708703
+	"subq $" #argc "*8, %%rsp\n\t"
3708703
+#define free_win_stack_frame(argc)		\
3708703
+	"addq $" #argc "*8, %%rsp\n\t"
3708703
+
3708703
+/* m is index of Windows arg required, n is total number of args to
3708703
+ * function Windows arg 1 should be at 0(%rsp), arg 2 at 8(%rsp) and
3708703
+ * so on, after stack frame is allocated, which starts at -n*8(%rsp)
3708703
+ * when stack frame is allocated. 4 > m >= n.
3708703
+*/
3708703
+
3708703
+#define lin2win_win_arg(m,n) "(" #m "-1-" #n ")*8(%%rsp)"
3708703
+
3708703
+/* volatile args for Windows function must be in clobber / output list */
3708703
+
3708703
+static UINT64 LIN2WIN0(void *func)
3708703
+{									
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8");
3708703
+	register UINT64 r9 __asm__("r9");
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(					
3708703
+		alloc_win_stack_frame(4)				
3708703
+		"call *%[fptr]\n\t"					
3708703
+		free_win_stack_frame(4)					
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),		
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)		
3708703
+		: [fptr] "r" (func));					
3708703
+	return ret;								
3708703
+}
3708703
 
3708703
+static UINT64 LIN2WIN1(void *func, UINT64 arg1)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8");
3708703
+	register UINT64 r9 __asm__("r9");
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		alloc_win_stack_frame(4)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(4)	
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
 
3708703
-Revision History
3708703
+static UINT64 LIN2WIN2(void *func, UINT64 arg1, UINT64 arg2)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8");
3708703
+	register UINT64 r9 __asm__("r9");
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		alloc_win_stack_frame(4)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(4)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
 
3708703
---*/
3708703
-#include "efi.h"
3708703
-#include "efistdarg.h"
3708703
+static UINT64 LIN2WIN3(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9");
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		alloc_win_stack_frame(4)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(4)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
 
3708703
-#define EFI_ARG_NUM_MAX 10
3708703
-#define EFI_REG_ARG_NUM 4
3708703
+static UINT64 LIN2WIN4(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		alloc_win_stack_frame(4)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(4)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
 
3708703
-/* Convert SysV calling convention to EFI x86_64 calling convention */
3708703
+static UINT64 LIN2WIN5(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4,
3708703
+	UINT64 arg5)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		"mov %[rarg5], " lin2win_win_arg(5,6) "\n\t"
3708703
+		alloc_win_stack_frame(6)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(6)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [rarg5] "r" ((unsigned long long)arg5),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
 
3708703
+static UINT64 LIN2WIN6(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4,
3708703
+	UINT64 arg5,
3708703
+	UINT64 arg6)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		"movq %[rarg5], " lin2win_win_arg(5,6) "\n\t"
3708703
+		"movq %[rarg6], " lin2win_win_arg(6,6) "\n\t"
3708703
+		alloc_win_stack_frame(6)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(6)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [rarg5] "r" ((UINT64)arg5), [rarg6] "r" ((UINT64)arg6),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
+static UINT64 LIN2WIN7(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4,
3708703
+	UINT64 arg5,
3708703
+	UINT64 arg6,
3708703
+	UINT64 arg7)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		"movq %[rarg5], " lin2win_win_arg(5,7) "\n\t"
3708703
+		"movq %[rarg6], " lin2win_win_arg(6,7) "\n\t"
3708703
+		"movq %[rarg7], " lin2win_win_arg(7,7) "\n\t"
3708703
+		alloc_win_stack_frame(7)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(7)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [rarg5] "r" ((UINT64)arg5), [rarg6] "r" ((UINT64)arg6),
3708703
+		  [rarg7] "r" ((UINT64)arg7), [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
+static UINT64 LIN2WIN8(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4,
3708703
+	UINT64 arg5,
3708703
+	UINT64 arg6,
3708703
+	UINT64 arg7,
3708703
+	UINT64 arg8)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		"movq %[rarg5], " lin2win_win_arg(5,8) "\n\t"
3708703
+		"movq %[rarg6], " lin2win_win_arg(6,8) "\n\t"
3708703
+		"movq %[rarg7], " lin2win_win_arg(7,8) "\n\t"
3708703
+		"movq %[rarg8], " lin2win_win_arg(8,8) "\n\t"
3708703
+		alloc_win_stack_frame(8)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(8)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [rarg5] "r" ((UINT64)arg5), [rarg6] "r" ((UINT64)arg6),
3708703
+		  [rarg7] "r" ((UINT64)arg7), [rarg8] "r" ((UINT64)arg8),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
+static UINT64 LIN2WIN9(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4,
3708703
+	UINT64 arg5,
3708703
+	UINT64 arg6,
3708703
+	UINT64 arg7,
3708703
+	UINT64 arg8,
3708703
+	UINT64 arg9)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		"movq %[rarg5], " lin2win_win_arg(5,9) "\n\t"
3708703
+		"movq %[rarg6], " lin2win_win_arg(6,9) "\n\t"
3708703
+		"movq %[rarg7], " lin2win_win_arg(7,9) "\n\t"
3708703
+		"movq %[rarg8], " lin2win_win_arg(8,9) "\n\t"
3708703
+		"movq %[rarg9], " lin2win_win_arg(9,9) "\n\t"
3708703
+		alloc_win_stack_frame(9)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(9)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [rarg5] "r" ((UINT64)arg5), [rarg6] "r" ((UINT64)arg6),
3708703
+		  [rarg7] "r" ((UINT64)arg7), [rarg8] "r" ((UINT64)arg8),
3708703
+		  [rarg9] "r" ((UINT64)arg9), [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
+static UINT64 LIN2WIN10(
3708703
+	void *func,
3708703
+	UINT64 arg1,
3708703
+	UINT64 arg2,
3708703
+	UINT64 arg3,
3708703
+	UINT64 arg4,
3708703
+	UINT64 arg5,
3708703
+	UINT64 arg6,
3708703
+	UINT64 arg7,
3708703
+	UINT64 arg8,
3708703
+	UINT64 arg9,
3708703
+	UINT64 arg10)
3708703
+{
3708703
+	UINT64 ret, dummy;
3708703
+	register UINT64 r8 __asm__("r8") = (UINT64)arg3;
3708703
+	register UINT64 r9 __asm__("r9") = (UINT64)arg4;
3708703
+	register UINT64 r10 __asm__("r10");
3708703
+	register UINT64 r11 __asm__("r11");
3708703
+	__asm__ __volatile__(
3708703
+		"movq %[rarg5], " lin2win_win_arg(5,10) "\n\t"
3708703
+		"movq %[rarg6], " lin2win_win_arg(6,10) "\n\t"
3708703
+		"movq %[rarg7], " lin2win_win_arg(7,10) "\n\t"
3708703
+		"movq %[rarg8], " lin2win_win_arg(8,10) "\n\t"
3708703
+		"movq %[rarg9], " lin2win_win_arg(9,10) "\n\t"
3708703
+		alloc_win_stack_frame(10)
3708703
+		"call *%[fptr]\n\t"
3708703
+		free_win_stack_frame(10)
3708703
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
3708703
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
3708703
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
3708703
+		  [rarg5] "r" ((UINT64)arg5), [rarg6] "r" ((UINT64)arg6),
3708703
+		  [rarg7] "r" ((UINT64)arg7), [rarg8] "r" ((UINT64)arg8),
3708703
+		  [rarg9] "r" ((UINT64)arg9), [rarg10] "r" ((UINT64)arg10),
3708703
+		  [fptr] "r" (func));
3708703
+	return ret;
3708703
+}
3708703
+/* New wrapper using NDIS */
3708703
+/* This wrapper merely calls LIN2WINxx functions to swizzle the
3708703
+ * args as per UEFI convention
3708703
+ */
3708703
 EFI_STATUS uefi_call_wrapper(void *fp, unsigned long va_num, ...)
3708703
 {
3708703
 	va_list ap;
3708703
@@ -31,92 +331,56 @@ EFI_STATUS uefi_call_wrapper(void *fp, u
3708703
 	unsigned int arg_size,stack_adjust_size;
3708703
 	EFI_STATUS status;
3708703
 
3708703
-	if (va_num > EFI_ARG_NUM_MAX || va_num<0)	{
3708703
+	if (va_num > EFI_ARG_NUM_MAX || va_num < 0) {
3708703
 		return EFI_LOAD_ERROR;
3708703
 	}
3708703
-	if (va_num==0)
3708703
-		/* There is no need to convert arguments for void argument. */
3708703
-		__asm__ __volatile__("call *%0;ret;"::"r"(fp));
3708703
-
3708703
-	/* The EFI arguments is stored in an array. Then later on it will be 
3708703
-	 * pushed into stack or passed to registers according to MS ABI.
3708703
-	 */
3708703
 	va_start(ap, va_num);
3708703
 	for (i = 0; i < va_num; i++) {
3708703
-		args[i] = va_arg(ap, unsigned long);
3708703
+		args[i] = va_arg(ap, UINT64);
3708703
 	}
3708703
 	va_end(ap);
3708703
-	arg_size = va_num*8;
3708703
-	stack_adjust_size = (va_num > EFI_REG_ARG_NUM? EFI_REG_ARG_NUM : va_num)*8;
3708703
-
3708703
-	/* Starting from here, assembly code makes sure all registers used are
3708703
-	 * under controlled by our code itself instead of by gcc.
3708703
-	 */
3708703
-	/* Start converting SysV calling convention to MS calling convention. */
3708703
-	__asm__ __volatile__(
3708703
-		/* 0. Save preserved registers. EFI call may clobbered them. */
3708703
-		"		pushq %%rbp;pushq %%rbx;pushq %%r12;"
3708703
-		"		pushq %%r13;pushq %%r14;pushq %%r15;"
3708703
-		/* 1. Push arguments passed by stack into stack. */
3708703
-		"		mov %1, %%r12;"
3708703
-		"		mov %3, %%r13;"
3708703
-		"		mov %1, %%rax;"
3708703
-		"		dec %%rax;"
3708703
-		"		mov $8, %%bl;"
3708703
-		"		mul %%bl;"
3708703
-		"		add %%rax, %%r13;"
3708703
-		"lstack:"
3708703
-		"		cmp $4, %%r12;"
3708703
-		"		jle lregister;" 
3708703
-		"		pushq (%%r13);"
3708703
-		"		sub $8, %%r13;"
3708703
-		"		dec %%r12;" 
3708703
-		"		jmp lstack;"
3708703
-		/* 2. Move arguments passed by registers into registers.
3708703
-		 *    rdi->rcx, rsi->rdx, rdx->r8, rcx->r9.
3708703
-		 */
3708703
-		"lregister:"	
3708703
-		"		mov %3, %%r14;"
3708703
-		"		mov $0, %%r12;"
3708703
-		"lloadregister:"
3708703
-		"		cmp %1, %%r12;"
3708703
-		"		jge lcall;"
3708703
-		"		mov (%%r14), %%rcx;"
3708703
-		"		inc %%r12;"
3708703
-		"		cmp %1, %%r12;"
3708703
-		"		jge lcall;"
3708703
-		"		mov 8(%%r14), %%rdx;"
3708703
-		"		inc %%r12;"
3708703
-		"		cmp %1, %%r12;"
3708703
-		"		jge lcall;"
3708703
-		"		mov 0x10(%%r14), %%r8;"
3708703
-		"		inc %%r12;"
3708703
-		"		cmp %1, %%r12;"
3708703
-		"		jge lcall;"
3708703
-		"		mov 0x18(%%r14), %%r9;"
3708703
-		/* 3. Save stack space for those register arguments. */
3708703
-		"lcall:				"
3708703
-		"		sub %2, %%rsp;"
3708703
-		/* 4. Save arg_size to r12 which is preserved in EFI call. */
3708703
-		"		mov %4, %%r12;"
3708703
-		/* 5. Call EFI function. */
3708703
-		"		call *%5;"
3708703
-		/* This code was not there before */
3708703
-		"		mov %%rax, %0;"
3708703
-		/* 6. Restore stack space reserved for those register
3708703
-		 * arguments.
3708703
-		 */
3708703
-		"		add %%r12, %%rsp;"
3708703
-		/* 7. Restore preserved registers. */
3708703
-		"		popq %%r15;popq %%r14;popq %%r13;"
3708703
-		"		popq %%r12;popq %%rbx;popq %%rbp;"
3708703
-		:"=r"(status)
3708703
-		:"r"((unsigned long)va_num),
3708703
-		 "r"((unsigned long)stack_adjust_size),
3708703
-		 "r"(args),
3708703
-		 "r"((unsigned long)arg_size),
3708703
-		 "r"(fp)
3708703
-		:"rsp","rbx","rax","r11","r12","r13","r14","rcx","rdx","r8","r9" 
3708703
-		);
3708703
-	return status;
3708703
+	/* As the number of args grows extend it appropriately */
3708703
+	switch (va_num) {
3708703
+	case 0:
3708703
+		return LIN2WIN0(fp);
3708703
+	case 1:
3708703
+		return LIN2WIN1(fp, args[0]);
3708703
+	case 2:
3708703
+		return LIN2WIN2(fp, 
3708703
+				args[0], args[1]);
3708703
+	case 3:
3708703
+		return LIN2WIN3(fp, 
3708703
+				args[0], args[1], args[2]);
3708703
+	case 4:
3708703
+		return LIN2WIN4(fp, 
3708703
+				args[0], args[1], args[2], args[3]);
3708703
+	case 5:
3708703
+		return LIN2WIN5(fp, 
3708703
+				args[0], args[1], args[2], args[3],
3708703
+				args[4]);
3708703
+	case 6:
3708703
+		return LIN2WIN6(fp, 
3708703
+				args[0], args[1], args[2], args[3], 
3708703
+				args[4], args[5]);
3708703
+	case 7:
3708703
+		return LIN2WIN7(fp, 
3708703
+				args[0], args[1], args[2], args[3],
3708703
+				args[4], args[5], args[6]);
3708703
+	case 8:
3708703
+		return LIN2WIN8(fp, 
3708703
+				args[0], args[1], args[2], args[3],
3708703
+				args[4], args[5], args[6], args[7]);
3708703
+	case 9:
3708703
+		return LIN2WIN9(fp, 
3708703
+				args[0], args[1], args[2], args[3],
3708703
+				args[4], args[5], args[6], args[7], 
3708703
+				args[8]);
3708703
+	case 10:
3708703
+		return LIN2WIN10(fp, 
3708703
+				args[0], args[1], args[2], args[3],
3708703
+				args[4], args[5], args[6], args[7], 
3708703
+				args[8], args[9]);
3708703
+	default:
3708703
+		return EFI_LOAD_ERROR;
3708703
+	}
3708703
 }
8b5a9e0
diff -urpN gnu-efi-3.0d/inc/x86_64/efibind.h.uefi_wrap gnu-efi-3.0d/inc/x86_64/efibind.h
8b5a9e0
--- gnu-efi-3.0d/inc/x86_64/efibind.h.uefi_wrap	2008-01-11 16:02:58.000000000 -0500
8b5a9e0
+++ gnu-efi-3.0d/inc/x86_64/efibind.h	2008-01-11 16:03:21.000000000 -0500
8b5a9e0
@@ -257,12 +257,7 @@ typedef uint64_t   UINTN;
8b5a9e0
 #endif
8b5a9e0
 #endif
8b5a9e0
 
8b5a9e0
-/* for x86_64, EFI_FUNCTION_WRAPPER must be defined */
8b5a9e0
-#ifdef  EFI_FUNCTION_WRAPPER
8b5a9e0
 UINTN uefi_call_wrapper(void *func, unsigned long va_num, ...);
8b5a9e0
-#else
8b5a9e0
-#error "EFI_FUNCTION_WRAPPER must be defined for x86_64 architecture"
8b5a9e0
-#endif
8b5a9e0
 
8b5a9e0
 #if _MSC_EXTENSIONS
8b5a9e0
 #pragma warning ( disable : 4731 )  // Suppress warnings about modification of EBP