- Fix uefi_call_wrapper(x, 10, ...) .
- Add efi_main wrappers and EFI_CALL() macro so drivers are possible.
This commit is contained in:
parent
627b9b53ef
commit
32f0550873
@ -1,42 +1,65 @@
|
|||||||
diff -up gnu-efi-3.0d/lib/runtime/rtdata.c.pragma gnu-efi-3.0d/lib/runtime/rtdata.c
|
diff -up gnu-efi-3.0d/lib/ia32/math.c.pragma gnu-efi-3.0d/lib/ia32/math.c
|
||||||
--- gnu-efi-3.0d/lib/runtime/rtdata.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
--- gnu-efi-3.0d/lib/ia32/math.c.pragma 2008-03-10 14:43:48.000000000 -0400
|
||||||
+++ gnu-efi-3.0d/lib/runtime/rtdata.c 2007-12-19 15:00:21.000000000 -0500
|
+++ gnu-efi-3.0d/lib/ia32/math.c 2008-03-10 14:43:32.000000000 -0400
|
||||||
@@ -26,7 +26,9 @@ Revision History
|
@@ -23,11 +23,13 @@ Revision History
|
||||||
// right data section if it is explicitly initialized..
|
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#ifdef RUNTIME_CODE
|
||||||
+#ifndef __GNUC__
|
+#ifndef __GNUC__
|
||||||
#pragma BEGIN_RUNTIME_DATA()
|
#pragma RUNTIME_CODE(LShiftU64)
|
||||||
|
#pragma RUNTIME_CODE(RShiftU64)
|
||||||
|
#pragma RUNTIME_CODE(MultU64x32)
|
||||||
|
#pragma RUNTIME_CODE(DivU64x32)
|
||||||
|
#endif
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// RT - pointer to the runtime table
|
//
|
||||||
diff -up gnu-efi-3.0d/lib/runtime/vm.c.pragma gnu-efi-3.0d/lib/runtime/vm.c
|
diff -up gnu-efi-3.0d/lib/print.c.pragma gnu-efi-3.0d/lib/print.c
|
||||||
--- gnu-efi-3.0d/lib/runtime/vm.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
--- gnu-efi-3.0d/lib/print.c.pragma 2007-05-11 13:03:05.000000000 -0400
|
||||||
+++ gnu-efi-3.0d/lib/runtime/vm.c 2007-12-19 15:00:21.000000000 -0500
|
+++ gnu-efi-3.0d/lib/print.c 2008-03-10 14:42:54.000000000 -0400
|
||||||
@@ -24,7 +24,9 @@ Revision History
|
@@ -23,6 +23,7 @@ Revision History
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef RUNTIME_CODE
|
||||||
|
+#ifndef __GNUC__
|
||||||
|
#pragma RUNTIME_CODE(DbgPrint)
|
||||||
|
|
||||||
|
// For debugging..
|
||||||
|
@@ -39,6 +40,7 @@ Revision History
|
||||||
|
#pragma RUNTIME_CODE(TimeToString)
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#endif /* !defined(__GNUC__) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
diff -up gnu-efi-3.0d/lib/runtime/rtlock.c.pragma gnu-efi-3.0d/lib/runtime/rtlock.c
|
||||||
|
--- gnu-efi-3.0d/lib/runtime/rtlock.c.pragma 2007-05-11 13:03:05.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/lib/runtime/rtlock.c 2008-03-10 14:42:54.000000000 -0400
|
||||||
|
@@ -21,7 +21,9 @@ Revision History
|
||||||
|
|
||||||
|
|
||||||
#include "lib.h"
|
|
||||||
|
|
||||||
+#ifndef __GNUC__
|
+#ifndef __GNUC__
|
||||||
#pragma RUNTIME_CODE(RtLibEnableVirtualMappings)
|
#pragma RUNTIME_CODE(RtAcquireLock)
|
||||||
+#endif
|
+#endif
|
||||||
VOID
|
VOID
|
||||||
RUNTIMEFUNCTION
|
RtAcquireLock (
|
||||||
RtLibEnableVirtualMappings (
|
IN FLOCK *Lock
|
||||||
@@ -64,7 +66,9 @@ RtLibEnableVirtualMappings (
|
@@ -58,7 +60,9 @@ Returns:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
+#ifndef __GNUC__
|
+#ifndef __GNUC__
|
||||||
#pragma RUNTIME_CODE(RtConvertList)
|
#pragma RUNTIME_CODE(RtAcquireLock)
|
||||||
+#endif
|
+#endif
|
||||||
VOID
|
VOID
|
||||||
RUNTIMEFUNCTION
|
RtReleaseLock (
|
||||||
RtConvertList (
|
IN FLOCK *Lock
|
||||||
diff -up gnu-efi-3.0d/lib/runtime/efirtlib.c.pragma gnu-efi-3.0d/lib/runtime/efirtlib.c
|
diff -up gnu-efi-3.0d/lib/runtime/efirtlib.c.pragma gnu-efi-3.0d/lib/runtime/efirtlib.c
|
||||||
--- gnu-efi-3.0d/lib/runtime/efirtlib.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
--- gnu-efi-3.0d/lib/runtime/efirtlib.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
||||||
+++ gnu-efi-3.0d/lib/runtime/efirtlib.c 2007-12-19 15:00:21.000000000 -0500
|
+++ gnu-efi-3.0d/lib/runtime/efirtlib.c 2008-03-10 14:42:54.000000000 -0400
|
||||||
@@ -20,7 +20,9 @@ Revision History
|
@@ -20,7 +20,9 @@ Revision History
|
||||||
#include "efilib.h"
|
#include "efilib.h"
|
||||||
#include "efirtlib.h"
|
#include "efirtlib.h"
|
||||||
@ -87,32 +110,9 @@ diff -up gnu-efi-3.0d/lib/runtime/efirtlib.c.pragma gnu-efi-3.0d/lib/runtime/efi
|
|||||||
INTN
|
INTN
|
||||||
RUNTIMEFUNCTION
|
RUNTIMEFUNCTION
|
||||||
RtCompareGuid (
|
RtCompareGuid (
|
||||||
diff -up gnu-efi-3.0d/lib/runtime/rtlock.c.pragma gnu-efi-3.0d/lib/runtime/rtlock.c
|
|
||||||
--- gnu-efi-3.0d/lib/runtime/rtlock.c.pragma 2007-05-11 13:03:05.000000000 -0400
|
|
||||||
+++ gnu-efi-3.0d/lib/runtime/rtlock.c 2007-12-19 15:00:21.000000000 -0500
|
|
||||||
@@ -21,7 +21,9 @@ Revision History
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
+#ifndef __GNUC__
|
|
||||||
#pragma RUNTIME_CODE(RtAcquireLock)
|
|
||||||
+#endif
|
|
||||||
VOID
|
|
||||||
RtAcquireLock (
|
|
||||||
IN FLOCK *Lock
|
|
||||||
@@ -58,7 +60,9 @@ Returns:
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
+#ifndef __GNUC__
|
|
||||||
#pragma RUNTIME_CODE(RtAcquireLock)
|
|
||||||
+#endif
|
|
||||||
VOID
|
|
||||||
RtReleaseLock (
|
|
||||||
IN FLOCK *Lock
|
|
||||||
diff -up gnu-efi-3.0d/lib/runtime/rtstr.c.pragma gnu-efi-3.0d/lib/runtime/rtstr.c
|
diff -up gnu-efi-3.0d/lib/runtime/rtstr.c.pragma gnu-efi-3.0d/lib/runtime/rtstr.c
|
||||||
--- gnu-efi-3.0d/lib/runtime/rtstr.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
--- gnu-efi-3.0d/lib/runtime/rtstr.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
||||||
+++ gnu-efi-3.0d/lib/runtime/rtstr.c 2007-12-19 15:00:21.000000000 -0500
|
+++ gnu-efi-3.0d/lib/runtime/rtstr.c 2008-03-10 14:42:54.000000000 -0400
|
||||||
@@ -17,7 +17,9 @@ Revision History
|
@@ -17,7 +17,9 @@ Revision History
|
||||||
|
|
||||||
#include "lib.h"
|
#include "lib.h"
|
||||||
@ -183,9 +183,45 @@ diff -up gnu-efi-3.0d/lib/runtime/rtstr.c.pragma gnu-efi-3.0d/lib/runtime/rtstr.
|
|||||||
UINT8
|
UINT8
|
||||||
RUNTIMEFUNCTION
|
RUNTIMEFUNCTION
|
||||||
RtDecimaltoBCD (
|
RtDecimaltoBCD (
|
||||||
|
diff -up gnu-efi-3.0d/lib/runtime/vm.c.pragma gnu-efi-3.0d/lib/runtime/vm.c
|
||||||
|
--- gnu-efi-3.0d/lib/runtime/vm.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/lib/runtime/vm.c 2008-03-10 14:42:54.000000000 -0400
|
||||||
|
@@ -24,7 +24,9 @@ Revision History
|
||||||
|
|
||||||
|
#include "lib.h"
|
||||||
|
|
||||||
|
+#ifndef __GNUC__
|
||||||
|
#pragma RUNTIME_CODE(RtLibEnableVirtualMappings)
|
||||||
|
+#endif
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtLibEnableVirtualMappings (
|
||||||
|
@@ -64,7 +66,9 @@ RtLibEnableVirtualMappings (
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef __GNUC__
|
||||||
|
#pragma RUNTIME_CODE(RtConvertList)
|
||||||
|
+#endif
|
||||||
|
VOID
|
||||||
|
RUNTIMEFUNCTION
|
||||||
|
RtConvertList (
|
||||||
|
diff -up gnu-efi-3.0d/lib/runtime/rtdata.c.pragma gnu-efi-3.0d/lib/runtime/rtdata.c
|
||||||
|
--- gnu-efi-3.0d/lib/runtime/rtdata.c.pragma 2007-05-09 14:37:27.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/lib/runtime/rtdata.c 2008-03-10 14:42:54.000000000 -0400
|
||||||
|
@@ -26,7 +26,9 @@ Revision History
|
||||||
|
// right data section if it is explicitly initialized..
|
||||||
|
//
|
||||||
|
|
||||||
|
+#ifndef __GNUC__
|
||||||
|
#pragma BEGIN_RUNTIME_DATA()
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// RT - pointer to the runtime table
|
||||||
diff -up gnu-efi-3.0d/lib/x86_64/math.c.pragma gnu-efi-3.0d/lib/x86_64/math.c
|
diff -up gnu-efi-3.0d/lib/x86_64/math.c.pragma gnu-efi-3.0d/lib/x86_64/math.c
|
||||||
--- gnu-efi-3.0d/lib/x86_64/math.c.pragma 2007-12-19 15:00:46.000000000 -0500
|
--- gnu-efi-3.0d/lib/x86_64/math.c.pragma 2007-05-11 13:03:05.000000000 -0400
|
||||||
+++ gnu-efi-3.0d/lib/x86_64/math.c 2007-12-19 15:01:07.000000000 -0500
|
+++ gnu-efi-3.0d/lib/x86_64/math.c 2008-03-10 14:43:31.000000000 -0400
|
||||||
@@ -23,11 +23,13 @@ Revision History
|
@@ -23,11 +23,13 @@ Revision History
|
||||||
//
|
//
|
||||||
|
|
||||||
@ -200,23 +236,3 @@ diff -up gnu-efi-3.0d/lib/x86_64/math.c.pragma gnu-efi-3.0d/lib/x86_64/math.c
|
|||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
diff -up gnu-efi-3.0d/lib/x86_64/callwrap.c.pragma gnu-efi-3.0d/lib/x86_64/callwrap.c
|
|
||||||
diff -up gnu-efi-3.0d/lib/print.c.pragma gnu-efi-3.0d/lib/print.c
|
|
||||||
--- gnu-efi-3.0d/lib/print.c.pragma 2007-05-11 13:03:05.000000000 -0400
|
|
||||||
+++ gnu-efi-3.0d/lib/print.c 2007-12-19 15:00:21.000000000 -0500
|
|
||||||
@@ -23,6 +23,7 @@ Revision History
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef RUNTIME_CODE
|
|
||||||
+#ifndef __GNUC__
|
|
||||||
#pragma RUNTIME_CODE(DbgPrint)
|
|
||||||
|
|
||||||
// For debugging..
|
|
||||||
@@ -39,6 +40,7 @@ Revision History
|
|
||||||
#pragma RUNTIME_CODE(TimeToString)
|
|
||||||
*/
|
|
||||||
|
|
||||||
+#endif /* !defined(__GNUC__) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
|
12
gnu-efi-3.0d-uefi_wrap_call10.patch
Normal file
12
gnu-efi-3.0d-uefi_wrap_call10.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
diff -up gnu-efi-3.0d/lib/x86_64/callwrap.c.call10 gnu-efi-3.0d/lib/x86_64/callwrap.c
|
||||||
|
--- gnu-efi-3.0d/lib/x86_64/callwrap.c.call10 2008-03-27 13:37:37.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/lib/x86_64/callwrap.c 2008-03-27 13:38:08.000000000 -0400
|
||||||
|
@@ -307,6 +307,7 @@ static UINT64 LIN2WIN10(
|
||||||
|
"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)
|
||||||
|
diff -up gnu-efi-3.0d/inc/x86_64/efibind.h.call10 gnu-efi-3.0d/inc/x86_64/efibind.h
|
289
gnu-efi-3.0d-unwrap.patch
Normal file
289
gnu-efi-3.0d-unwrap.patch
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
diff -up gnu-efi-3.0d/inc/ia32/pe.h.unwrap gnu-efi-3.0d/inc/ia32/pe.h
|
||||||
|
--- gnu-efi-3.0d/inc/ia32/pe.h.unwrap 2008-03-10 14:38:18.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/inc/ia32/pe.h 2008-03-10 14:39:21.000000000 -0400
|
||||||
|
@@ -588,4 +588,6 @@ typedef struct _IMAGE_IMPORT_DESCRIPTOR
|
||||||
|
PIMAGE_THUNK_DATA FirstThunk;
|
||||||
|
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
|
||||||
|
|
||||||
|
+#define EFI_CALL(sym, argc) sym
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
diff -up gnu-efi-3.0d/inc/ia32/efibind.h.unwrap gnu-efi-3.0d/inc/ia32/efibind.h
|
||||||
|
--- gnu-efi-3.0d/inc/ia32/efibind.h.unwrap 2008-03-10 14:34:58.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/inc/ia32/efibind.h 2008-03-10 14:35:49.000000000 -0400
|
||||||
|
@@ -234,7 +234,22 @@ typedef uint32_t UINTN;
|
||||||
|
// one big module.
|
||||||
|
//
|
||||||
|
|
||||||
|
- #define EFI_DRIVER_ENTRY_POINT(InitFunction)
|
||||||
|
+ #define EFI_DRIVER_ENTRY_POINT(InitFunction) \
|
||||||
|
+ UINTN \
|
||||||
|
+ InitializeDriver ( \
|
||||||
|
+ VOID *ImageHandle, \
|
||||||
|
+ VOID *SystemTable \
|
||||||
|
+ ) \
|
||||||
|
+ { \
|
||||||
|
+ return InitFunction(ImageHandle, \
|
||||||
|
+ SystemTable); \
|
||||||
|
+ } \
|
||||||
|
+ \
|
||||||
|
+ EFI_STATUS efi_main( \
|
||||||
|
+ EFI_HANDLE image, \
|
||||||
|
+ EFI_SYSTEM_TABLE *systab \
|
||||||
|
+ ) __attribute__((weak, \
|
||||||
|
+ alias ("InitializeDriver")));
|
||||||
|
|
||||||
|
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
|
||||||
|
(_if)->LoadInternal(type, name, entry)
|
||||||
|
diff -up gnu-efi-3.0d/inc/x86_64/pe.h.unwrap gnu-efi-3.0d/inc/x86_64/pe.h
|
||||||
|
--- gnu-efi-3.0d/inc/x86_64/pe.h.unwrap 2008-03-10 14:37:23.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/inc/x86_64/pe.h 2008-03-10 14:38:08.000000000 -0400
|
||||||
|
@@ -588,4 +588,184 @@ typedef struct _IMAGE_IMPORT_DESCRIPTOR
|
||||||
|
PIMAGE_THUNK_DATA FirstThunk;
|
||||||
|
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
|
||||||
|
|
||||||
|
+#define alloc_lin_stack_frame(argc) \
|
||||||
|
+ "subq ($" #argc "-6)*8, %rsp\n\t"
|
||||||
|
+#define free_lin_stack_frame(argc) \
|
||||||
|
+ "addq ($" #argc "-6)*8, %rsp\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin_prolog \
|
||||||
|
+ "push %rsi\n\t" \
|
||||||
|
+ "push %rdi\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin_epilog \
|
||||||
|
+ "pop %rdi\n\t" \
|
||||||
|
+ "pop %rsi\n\t"
|
||||||
|
+
|
||||||
|
+#define call_lin_func \
|
||||||
|
+ "xor %rax, %rax\n\t" \
|
||||||
|
+ "call *%r10\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin_efi_arg(n) "(" #n "+2)*8(%rsp)"
|
||||||
|
+
|
||||||
|
+#define efi2lin_arg1 "mov %rcx, %rdi\n\t"
|
||||||
|
+#define efi2lin_arg2 "mov %rdx, %rsi\n\t"
|
||||||
|
+#define efi2lin_arg3 "mov %r8, %rdx\n\t"
|
||||||
|
+#define efi2lin_arg4 "mov %r9, %rcx\n\t"
|
||||||
|
+#define efi2lin_arg5 "mov " efi2lin_efi_arg(5) ", %r8\n\t"
|
||||||
|
+#define efi2lin_arg6 "mov " efi2lin_efi_arg(6) ", %r9\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin0 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin1 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin2 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin3 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin4 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ efi2lin_arg4 \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin5 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ efi2lin_arg4 \
|
||||||
|
+ efi2lin_arg5 \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin6 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ efi2lin_arg4 \
|
||||||
|
+ efi2lin_arg5 \
|
||||||
|
+ efi2lin_arg6 \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define call_lin_func_args(n) \
|
||||||
|
+ "subq $(" #n "-6) *8, %rsp\n\t" \
|
||||||
|
+ call_lin_func \
|
||||||
|
+ "addq $(" #n "-6) *8, %rsp\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin_lin_arg(m, n) "(" #m "-1-" #n ")*8(%rsp)"
|
||||||
|
+
|
||||||
|
+#define efi2lin7 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ efi2lin_arg4 \
|
||||||
|
+ efi2lin_arg5 \
|
||||||
|
+ efi2lin_arg6 \
|
||||||
|
+ \
|
||||||
|
+ "# copy efidows argument 7 onto stack for Linux function" \
|
||||||
|
+ "mov " efi2lin_efi_arg(7) ", %r11 \n\t" \
|
||||||
|
+ "mov %r11, " efi2lin_lin_arg(7,7) "\n\t" \
|
||||||
|
+ \
|
||||||
|
+ call_lin_func_args(7) \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin8 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ efi2lin_arg4 \
|
||||||
|
+ efi2lin_arg5 \
|
||||||
|
+ efi2lin_arg6 \
|
||||||
|
+ \
|
||||||
|
+ "# copy efidows arguments 7 and 8 onto stack for Linux function" \
|
||||||
|
+ "mov " efi2lin_efi_arg(7) ", %r11\n\t" \
|
||||||
|
+ "mov %r11, " efi2lin_lin_arg(7,8) "\n\t" \
|
||||||
|
+ "mov " efi2lin_efi_arg(8) ", %r11\n\t" \
|
||||||
|
+ "mov %r11, " efi2lin_lin_arg(8,8) "\n\t" \
|
||||||
|
+ \
|
||||||
|
+ call_lin_func_args(8) \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin9to12 \
|
||||||
|
+ efi2lin_prolog \
|
||||||
|
+ \
|
||||||
|
+ "# since we destroy rsi and rdi here, first copy efidows\n\t" \
|
||||||
|
+ "# arguments 7 through 12 onto stack for Linux function\n\t" \
|
||||||
|
+ "mov %rcx, %r11 # save rcx\n\t" \
|
||||||
|
+ "lea " efi2lin_efi_arg(7) ", %rsi # source (efidows arg 7 and up)\n\t" \
|
||||||
|
+ "lea " efi2lin_lin_arg(7,12) ", %rdi # = destination\n\t" \
|
||||||
|
+ "mov $6, %rcx # 6 arguments\n\t" \
|
||||||
|
+ "rep\n\t" \
|
||||||
|
+ "movsq\n\t" \
|
||||||
|
+ "mov %r11, %rcx # restore rcx\n\t" \
|
||||||
|
+ \
|
||||||
|
+ efi2lin_arg1 \
|
||||||
|
+ efi2lin_arg2 \
|
||||||
|
+ efi2lin_arg3 \
|
||||||
|
+ efi2lin_arg4 \
|
||||||
|
+ efi2lin_arg5 \
|
||||||
|
+ efi2lin_arg6 \
|
||||||
|
+ \
|
||||||
|
+ call_lin_func_args(12) \
|
||||||
|
+ efi2lin_epilog \
|
||||||
|
+ "ret\n\t"
|
||||||
|
+
|
||||||
|
+#define efi2lin9 efi2lin9to12
|
||||||
|
+#define efi2lin10 efi2lin9to12
|
||||||
|
+#define efi2lin11 efi2lin9to12
|
||||||
|
+#define efi2lin12 efi2lin9to12
|
||||||
|
+
|
||||||
|
+#define EFI_TOKEN_PASTE(a,b) a ## b
|
||||||
|
+#define EFI_TOKEN_STRING(a) #a
|
||||||
|
+#define EFI_CALL_NAME(sym) _efi_wrap_ ## sym
|
||||||
|
+#define EFI_CALL(sym, argc) \
|
||||||
|
+ extern EFI_CALL_NAME(sym)(); \
|
||||||
|
+ \
|
||||||
|
+ __asm__ ("\n" \
|
||||||
|
+ ".globl " #sym "\n\t" \
|
||||||
|
+ ".type\t" #sym ", @function\n" \
|
||||||
|
+ #sym ":\n\t" \
|
||||||
|
+ "lea\t_efi_wrap_" #sym "@PLT, %r10\n\t" \
|
||||||
|
+ EFI_TOKEN_PASTE(efi2lin, argc) \
|
||||||
|
+ ".size\t" #sym ", .-" #sym "\n\t" \
|
||||||
|
+ ); \
|
||||||
|
+ \
|
||||||
|
+ EFI_STATUS EFI_CALL_NAME(sym)
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
diff -up gnu-efi-3.0d/inc/x86_64/efibind.h.unwrap gnu-efi-3.0d/inc/x86_64/efibind.h
|
||||||
|
--- gnu-efi-3.0d/inc/x86_64/efibind.h.unwrap 2008-03-10 14:30:40.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/inc/x86_64/efibind.h 2008-03-10 14:35:51.000000000 -0400
|
||||||
|
@@ -234,7 +234,22 @@ typedef uint64_t UINTN;
|
||||||
|
// one big module.
|
||||||
|
//
|
||||||
|
|
||||||
|
- #define EFI_DRIVER_ENTRY_POINT(InitFunction)
|
||||||
|
+ #define EFI_DRIVER_ENTRY_POINT(InitFunction) \
|
||||||
|
+ UINTN \
|
||||||
|
+ InitializeDriver ( \
|
||||||
|
+ VOID *ImageHandle, \
|
||||||
|
+ VOID *SystemTable \
|
||||||
|
+ ) \
|
||||||
|
+ { \
|
||||||
|
+ return InitFunction(ImageHandle, \
|
||||||
|
+ SystemTable); \
|
||||||
|
+ } \
|
||||||
|
+ \
|
||||||
|
+ EFI_STATUS efi_main( \
|
||||||
|
+ EFI_HANDLE image, \
|
||||||
|
+ EFI_SYSTEM_TABLE *systab \
|
||||||
|
+ ) __attribute__((weak, \
|
||||||
|
+ alias ("InitializeDriver")));
|
||||||
|
|
||||||
|
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
|
||||||
|
(_if)->LoadInternal(type, name, entry)
|
||||||
|
diff -up gnu-efi-3.0d/inc/ia64/pe.h.unwrap gnu-efi-3.0d/inc/ia64/pe.h
|
||||||
|
--- gnu-efi-3.0d/inc/ia64/pe.h.unwrap 2008-03-10 14:39:01.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/inc/ia64/pe.h 2008-03-10 14:39:20.000000000 -0400
|
||||||
|
@@ -594,4 +594,6 @@ typedef struct _IMAGE_IMPORT_DESCRIPTOR
|
||||||
|
PIMAGE_THUNK_DATA FirstThunk;
|
||||||
|
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;
|
||||||
|
|
||||||
|
+#define EFI_CALL(sym, argc) sym
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
diff -up gnu-efi-3.0d/inc/ia64/efibind.h.unwrap gnu-efi-3.0d/inc/ia64/efibind.h
|
||||||
|
--- gnu-efi-3.0d/inc/ia64/efibind.h.unwrap 2008-03-10 14:36:00.000000000 -0400
|
||||||
|
+++ gnu-efi-3.0d/inc/ia64/efibind.h 2008-03-10 14:36:59.000000000 -0400
|
||||||
|
@@ -187,7 +187,22 @@ void __mf (void);
|
||||||
|
// one big module.
|
||||||
|
//
|
||||||
|
|
||||||
|
-#define EFI_DRIVER_ENTRY_POINT(InitFunction)
|
||||||
|
+#define EFI_DRIVER_ENTRY_POINT(InitFunction) \
|
||||||
|
+ UINTN \
|
||||||
|
+ InitializeDriver ( \
|
||||||
|
+ VOID *ImageHandle, \
|
||||||
|
+ VOID *SystemTable \
|
||||||
|
+ ) \
|
||||||
|
+ { \
|
||||||
|
+ return InitFunction(ImageHandle, \
|
||||||
|
+ SystemTable); \
|
||||||
|
+ } \
|
||||||
|
+ \
|
||||||
|
+ EFI_STATUS efi_main( \
|
||||||
|
+ EFI_HANDLE image, \
|
||||||
|
+ EFI_SYSTEM_TABLE *systab \
|
||||||
|
+ ) __attribute__((weak, \
|
||||||
|
+ alias ("InitializeDriver")));
|
||||||
|
|
||||||
|
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
|
||||||
|
(_if)->LoadInternal(type, name, entry)
|
18
gnu-efi.spec
18
gnu-efi.spec
@ -1,7 +1,7 @@
|
|||||||
Summary: Development Libraries and headers for EFI
|
Summary: Development Libraries and headers for EFI
|
||||||
Name: gnu-efi
|
Name: gnu-efi
|
||||||
Version: 3.0d
|
Version: 3.0d
|
||||||
Release: 3%{?dist}
|
Release: 4%{?dist}
|
||||||
Group: Development/System
|
Group: Development/System
|
||||||
License: GPL
|
License: GPL
|
||||||
URL: ftp://ftp.hpl.hp.com/pub/linux-ia64
|
URL: ftp://ftp.hpl.hp.com/pub/linux-ia64
|
||||||
@ -10,6 +10,8 @@ Patch0: gnu-efi-3.0d-pragma.patch
|
|||||||
Patch1: gnu-efi-3.0d-uefi_wrap.patch
|
Patch1: gnu-efi-3.0d-uefi_wrap.patch
|
||||||
Patch2: gnu-efi-3.0d-x86_64.patch
|
Patch2: gnu-efi-3.0d-x86_64.patch
|
||||||
Patch3: gnu-efi-3.0d-rpm.patch
|
Patch3: gnu-efi-3.0d-rpm.patch
|
||||||
|
Patch4: gnu-efi-3.0d-unwrap.patch
|
||||||
|
Patch5: gnu-efi-3.0d-uefi_wrap_call10.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
ExclusiveArch: ia64 i386 x86_64
|
ExclusiveArch: ia64 i386 x86_64
|
||||||
|
|
||||||
@ -19,10 +21,12 @@ applications that run under EFI (Extensible Firmware Interface).
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch0 -p1 -b .pragma
|
%patch0 -p1
|
||||||
%patch1 -p1 -b .uefi_wrap
|
%patch1 -p1
|
||||||
%patch2 -p1 -b .x86_64
|
%patch2 -p1
|
||||||
%patch3 -p1 -b .rpm
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
%patch5 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# Package cannot build with %{?_smp_mflags}.
|
# Package cannot build with %{?_smp_mflags}.
|
||||||
@ -50,6 +54,10 @@ rm -rf %{buildroot}
|
|||||||
%{_libdir}/*
|
%{_libdir}/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Mar 27 2008 Peter Jones <pjones@redhat.com> - 3.0d-4
|
||||||
|
- Fix uefi_call_wrapper(x, 10, ...) .
|
||||||
|
- Add efi_main wrappers and EFI_CALL() macro so drivers are possible.
|
||||||
|
|
||||||
* Mon Feb 18 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 3.0d-3
|
* Mon Feb 18 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 3.0d-3
|
||||||
- Autorebuild for GCC 4.3
|
- Autorebuild for GCC 4.3
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user