176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Processor or Compiler specific defines and types for Ia32 architecture. 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman Copyright (c) 2006, Intel Corporation 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman All rights reserved. This program and the accompanying materials 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman are licensed and made available under the terms and conditions of the BSD License 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman which accompanies this distribution. The full text of the license may be found at 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman http://opensource.org/licenses/bsd-license.php 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/ 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __PROCESSOR_BIND_H__ 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __PROCESSOR_BIND_H__ 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Define the processor type so other code can make processor based choices 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MDE_CPU_IA32 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Make sure we are useing the correct packing rules per EFI specification 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __GNUC__ 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma pack() 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if __INTEL_COMPILER 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disable ICC's remark #869: "Parameter" was never referenced warning. 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// This is legal ANSI C code so we disable the remark that is turned on with -Wall 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 869 ) 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disable ICC's remark #1418: external function definition with no prior declaration. 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// This is legal ANSI C code so we disable the remark that is turned on with /W4 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 1418 ) 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disable ICC's remark #1419: external declaration in primary source file 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// This is legal ANSI C code so we disable the remark that is turned on with /W4 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 1419 ) 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if _MSC_EXTENSIONS 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disable warning that make it impossible to compile at /W4 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// This only works for Microsoft* tools 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disabling bitfield type checking warnings. 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 4214 ) 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disabling the unreferenced formal parameter warnings. 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 4100 ) 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Disable slightly different base types warning as CHAR8 * can not be set 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// to a constant string. 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 4057 ) 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// ASSERT(FALSE) or while (TRUE) are legal constructes so supress this warning 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 4127 ) 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// This warning is caused by functions defined but not used. For precompiled header only. 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 4505 ) 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// This warning is caused by empty (after preprocessing) souce file. For precompiled header only. 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#pragma warning ( disable : 4206 ) 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if !defined(__GNUC__) && (__STDC_VERSION__ < 199901L) 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // No ANSI C 2000 stdint.h integer width declarations, so define equivalents 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #if _MSC_EXTENSIONS 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // use Microsoft* C complier dependent interger width types 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned __int64 UINT64; 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef __int64 INT64; 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned __int32 UINT32; 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef __int32 INT32; 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned short UINT16; 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned short CHAR16; 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef short INT16; 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned char BOOLEAN; 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned char UINT8; 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef char CHAR8; 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef char INT8; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #else 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Assume standard IA-32 alignment. 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Need to check portability of long long 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned long long UINT64; 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef long long INT64; 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned int UINT32; 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef int INT32; 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned short UINT16; 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned short CHAR16; 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef short INT16; 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned char BOOLEAN; 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef unsigned char UINT8; 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef char CHAR8; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef char INT8; 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #endif 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define UINT8_MAX 0xff 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // Use ANSI C 2000 stdint.h integer width declarations 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman // 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #include "stdint.h" 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef uint8_t BOOLEAN; 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef int8_t INT8; 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef uint8_t UINT8; 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef int16_t INT16; 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef uint16_t UINT16; 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef int32_t INT32; 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef uint32_t UINT32; 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef int64_t INT64; 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef uint64_t UINT64; 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef char CHAR8; 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman typedef uint16_t CHAR16; 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef UINT32 UINTN; 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef INT32 INTN; 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Processor specific defines 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_BIT 0x80000000 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_2_BITS 0xC0000000 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Maximum legal IA-32 address 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_ADDRESS 0xFFFFFFFF 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// The stack alignment required for IA-32 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define CPU_STACK_ALIGNMENT sizeof(UINTN) 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Modifier to ensure that all protocol member functions and EFI intrinsics 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// use the correct C calling convention. All protocol member functions and 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// EFI intrinsics are required to modify thier member functions with EFIAPI. 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if _MSC_EXTENSIONS 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /// 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /// Microsoft* compiler requires _EFIAPI useage, __cdecl is Microsoft* specific C. 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /// 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define EFIAPI __cdecl 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #if __GNUC__ 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define EFIAPI __attribute__((cdecl,regparm(0))) 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #endif 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// The Microsoft* C compiler can removed references to unreferenced data items 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// if the /OPT:REF linker option is used. We defined a macro as this is a 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// a non standard extension 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if _MSC_EXTENSIONS 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany) 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define GLOBAL_REMOVE_IF_UNREFERENCED 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// For symbol name in GNU assembly code, an extra "_" is necessary 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if __GNUC__ 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #if defined(linux) 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define ASM_PFX(name) name 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #else 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #define ASM_PFX(name) _##name 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman #endif 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FUNCTION_ENTRY_POINT(p) (p) 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 216