/** @file
  Processor or compiler specific defines and types for EBC.

  We currently only have one EBC compiler so there may be some Intel compiler
  specific functions in this file.

Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under 
the terms and conditions of the BSD License that accompanies this distribution.  
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.                                          
    
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

**/

#ifndef __PROCESSOR_BIND_H__
#define __PROCESSOR_BIND_H__

///
/// Define the processor type so other code can make processor based choices
///
#define MDE_CPU_EBC

//
// Native integer types
//

///
/// 1-byte signed value
///
typedef signed char           INT8;
///
/// Logical Boolean.  1-byte value containing 0 for FALSE or a 1 for TRUE.  Other
/// values are undefined.
///
typedef unsigned char         BOOLEAN;
///
/// 1-byte unsigned value.
///
typedef unsigned char         UINT8;
///
/// 1-byte Character.
///
typedef char                  CHAR8;
///
/// 2-byte signed value.
///
typedef short                 INT16;
///
/// 2-byte unsigned value.
///
typedef unsigned short        UINT16;
///
/// 2-byte Character.  Unless otherwise specified all strings are stored in the
/// UTF-16 encoding format as defined by Unicode 2.1 and ISO/IEC 10646 standards.
///
typedef unsigned short        CHAR16;
///
/// 4-byte signed value.
///
typedef int                   INT32;
///
/// 4-byte unsigned value.
///
typedef unsigned int          UINT32;
///
/// 8-byte signed value.
///
typedef __int64               INT64;
///
/// 8-byte unsigned value.
///
typedef unsigned __int64      UINT64;

///
/// Signed value of native width.  (4 bytes on supported 32-bit processor instructions,
/// 8 bytes on supported 64-bit processor instructions)
/// "long" type scales to the processor native size with EBC compiler
///
typedef long                  INTN;
///
/// The unsigned value of native width.  (4 bytes on supported 32-bit processor instructions;
/// 8 bytes on supported 64-bit processor instructions)
/// "long" type scales to the processor native size with the EBC compiler.
///
typedef unsigned long         UINTN;

///
/// A value of native width with the highest bit set.
/// Scalable macro to set the most significant bit in a natural number.
///
#define MAX_BIT     (1ULL << (sizeof (INTN) * 8 - 1)) 
///
/// A value of native width with the two highest bits set.
/// Scalable macro to set the most 2 significant bits in a natural number.
///
#define MAX_2_BITS  (3ULL << (sizeof (INTN) * 8 - 2))

///
/// Maximum legal EBC address
///
#define MAX_ADDRESS   ((UINTN) ~0)

///
/// Maximum legal EBC INTN and UINTN values.
///
#define MAX_UINTN  ((UINTN) ~0)
#define MAX_INTN   ((INTN)~MAX_BIT)

///
/// The stack alignment required for EBC
///
#define CPU_STACK_ALIGNMENT   sizeof(UINTN)

///
/// Page allocation granularity for EBC
///
#define DEFAULT_PAGE_ALLOCATION_GRANULARITY   (0x1000)
#define RUNTIME_PAGE_ALLOCATION_GRANULARITY   (0x1000)

///
/// Modifier to ensure that all protocol member functions and EFI intrinsics
/// use the correct C calling convention. All protocol member functions and
/// EFI intrinsics are required to modify their member functions with EFIAPI.
///
#ifdef EFIAPI
  ///
  /// If EFIAPI is already defined, then we use that definition.
  ///
#else
#define EFIAPI    
#endif

/**
  Return the pointer to the first instruction of a function given a function pointer.
  On EBC architectures, these two pointer values are the same, 
  so the implementation of this macro is very simple.
  
  @param  FunctionPointer   A pointer to a function.

  @return The pointer to the first instruction of a function given a function pointer.
**/
#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)

#ifndef __USER_LABEL_PREFIX__
#define __USER_LABEL_PREFIX__
#endif

#endif 

