1373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel/** @file
2373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
3373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  Copyright (c) 2013, ARM Ltd. All rights reserved.<BR>
4373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
5373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  This program and the accompanying materials
6373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  are licensed and made available under the terms and conditions of the BSD License
7373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  which accompanies this distribution.  The full text of the license may be found at
8373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  http://opensource.org/licenses/bsd-license.php
9373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
10373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
13373fbc64167e080fbe334776877cfba116d62a2dHarry LiebelModule Name:
14373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
15373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  EfiBind.h
16373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
17373fbc64167e080fbe334776877cfba116d62a2dHarry LiebelAbstract:
18373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
19373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  Processor or Compiler specific defines and types for AArch64.
20373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  We are using the ANSI C 2000 _t type definitions for basic types.
21373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  This it technically a violation of the coding standard, but they
22373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  are used to make EfiTypes.h portable. Code other than EfiTypes.h
23373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  should never use any ANSI C 2000 _t integer types.
24373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
25373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel**/
26373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
27373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
28373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#ifndef _EFI_BIND_H_
29373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define _EFI_BIND_H_
30373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
31373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
32373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_DRIVER_ENTRY_POINT(InitFunction)
33373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
34373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
35373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
36373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
37373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Make sure we are using the correct packing rules per EFI specification.
38373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
39373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#ifndef __GNUC__
40373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#pragma pack()
41373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif
42373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
43373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
44373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
45373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Assume standard AArch64 alignment.
46373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// BugBug: Need to check portability of long long
47373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
48373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned long long  uint64_t;
49373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef long long           int64_t;
50373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned int        uint32_t;
51373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef int                 int32_t;
52373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned short      uint16_t;
53373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef short               int16_t;
54373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned char       uint8_t;
55373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef signed char         int8_t;
56373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
57373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
58373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Native integer size in stdint.h
59373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
60373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef uint64_t  uintn_t;
61373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef int64_t   intn_t;
62373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
63373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
64373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Processor specific defines
65373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
66373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_MAX_BIT       0x8000000000000000
67373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define MAX_2_BITS        0xC000000000000000
68373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
69373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
70373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Maximum legal AArch64 address
71373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
72373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_MAX_ADDRESS   0xFFFFFFFFFFFFFFFF
73373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
74373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
75373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  Bad pointer value to use in check builds.
76373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  if you see this value you are using uninitialized or free'ed data
77373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
78373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_BAD_POINTER          0xAFAFAFAFAFAFAFAF
79373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_BAD_POINTER_AS_BYTE  0xAF
80373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
81373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_DEADLOOP()    { volatile UINTN __iii; __iii = 1; while (__iii); }
82373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
83373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
84373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// For real hardware, just put in a halt loop. Don't do a while(1) because the
85373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// compiler will optimize away the rest of the function following, so that you run out in
86373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// the weeds if you skip over it with a debugger.
87373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
88373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_BREAKPOINT EFI_DEADLOOP()
89373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
90373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
91373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
92373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Memory Fence forces serialization, and is needed to support out of order
93373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  memory transactions. The Memory Fence is mainly used to make sure IO
94373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  transactions complete in a deterministic sequence, and to syncronize locks
95373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  an other MP code. Currently no memory fencing is required.
96373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
97373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define MEMORY_FENCE()
98373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
99373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
100373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Some compilers don't support the forward reference construct:
101373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  typedef struct XXXXX. The forward reference is required for
102373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//  ANSI compatibility.
103373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
104373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// The following macro provide a workaround for such cases.
105373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
106373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
107373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
108373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#ifdef EFI_NO_INTERFACE_DECL
109373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  #define EFI_FORWARD_DECLARATION(x)
110373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#else
111373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
112373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif
113373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
114373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
115373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
116373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Some C compilers optimize the calling conventions to increase performance.
117373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// _EFIAPI is used to make all public APIs follow the standard C calling
118373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// convention.
119373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
120373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define _EFIAPI
121373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
122373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
123373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
124373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
125373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// For symbol name in GNU assembly code, an extra "_" is necessary
126373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel//
127373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#if defined(__GNUC__)
128373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  ///
129373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  /// Private worker functions for ASM_PFX()
130373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  ///
131373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  #define _CONCATENATE(a, b)  __CONCATENATE(a, b)
132373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  #define __CONCATENATE(a, b) a ## b
133373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
134373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  ///
135373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
136373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  /// on symbols in assembly language.
137373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  ///
138373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel  #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
139373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
140373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif
141373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
142373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif
143373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel
144