ProcessorBind.h revision 27af6b876a70c49928bdae7bedbb72cba9a18171
1959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang/** @file
2959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  Processor or Compiler specific defines and types for x64.
3959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
4959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  Copyright (c) 2006, Intel Corporation
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
18959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
19959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Define the processor type so other code can make processor based choices
20959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
21959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MDE_CPU_IA32
22959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
23959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
24959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Make sure we are useing the correct packing rules per EFI specification
25959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
26959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#ifndef __GNUC__
27959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma pack()
28959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
29959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
30b483e39524be82e44caa2804145415d17713a6a5AJFISH#if __INTEL_COMPILER
31b483e39524be82e44caa2804145415d17713a6a5AJFISH//
32b483e39524be82e44caa2804145415d17713a6a5AJFISH// Disable ICC's remark #1418: external function definition with no prior declaration.
33b483e39524be82e44caa2804145415d17713a6a5AJFISH// This is legal ANSI C code so we disable the remark that is turned on with /W4
34b483e39524be82e44caa2804145415d17713a6a5AJFISH//
35b483e39524be82e44caa2804145415d17713a6a5AJFISH#pragma warning ( disable : 1418 )
36b483e39524be82e44caa2804145415d17713a6a5AJFISH
37b483e39524be82e44caa2804145415d17713a6a5AJFISH
38b483e39524be82e44caa2804145415d17713a6a5AJFISH//
39b483e39524be82e44caa2804145415d17713a6a5AJFISH// Disable ICC's remark #1419: external declaration in primary source file
40b483e39524be82e44caa2804145415d17713a6a5AJFISH// This is legal ANSI C code so we disable the remark that is turned on with /W4
41b483e39524be82e44caa2804145415d17713a6a5AJFISH//
42b483e39524be82e44caa2804145415d17713a6a5AJFISH#pragma warning ( disable : 1419 )
43b483e39524be82e44caa2804145415d17713a6a5AJFISH
44b483e39524be82e44caa2804145415d17713a6a5AJFISH#endif
45b483e39524be82e44caa2804145415d17713a6a5AJFISH
46b483e39524be82e44caa2804145415d17713a6a5AJFISH
47959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if _MSC_EXTENSIONS
48959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
49959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
50959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disable warning that make it impossible to compile at /W4
51959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// This only works for Microsoft* tools
52959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
53959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
54959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
55959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disabling bitfield type checking warnings.
56959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
57959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4214 )
58959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
59959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
60959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disabling the unreferenced formal parameter warnings.
61959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
62959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4100 )
63959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
64959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
65959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Disable slightly different base types warning as CHAR8 * can not be set
66959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// to a constant string.
67959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
68959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4057 )
69959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
70959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
71959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning
72959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
73959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4127 )
74959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
75959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
76959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// This warning is caused by functions defined but not used. For precompiled header only.
77959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
78959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4505 )
79959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
80959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
81959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// This warning is caused by empty (after preprocessing) souce file. For precompiled header only.
82959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
83959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#pragma warning ( disable : 4206 )
84959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
85959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
86959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
87959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
88959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L)
89959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
90959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  // No ANSI C 2000 stdint.h integer width declarations, so define equivalents
91959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
92959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
93959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #if _MSC_EXTENSIONS
94959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
95959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
96959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    // use Microsoft* C complier dependent interger width types
97959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
98959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned __int64    UINT64;
99959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef __int64             INT64;
100959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned __int32    UINT32;
101959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef __int32             INT32;
102959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      UINT16;
103959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      CHAR16;
104959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef short               INT16;
105959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       BOOLEAN;
106959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       UINT8;
107959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                CHAR8;
108959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                INT8;
109959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #else
110959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
111959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
112959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    // Assume standard IA-32 alignment.
113959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    // Need to check portability of long long
114959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    //
115959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned long long  UINT64;
116959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef long long           INT64;
117959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned int        UINT32;
118959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef int                 INT32;
119959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      UINT16;
120959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned short      CHAR16;
121959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef short               INT16;
122959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       BOOLEAN;
123959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef unsigned char       UINT8;
124959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                CHAR8;
125959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang    typedef char                INT8;
126959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #endif
127959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
128959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define UINT8_MAX 0xff
129959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
130959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#else
131959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
132959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  // Use ANSI C 2000 stdint.h integer width declarations
133959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
134959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #include "stdint.h"
135959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint8_t   BOOLEAN;
136959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int8_t    INT8;
137959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint8_t   UINT8;
138959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int16_t   INT16;
139959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint16_t  UINT16;
140959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int32_t   INT32;
141959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint32_t  UINT32;
142959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef int64_t   INT64;
143959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint64_t  UINT64;
144959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef char      CHAR8;
145959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  typedef uint16_t  CHAR16;
146959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
147959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
148959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
149959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef UINT32  UINTN;
150959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshangtypedef INT32   INTN;
151959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
152959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
153959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
154959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Processor specific defines
155959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
156959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_BIT     0x80000000
157959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_2_BITS  0xC0000000
158959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
159959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
160959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Maximum legal IA-32 address
161959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
162959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define MAX_ADDRESS   0xFFFFFFFF
163959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
164959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
165959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// The stack alignment required for IA-32
166959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
167959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#define CPU_STACK_ALIGNMENT   sizeof(UINTN)
168959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
169959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
170959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// Modifier to ensure that all protocol member functions and EFI intrinsics
171959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// use the correct C calling convention. All protocol member functions and
172959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// EFI intrinsics are required to modify thier member functions with EFIAPI.
173959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
174959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if _MSC_EXTENSIONS
175959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
176959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  // Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C.
177959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  //
178959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define EFIAPI __cdecl
179959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
180959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
181959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if __GNUC__
182959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define EFIAPI __attribute__((cdecl))
183959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
184959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
185959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
186959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang// The Microsoft* C compiler can removed references to unreferenced data items
187959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//  if the /OPT:REF linker option is used. We defined a macro as this is a
188959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//  a non standard extension
189959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang//
190959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#if _MSC_EXTENSIONS
191959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)
192959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#else
193959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang  #define GLOBAL_REMOVE_IF_UNREFERENCED
194959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
195959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
19627af6b876a70c49928bdae7bedbb72cba9a18171jwang//
19727af6b876a70c49928bdae7bedbb72cba9a18171jwang// For symbol name in GNU assembly code, an extra "_" is necessary
19827af6b876a70c49928bdae7bedbb72cba9a18171jwang//
19927af6b876a70c49928bdae7bedbb72cba9a18171jwang#if __GNUC__
20027af6b876a70c49928bdae7bedbb72cba9a18171jwang  #define ASM_PFX(name) _##name
20127af6b876a70c49928bdae7bedbb72cba9a18171jwang#endif
20227af6b876a70c49928bdae7bedbb72cba9a18171jwang
203959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang#endif
204959ccb23c6a14797ecaf5990bd5906b4b05a9b75yshang
205