1*ca987d46SWarner Losh /*++ 2*ca987d46SWarner Losh 3*ca987d46SWarner Losh Copyright (c) 1999 - 2003 Intel Corporation. All rights reserved 4*ca987d46SWarner Losh This software and associated documentation (if any) is furnished 5*ca987d46SWarner Losh under a license and may only be used or copied in accordance 6*ca987d46SWarner Losh with the terms of the license. Except as permitted by such 7*ca987d46SWarner Losh license, no part of this software or documentation may be 8*ca987d46SWarner Losh reproduced, stored in a retrieval system, or transmitted in any 9*ca987d46SWarner Losh form or by any means without the express written consent of 10*ca987d46SWarner Losh Intel Corporation. 11*ca987d46SWarner Losh 12*ca987d46SWarner Losh Module Name: 13*ca987d46SWarner Losh 14*ca987d46SWarner Losh efefind.h 15*ca987d46SWarner Losh 16*ca987d46SWarner Losh Abstract: 17*ca987d46SWarner Losh 18*ca987d46SWarner Losh EFI to compile bindings 19*ca987d46SWarner Losh 20*ca987d46SWarner Losh 21*ca987d46SWarner Losh 22*ca987d46SWarner Losh 23*ca987d46SWarner Losh Revision History 24*ca987d46SWarner Losh 25*ca987d46SWarner Losh --*/ 26*ca987d46SWarner Losh 27*ca987d46SWarner Losh #pragma pack() 28*ca987d46SWarner Losh 29*ca987d46SWarner Losh #ifdef EFI_NT_EMULATOR 30*ca987d46SWarner Losh #define POST_CODE(_Data) 31*ca987d46SWarner Losh #else 32*ca987d46SWarner Losh #ifdef EFI_DEBUG 33*ca987d46SWarner Losh #define POST_CODE(_Data) __asm mov eax,(_Data) __asm out 0x80,al 34*ca987d46SWarner Losh #else 35*ca987d46SWarner Losh #define POST_CODE(_Data) 36*ca987d46SWarner Losh #endif 37*ca987d46SWarner Losh #endif 38*ca987d46SWarner Losh 39*ca987d46SWarner Losh #define EFIERR(a) (0x8000000000000000 | a) 40*ca987d46SWarner Losh #define EFI_ERROR_MASK 0x8000000000000000 41*ca987d46SWarner Losh #define EFIERR_OEM(a) (0xc000000000000000 | a) 42*ca987d46SWarner Losh 43*ca987d46SWarner Losh 44*ca987d46SWarner Losh #define BAD_POINTER 0xFBFBFBFBFBFBFBFB 45*ca987d46SWarner Losh #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 46*ca987d46SWarner Losh 47*ca987d46SWarner Losh #define BREAKPOINT() __asm { int 3 } 48*ca987d46SWarner Losh 49*ca987d46SWarner Losh // 50*ca987d46SWarner Losh // Pointers must be aligned to these address to function 51*ca987d46SWarner Losh // 52*ca987d46SWarner Losh 53*ca987d46SWarner Losh #define MIN_ALIGNMENT_SIZE 4 54*ca987d46SWarner Losh 55*ca987d46SWarner Losh #define ALIGN_VARIABLE(Value ,Adjustment) \ 56*ca987d46SWarner Losh (UINTN)Adjustment = 0; \ 57*ca987d46SWarner Losh if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ 58*ca987d46SWarner Losh (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ 59*ca987d46SWarner Losh Value = (UINTN)Value + (UINTN)Adjustment 60*ca987d46SWarner Losh 61*ca987d46SWarner Losh 62*ca987d46SWarner Losh // 63*ca987d46SWarner Losh // Define macros to build data structure signatures from characters. 64*ca987d46SWarner Losh // 65*ca987d46SWarner Losh 66*ca987d46SWarner Losh #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) 67*ca987d46SWarner Losh #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) 68*ca987d46SWarner Losh #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)) 69*ca987d46SWarner Losh 70*ca987d46SWarner Losh // 71*ca987d46SWarner Losh // EFIAPI - prototype calling convention for EFI function pointers 72*ca987d46SWarner Losh // BOOTSERVICE - prototype for implementation of a boot service interface 73*ca987d46SWarner Losh // RUNTIMESERVICE - prototype for implementation of a runtime service interface 74*ca987d46SWarner Losh // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service 75*ca987d46SWarner Losh // RUNTIME_CODE - pragma macro for declaring runtime code 76*ca987d46SWarner Losh // 77*ca987d46SWarner Losh 78*ca987d46SWarner Losh #ifdef __amd64__ 79*ca987d46SWarner Losh #define EFIAPI __attribute__((ms_abi)) 80*ca987d46SWarner Losh #endif 81*ca987d46SWarner Losh 82*ca987d46SWarner Losh #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options 83*ca987d46SWarner Losh #ifdef _MSC_EXTENSIONS 84*ca987d46SWarner Losh #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler 85*ca987d46SWarner Losh #else 86*ca987d46SWarner Losh #define EFIAPI // Substitute expresion to force C calling convention 87*ca987d46SWarner Losh #endif 88*ca987d46SWarner Losh #endif 89*ca987d46SWarner Losh 90*ca987d46SWarner Losh #define BOOTSERVICE 91*ca987d46SWarner Losh //#define RUNTIMESERVICE(proto,a) alloc_text("rtcode",a); proto a 92*ca987d46SWarner Losh //#define RUNTIMEFUNCTION(proto,a) alloc_text("rtcode",a); proto a 93*ca987d46SWarner Losh #define RUNTIMESERVICE 94*ca987d46SWarner Losh #define RUNTIMEFUNCTION 95*ca987d46SWarner Losh 96*ca987d46SWarner Losh 97*ca987d46SWarner Losh #define RUNTIME_CODE(a) alloc_text("rtcode", a) 98*ca987d46SWarner Losh #define BEGIN_RUNTIME_DATA() data_seg("rtdata") 99*ca987d46SWarner Losh #define END_RUNTIME_DATA() data_seg("") 100*ca987d46SWarner Losh 101*ca987d46SWarner Losh #define VOLATILE volatile 102*ca987d46SWarner Losh 103*ca987d46SWarner Losh #define MEMORY_FENCE() 104*ca987d46SWarner Losh 105*ca987d46SWarner Losh #ifdef EFI_NO_INTERFACE_DECL 106*ca987d46SWarner Losh #define EFI_FORWARD_DECLARATION(x) 107*ca987d46SWarner Losh #define EFI_INTERFACE_DECL(x) 108*ca987d46SWarner Losh #else 109*ca987d46SWarner Losh #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x 110*ca987d46SWarner Losh #define EFI_INTERFACE_DECL(x) typedef struct x 111*ca987d46SWarner Losh #endif 112*ca987d46SWarner Losh 113*ca987d46SWarner Losh #ifdef EFI_NT_EMULATOR 114*ca987d46SWarner Losh 115*ca987d46SWarner Losh // 116*ca987d46SWarner Losh // To help ensure proper coding of integrated drivers, they are 117*ca987d46SWarner Losh // compiled as DLLs. In NT they require a dll init entry pointer. 118*ca987d46SWarner Losh // The macro puts a stub entry point into the DLL so it will load. 119*ca987d46SWarner Losh // 120*ca987d46SWarner Losh 121*ca987d46SWarner Losh #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ 122*ca987d46SWarner Losh EFI_STATUS \ 123*ca987d46SWarner Losh InitFunction ( \ 124*ca987d46SWarner Losh EFI_HANDLE ImageHandle, \ 125*ca987d46SWarner Losh EFI_SYSTEM_TABLE *SystemTable \ 126*ca987d46SWarner Losh ); \ 127*ca987d46SWarner Losh \ 128*ca987d46SWarner Losh UINTN \ 129*ca987d46SWarner Losh __stdcall \ 130*ca987d46SWarner Losh _DllMainCRTStartup ( \ 131*ca987d46SWarner Losh UINTN Inst, \ 132*ca987d46SWarner Losh UINTN reason_for_call, \ 133*ca987d46SWarner Losh VOID *rserved \ 134*ca987d46SWarner Losh ) \ 135*ca987d46SWarner Losh { \ 136*ca987d46SWarner Losh return 1; \ 137*ca987d46SWarner Losh } \ 138*ca987d46SWarner Losh \ 139*ca987d46SWarner Losh int \ 140*ca987d46SWarner Losh __declspec( dllexport ) \ 141*ca987d46SWarner Losh __cdecl \ 142*ca987d46SWarner Losh InitializeDriver ( \ 143*ca987d46SWarner Losh void *ImageHandle, \ 144*ca987d46SWarner Losh void *SystemTable \ 145*ca987d46SWarner Losh ) \ 146*ca987d46SWarner Losh { \ 147*ca987d46SWarner Losh return InitFunction(ImageHandle, SystemTable); \ 148*ca987d46SWarner Losh } 149*ca987d46SWarner Losh 150*ca987d46SWarner Losh 151*ca987d46SWarner Losh #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ 152*ca987d46SWarner Losh (_if)->LoadInternal(type, name, NULL) 153*ca987d46SWarner Losh 154*ca987d46SWarner Losh #else // EFI_NT_EMULATOR 155*ca987d46SWarner Losh 156*ca987d46SWarner Losh // 157*ca987d46SWarner Losh // When building similar to FW, link everything together as 158*ca987d46SWarner Losh // one big module. 159*ca987d46SWarner Losh // 160*ca987d46SWarner Losh 161*ca987d46SWarner Losh #define EFI_DRIVER_ENTRY_POINT(InitFunction) 162*ca987d46SWarner Losh 163*ca987d46SWarner Losh #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ 164*ca987d46SWarner Losh (_if)->LoadInternal(type, name, entry) 165*ca987d46SWarner Losh 166*ca987d46SWarner Losh #endif // EFI_FW_NT 167*ca987d46SWarner Losh 168*ca987d46SWarner Losh #ifdef __FreeBSD__ 169*ca987d46SWarner Losh #define INTERFACE_DECL(x) struct x 170*ca987d46SWarner Losh #else 171*ca987d46SWarner Losh // 172*ca987d46SWarner Losh // Some compilers don't support the forward reference construct: 173*ca987d46SWarner Losh // typedef struct XXXXX 174*ca987d46SWarner Losh // 175*ca987d46SWarner Losh // The following macro provide a workaround for such cases. 176*ca987d46SWarner Losh // 177*ca987d46SWarner Losh #ifdef NO_INTERFACE_DECL 178*ca987d46SWarner Losh #define INTERFACE_DECL(x) 179*ca987d46SWarner Losh #else 180*ca987d46SWarner Losh #define INTERFACE_DECL(x) typedef struct x 181*ca987d46SWarner Losh #endif 182*ca987d46SWarner Losh #endif /* __FreeBSD__ */ 183*ca987d46SWarner Losh 184*ca987d46SWarner Losh #ifdef _MSC_EXTENSIONS 185*ca987d46SWarner Losh #pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP 186*ca987d46SWarner Losh #endif 187*ca987d46SWarner Losh 188