Home | History | Annotate | Download | only in Arm
      1 /** @file
      2   Processor or Compiler specific defines and types for ARM.
      3 
      4   Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
      5   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef __PROCESSOR_BIND_H__
     17 #define __PROCESSOR_BIND_H__
     18 
     19 ///
     20 /// Define the processor type so other code can make processor based choices
     21 ///
     22 #define MDE_CPU_ARM
     23 
     24 //
     25 // Make sure we are using the correct packing rules per EFI specification
     26 //
     27 #ifndef __GNUC__
     28 #pragma pack()
     29 #endif
     30 
     31 #if _MSC_EXTENSIONS
     32   //
     33   // use Microsoft* C complier dependent integer width types
     34   //
     35   typedef unsigned __int64    UINT64;
     36   typedef __int64             INT64;
     37   typedef unsigned __int32    UINT32;
     38   typedef __int32             INT32;
     39   typedef unsigned short      UINT16;
     40   typedef unsigned short      CHAR16;
     41   typedef short               INT16;
     42   typedef unsigned char       BOOLEAN;
     43   typedef unsigned char       UINT8;
     44   typedef char                CHAR8;
     45   typedef signed char         INT8;
     46 #else
     47   //
     48   // Assume standard ARM alignment.
     49   //
     50   typedef unsigned long long  UINT64;
     51   typedef long long           INT64;
     52   typedef unsigned int        UINT32;
     53   typedef int                 INT32;
     54   typedef unsigned short      UINT16;
     55   typedef unsigned short      CHAR16;
     56   typedef short               INT16;
     57   typedef unsigned char       BOOLEAN;
     58   typedef unsigned char       UINT8;
     59   typedef char                CHAR8;
     60   typedef signed char         INT8;
     61 
     62   #define UINT8_MAX 0xff
     63 #endif
     64 
     65 ///
     66 /// Unsigned value of native width.  (4 bytes on supported 32-bit processor instructions,
     67 /// 8 bytes on supported 64-bit processor instructions)
     68 ///
     69 typedef UINT32  UINTN;
     70 
     71 ///
     72 /// Signed value of native width.  (4 bytes on supported 32-bit processor instructions,
     73 /// 8 bytes on supported 64-bit processor instructions)
     74 ///
     75 typedef INT32   INTN;
     76 
     77 //
     78 // Processor specific defines
     79 //
     80 
     81 ///
     82 /// A value of native width with the highest bit set.
     83 ///
     84 #define MAX_BIT      0x80000000
     85 
     86 ///
     87 /// A value of native width with the two highest bits set.
     88 ///
     89 #define MAX_2_BITS   0xC0000000
     90 
     91 ///
     92 /// Maximum legal ARM address
     93 ///
     94 #define MAX_ADDRESS  0xFFFFFFFF
     95 
     96 ///
     97 /// The stack alignment required for ARM
     98 ///
     99 #define CPU_STACK_ALIGNMENT  sizeof(UINT64)
    100 
    101 //
    102 // Modifier to ensure that all protocol member functions and EFI intrinsics
    103 // use the correct C calling convention. All protocol member functions and
    104 // EFI intrinsics are required to modify their member functions with EFIAPI.
    105 //
    106 #define EFIAPI
    107 
    108 #if defined(__GNUC__)
    109   ///
    110   /// For GNU assembly code, .global or .globl can declare global symbols.
    111   /// Define this macro to unify the usage.
    112   ///
    113   #define ASM_GLOBAL .globl
    114 
    115   #if !defined(__APPLE__)
    116     ///
    117     /// ARM EABI defines that the linker should not manipulate call relocations
    118     /// (do bl/blx conversion) unless the target symbol has function type.
    119     /// CodeSourcery 2010.09 started requiring the .type to function properly
    120     ///
    121     #define INTERWORK_FUNC(func__)   .type ASM_PFX(func__), %function
    122 
    123     #define GCC_ASM_EXPORT(func__)  \
    124              .global  _CONCATENATE (__USER_LABEL_PREFIX__, func__)    ;\
    125              .type ASM_PFX(func__), %function
    126 
    127     #define GCC_ASM_IMPORT(func__)  \
    128              .extern  _CONCATENATE (__USER_LABEL_PREFIX__, func__)
    129 
    130   #else
    131     //
    132     // .type not supported by Apple Xcode tools
    133     //
    134     #define INTERWORK_FUNC(func__)
    135 
    136     #define GCC_ASM_EXPORT(func__)  \
    137              .globl  _CONCATENATE (__USER_LABEL_PREFIX__, func__)    \
    138 
    139     #define GCC_ASM_IMPORT(name)
    140 
    141   #endif
    142 #endif
    143 
    144 /**
    145   Return the pointer to the first instruction of a function given a function pointer.
    146   On ARM CPU architectures, these two pointer values are the same,
    147   so the implementation of this macro is very simple.
    148 
    149   @param  FunctionPointer   A pointer to a function.
    150 
    151   @return The pointer to the first instruction of a function given a function pointer.
    152 
    153 **/
    154 #define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)
    155 
    156 #endif
    157 
    158 
    159