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