142 lines
5.4 KiB
Diff
142 lines
5.4 KiB
Diff
From 3f693b16c4f9992247e11c1f15cf0e06bbf69a93 Mon Sep 17 00:00:00 2001
|
|
From: Peter Jones <pjones@redhat.com>
|
|
Date: Mon, 26 Jul 2010 17:04:12 -0400
|
|
Subject: [PATCH] Add the routines to make callbacks work.
|
|
|
|
GCC on x86_64 now provides a function attribute "ms_abi" to generate
|
|
functions using the Windows x86_64 calling conventions. These can be
|
|
used to write callback functions to be called from UEFI.
|
|
---
|
|
Make.defaults | 2 +-
|
|
inc/ia32/efibind.h | 18 +++++++++++++++++-
|
|
inc/ia64/efibind.h | 19 ++++++++++++++++++-
|
|
inc/x86_64/efibind.h | 22 +++++++++++++++++-----
|
|
4 files changed, 53 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/Make.defaults b/Make.defaults
|
|
index 529d58c..2a981a1 100644
|
|
--- a/Make.defaults
|
|
+++ b/Make.defaults
|
|
@@ -59,7 +59,7 @@ ifeq ($(ARCH), ia32)
|
|
endif
|
|
|
|
ifeq ($(ARCH), x86_64)
|
|
- CFLAGS += -DEFI_FUNCTION_WRAPPER -mno-red-zone
|
|
+ CFLAGS += -mno-red-zone
|
|
ifeq ($(HOSTARCH), ia32)
|
|
ARCH3264 = -m64
|
|
endif
|
|
diff --git a/inc/ia32/efibind.h b/inc/ia32/efibind.h
|
|
index 647a63e..0201ca1 100644
|
|
--- a/inc/ia32/efibind.h
|
|
+++ b/inc/ia32/efibind.h
|
|
@@ -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)
|
|
@@ -259,6 +274,7 @@ typedef uint32_t UINTN;
|
|
|
|
/* No efi call wrapper for IA32 architecture */
|
|
#define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__)
|
|
+#define EFI_FUNCTION
|
|
|
|
#ifdef _MSC_EXTENSIONS
|
|
#pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP
|
|
diff --git a/inc/ia64/efibind.h b/inc/ia64/efibind.h
|
|
index 83ca529..aac83b3 100644
|
|
--- a/inc/ia64/efibind.h
|
|
+++ b/inc/ia64/efibind.h
|
|
@@ -182,7 +182,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)
|
|
@@ -205,3 +220,4 @@ void __mf (void);
|
|
|
|
/* No efi call wrapper for IA32 architecture */
|
|
#define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__)
|
|
+#define EFI_FUNCTION
|
|
diff --git a/inc/x86_64/efibind.h b/inc/x86_64/efibind.h
|
|
index 1f8e735..9250973 100644
|
|
--- a/inc/x86_64/efibind.h
|
|
+++ b/inc/x86_64/efibind.h
|
|
@@ -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)
|
|
@@ -258,11 +273,8 @@ typedef uint64_t UINTN;
|
|
#endif
|
|
|
|
/* for x86_64, EFI_FUNCTION_WRAPPER must be defined */
|
|
-#ifdef EFI_FUNCTION_WRAPPER
|
|
UINTN uefi_call_wrapper(void *func, unsigned long va_num, ...);
|
|
-#else
|
|
-#error "EFI_FUNCTION_WRAPPER must be defined for x86_64 architecture"
|
|
-#endif
|
|
+#define EFI_FUNCTION __attribute__((ms_abi))
|
|
|
|
#ifdef _MSC_EXTENSIONS
|
|
#pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP
|
|
--
|
|
1.7.6
|
|
|