xref: /freebsd/stand/efi/include/arm/efibind.h (revision 7a1bc422d109a7cee56dcfbac616eda613c1c43e)
1*ca987d46SWarner Losh /*++
2*ca987d46SWarner Losh 
3*ca987d46SWarner Losh Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.
4*ca987d46SWarner Losh 
5*ca987d46SWarner Losh This program and the accompanying materials
6*ca987d46SWarner Losh are licensed and made available under the terms and conditions of the BSD License
7*ca987d46SWarner Losh which accompanies this distribution.  The full text of the license may be found at
8*ca987d46SWarner Losh http://opensource.org/licenses/bsd-license.php
9*ca987d46SWarner Losh 
10*ca987d46SWarner Losh THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11*ca987d46SWarner Losh WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12*ca987d46SWarner Losh 
13*ca987d46SWarner Losh Module Name:
14*ca987d46SWarner Losh 
15*ca987d46SWarner Losh   EfiBind.h
16*ca987d46SWarner Losh 
17*ca987d46SWarner Losh Abstract:
18*ca987d46SWarner Losh 
19*ca987d46SWarner Losh   Processor or Compiler specific defines and types for IA-32.
20*ca987d46SWarner Losh   We are using the ANSI C 2000 _t type definitions for basic types.
21*ca987d46SWarner Losh   This it technically a violation of the coding standard, but they
22*ca987d46SWarner Losh   are used to make EfiTypes.h portable. Code other than EfiTypes.h
23*ca987d46SWarner Losh   should never use any ANSI C 2000 _t integer types.
24*ca987d46SWarner Losh 
25*ca987d46SWarner Losh --*/
26*ca987d46SWarner Losh 
27*ca987d46SWarner Losh #ifndef _EFI_BIND_H_
28*ca987d46SWarner Losh #define _EFI_BIND_H_
29*ca987d46SWarner Losh 
30*ca987d46SWarner Losh 
31*ca987d46SWarner Losh #define EFI_DRIVER_ENTRY_POINT(InitFunction)
32*ca987d46SWarner Losh #define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
33*ca987d46SWarner Losh 
34*ca987d46SWarner Losh 
35*ca987d46SWarner Losh //
36*ca987d46SWarner Losh // Make sure we are using the correct packing rules per EFI specification
37*ca987d46SWarner Losh //
38*ca987d46SWarner Losh #ifndef __GNUC__
39*ca987d46SWarner Losh #pragma pack()
40*ca987d46SWarner Losh #endif
41*ca987d46SWarner Losh 
42*ca987d46SWarner Losh 
43*ca987d46SWarner Losh #define EFIERR(a)           (0x80000000 | a)
44*ca987d46SWarner Losh #define EFI_ERROR_MASK      0x80000000
45*ca987d46SWarner Losh #define EFIERR_OEM(a)       (0xc0000000 | a)
46*ca987d46SWarner Losh 
47*ca987d46SWarner Losh //
48*ca987d46SWarner Losh // Processor specific defines
49*ca987d46SWarner Losh //
50*ca987d46SWarner Losh #define EFI_MAX_BIT       0x80000000
51*ca987d46SWarner Losh #define MAX_2_BITS        0xC0000000
52*ca987d46SWarner Losh 
53*ca987d46SWarner Losh //
54*ca987d46SWarner Losh // Maximum legal IA-32 address
55*ca987d46SWarner Losh //
56*ca987d46SWarner Losh #define EFI_MAX_ADDRESS   0xFFFFFFFF
57*ca987d46SWarner Losh 
58*ca987d46SWarner Losh //
59*ca987d46SWarner Losh //  Bad pointer value to use in check builds.
60*ca987d46SWarner Losh //  if you see this value you are using uninitialized or free'ed data
61*ca987d46SWarner Losh //
62*ca987d46SWarner Losh #define EFI_BAD_POINTER          0xAFAFAFAF
63*ca987d46SWarner Losh #define EFI_BAD_POINTER_AS_BYTE  0xAF
64*ca987d46SWarner Losh 
65*ca987d46SWarner Losh #define EFI_DEADLOOP()    { volatile UINTN __iii; __iii = 1; while (__iii); }
66*ca987d46SWarner Losh 
67*ca987d46SWarner Losh //
68*ca987d46SWarner Losh // Inject a break point in the code to assist debugging for NT Emulation Environment
69*ca987d46SWarner Losh // For real hardware, just put in a halt loop. Don't do a while(1) because the
70*ca987d46SWarner Losh // compiler will optimize away the rest of the function following, so that you run out in
71*ca987d46SWarner Losh // the weeds if you skip over it with a debugger.
72*ca987d46SWarner Losh //
73*ca987d46SWarner Losh #define EFI_BREAKPOINT EFI_DEADLOOP()
74*ca987d46SWarner Losh 
75*ca987d46SWarner Losh 
76*ca987d46SWarner Losh //
77*ca987d46SWarner Losh // Memory Fence forces serialization, and is needed to support out of order
78*ca987d46SWarner Losh //  memory transactions. The Memory Fence is mainly used to make sure IO
79*ca987d46SWarner Losh //  transactions complete in a deterministic sequence, and to syncronize locks
80*ca987d46SWarner Losh //  an other MP code. Currently no memory fencing is required.
81*ca987d46SWarner Losh //
82*ca987d46SWarner Losh #define MEMORY_FENCE()
83*ca987d46SWarner Losh 
84*ca987d46SWarner Losh //
85*ca987d46SWarner Losh // Some compilers don't support the forward reference construct:
86*ca987d46SWarner Losh //  typedef struct XXXXX. The forward reference is required for
87*ca987d46SWarner Losh //  ANSI compatibility.
88*ca987d46SWarner Losh //
89*ca987d46SWarner Losh // The following macro provide a workaround for such cases.
90*ca987d46SWarner Losh //
91*ca987d46SWarner Losh 
92*ca987d46SWarner Losh 
93*ca987d46SWarner Losh #ifdef EFI_NO_INTERFACE_DECL
94*ca987d46SWarner Losh   #define EFI_FORWARD_DECLARATION(x)
95*ca987d46SWarner Losh #else
96*ca987d46SWarner Losh   #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
97*ca987d46SWarner Losh #endif
98*ca987d46SWarner Losh 
99*ca987d46SWarner Losh 
100*ca987d46SWarner Losh //
101*ca987d46SWarner Losh // Some C compilers optimize the calling conventions to increase performance.
102*ca987d46SWarner Losh // EFIAPI is used to make all public APIs follow the standard C calling
103*ca987d46SWarner Losh // convention.
104*ca987d46SWarner Losh //
105*ca987d46SWarner Losh #define EFIAPI
106*ca987d46SWarner Losh 
107*ca987d46SWarner Losh 
108*ca987d46SWarner Losh 
109*ca987d46SWarner Losh //
110*ca987d46SWarner Losh // For symbol name in GNU assembly code, an extra "_" is necessary
111*ca987d46SWarner Losh //
112*ca987d46SWarner Losh #if defined(__GNUC__)
113*ca987d46SWarner Losh   ///
114*ca987d46SWarner Losh   /// Private worker functions for ASM_PFX()
115*ca987d46SWarner Losh   ///
116*ca987d46SWarner Losh   #define _CONCATENATE(a, b)  __CONCATENATE(a, b)
117*ca987d46SWarner Losh   #define __CONCATENATE(a, b) a ## b
118*ca987d46SWarner Losh 
119*ca987d46SWarner Losh   ///
120*ca987d46SWarner Losh   /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
121*ca987d46SWarner Losh   /// on symbols in assembly language.
122*ca987d46SWarner Losh   ///
123*ca987d46SWarner Losh   #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
124*ca987d46SWarner Losh 
125*ca987d46SWarner Losh #endif
126*ca987d46SWarner Losh 
127*ca987d46SWarner Losh #define INTERFACE_DECL(x) struct x
128*ca987d46SWarner Losh 
129*ca987d46SWarner Losh #endif
130