efibind.h revision 292625
1314564Sdim/* $FreeBSD: head/sys/boot/efi/include/arm64/efibind.h 292625 2015-12-22 20:40:34Z emaste $ */
2314564Sdim/*++
3353358Sdim
4353358SdimCopyright (c)  1999 - 2003 Intel Corporation. All rights reserved
5353358SdimThis software and associated documentation (if any) is furnished
6314564Sdimunder a license and may only be used or copied in accordance
7314564Sdimwith the terms of the license. Except as permitted by such
8314564Sdimlicense, no part of this software or documentation may be
9284677Sdimreproduced, stored in a retrieval system, or transmitted in any
10314564Sdimform or by any means without the express written consent of
11341825SdimIntel Corporation.
12341825Sdim
13309124SdimModule Name:
14284677Sdim
15284677Sdim    efefind.h
16284677Sdim
17284677SdimAbstract:
18314564Sdim
19341825Sdim    EFI to compile bindings
20284677Sdim
21360784Sdim
22327952Sdim
23341825Sdim
24341825SdimRevision History
25341825Sdim
26341825Sdim--*/
27341825Sdim
28314564Sdim#pragma pack()
29314564Sdim
30341825Sdim
31341825Sdim#ifdef __FreeBSD__
32353358Sdim#include <sys/stdint.h>
33353358Sdim#else
34353358Sdim//
35341825Sdim// Basic int types of various widths
36353358Sdim//
37353358Sdim
38353358Sdim#if (__STDC_VERSION__ < 199901L )
39353358Sdim
40341825Sdim    // No ANSI C 1999/2000 stdint.h integer width declarations
41341825Sdim
42341825Sdim    #if _MSC_EXTENSIONS
43309124Sdim
44284677Sdim        // Use Microsoft C compiler integer width declarations
45314564Sdim
46314564Sdim        typedef unsigned __int64    uint64_t;
47314564Sdim        typedef __int64             int64_t;
48314564Sdim        typedef unsigned __int32    uint32_t;
49314564Sdim        typedef __int32             int32_t;
50314564Sdim        typedef unsigned __int16    uint16_t;
51314564Sdim        typedef __int16             int16_t;
52314564Sdim        typedef unsigned __int8     uint8_t;
53314564Sdim        typedef __int8              int8_t;
54314564Sdim    #else
55314564Sdim        #ifdef UNIX_LP64
56314564Sdim
57314564Sdim            // Use LP64 programming model from C_FLAGS for integer width declarations
58314564Sdim
59314564Sdim            typedef unsigned long       uint64_t;
60314564Sdim            typedef long                int64_t;
61314564Sdim            typedef unsigned int        uint32_t;
62314564Sdim            typedef int                 int32_t;
63314564Sdim            typedef unsigned short      uint16_t;
64284677Sdim            typedef short               int16_t;
65            typedef unsigned char       uint8_t;
66            typedef char                int8_t;
67        #else
68
69            // Assume P64 programming model from C_FLAGS for integer width declarations
70
71            typedef unsigned long long  uint64_t;
72            typedef long long           int64_t;
73            typedef unsigned int        uint32_t;
74            typedef int                 int32_t;
75            typedef unsigned short      uint16_t;
76            typedef short               int16_t;
77            typedef unsigned char       uint8_t;
78            typedef char                int8_t;
79        #endif
80    #endif
81#endif
82#endif	/* __FreeBSD__ */
83
84//
85// Basic EFI types of various widths
86//
87
88
89typedef uint64_t   UINT64;
90typedef int64_t    INT64;
91typedef uint32_t   UINT32;
92typedef int32_t    INT32;
93typedef uint16_t   UINT16;
94typedef int16_t    INT16;
95typedef uint8_t    UINT8;
96typedef int8_t     INT8;
97
98
99#undef VOID
100#define VOID    void
101
102
103typedef int64_t    INTN;
104typedef uint64_t   UINTN;
105
106//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
107// BugBug: Code to debug
108//
109#define BIT63   0x8000000000000000
110
111#define PLATFORM_IOBASE_ADDRESS   (0xffffc000000 | BIT63)
112#define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) )
113
114//
115// Macro's with casts make this much easier to use and read.
116//
117#define PORT_TO_MEM8D(_Port)  (*(UINT8  *)(PORT_TO_MEMD(_Port)))
118#define POST_CODE(_Data)  (PORT_TO_MEM8D(0x80) = (_Data))
119//
120// BugBug: End Debug Code!!!
121//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
122
123#define EFIERR(a)           (0x8000000000000000 | a)
124#define EFI_ERROR_MASK      0x8000000000000000
125#define EFIERR_OEM(a)       (0xc000000000000000 | a)
126
127#define BAD_POINTER         0xFBFBFBFBFBFBFBFB
128#define MAX_ADDRESS         0xFFFFFFFFFFFFFFFF
129
130#pragma intrinsic (__break)
131#define BREAKPOINT()  __break(0)
132
133//
134// Pointers must be aligned to these address to function
135//  you will get an alignment fault if this value is less than 8
136//
137#define MIN_ALIGNMENT_SIZE  8
138
139#define ALIGN_VARIABLE(Value , Adjustment) \
140            (UINTN) Adjustment = 0; \
141            if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
142                (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
143            Value = (UINTN)Value + (UINTN)Adjustment
144
145//
146// Define macros to create data structure signatures.
147//
148
149#define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
150#define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
151#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))
152
153//
154// EFIAPI - prototype calling convention for EFI function pointers
155// BOOTSERVICE - prototype for implementation of a boot service interface
156// RUNTIMESERVICE - prototype for implementation of a runtime service interface
157// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
158// RUNTIME_CODE - pragma macro for declaring runtime code
159//
160
161#ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
162    #if _MSC_EXTENSIONS
163        #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler
164    #else
165        #define EFIAPI          // Substitute expresion to force C calling convention
166    #endif
167#endif
168
169#define BOOTSERVICE
170#define RUNTIMESERVICE
171#define RUNTIMEFUNCTION
172
173#define RUNTIME_CODE(a)         alloc_text("rtcode", a)
174#define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
175#define END_RUNTIME_DATA()      data_seg()
176
177#define VOLATILE    volatile
178
179//
180// BugBug: Need to find out if this is portable accross compliers.
181//
182void __mfa (void);
183#pragma intrinsic (__mfa)
184#define MEMORY_FENCE()    __mfa()
185
186#ifdef EFI_NO_INTERFACE_DECL
187  #define EFI_FORWARD_DECLARATION(x)
188  #define EFI_INTERFACE_DECL(x)
189#else
190  #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
191  #define EFI_INTERFACE_DECL(x) typedef struct x
192#endif
193
194//
195// When build similiar to FW, then link everything together as
196// one big module.
197//
198
199#define EFI_DRIVER_ENTRY_POINT(InitFunction)
200
201#define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
202            (_if)->LoadInternal(type, name, entry)
203//        entry(NULL, ST)
204
205#ifdef __FreeBSD__
206#define INTERFACE_DECL(x) struct x
207#else
208//
209// Some compilers don't support the forward reference construct:
210//  typedef struct XXXXX
211//
212// The following macro provide a workaround for such cases.
213//
214#ifdef NO_INTERFACE_DECL
215#define INTERFACE_DECL(x)
216#else
217#define INTERFACE_DECL(x) typedef struct x
218#endif
219#endif
220