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
30199767fToomas Soome#include <sys/stdint.h>
31199767fToomas Soome
32199767fToomas Soome//
33199767fToomas Soome// Basic EFI types of various widths
34199767fToomas Soome//
35199767fToomas Soome
36199767fToomas Soome#ifndef ACPI_THREAD_ID		/* ACPI's definitions are fine, use those */
37199767fToomas Soome#define ACPI_USE_SYSTEM_INTTYPES 1	/* Tell ACPI we've defined types */
38199767fToomas Soome
39199767fToomas Soometypedef uint64_t   UINT64;
40199767fToomas Soometypedef int64_t    INT64;
41199767fToomas Soome
42199767fToomas Soome#ifndef _BASETSD_H_
43199767fToomas Soome    typedef uint32_t   UINT32;
44199767fToomas Soome    typedef int32_t    INT32;
45199767fToomas Soome#endif
46199767fToomas Soome
47199767fToomas Soometypedef uint16_t   UINT16;
48199767fToomas Soometypedef int16_t    INT16;
49199767fToomas Soometypedef uint8_t    UINT8;
50199767fToomas Soometypedef int8_t     INT8;
51199767fToomas Soome
52199767fToomas Soome#endif
53199767fToomas Soome
54199767fToomas Soome#undef VOID
55199767fToomas Soome#define VOID    void
56199767fToomas Soome
57199767fToomas Soome
58199767fToomas Soometypedef int32_t    INTN;
59199767fToomas Soometypedef uint32_t   UINTN;
60199767fToomas Soome
61199767fToomas Soome#ifdef EFI_NT_EMULATOR
62199767fToomas Soome    #define POST_CODE(_Data)
63199767fToomas Soome#else
64199767fToomas Soome    #ifdef EFI_DEBUG
65199767fToomas Soome#define POST_CODE(_Data)    __asm mov eax,(_Data) __asm out 0x80,al
66199767fToomas Soome    #else
67199767fToomas Soome        #define POST_CODE(_Data)
68199767fToomas Soome    #endif
69199767fToomas Soome#endif
70199767fToomas Soome
71199767fToomas Soome#define EFIERR(a)           (0x80000000 | a)
72199767fToomas Soome#define EFI_ERROR_MASK      0x80000000
73199767fToomas Soome#define EFIERR_OEM(a)       (0xc0000000 | a)
74199767fToomas Soome
75199767fToomas Soome
76199767fToomas Soome#define BAD_POINTER         0xFBFBFBFB
77199767fToomas Soome#define MAX_ADDRESS         0xFFFFFFFF
78199767fToomas Soome
79199767fToomas Soome#define BREAKPOINT()        __asm { int 3 }
80199767fToomas Soome
81199767fToomas Soome//
82199767fToomas Soome// Pointers must be aligned to these address to function
83199767fToomas Soome//
84199767fToomas Soome
85199767fToomas Soome#define MIN_ALIGNMENT_SIZE  4
86199767fToomas Soome
87199767fToomas Soome#define ALIGN_VARIABLE(Value ,Adjustment) \
88199767fToomas Soome            (UINTN)Adjustment = 0; \
89199767fToomas Soome            if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
90199767fToomas Soome                (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
91199767fToomas Soome            Value = (UINTN)Value + (UINTN)Adjustment
92199767fToomas Soome
93199767fToomas Soome
94199767fToomas Soome//
95199767fToomas Soome// Define macros to build data structure signatures from characters.
96199767fToomas Soome//
97199767fToomas Soome
98199767fToomas Soome#define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
99199767fToomas Soome#define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
100199767fToomas 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))
101199767fToomas Soome
102199767fToomas Soome//
103199767fToomas Soome// EFIAPI - prototype calling convention for EFI function pointers
104199767fToomas Soome// BOOTSERVICE - prototype for implementation of a boot service interface
105199767fToomas Soome// RUNTIMESERVICE - prototype for implementation of a runtime service interface
106199767fToomas Soome// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
107199767fToomas Soome// RUNTIME_CODE - pragma macro for declaring runtime code
108199767fToomas Soome//
109199767fToomas Soome
110199767fToomas Soome#ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
111199767fToomas Soome    #ifdef _MSC_EXTENSIONS
112199767fToomas Soome        #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler
113199767fToomas Soome    #else
114199767fToomas Soome        #define EFIAPI          // Substitute expresion to force C calling convention
115199767fToomas Soome    #endif
116199767fToomas Soome#endif
117199767fToomas Soome
118199767fToomas Soome#define BOOTSERVICE
119199767fToomas Soome//#define RUNTIMESERVICE(proto,a)    alloc_text("rtcode",a); proto a
120199767fToomas Soome//#define RUNTIMEFUNCTION(proto,a)   alloc_text("rtcode",a); proto a
121199767fToomas Soome#define RUNTIMESERVICE
122199767fToomas Soome#define RUNTIMEFUNCTION
123199767fToomas Soome
124199767fToomas Soome
125199767fToomas Soome#define RUNTIME_CODE(a)         alloc_text("rtcode", a)
126199767fToomas Soome#define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
127199767fToomas Soome#define END_RUNTIME_DATA()      data_seg()
128199767fToomas Soome
129199767fToomas Soome#define VOLATILE    volatile
130199767fToomas Soome
131199767fToomas Soome#define MEMORY_FENCE()
132199767fToomas Soome
133199767fToomas Soome#ifdef EFI_NO_INTERFACE_DECL
134199767fToomas Soome  #define EFI_FORWARD_DECLARATION(x)
135199767fToomas Soome  #define EFI_INTERFACE_DECL(x)
136199767fToomas Soome#else
137199767fToomas Soome  #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
138199767fToomas Soome  #define EFI_INTERFACE_DECL(x) typedef struct x
139199767fToomas Soome#endif
140199767fToomas Soome
141199767fToomas Soome#ifdef EFI_NT_EMULATOR
142199767fToomas Soome
143199767fToomas Soome//
144199767fToomas Soome// To help ensure proper coding of integrated drivers, they are
145199767fToomas Soome// compiled as DLLs.  In NT they require a dll init entry pointer.
146199767fToomas Soome// The macro puts a stub entry point into the DLL so it will load.
147199767fToomas Soome//
148199767fToomas Soome
149199767fToomas Soome#define EFI_DRIVER_ENTRY_POINT(InitFunction)            \
150199767fToomas Soome    EFI_STATUS                                          \
151199767fToomas Soome    InitFunction (                                      \
152199767fToomas Soome      EFI_HANDLE  ImageHandle,                          \
153199767fToomas Soome      EFI_SYSTEM_TABLE  *SystemTable                    \
154199767fToomas Soome      );                                                \
155199767fToomas Soome                                                        \
156199767fToomas Soome    UINTN                                               \
157199767fToomas Soome    __stdcall                                           \
158199767fToomas Soome    _DllMainCRTStartup (                                \
159199767fToomas Soome        UINTN    Inst,                                  \
160199767fToomas Soome        UINTN    reason_for_call,                       \
161199767fToomas Soome        VOID    *rserved                                \
162199767fToomas Soome        )                                               \
163199767fToomas Soome    {                                                   \
164199767fToomas Soome        return 1;                                       \
165199767fToomas Soome    }                                                   \
166199767fToomas Soome                                                        \
167199767fToomas Soome    int                                                 \
168199767fToomas Soome    __declspec( dllexport )                             \
169199767fToomas Soome    __cdecl                                             \
170199767fToomas Soome    InitializeDriver (                                  \
171199767fToomas Soome        void *ImageHandle,                              \
172199767fToomas Soome        void *SystemTable                               \
173199767fToomas Soome        )                                               \
174199767fToomas Soome    {                                                   \
175199767fToomas Soome        return InitFunction(ImageHandle, SystemTable);  \
176199767fToomas Soome    }
177199767fToomas Soome
178199767fToomas Soome
179199767fToomas Soome    #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)      \
1800350272Toomas Soome        (_if)->LoadInternal(type, name, NULL)
181199767fToomas Soome
1820350272Toomas Soome#else // EFI_NT_EMULATOR
183199767fToomas Soome
184199767fToomas Soome//
1850350272Toomas Soome// When building similar to FW, link everything together as
186199767fToomas Soome// one big module.
187199767fToomas Soome//
188199767fToomas Soome
189199767fToomas Soome    #define EFI_DRIVER_ENTRY_POINT(InitFunction)
190199767fToomas Soome
191199767fToomas Soome    #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
192199767fToomas Soome            (_if)->LoadInternal(type, name, entry)
193199767fToomas Soome
194199767fToomas Soome#endif // EFI_FW_NT
195199767fToomas Soome
196199767fToomas Soome#define INTERFACE_DECL(x) struct x
197199767fToomas Soome
198199767fToomas Soome#ifdef _MSC_EXTENSIONS
199199767fToomas Soome#pragma warning ( disable : 4731 )  // Suppress warnings about modification of EBP
200199767fToomas Soome#endif