ProcessorBind.h revision 3963c4bf44b14be594c4253d695652e077856773
1959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang/** @file
2d1057d4ec5d3a48c800d041c44ed07a2dbe9d936klu  Processor or Compiler specific defines and types for Ia32 architecture.
3959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
43963c4bf44b14be594c4253d695652e077856773gikidy  Copyright (c) 2006, Intel Corporation<BR>
5959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  All rights reserved. This program and the accompanying materials
6959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  are licensed and made available under the terms and conditions of the BSD License
7959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  which accompanies this distribution.  The full text of the license may be found at
8959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  http://opensource.org/licenses/bsd-license.php
9959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
10959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
13959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang**/
14959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
15959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#ifndef __PROCESSOR_BIND_H__
16959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define __PROCESSOR_BIND_H__
17959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
183566565aa46899c26d5d8243966643f9a89a2133klu///
193566565aa46899c26d5d8243966643f9a89a2133klu/// Define the processor type so other code can make processor based choices
203566565aa46899c26d5d8243966643f9a89a2133klu///
21959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MDE_CPU_IA32
22959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
23959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
243963c4bf44b14be594c4253d695652e077856773gikidy// Make sure we are using the correct packing rules per EFI specification
25959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
26959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#ifndef __GNUC__
27959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma pack()
28959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
29959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
30b483e39524be82e44caa2804145415d17713a6a5AJFISH#if __INTEL_COMPILER
31b483e39524be82e44caa2804145415d17713a6a5AJFISH//
32ed300ce2a68ba42b7e140af9e7e71c706518c9f1jljusten// Disable ICC's remark #869: "Parameter" was never referenced warning.
33ed300ce2a68ba42b7e140af9e7e71c706518c9f1jljusten// This is legal ANSI C code so we disable the remark that is turned on with -Wall
34ed300ce2a68ba42b7e140af9e7e71c706518c9f1jljusten//
35ed300ce2a68ba42b7e140af9e7e71c706518c9f1jljusten#pragma warning ( disable : 869 )
36ed300ce2a68ba42b7e140af9e7e71c706518c9f1jljusten
37ed300ce2a68ba42b7e140af9e7e71c706518c9f1jljusten//
38b483e39524be82e44caa2804145415d17713a6a5AJFISH// Disable ICC's remark #1418: external function definition with no prior declaration.
39b483e39524be82e44caa2804145415d17713a6a5AJFISH// This is legal ANSI C code so we disable the remark that is turned on with /W4
40b483e39524be82e44caa2804145415d17713a6a5AJFISH//
41b483e39524be82e44caa2804145415d17713a6a5AJFISH#pragma warning ( disable : 1418 )
42b483e39524be82e44caa2804145415d17713a6a5AJFISH
43b483e39524be82e44caa2804145415d17713a6a5AJFISH//
44b483e39524be82e44caa2804145415d17713a6a5AJFISH// Disable ICC's remark #1419: external declaration in primary source file
45b483e39524be82e44caa2804145415d17713a6a5AJFISH// This is legal ANSI C code so we disable the remark that is turned on with /W4
46b483e39524be82e44caa2804145415d17713a6a5AJFISH//
47b483e39524be82e44caa2804145415d17713a6a5AJFISH#pragma warning ( disable : 1419 )
48b483e39524be82e44caa2804145415d17713a6a5AJFISH
49b483e39524be82e44caa2804145415d17713a6a5AJFISH#endif
50b483e39524be82e44caa2804145415d17713a6a5AJFISH
51b483e39524be82e44caa2804145415d17713a6a5AJFISH
52959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if _MSC_EXTENSIONS
53959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
54959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
55959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disable warning that make it impossible to compile at /W4
56959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// This only works for Microsoft* tools
57959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
58959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
59959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
60959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disabling bitfield type checking warnings.
61959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
62959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4214 )
63959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
64959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
65959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disabling the unreferenced formal parameter warnings.
66959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
67959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4100 )
68959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
69959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
70959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disable slightly different base types warning as CHAR8 * can not be set
71959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// to a constant string.
72959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
73959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4057 )
74959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
75959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
76959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning
77959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
78959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4127 )
79959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
80959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
81959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// This warning is caused by functions defined but not used. For precompiled header only.
82959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
83959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4505 )
84959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
85959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
863963c4bf44b14be594c4253d695652e077856773gikidy// This warning is caused by empty (after preprocessing) source file. For precompiled header only.
87959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
88959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4206 )
89959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
90959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
91959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
92959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
93959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L)
94959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
95959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  // No ANSI C 2000 stdint.h integer width declarations, so define equivalents
96959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
97959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
98959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #if _MSC_EXTENSIONS
999510db651c2e1ddf8459ff97078c0f2b677977c6vanjeff
100959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
101959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    // use Microsoft* C complier dependent interger width types
102959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
103959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned __int64    UINT64;
104959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef __int64             INT64;
105959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned __int32    UINT32;
106959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef __int32             INT32;
107959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      UINT16;
108959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      CHAR16;
109959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef short               INT16;
110959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       BOOLEAN;
111959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       UINT8;
112959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                CHAR8;
113959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                INT8;
114959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #else
115959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
116959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
117959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    // Assume standard IA-32 alignment.
118959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    // Need to check portability of long long
119959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
120959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned long long  UINT64;
121959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef long long           INT64;
122959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned int        UINT32;
123959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef int                 INT32;
124959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      UINT16;
125959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      CHAR16;
126959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef short               INT16;
127959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       BOOLEAN;
128959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       UINT8;
129959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                CHAR8;
130959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                INT8;
131959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #endif
132959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
133959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define UINT8_MAX 0xff
134959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
135959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#else
136959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
137959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  // Use ANSI C 2000 stdint.h integer width declarations
138959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
139959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #include "stdint.h"
140959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint8_t   BOOLEAN;
141959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int8_t    INT8;
142959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint8_t   UINT8;
143959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int16_t   INT16;
144959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint16_t  UINT16;
145959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int32_t   INT32;
146959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint32_t  UINT32;
147959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int64_t   INT64;
148959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint64_t  UINT64;
149959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef char      CHAR8;
150959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint16_t  CHAR16;
151959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
152959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
153959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
154959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef UINT32  UINTN;
155959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef INT32   INTN;
156959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
157959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
1583566565aa46899c26d5d8243966643f9a89a2133klu///
1593566565aa46899c26d5d8243966643f9a89a2133klu/// Processor specific defines
1603566565aa46899c26d5d8243966643f9a89a2133klu///
161959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_BIT     0x80000000
162959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_2_BITS  0xC0000000
163959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
1643566565aa46899c26d5d8243966643f9a89a2133klu///
1653566565aa46899c26d5d8243966643f9a89a2133klu/// Maximum legal IA-32 address
1663566565aa46899c26d5d8243966643f9a89a2133klu///
167959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_ADDRESS   0xFFFFFFFF
168959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
1693566565aa46899c26d5d8243966643f9a89a2133klu///
1703566565aa46899c26d5d8243966643f9a89a2133klu/// The stack alignment required for IA-32
1713566565aa46899c26d5d8243966643f9a89a2133klu///
172959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define CPU_STACK_ALIGNMENT   sizeof(UINTN)
173959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
174959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
175959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Modifier to ensure that all protocol member functions and EFI intrinsics
176959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// use the correct C calling convention. All protocol member functions and
1773963c4bf44b14be594c4253d695652e077856773gikidy// EFI intrinsics are required to modify their member functions with EFIAPI.
178959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
179959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if _MSC_EXTENSIONS
1803566565aa46899c26d5d8243966643f9a89a2133klu  ///
1813566565aa46899c26d5d8243966643f9a89a2133klu  /// Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C.
1823566565aa46899c26d5d8243966643f9a89a2133klu  ///
183959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define EFIAPI __cdecl
18486b2b825c48d9524db4870b87c185f707a3b1dfaklu#else
18586b2b825c48d9524db4870b87c185f707a3b1dfaklu  #if __GNUC__
18686b2b825c48d9524db4870b87c185f707a3b1dfaklu    #define EFIAPI __attribute__((cdecl))
18786b2b825c48d9524db4870b87c185f707a3b1dfaklu  #endif
188959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
189959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
190959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
191959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// The Microsoft* C compiler can removed references to unreferenced data items
192959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//  if the /OPT:REF linker option is used. We defined a macro as this is a
193959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//  a non standard extension
194959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
195959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if _MSC_EXTENSIONS
196959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
197959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#else
198959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define GLOBAL_REMOVE_IF_UNREFERENCED
199959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
200959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
20127af6b876a70c49928bdae7bedbb72cba9a18171jwang//
20227af6b876a70c49928bdae7bedbb72cba9a18171jwang// For symbol name in GNU assembly code, an extra "_" is necessary
20327af6b876a70c49928bdae7bedbb72cba9a18171jwang//
20427af6b876a70c49928bdae7bedbb72cba9a18171jwang#if __GNUC__
205ed0b86b1838a525dc5e9e86dc0acd47e3a16dc50eric_tian  #if defined(linux)
206ed0b86b1838a525dc5e9e86dc0acd47e3a16dc50eric_tian    #define ASM_PFX(name) name
207ed0b86b1838a525dc5e9e86dc0acd47e3a16dc50eric_tian  #else
208ed0b86b1838a525dc5e9e86dc0acd47e3a16dc50eric_tian    #define ASM_PFX(name) _##name
209ed0b86b1838a525dc5e9e86dc0acd47e3a16dc50eric_tian  #endif
21027af6b876a70c49928bdae7bedbb72cba9a18171jwang#endif
21127af6b876a70c49928bdae7bedbb72cba9a18171jwang
21214996c966991de1127fc2d6af8a08df47167b4ablgao/**
21314996c966991de1127fc2d6af8a08df47167b4ablgao  Return the pointer to the first instruction of a function given a function pointer.
21414996c966991de1127fc2d6af8a08df47167b4ablgao  On IA32 CPU architectures, these two pointer values are the same,
21514996c966991de1127fc2d6af8a08df47167b4ablgao  so the implementation of this macro is very simple.
21614996c966991de1127fc2d6af8a08df47167b4ablgao
2173963c4bf44b14be594c4253d695652e077856773gikidy  @param  FunctionPointer   A pointer to a function.
21814996c966991de1127fc2d6af8a08df47167b4ablgao
21914996c966991de1127fc2d6af8a08df47167b4ablgao  @return The pointer to the first instruction of a function given a function pointer.
2203963c4bf44b14be594c4253d695652e077856773gikidy
22114996c966991de1127fc2d6af8a08df47167b4ablgao**/
2223963c4bf44b14be594c4253d695652e077856773gikidy#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(FunctionPointer)
22324a7505cefd6dbb73bcdf2778f4e59095780aa50mdkinney
224959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
225959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
226