1959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang/** @file
2959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  Processor or compiler specific defines and types for EBC.
3959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
41a2f870c9babe077c2d3abea23b6e8e044778341pkandel  We currently only have one EBC compiler so there may be some Intel compiler
5959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  specific functions in this file.
6959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
739899436d3c60a0b4f0a945413d9beb814eb444aLiming GaoCopyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
8af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterThis program and the accompanying materials are licensed and made available under
9af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterthe terms and conditions of the BSD License that accompanies this distribution.
10af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterThe full text of the license may be found at
11af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterhttp://opensource.org/licenses/bsd-license.php.
12af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter
13af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14af2dc6a70b9380d702bd0720cdb029d630c505e3myronporterWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
16959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang**/
17959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
18959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#ifndef __PROCESSOR_BIND_H__
19959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define __PROCESSOR_BIND_H__
20959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
21d484d1206719ccd807ad4bc557c452fac91de3dfklu///
22d484d1206719ccd807ad4bc557c452fac91de3dfklu/// Define the processor type so other code can make processor based choices
23d484d1206719ccd807ad4bc557c452fac91de3dfklu///
24959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MDE_CPU_EBC
25959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
26959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
27959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Native integer types
28959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
29f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney
30f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
31f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// 1-byte signed value
32f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
33d22ebbe39fcf3a7462492667345dabc401765454lgaotypedef signed char           INT8;
34f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
35f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// Logical Boolean.  1-byte value containing 0 for FALSE or a 1 for TRUE.  Other
36f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// values are undefined.
37f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
38959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned char         BOOLEAN;
39f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
40af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 1-byte unsigned value.
41f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
42959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned char         UINT8;
43f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
44af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 1-byte Character.
45f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
467d0db9ceb5971772bb1e7501412ca4714a3bbd6dqwangtypedef char                  CHAR8;
47f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
48af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 2-byte signed value.
49f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
50959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef short                 INT16;
51f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
52af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 2-byte unsigned value.
53f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
54959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned short        UINT16;
55f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
56f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// 2-byte Character.  Unless otherwise specified all strings are stored in the
57f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.
58f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
59959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned short        CHAR16;
60f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
61af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 4-byte signed value.
62f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
63959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef int                   INT32;
64f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
65af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 4-byte unsigned value.
66f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
67959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned int          UINT32;
68f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
69af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 8-byte signed value.
70f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
71959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef __int64               INT64;
72f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
73af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// 8-byte unsigned value.
74f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
75959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned __int64      UINT64;
76959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
77d484d1206719ccd807ad4bc557c452fac91de3dfklu///
78f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// Signed value of native width.  (4 bytes on supported 32-bit processor instructions,
79f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// 8 bytes on supported 64-bit processor instructions)
80d484d1206719ccd807ad4bc557c452fac91de3dfklu/// "long" type scales to the processor native size with EBC compiler
81d484d1206719ccd807ad4bc557c452fac91de3dfklu///
82959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef long                  INTN;
83f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
84af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// The unsigned value of native width.  (4 bytes on supported 32-bit processor instructions;
85f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// 8 bytes on supported 64-bit processor instructions)
86af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// "long" type scales to the processor native size with the EBC compiler.
87f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
88959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef unsigned long         UINTN;
89959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
90d484d1206719ccd807ad4bc557c452fac91de3dfklu///
91f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// A value of native width with the highest bit set.
92af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Scalable macro to set the most significant bit in a natural number.
93d484d1206719ccd807ad4bc557c452fac91de3dfklu///
94959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_BIT     (1ULL << (sizeof (INTN) * 8 - 1))
95f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
96f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney/// A value of native width with the two highest bits set.
97af2dc6a70b9380d702bd0720cdb029d630c505e3myronporter/// Scalable macro to set the most 2 significant bits in a natural number.
98f4ec40abd6533850edb914de59b7ef5f1c1c1bb6mdkinney///
99959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_2_BITS  (3ULL << (sizeof (INTN) * 8 - 2))
100959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
101d484d1206719ccd807ad4bc557c452fac91de3dfklu///
102d484d1206719ccd807ad4bc557c452fac91de3dfklu/// Maximum legal EBC address
103d484d1206719ccd807ad4bc557c452fac91de3dfklu///
104959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_ADDRESS   ((UINTN) ~0)
105959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
106d484d1206719ccd807ad4bc557c452fac91de3dfklu///
10739899436d3c60a0b4f0a945413d9beb814eb444aLiming Gao/// Maximum legal EBC INTN and UINTN values.
10839899436d3c60a0b4f0a945413d9beb814eb444aLiming Gao///
10939899436d3c60a0b4f0a945413d9beb814eb444aLiming Gao#define MAX_UINTN  ((UINTN) ~0)
11039899436d3c60a0b4f0a945413d9beb814eb444aLiming Gao#define MAX_INTN   ((INTN)~MAX_BIT)
11139899436d3c60a0b4f0a945413d9beb814eb444aLiming Gao
11239899436d3c60a0b4f0a945413d9beb814eb444aLiming Gao///
113d484d1206719ccd807ad4bc557c452fac91de3dfklu/// The stack alignment required for EBC
114d484d1206719ccd807ad4bc557c452fac91de3dfklu///
115959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define CPU_STACK_ALIGNMENT   sizeof(UINTN)
116959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
117d484d1206719ccd807ad4bc557c452fac91de3dfklu///
118d484d1206719ccd807ad4bc557c452fac91de3dfklu/// Modifier to ensure that all protocol member functions and EFI intrinsics
119d484d1206719ccd807ad4bc557c452fac91de3dfklu/// use the correct C calling convention. All protocol member functions and
1203963c4bf44b14be594c4253d695652e077856773gikidy/// EFI intrinsics are required to modify their member functions with EFIAPI.
121d484d1206719ccd807ad4bc557c452fac91de3dfklu///
1226149e6bb4f3b77f1f60379fb51b6bb414e9d9062jljusten#ifdef EFIAPI
1236149e6bb4f3b77f1f60379fb51b6bb414e9d9062jljusten  ///
1246149e6bb4f3b77f1f60379fb51b6bb414e9d9062jljusten  /// If EFIAPI is already defined, then we use that definition.
1256149e6bb4f3b77f1f60379fb51b6bb414e9d9062jljusten  ///
1266149e6bb4f3b77f1f60379fb51b6bb414e9d9062jljusten#else
127959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define EFIAPI
1286149e6bb4f3b77f1f60379fb51b6bb414e9d9062jljusten#endif
129959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
13014996c966991de1127fc2d6af8a08df47167b4ablgao/**
13114996c966991de1127fc2d6af8a08df47167b4ablgao  Return the pointer to the first instruction of a function given a function pointer.
13214996c966991de1127fc2d6af8a08df47167b4ablgao  On EBC architectures, these two pointer values are the same,
13314996c966991de1127fc2d6af8a08df47167b4ablgao  so the implementation of this macro is very simple.
13414996c966991de1127fc2d6af8a08df47167b4ablgao
1353963c4bf44b14be594c4253d695652e077856773gikidy  @param  FunctionPointer   A pointer to a function.
13614996c966991de1127fc2d6af8a08df47167b4ablgao
13714996c966991de1127fc2d6af8a08df47167b4ablgao  @return The pointer to the first instruction of a function given a function pointer.
13814996c966991de1127fc2d6af8a08df47167b4ablgao**/
1399a1d00cbb571c019e98b28189f6619ff32e7bb49mdkinney#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)
14024a7505cefd6dbb73bcdf2778f4e59095780aa50mdkinney
14102eef553114dea1e4d55071e91398a0625e4e18cJordan Justen#ifndef __USER_LABEL_PREFIX__
14202eef553114dea1e4d55071e91398a0625e4e18cJordan Justen#define __USER_LABEL_PREFIX__
14302eef553114dea1e4d55071e91398a0625e4e18cJordan Justen#endif
14402eef553114dea1e4d55071e91398a0625e4e18cJordan Justen
145959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
146959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
147