Blob Blame History Raw
diff -urpN /dev/null gnu-efi-3.0d/gnuefi/callwrap_ia32.c
--- /dev/null	2008-04-24 00:20:49.271011245 -0400
+++ gnu-efi-3.0d/gnuefi/callwrap_ia32.c	2008-04-29 15:40:43.000000000 -0400
@@ -0,0 +1,103 @@
+
+typedef unsigned long EFI_STATUS;
+
+typedef EFI_STATUS (*func0)(void);
+typedef EFI_STATUS (*func1)(unsigned long);
+typedef EFI_STATUS (*func2)(unsigned long, unsigned long);
+typedef EFI_STATUS (*func3)(unsigned long, unsigned long, unsigned long);
+typedef EFI_STATUS (*func4)(unsigned long, unsigned long, unsigned long,
+			    unsigned long);
+typedef EFI_STATUS (*func5)(unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long);
+typedef EFI_STATUS (*func6)(unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long, unsigned long);
+typedef EFI_STATUS (*func7)(unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long, unsigned long,
+			    unsigned long);
+typedef EFI_STATUS (*func8)(unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long);
+typedef EFI_STATUS (*func9)(unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long, unsigned long,
+			    unsigned long, unsigned long, unsigned long);
+typedef EFI_STATUS (*func10)(unsigned long, unsigned long, unsigned long,
+			     unsigned long, unsigned long, unsigned long,
+			     unsigned long, unsigned long, unsigned long,
+			     unsigned long);
+
+EFI_STATUS gnuefi_call0 (unsigned long func)
+{
+	return ((func0)func)();
+}
+
+EFI_STATUS gnuefi_call1 (unsigned long func, unsigned long a)
+{
+	return ((func1)func)(a);
+}
+
+EFI_STATUS gnuefi_call2 (unsigned long func, unsigned long a, unsigned long b)
+{
+	return ((func2)func)(a, b);
+}
+
+EFI_STATUS gnuefi_call3 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c)
+{
+	return ((func3)func)(a, b, c);
+}
+
+EFI_STATUS gnuefi_call4 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c, unsigned long d)
+{
+	return ((func4)func)(a, b, c, d);
+}
+
+EFI_STATUS gnuefi_call5 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c,
+		      unsigned long d, unsigned long e)
+{
+	return ((func5)func)(a, b, c, d, e);
+}
+
+EFI_STATUS gnuefi_call6 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c,
+		      unsigned long d, unsigned long e, unsigned long f)
+{
+	return ((func6)func)(a, b, c, d, e, f);
+}
+
+EFI_STATUS gnuefi_call7 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c,
+		      unsigned long d, unsigned long e,
+		      unsigned long f, unsigned long g)
+{
+	return ((func7)func)(a, b, c, d, e, f, g);
+}
+
+EFI_STATUS gnuefi_call8 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c,
+		      unsigned long d, unsigned long e,
+		      unsigned long f, unsigned long g,
+		      unsigned long h)
+{
+	return ((func8)func)(a, b, c, d, e, f, g, h);
+}
+
+EFI_STATUS gnuefi_call9 (unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c,
+		      unsigned long d, unsigned long e,
+		      unsigned long f, unsigned long g,
+		      unsigned long h, unsigned long i)
+{
+	return ((func9)func)(a, b, c, d, e, f, g, h, i);
+}
+
+EFI_STATUS gnuefi_call10(unsigned long func, unsigned long a,
+		      unsigned long b, unsigned long c,
+		      unsigned long d, unsigned long e,
+		      unsigned long f, unsigned long g,
+		      unsigned long h, unsigned long i,
+		      unsigned long j)
+{
+	return ((func10)func)(a, b, c, d, e, f, g, h, i, j);
+}
diff -urpN /dev/null gnu-efi-3.0d/gnuefi/callwrap_x86_64.c
--- /dev/null	2008-04-24 00:20:49.271011245 -0400
+++ gnu-efi-3.0d/gnuefi/callwrap_x86_64.c	2008-04-29 15:40:07.000000000 -0400
@@ -0,0 +1,395 @@
+/*
+ *  Copyright (C) 2006 Giridhar Pemmasani
+ *  Copyright (C) 2007-2010 Intel Corp
+ *  	Contributed by Chandramouli Narayanan<mouli@linux.intel.com>
+ *	Adapted wrapper macros for Linux to windows calls from
+ *	NDIS wrapper project (http:/ndiswrapper.sourceforge.net)
+ *	
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *  GNU General Public License for more details.
+ *
+ */
+
+#define alloc_win_stack_frame(argc)		\
+	"subq $" #argc "*8, %%rsp\n\t"
+#define free_win_stack_frame(argc)		\
+	"addq $" #argc "*8, %%rsp\n\t"
+
+/* m is index of Windows arg required, n is total number of args to
+ * function Windows arg 1 should be at 0(%rsp), arg 2 at 8(%rsp) and
+ * so on, after stack frame is allocated, which starts at -n*8(%rsp)
+ * when stack frame is allocated. 4 > m >= n.
+*/
+
+#define lin2win_win_arg(m,n) "(" #m "-1-" #n ")*8(%%rsp)"
+
+/* volatile args for Windows function must be in clobber / output list */
+extern unsigned long long gnuefi_call0(void *func);
+extern unsigned long long gnuefi_call1(void *func, unsigned long long arg1);
+extern unsigned long long gnuefi_call2(void *func, unsigned long long arg1, unsigned long long arg2);
+extern unsigned long long gnuefi_call3(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3);
+extern unsigned long long gnuefi_call4(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4);
+extern unsigned long long gnuefi_call5(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5);
+extern unsigned long long gnuefi_call6(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6);
+extern unsigned long long gnuefi_call7(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7);
+extern unsigned long long gnuefi_call8(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7,
+	unsigned long long arg8);
+extern unsigned long long gnuefi_call9(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7,
+	unsigned long long arg8,
+	unsigned long long arg9);
+extern unsigned long long gnuefi_call10(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7,
+	unsigned long long arg8,
+	unsigned long long arg9,
+	unsigned long long arg10);
+
+
+unsigned long long gnuefi_call0(void *func)
+{									
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8");
+	register unsigned long long r9 __asm__("r9");
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(					
+		alloc_win_stack_frame(4)				
+		"call *%[fptr]\n\t"					
+		free_win_stack_frame(4)					
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),		
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)		
+		: [fptr] "r" (func));					
+	return ret;								
+}
+
+unsigned long long gnuefi_call1(void *func, unsigned long long arg1)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8");
+	register unsigned long long r9 __asm__("r9");
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		alloc_win_stack_frame(4)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(4)	
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call2(void *func, unsigned long long arg1, unsigned long long arg2)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8");
+	register unsigned long long r9 __asm__("r9");
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		alloc_win_stack_frame(4)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(4)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call3(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9");
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		alloc_win_stack_frame(4)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(4)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call4(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		alloc_win_stack_frame(4)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(4)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call5(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		"mov %[rarg5], " lin2win_win_arg(5,6) "\n\t"
+		alloc_win_stack_frame(6)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(6)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [rarg5] "r" ((unsigned long long)arg5),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call6(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		"movq %[rarg5], " lin2win_win_arg(5,6) "\n\t"
+		"movq %[rarg6], " lin2win_win_arg(6,6) "\n\t"
+		alloc_win_stack_frame(6)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(6)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [rarg5] "r" ((unsigned long long)arg5), [rarg6] "r" ((unsigned long long)arg6),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call7(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		"movq %[rarg5], " lin2win_win_arg(5,7) "\n\t"
+		"movq %[rarg6], " lin2win_win_arg(6,7) "\n\t"
+		"movq %[rarg7], " lin2win_win_arg(7,7) "\n\t"
+		alloc_win_stack_frame(7)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(7)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [rarg5] "r" ((unsigned long long)arg5), [rarg6] "r" ((unsigned long long)arg6),
+		  [rarg7] "r" ((unsigned long long)arg7), [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call8(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7,
+	unsigned long long arg8)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		"movq %[rarg5], " lin2win_win_arg(5,8) "\n\t"
+		"movq %[rarg6], " lin2win_win_arg(6,8) "\n\t"
+		"movq %[rarg7], " lin2win_win_arg(7,8) "\n\t"
+		"movq %[rarg8], " lin2win_win_arg(8,8) "\n\t"
+		alloc_win_stack_frame(8)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(8)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [rarg5] "r" ((unsigned long long)arg5), [rarg6] "r" ((unsigned long long)arg6),
+		  [rarg7] "r" ((unsigned long long)arg7), [rarg8] "r" ((unsigned long long)arg8),
+		  [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call9(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7,
+	unsigned long long arg8,
+	unsigned long long arg9)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		"movq %[rarg5], " lin2win_win_arg(5,9) "\n\t"
+		"movq %[rarg6], " lin2win_win_arg(6,9) "\n\t"
+		"movq %[rarg7], " lin2win_win_arg(7,9) "\n\t"
+		"movq %[rarg8], " lin2win_win_arg(8,9) "\n\t"
+		"movq %[rarg9], " lin2win_win_arg(9,9) "\n\t"
+		alloc_win_stack_frame(9)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(9)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [rarg5] "r" ((unsigned long long)arg5), [rarg6] "r" ((unsigned long long)arg6),
+		  [rarg7] "r" ((unsigned long long)arg7), [rarg8] "r" ((unsigned long long)arg8),
+		  [rarg9] "r" ((unsigned long long)arg9), [fptr] "r" (func));
+	return ret;
+}
+
+unsigned long long gnuefi_call10(
+	void *func,
+	unsigned long long arg1,
+	unsigned long long arg2,
+	unsigned long long arg3,
+	unsigned long long arg4,
+	unsigned long long arg5,
+	unsigned long long arg6,
+	unsigned long long arg7,
+	unsigned long long arg8,
+	unsigned long long arg9,
+	unsigned long long arg10)
+{
+	unsigned long long ret, dummy;
+	register unsigned long long r8 __asm__("r8") = (unsigned long long)arg3;
+	register unsigned long long r9 __asm__("r9") = (unsigned long long)arg4;
+	register unsigned long long r10 __asm__("r10");
+	register unsigned long long r11 __asm__("r11");
+	__asm__ __volatile__(
+		"movq %[rarg5], " lin2win_win_arg(5,10) "\n\t"
+		"movq %[rarg6], " lin2win_win_arg(6,10) "\n\t"
+		"movq %[rarg7], " lin2win_win_arg(7,10) "\n\t"
+		"movq %[rarg8], " lin2win_win_arg(8,10) "\n\t"
+		"movq %[rarg9], " lin2win_win_arg(9,10) "\n\t"
+		"movq %[rarg10], " lin2win_win_arg(10,10) "\n\t"
+		alloc_win_stack_frame(10)
+		"call *%[fptr]\n\t"
+		free_win_stack_frame(10)
+		: "=a" (ret), "=c" (dummy), "=d" (dummy),
+		  "=r" (r8), "=r" (r9), "=r" (r10), "=r" (r11)
+		: "c" (arg1), "d" (arg2), "r" (r8), "r" (r9),
+		  [rarg5] "r" ((unsigned long long)arg5), [rarg6] "r" ((unsigned long long)arg6),
+		  [rarg7] "r" ((unsigned long long)arg7), [rarg8] "r" ((unsigned long long)arg8),
+		  [rarg9] "r" ((unsigned long long)arg9), [rarg10] "r" ((unsigned long long)arg10),
+		  [fptr] "r" (func));
+	return ret;
+}
+
diff -urpN gnu-efi-3.0d/gnuefi/Makefile.callwrap gnu-efi-3.0d/gnuefi/Makefile
--- gnu-efi-3.0d/gnuefi/Makefile.callwrap	2008-04-29 15:40:07.000000000 -0400
+++ gnu-efi-3.0d/gnuefi/Makefile	2008-04-29 15:40:07.000000000 -0400
@@ -23,7 +23,7 @@
 
 include ../Make.defaults
 CDIR=$(TOPDIR)/..
-FILES	= reloc_$(ARCH) setjmp_$(ARCH)
+FILES	= reloc_$(ARCH) setjmp_$(ARCH) callwrap_$(ARCH)
 
 OBJS	= $(FILES:%=%.o)