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