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