xref: /freebsd/stand/efi/include/amd64/efibind.h (revision 3a05fa14f9a62370edc26260a4cfabb8a0c5041c)
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