1199767fToomas Soome/*++
2199767fToomas Soome
3199767fToomas SoomeCopyright (c)  1999 - 2003 Intel Corporation. All rights reserved
4199767fToomas SoomeThis software and associated documentation (if any) is furnished
5199767fToomas Soomeunder a license and may only be used or copied in accordance
6199767fToomas Soomewith the terms of the license. Except as permitted by such
7199767fToomas Soomelicense, no part of this software or documentation may be
8199767fToomas Soomereproduced, stored in a retrieval system, or transmitted in any
9199767fToomas Soomeform or by any means without the express written consent of
10199767fToomas SoomeIntel Corporation.
11199767fToomas Soome
12199767fToomas SoomeModule Name:
13199767fToomas Soome
14199767fToomas Soome    efefind.h
15199767fToomas Soome
16199767fToomas SoomeAbstract:
17199767fToomas Soome
18199767fToomas Soome    EFI to compile bindings
19199767fToomas Soome
20199767fToomas Soome
21199767fToomas Soome
22199767fToomas Soome
23199767fToomas SoomeRevision History
24199767fToomas Soome
25199767fToomas Soome--*/
26199767fToomas Soome
27199767fToomas Soome#pragma pack()
28199767fToomas Soome
29199767fToomas Soome#include <sys/stdint.h>
30199767fToomas Soome
31199767fToomas Soome//
32199767fToomas Soome// Basic EFI types of various widths
33199767fToomas Soome//
34199767fToomas Soome
35199767fToomas Soome#ifndef ACPI_THREAD_ID		/* ACPI's definitions are fine */
36199767fToomas Soome#define ACPI_USE_SYSTEM_INTTYPES 1	/* Tell ACPI we've defined types */
37199767fToomas Soome
38199767fToomas Soometypedef uint64_t   UINT64;
39199767fToomas Soometypedef int64_t    INT64;
40199767fToomas Soome
41199767fToomas Soome#ifndef _BASETSD_H_
42199767fToomas Soome    typedef uint32_t   UINT32;
43199767fToomas Soome    typedef int32_t    INT32;
44199767fToomas Soome#endif
45199767fToomas Soome
46199767fToomas Soometypedef uint16_t   UINT16;
47199767fToomas Soometypedef int16_t    INT16;
48199767fToomas Soometypedef uint8_t    UINT8;
49199767fToomas Soometypedef int8_t     INT8;
50199767fToomas Soome
51199767fToomas Soome#endif
52199767fToomas Soome
53199767fToomas Soome#undef VOID
54199767fToomas Soome#define VOID    void
55199767fToomas Soome
56199767fToomas Soome
57199767fToomas Soometypedef int64_t    INTN;
58199767fToomas Soometypedef uint64_t   UINTN;
59199767fToomas Soome
60199767fToomas Soome#ifdef EFI_NT_EMULATOR
61199767fToomas Soome    #define POST_CODE(_Data)
62199767fToomas Soome#else
63199767fToomas Soome    #ifdef EFI_DEBUG
64199767fToomas Soome#define POST_CODE(_Data)    __asm mov eax,(_Data) __asm out 0x80,al
65199767fToomas Soome    #else
66199767fToomas Soome        #define POST_CODE(_Data)
67199767fToomas Soome    #endif
68199767fToomas Soome#endif
69199767fToomas Soome
70199767fToomas Soome#define EFIERR(a)           (0x8000000000000000 | a)
71199767fToomas Soome#define EFI_ERROR_MASK      0x8000000000000000
72199767fToomas Soome#define EFIERR_OEM(a)       (0xc000000000000000 | a)
73199767fToomas Soome
74199767fToomas Soome
75199767fToomas Soome#define BAD_POINTER         0xFBFBFBFBFBFBFBFB
76199767fToomas Soome#define MAX_ADDRESS         0xFFFFFFFFFFFFFFFF
77199767fToomas Soome
78199767fToomas Soome#define BREAKPOINT()        __asm { int 3 }
79199767fToomas Soome
80199767fToomas Soome//
81199767fToomas Soome// Pointers must be aligned to these address to function
82199767fToomas Soome//
83199767fToomas Soome
84199767fToomas Soome#define MIN_ALIGNMENT_SIZE  4
85199767fToomas Soome
86199767fToomas Soome#define ALIGN_VARIABLE(Value ,Adjustment) \
87199767fToomas Soome            (UINTN)Adjustment = 0; \
88199767fToomas Soome            if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
89199767fToomas Soome                (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
90199767fToomas Soome            Value = (UINTN)Value + (UINTN)Adjustment
91199767fToomas Soome
92199767fToomas Soome
93199767fToomas Soome//
94199767fToomas Soome// Define macros to build data structure signatures from characters.
95199767fToomas Soome//
96199767fToomas Soome
97199767fToomas Soome#define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
98199767fToomas Soome#define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
99199767fToomas Soome#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))
100199767fToomas Soome
101199767fToomas Soome//
102199767fToomas Soome// EFIAPI - prototype calling convention for EFI function pointers
103199767fToomas Soome// BOOTSERVICE - prototype for implementation of a boot service interface
104199767fToomas Soome// RUNTIMESERVICE - prototype for implementation of a runtime service interface
105199767fToomas Soome// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
106199767fToomas Soome// RUNTIME_CODE - pragma macro for declaring runtime code
107199767fToomas Soome//
108199767fToomas Soome
109199767fToomas Soome#ifdef	__amd64__
110199767fToomas Soome#define	EFIAPI	__attribute__((ms_abi))
111199767fToomas Soome#endif
112199767fToomas Soome
113199767fToomas Soome#ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
114199767fToomas Soome    #ifdef _MSC_EXTENSIONS
115199767fToomas Soome        #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler
116199767fToomas Soome    #else
117199767fToomas Soome        #define EFIAPI          // Substitute expresion to force C calling convention
118199767fToomas Soome    #endif
119199767fToomas Soome#endif
120199767fToomas Soome
121199767fToomas Soome#define BOOTSERVICE
122199767fToomas Soome//#define RUNTIMESERVICE(proto,a)    alloc_text("rtcode",a); proto a
123199767fToomas Soome//#define RUNTIMEFUNCTION(proto,a)   alloc_text("rtcode",a); proto a
124199767fToomas Soome#define RUNTIMESERVICE
125199767fToomas Soome#define RUNTIMEFUNCTION
126199767fToomas Soome
127199767fToomas Soome
128199767fToomas Soome#define RUNTIME_CODE(a)         alloc_text("rtcode", a)
129199767fToomas Soome#define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
130199767fToomas Soome#define END_RUNTIME_DATA()      data_seg("")
131199767fToomas Soome
132199767fToomas Soome#define VOLATILE    volatile
133199767fToomas Soome
134199767fToomas Soome#define MEMORY_FENCE()
135199767fToomas Soome
136199767fToomas Soome#ifdef EFI_NO_INTERFACE_DECL
137199767fToomas Soome  #define EFI_FORWARD_DECLARATION(x)
138199767fToomas Soome  #define EFI_INTERFACE_DECL(x)
139199767fToomas Soome#else
140199767fToomas Soome  #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
141199767fToomas Soome  #define EFI_INTERFACE_DECL(x) typedef struct x
142199767fToomas Soome#endif
143199767fToomas Soome
144199767fToomas Soome#ifdef EFI_NT_EMULATOR
145199767fToomas Soome
146199767fToomas Soome//
147199767fToomas Soome// To help ensure proper coding of integrated drivers, they are
148199767fToomas Soome// compiled as DLLs.  In NT they require a dll init entry pointer.
149199767fToomas Soome// The macro puts a stub entry point into the DLL so it will load.
150199767fToomas Soome//
151199767fToomas Soome
152199767fToomas Soome#define EFI_DRIVER_ENTRY_POINT(InitFunction)            \
153199767fToomas Soome    EFI_STATUS                                          \
154199767fToomas Soome    InitFunction (                                      \
155199767fToomas Soome      EFI_HANDLE  ImageHandle,                          \
156199767fToomas Soome      EFI_SYSTEM_TABLE  *SystemTable                    \
157199767fToomas Soome      );                                                \
158199767fToomas Soome                                                        \
159199767fToomas Soome    UINTN                                               \
160199767fToomas Soome    __stdcall                                           \
161199767fToomas Soome    _DllMainCRTStartup (                                \
162199767fToomas Soome        UINTN    Inst,                                  \
163199767fToomas Soome        UINTN    reason_for_call,                       \
164199767fToomas Soome        VOID    *rserved                                \
165199767fToomas Soome        )                                               \
166199767fToomas Soome    {                                                   \
167199767fToomas Soome        return 1;                                       \
168199767fToomas Soome    }                                                   \
169199767fToomas Soome                                                        \
170199767fToomas Soome    int                                                 \
171199767fToomas Soome    __declspec( dllexport )                             \
172199767fToomas Soome    __cdecl                                             \
173199767fToomas Soome    InitializeDriver (                                  \
174199767fToomas Soome        void *ImageHandle,                              \
175199767fToomas Soome        void *SystemTable                               \
176199767fToomas Soome        )                                               \
177199767fToomas Soome    {                                                   \
178199767fToomas Soome        return InitFunction(ImageHandle, SystemTable);  \
179199767fToomas Soome    }
180199767fToomas Soome
181199767fToomas Soome
182199767fToomas Soome    #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)      \
1830350272Toomas Soome        (_if)->LoadInternal(type, name, NULL)
184199767fToomas Soome
1850350272Toomas Soome#else // EFI_NT_EMULATOR
186199767fToomas Soome
187199767fToomas Soome//
1880350272Toomas Soome// When building similar to FW, link everything together as
189199767fToomas Soome// one big module.
190199767fToomas Soome//
191199767fToomas Soome
192199767fToomas Soome    #define EFI_DRIVER_ENTRY_POINT(InitFunction)
193199767fToomas Soome
194199767fToomas Soome    #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
195199767fToomas Soome            (_if)->LoadInternal(type, name, entry)
196199767fToomas Soome
197199767fToomas Soome#endif // EFI_FW_NT
198199767fToomas Soome
199199767fToomas Soome#define INTERFACE_DECL(x) struct x
200199767fToomas Soome
201199767fToomas Soome#ifdef _MSC_EXTENSIONS
202199767fToomas Soome#pragma warning ( disable : 4731 )  // Suppress warnings about modification of EBP
203199767fToomas Soome#endif