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