1 /** @file 2 Processor or Compiler specific defines and types for Ia32 architecture. 3 4 Copyright (c) 2006, Intel Corporation 5 All rights reserved. This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef __PROCESSOR_BIND_H__ 16 #define __PROCESSOR_BIND_H__ 17 18 /// 19 /// Define the processor type so other code can make processor based choices 20 /// 21 #define MDE_CPU_IA32 22 23 // 24 // Make sure we are useing the correct packing rules per EFI specification 25 // 26 #ifndef __GNUC__ 27 #pragma pack() 28 #endif 29 30 #if __INTEL_COMPILER 31 // 32 // Disable ICC's remark #869: "Parameter" was never referenced warning. 33 // This is legal ANSI C code so we disable the remark that is turned on with -Wall 34 // 35 #pragma warning ( disable : 869 ) 36 37 // 38 // Disable ICC's remark #1418: external function definition with no prior declaration. 39 // This is legal ANSI C code so we disable the remark that is turned on with /W4 40 // 41 #pragma warning ( disable : 1418 ) 42 43 // 44 // Disable ICC's remark #1419: external declaration in primary source file 45 // This is legal ANSI C code so we disable the remark that is turned on with /W4 46 // 47 #pragma warning ( disable : 1419 ) 48 49 #endif 50 51 52 #if _MSC_EXTENSIONS 53 54 // 55 // Disable warning that make it impossible to compile at /W4 56 // This only works for Microsoft* tools 57 // 58 59 // 60 // Disabling bitfield type checking warnings. 61 // 62 #pragma warning ( disable : 4214 ) 63 64 // 65 // Disabling the unreferenced formal parameter warnings. 66 // 67 #pragma warning ( disable : 4100 ) 68 69 // 70 // Disable slightly different base types warning as CHAR8 * can not be set 71 // to a constant string. 72 // 73 #pragma warning ( disable : 4057 ) 74 75 // 76 // ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning 77 // 78 #pragma warning ( disable : 4127 ) 79 80 // 81 // This warning is caused by functions defined but not used. For precompiled header only. 82 // 83 #pragma warning ( disable : 4505 ) 84 85 // 86 // This warning is caused by empty (after preprocessing) souce file. For precompiled header only. 87 // 88 #pragma warning ( disable : 4206 ) 89 90 #endif 91 92 93 #if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L) 94 // 95 // No ANSI C 2000 stdint.h integer width declarations, so define equivalents 96 // 97 98 #if _MSC_EXTENSIONS 99 100 // 101 // use Microsoft* C complier dependent interger width types 102 // 103 typedef unsigned __int64 UINT64; 104 typedef __int64 INT64; 105 typedef unsigned __int32 UINT32; 106 typedef __int32 INT32; 107 typedef unsigned short UINT16; 108 typedef unsigned short CHAR16; 109 typedef short INT16; 110 typedef unsigned char BOOLEAN; 111 typedef unsigned char UINT8; 112 typedef char CHAR8; 113 typedef char INT8; 114 #else 115 116 // 117 // Assume standard IA-32 alignment. 118 // Need to check portability of long long 119 // 120 typedef unsigned long long UINT64; 121 typedef long long INT64; 122 typedef unsigned int UINT32; 123 typedef int INT32; 124 typedef unsigned short UINT16; 125 typedef unsigned short CHAR16; 126 typedef short INT16; 127 typedef unsigned char BOOLEAN; 128 typedef unsigned char UINT8; 129 typedef char CHAR8; 130 typedef char INT8; 131 #endif 132 133 #define UINT8_MAX 0xff 134 135 #else 136 // 137 // Use ANSI C 2000 stdint.h integer width declarations 138 // 139 #include "stdint.h" 140 typedef uint8_t BOOLEAN; 141 typedef int8_t INT8; 142 typedef uint8_t UINT8; 143 typedef int16_t INT16; 144 typedef uint16_t UINT16; 145 typedef int32_t INT32; 146 typedef uint32_t UINT32; 147 typedef int64_t INT64; 148 typedef uint64_t UINT64; 149 typedef char CHAR8; 150 typedef uint16_t CHAR16; 151 152 #endif 153 154 typedef UINT32 UINTN; 155 typedef INT32 INTN; 156 157 158 /// 159 /// Processor specific defines 160 /// 161 #define MAX_BIT 0x80000000 162 #define MAX_2_BITS 0xC0000000 163 164 /// 165 /// Maximum legal IA-32 address 166 /// 167 #define MAX_ADDRESS 0xFFFFFFFF 168 169 /// 170 /// The stack alignment required for IA-32 171 /// 172 #define CPU_STACK_ALIGNMENT sizeof(UINTN) 173 174 // 175 // Modifier to ensure that all protocol member functions and EFI intrinsics 176 // use the correct C calling convention. All protocol member functions and 177 // EFI intrinsics are required to modify thier member functions with EFIAPI. 178 // 179 #if _MSC_EXTENSIONS 180 /// 181 /// Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C. 182 /// 183 #define EFIAPI __cdecl 184 #else 185 #if __GNUC__ 186 #define EFIAPI __attribute__((cdecl,regparm(0))) 187 #endif 188 #endif 189 190 // 191 // The Microsoft* C compiler can removed references to unreferenced data items 192 // if the /OPT:REF linker option is used. We defined a macro as this is a 193 // a non standard extension 194 // 195 #if _MSC_EXTENSIONS 196 #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany) 197 #else 198 #define GLOBAL_REMOVE_IF_UNREFERENCED 199 #endif 200 201 // 202 // For symbol name in GNU assembly code, an extra "_" is necessary 203 // 204 #if __GNUC__ 205 #if defined(linux) 206 #define ASM_PFX(name) name 207 #else 208 #define ASM_PFX(name) _##name 209 #endif 210 #endif 211 212 #define FUNCTION_ENTRY_POINT(p) (p) 213 214 #endif 215 216