Home | History | Annotate | Line # | Download | only in x86_64
      1  1.5  jmcneill /*	$NetBSD: efibind.h,v 1.5 2021/09/30 19:02:48 jmcneill Exp $	*/
      2  1.1  jakllsch 
      3  1.1  jakllsch /*++
      4  1.1  jakllsch 
      5  1.1  jakllsch Copyright (c) 1998  Intel Corporation
      6  1.1  jakllsch 
      7  1.1  jakllsch Module Name:
      8  1.1  jakllsch 
      9  1.1  jakllsch     efefind.h
     10  1.1  jakllsch 
     11  1.1  jakllsch Abstract:
     12  1.1  jakllsch 
     13  1.1  jakllsch     EFI to compile bindings
     14  1.1  jakllsch 
     15  1.1  jakllsch 
     16  1.1  jakllsch 
     17  1.1  jakllsch 
     18  1.1  jakllsch Revision History
     19  1.1  jakllsch 
     20  1.1  jakllsch --*/
     21  1.1  jakllsch #ifndef X86_64_EFI_BIND
     22  1.1  jakllsch #define X86_64_EFI_BIND
     23  1.1  jakllsch #ifndef __GNUC__
     24  1.1  jakllsch #pragma pack()
     25  1.1  jakllsch #endif
     26  1.1  jakllsch 
     27  1.5  jmcneill #if defined(_MSC_VER)
     28  1.5  jmcneill     #define HAVE_USE_MS_ABI 1
     29  1.5  jmcneill #elif defined(GNU_EFI_USE_MS_ABI)
     30  1.3  jmcneill     #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))||(defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 2)))
     31  1.1  jakllsch         #define HAVE_USE_MS_ABI 1
     32  1.1  jakllsch     #else
     33  1.1  jakllsch         #error Compiler is too old for GNU_EFI_USE_MS_ABI
     34  1.1  jakllsch     #endif
     35  1.1  jakllsch #endif
     36  1.1  jakllsch 
     37  1.1  jakllsch //
     38  1.1  jakllsch // Basic int types of various widths
     39  1.1  jakllsch //
     40  1.1  jakllsch 
     41  1.5  jmcneill #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus)
     42  1.1  jakllsch 
     43  1.1  jakllsch     // No ANSI C 1999/2000 stdint.h integer width declarations
     44  1.1  jakllsch 
     45  1.1  jakllsch     #if defined(_MSC_EXTENSIONS)
     46  1.1  jakllsch 
     47  1.1  jakllsch         // Use Microsoft C compiler integer width declarations
     48  1.1  jakllsch 
     49  1.1  jakllsch         typedef unsigned __int64    uint64_t;
     50  1.1  jakllsch         typedef __int64             int64_t;
     51  1.1  jakllsch         typedef unsigned __int32    uint32_t;
     52  1.1  jakllsch         typedef __int32             int32_t;
     53  1.1  jakllsch         typedef unsigned short      uint16_t;
     54  1.1  jakllsch         typedef short               int16_t;
     55  1.1  jakllsch         typedef unsigned char       uint8_t;
     56  1.1  jakllsch         typedef char                int8_t;
     57  1.1  jakllsch     #elif defined(__GNUC__)
     58  1.1  jakllsch         typedef int __attribute__((__mode__(__DI__)))           int64_t;
     59  1.1  jakllsch         typedef unsigned int __attribute__((__mode__(__DI__)))  uint64_t;
     60  1.1  jakllsch         typedef unsigned int        uint32_t;
     61  1.1  jakllsch         typedef int                 int32_t;
     62  1.1  jakllsch         typedef unsigned short      uint16_t;
     63  1.1  jakllsch         typedef short               int16_t;
     64  1.1  jakllsch         typedef unsigned char       uint8_t;
     65  1.1  jakllsch         typedef signed char         int8_t;
     66  1.1  jakllsch     #elif defined(UNIX_LP64)
     67  1.1  jakllsch 
     68  1.1  jakllsch         /*  Use LP64 programming model from C_FLAGS for integer width declarations */
     69  1.1  jakllsch 
     70  1.1  jakllsch        typedef unsigned long       uint64_t;
     71  1.1  jakllsch        typedef long                int64_t;
     72  1.1  jakllsch        typedef unsigned int        uint32_t;
     73  1.1  jakllsch        typedef int                 int32_t;
     74  1.1  jakllsch        typedef unsigned short      uint16_t;
     75  1.1  jakllsch        typedef short               int16_t;
     76  1.1  jakllsch        typedef unsigned char       uint8_t;
     77  1.1  jakllsch        typedef char                int8_t;
     78  1.1  jakllsch     #else
     79  1.1  jakllsch 
     80  1.1  jakllsch        /*  Assume P64 programming model from C_FLAGS for integer width declarations */
     81  1.1  jakllsch 
     82  1.1  jakllsch        typedef unsigned long long  uint64_t __attribute__((aligned (8)));
     83  1.1  jakllsch        typedef long long           int64_t __attribute__((aligned (8)));
     84  1.1  jakllsch        typedef unsigned int        uint32_t;
     85  1.1  jakllsch        typedef int                 int32_t;
     86  1.1  jakllsch        typedef unsigned short      uint16_t;
     87  1.1  jakllsch        typedef short               int16_t;
     88  1.1  jakllsch        typedef unsigned char       uint8_t;
     89  1.1  jakllsch        typedef char                int8_t;
     90  1.1  jakllsch     #endif
     91  1.5  jmcneill     typedef uint64_t            uintptr_t;
     92  1.5  jmcneill     typedef int64_t             intptr_t;
     93  1.2  jakllsch #elif defined(__NetBSD__)
     94  1.2  jakllsch     #include <sys/stdint.h>
     95  1.5  jmcneill #else
     96  1.1  jakllsch     #include <stdint.h>
     97  1.1  jakllsch #endif
     98  1.1  jakllsch 
     99  1.1  jakllsch //
    100  1.1  jakllsch // Basic EFI types of various widths
    101  1.1  jakllsch //
    102  1.1  jakllsch 
    103  1.1  jakllsch #ifndef __WCHAR_TYPE__
    104  1.1  jakllsch # define __WCHAR_TYPE__ short
    105  1.1  jakllsch #endif
    106  1.1  jakllsch 
    107  1.4       tnn #ifndef __ACTYPES_H__
    108  1.1  jakllsch typedef uint64_t   UINT64;
    109  1.1  jakllsch typedef int64_t    INT64;
    110  1.1  jakllsch 
    111  1.1  jakllsch #ifndef _BASETSD_H_
    112  1.1  jakllsch     typedef uint32_t   UINT32;
    113  1.1  jakllsch     typedef int32_t    INT32;
    114  1.1  jakllsch #endif
    115  1.1  jakllsch 
    116  1.1  jakllsch typedef uint16_t   UINT16;
    117  1.1  jakllsch typedef int16_t    INT16;
    118  1.1  jakllsch typedef uint8_t    UINT8;
    119  1.1  jakllsch typedef int8_t     INT8;
    120  1.4       tnn #endif /* __ACTYPES_H__ */
    121  1.1  jakllsch typedef __WCHAR_TYPE__ WCHAR;
    122  1.1  jakllsch 
    123  1.1  jakllsch #undef VOID
    124  1.1  jakllsch #define VOID    void
    125  1.1  jakllsch 
    126  1.1  jakllsch 
    127  1.1  jakllsch typedef int64_t    INTN;
    128  1.1  jakllsch typedef uint64_t   UINTN;
    129  1.1  jakllsch 
    130  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    131  1.1  jakllsch     #define POST_CODE(_Data)
    132  1.1  jakllsch #else
    133  1.1  jakllsch     #ifdef EFI_DEBUG
    134  1.1  jakllsch #define POST_CODE(_Data)    __asm mov eax,(_Data) __asm out 0x80,al
    135  1.1  jakllsch     #else
    136  1.1  jakllsch         #define POST_CODE(_Data)
    137  1.1  jakllsch     #endif
    138  1.1  jakllsch #endif
    139  1.1  jakllsch 
    140  1.1  jakllsch #define EFIERR(a)           (0x8000000000000000 | a)
    141  1.1  jakllsch #define EFI_ERROR_MASK      0x8000000000000000
    142  1.1  jakllsch #define EFIERR_OEM(a)       (0xc000000000000000 | a)
    143  1.1  jakllsch 
    144  1.1  jakllsch 
    145  1.1  jakllsch #define BAD_POINTER         0xFBFBFBFBFBFBFBFB
    146  1.1  jakllsch #define MAX_ADDRESS         0xFFFFFFFFFFFFFFFF
    147  1.1  jakllsch 
    148  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    149  1.1  jakllsch     #define BREAKPOINT()        __asm { int 3 }
    150  1.1  jakllsch #else
    151  1.1  jakllsch     #define BREAKPOINT()        while (TRUE);    // Make it hang on Bios[Dbg]32
    152  1.1  jakllsch #endif
    153  1.1  jakllsch 
    154  1.1  jakllsch //
    155  1.1  jakllsch // Pointers must be aligned to these address to function
    156  1.1  jakllsch //
    157  1.1  jakllsch 
    158  1.1  jakllsch #define MIN_ALIGNMENT_SIZE  4
    159  1.1  jakllsch 
    160  1.1  jakllsch #define ALIGN_VARIABLE(Value ,Adjustment) \
    161  1.1  jakllsch             (UINTN)Adjustment = 0; \
    162  1.1  jakllsch             if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
    163  1.1  jakllsch                 (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
    164  1.1  jakllsch             Value = (UINTN)Value + (UINTN)Adjustment
    165  1.1  jakllsch 
    166  1.1  jakllsch 
    167  1.1  jakllsch //
    168  1.1  jakllsch // Define macros to build data structure signatures from characters.
    169  1.1  jakllsch //
    170  1.1  jakllsch 
    171  1.1  jakllsch #define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
    172  1.1  jakllsch #define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
    173  1.1  jakllsch #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32))
    174  1.1  jakllsch //
    175  1.1  jakllsch // To export & import functions in the EFI emulator environment
    176  1.1  jakllsch //
    177  1.1  jakllsch 
    178  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    179  1.1  jakllsch     #define EXPORTAPI           __declspec( dllexport )
    180  1.1  jakllsch #else
    181  1.1  jakllsch     #define EXPORTAPI
    182  1.1  jakllsch #endif
    183  1.1  jakllsch 
    184  1.1  jakllsch 
    185  1.1  jakllsch //
    186  1.1  jakllsch // EFIAPI - prototype calling convention for EFI function pointers
    187  1.1  jakllsch // BOOTSERVICE - prototype for implementation of a boot service interface
    188  1.1  jakllsch // RUNTIMESERVICE - prototype for implementation of a runtime service interface
    189  1.1  jakllsch // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
    190  1.1  jakllsch // RUNTIME_CODE - pragma macro for declaring runtime code
    191  1.1  jakllsch //
    192  1.1  jakllsch 
    193  1.1  jakllsch #ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
    194  1.1  jakllsch     #ifdef _MSC_EXTENSIONS
    195  1.1  jakllsch         #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler
    196  1.1  jakllsch     #elif defined(HAVE_USE_MS_ABI)
    197  1.1  jakllsch         // Force amd64/ms calling conventions.
    198  1.1  jakllsch         #define EFIAPI __attribute__((ms_abi))
    199  1.1  jakllsch     #else
    200  1.1  jakllsch         #define EFIAPI          // Substitute expresion to force C calling convention
    201  1.1  jakllsch     #endif
    202  1.1  jakllsch #endif
    203  1.1  jakllsch 
    204  1.1  jakllsch #define BOOTSERVICE
    205  1.1  jakllsch //#define RUNTIMESERVICE(proto,a)    alloc_text("rtcode",a); proto a
    206  1.1  jakllsch //#define RUNTIMEFUNCTION(proto,a)   alloc_text("rtcode",a); proto a
    207  1.1  jakllsch #define RUNTIMESERVICE
    208  1.1  jakllsch #define RUNTIMEFUNCTION
    209  1.1  jakllsch 
    210  1.1  jakllsch 
    211  1.1  jakllsch #define RUNTIME_CODE(a)         alloc_text("rtcode", a)
    212  1.1  jakllsch #define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
    213  1.1  jakllsch #define END_RUNTIME_DATA()      data_seg("")
    214  1.1  jakllsch 
    215  1.1  jakllsch #define VOLATILE    volatile
    216  1.1  jakllsch 
    217  1.1  jakllsch #define MEMORY_FENCE()
    218  1.1  jakllsch 
    219  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    220  1.1  jakllsch 
    221  1.1  jakllsch //
    222  1.1  jakllsch // To help ensure proper coding of integrated drivers, they are
    223  1.1  jakllsch // compiled as DLLs.  In NT they require a dll init entry pointer.
    224  1.1  jakllsch // The macro puts a stub entry point into the DLL so it will load.
    225  1.1  jakllsch //
    226  1.1  jakllsch 
    227  1.1  jakllsch #define EFI_DRIVER_ENTRY_POINT(InitFunction)    \
    228  1.1  jakllsch     UINTN                                       \
    229  1.1  jakllsch     __stdcall                                   \
    230  1.1  jakllsch     _DllMainCRTStartup (                        \
    231  1.1  jakllsch         UINTN    Inst,                          \
    232  1.1  jakllsch         UINTN    reason_for_call,               \
    233  1.1  jakllsch         VOID    *rserved                        \
    234  1.1  jakllsch         )                                       \
    235  1.1  jakllsch     {                                           \
    236  1.1  jakllsch         return 1;                               \
    237  1.1  jakllsch     }                                           \
    238  1.1  jakllsch                                                 \
    239  1.1  jakllsch     int                                         \
    240  1.1  jakllsch     EXPORTAPI                                   \
    241  1.1  jakllsch     __cdecl                                     \
    242  1.1  jakllsch     InitializeDriver (                          \
    243  1.1  jakllsch         void *ImageHandle,                      \
    244  1.1  jakllsch         void *SystemTable                       \
    245  1.1  jakllsch         )                                       \
    246  1.1  jakllsch     {                                           \
    247  1.1  jakllsch         return InitFunction(ImageHandle, SystemTable);       \
    248  1.1  jakllsch     }
    249  1.1  jakllsch 
    250  1.1  jakllsch 
    251  1.1  jakllsch     #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)      \
    252  1.1  jakllsch         (_if)->LoadInternal(type, name, NULL)
    253  1.1  jakllsch 
    254  1.1  jakllsch #else // EFI_NT_EMULATOR
    255  1.1  jakllsch 
    256  1.1  jakllsch //
    257  1.1  jakllsch // When build similiar to FW, then link everything together as
    258  1.3  jmcneill // one big module. For the MSVC toolchain, we simply tell the
    259  1.3  jmcneill // linker what our driver init function is using /ENTRY.
    260  1.1  jakllsch //
    261  1.3  jmcneill #if defined(_MSC_EXTENSIONS)
    262  1.3  jmcneill     #define EFI_DRIVER_ENTRY_POINT(InitFunction) \
    263  1.3  jmcneill         __pragma(comment(linker, "/ENTRY:" # InitFunction))
    264  1.3  jmcneill #else
    265  1.1  jakllsch     #define EFI_DRIVER_ENTRY_POINT(InitFunction)    \
    266  1.1  jakllsch         UINTN                                       \
    267  1.1  jakllsch         InitializeDriver (                          \
    268  1.1  jakllsch             VOID    *ImageHandle,                   \
    269  1.1  jakllsch             VOID    *SystemTable                    \
    270  1.1  jakllsch             )                                       \
    271  1.1  jakllsch         {                                           \
    272  1.1  jakllsch             return InitFunction(ImageHandle,        \
    273  1.1  jakllsch                     SystemTable);                   \
    274  1.1  jakllsch         }                                           \
    275  1.1  jakllsch                                                     \
    276  1.1  jakllsch         EFI_STATUS efi_main(                        \
    277  1.1  jakllsch             EFI_HANDLE image,                       \
    278  1.1  jakllsch             EFI_SYSTEM_TABLE *systab                \
    279  1.1  jakllsch             ) __attribute__((weak,                  \
    280  1.1  jakllsch                     alias ("InitializeDriver")));
    281  1.3  jmcneill #endif
    282  1.1  jakllsch 
    283  1.1  jakllsch     #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
    284  1.1  jakllsch             (_if)->LoadInternal(type, name, entry)
    285  1.1  jakllsch 
    286  1.3  jmcneill #endif // EFI_NT_EMULATOR
    287  1.1  jakllsch 
    288  1.1  jakllsch //
    289  1.1  jakllsch // Some compilers don't support the forward reference construct:
    290  1.1  jakllsch //  typedef struct XXXXX
    291  1.1  jakllsch //
    292  1.1  jakllsch // The following macro provide a workaround for such cases.
    293  1.1  jakllsch //
    294  1.1  jakllsch #ifdef NO_INTERFACE_DECL
    295  1.1  jakllsch #define INTERFACE_DECL(x)
    296  1.1  jakllsch #else
    297  1.3  jmcneill #if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
    298  1.1  jakllsch #define INTERFACE_DECL(x) struct x
    299  1.1  jakllsch #else
    300  1.1  jakllsch #define INTERFACE_DECL(x) typedef struct x
    301  1.1  jakllsch #endif
    302  1.1  jakllsch #endif
    303  1.1  jakllsch 
    304  1.1  jakllsch /* for x86_64, EFI_FUNCTION_WRAPPER must be defined */
    305  1.1  jakllsch #if defined(HAVE_USE_MS_ABI)
    306  1.1  jakllsch #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__)
    307  1.1  jakllsch #else
    308  1.1  jakllsch /*
    309  1.1  jakllsch   Credits for macro-magic:
    310  1.1  jakllsch     https://groups.google.com/forum/?fromgroups#!topic/comp.std.c/d-6Mj5Lko_s
    311  1.1  jakllsch     http://efesx.com/2010/08/31/overloading-macros/
    312  1.1  jakllsch */
    313  1.1  jakllsch #define __VA_NARG__(...)                        \
    314  1.1  jakllsch   __VA_NARG_(_0, ## __VA_ARGS__, __RSEQ_N())
    315  1.1  jakllsch #define __VA_NARG_(...)                         \
    316  1.1  jakllsch   __VA_ARG_N(__VA_ARGS__)
    317  1.1  jakllsch #define __VA_ARG_N(                             \
    318  1.1  jakllsch   _0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N
    319  1.1  jakllsch #define __RSEQ_N()                              \
    320  1.1  jakllsch   10, 9,  8,  7,  6,  5,  4,  3,  2,  1,  0
    321  1.1  jakllsch 
    322  1.1  jakllsch #define __VA_ARG_NSUFFIX__(prefix,...)                  \
    323  1.1  jakllsch   __VA_ARG_NSUFFIX_N(prefix, __VA_NARG__(__VA_ARGS__))
    324  1.1  jakllsch #define __VA_ARG_NSUFFIX_N(prefix,nargs)        \
    325  1.1  jakllsch   __VA_ARG_NSUFFIX_N_(prefix, nargs)
    326  1.1  jakllsch #define __VA_ARG_NSUFFIX_N_(prefix,nargs)       \
    327  1.1  jakllsch   prefix ## nargs
    328  1.1  jakllsch 
    329  1.1  jakllsch /* Prototypes of EFI cdecl -> stdcall trampolines */
    330  1.1  jakllsch UINT64 efi_call0(void *func);
    331  1.1  jakllsch UINT64 efi_call1(void *func, UINT64 arg1);
    332  1.1  jakllsch UINT64 efi_call2(void *func, UINT64 arg1, UINT64 arg2);
    333  1.1  jakllsch UINT64 efi_call3(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3);
    334  1.1  jakllsch UINT64 efi_call4(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    335  1.1  jakllsch                  UINT64 arg4);
    336  1.1  jakllsch UINT64 efi_call5(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    337  1.1  jakllsch                  UINT64 arg4, UINT64 arg5);
    338  1.1  jakllsch UINT64 efi_call6(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    339  1.1  jakllsch                  UINT64 arg4, UINT64 arg5, UINT64 arg6);
    340  1.1  jakllsch UINT64 efi_call7(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    341  1.1  jakllsch                  UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7);
    342  1.1  jakllsch UINT64 efi_call8(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    343  1.1  jakllsch                  UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
    344  1.1  jakllsch                  UINT64 arg8);
    345  1.1  jakllsch UINT64 efi_call9(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    346  1.1  jakllsch                  UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
    347  1.1  jakllsch                  UINT64 arg8, UINT64 arg9);
    348  1.1  jakllsch UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
    349  1.1  jakllsch                   UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
    350  1.1  jakllsch                   UINT64 arg8, UINT64 arg9, UINT64 arg10);
    351  1.1  jakllsch 
    352  1.1  jakllsch /* Front-ends to efi_callX to avoid compiler warnings */
    353  1.1  jakllsch #define _cast64_efi_call0(f) \
    354  1.1  jakllsch   efi_call0(f)
    355  1.1  jakllsch #define _cast64_efi_call1(f,a1) \
    356  1.1  jakllsch   efi_call1(f, (UINT64)(a1))
    357  1.1  jakllsch #define _cast64_efi_call2(f,a1,a2) \
    358  1.1  jakllsch   efi_call2(f, (UINT64)(a1), (UINT64)(a2))
    359  1.1  jakllsch #define _cast64_efi_call3(f,a1,a2,a3) \
    360  1.1  jakllsch   efi_call3(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3))
    361  1.1  jakllsch #define _cast64_efi_call4(f,a1,a2,a3,a4) \
    362  1.1  jakllsch   efi_call4(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4))
    363  1.1  jakllsch #define _cast64_efi_call5(f,a1,a2,a3,a4,a5) \
    364  1.1  jakllsch   efi_call5(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
    365  1.1  jakllsch             (UINT64)(a5))
    366  1.1  jakllsch #define _cast64_efi_call6(f,a1,a2,a3,a4,a5,a6) \
    367  1.1  jakllsch   efi_call6(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
    368  1.1  jakllsch             (UINT64)(a5), (UINT64)(a6))
    369  1.1  jakllsch #define _cast64_efi_call7(f,a1,a2,a3,a4,a5,a6,a7) \
    370  1.1  jakllsch   efi_call7(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
    371  1.1  jakllsch             (UINT64)(a5), (UINT64)(a6), (UINT64)(a7))
    372  1.1  jakllsch #define _cast64_efi_call8(f,a1,a2,a3,a4,a5,a6,a7,a8) \
    373  1.1  jakllsch   efi_call8(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
    374  1.1  jakllsch             (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8))
    375  1.1  jakllsch #define _cast64_efi_call9(f,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
    376  1.1  jakllsch   efi_call9(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
    377  1.1  jakllsch             (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \
    378  1.1  jakllsch             (UINT64)(a9))
    379  1.1  jakllsch #define _cast64_efi_call10(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \
    380  1.1  jakllsch   efi_call10(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
    381  1.1  jakllsch              (UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \
    382  1.1  jakllsch              (UINT64)(a9), (UINT64)(a10))
    383  1.1  jakllsch 
    384  1.1  jakllsch /* main wrapper (va_num ignored) */
    385  1.1  jakllsch #define uefi_call_wrapper(func,va_num,...)                        \
    386  1.3  jmcneill   __VA_ARG_NSUFFIX__(_cast64_efi_call, __VA_ARGS__) (func , ##__VA_ARGS__)
    387  1.1  jakllsch 
    388  1.1  jakllsch #endif
    389  1.3  jmcneill 
    390  1.3  jmcneill #if defined(HAVE_USE_MS_ABI) && !defined(_MSC_EXTENSIONS)
    391  1.3  jmcneill     #define EFI_FUNCTION __attribute__((ms_abi))
    392  1.3  jmcneill #else
    393  1.3  jmcneill     #define EFI_FUNCTION
    394  1.3  jmcneill #endif
    395  1.1  jakllsch 
    396  1.1  jakllsch #ifdef _MSC_EXTENSIONS
    397  1.1  jakllsch #pragma warning ( disable : 4731 )  // Suppress warnings about modification of EBP
    398  1.1  jakllsch #endif
    399  1.1  jakllsch 
    400  1.1  jakllsch #endif
    401