From 373fbc64167e080fbe334776877cfba116d62a2d Mon Sep 17 00:00:00 2001 From: Harry Liebel Date: Thu, 8 Aug 2013 08:55:02 +0000 Subject: Add Aarch64 support to EdkCompatibilityPkg. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Harry Liebel Signed-off-by: Olivier Martin Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14533 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Foundation/Efi/Include/EfiImage.h | 1 + .../Efi/Protocol/DebugSupport/DebugSupport.h | 31 ++--- .../Foundation/Include/AArch64/EfiBind.h | 143 +++++++++++++++++++++ .../Include/AArch64/EfiPeOptionalHeader.h | 39 ++++++ .../Foundation/Include/AArch64/TianoBind.h | 32 +++++ .../Library/CompilerStub/CompilerStubLib.inf | 6 + .../Library/Dxe/EfiDriverLib/EfiDriverLib.inf | 12 +- .../Library/Dxe/Include/AArch64/ProcDep.h | 26 ++++ .../Library/EfiCommonLib/EfiCommonLib.inf | 12 +- .../Pei/PeiLib/AArch64/PerformancePrimitives.c | 48 +++++++ .../Library/Pei/PeiLib/Arm/PerformancePrimitives.c | 20 +-- .../Foundation/Library/Pei/PeiLib/PeiLib.inf | 7 +- 12 files changed, 345 insertions(+), 32 deletions(-) create mode 100644 EdkCompatibilityPkg/Foundation/Include/AArch64/EfiBind.h create mode 100644 EdkCompatibilityPkg/Foundation/Include/AArch64/EfiPeOptionalHeader.h create mode 100644 EdkCompatibilityPkg/Foundation/Include/AArch64/TianoBind.h create mode 100644 EdkCompatibilityPkg/Foundation/Library/Dxe/Include/AArch64/ProcDep.h create mode 100644 EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/AArch64/PerformancePrimitives.c diff --git a/EdkCompatibilityPkg/Foundation/Efi/Include/EfiImage.h b/EdkCompatibilityPkg/Foundation/Efi/Include/EfiImage.h index 90f7b75b47..070821449e 100644 --- a/EdkCompatibilityPkg/Foundation/Efi/Include/EfiImage.h +++ b/EdkCompatibilityPkg/Foundation/Efi/Include/EfiImage.h @@ -49,6 +49,7 @@ Abstract: #define EFI_IMAGE_MACHINE_IA64 0x0200 #define EFI_IMAGE_MACHINE_X64 0x8664 #define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01c2 +#define EFI_IMAGE_MACHINE_AARCH64 0xAA64 // // #define EFI_IMAGE_MACHINE_FCODE 0xfc0d diff --git a/EdkCompatibilityPkg/Foundation/Efi/Protocol/DebugSupport/DebugSupport.h b/EdkCompatibilityPkg/Foundation/Efi/Protocol/DebugSupport/DebugSupport.h index 2249a12a85..dea02dc03f 100644 --- a/EdkCompatibilityPkg/Foundation/Efi/Protocol/DebugSupport/DebugSupport.h +++ b/EdkCompatibilityPkg/Foundation/Efi/Protocol/DebugSupport/DebugSupport.h @@ -1,13 +1,13 @@ /*++ Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which 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. +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which 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. Module Name: @@ -17,10 +17,10 @@ Abstract: DebugSupport protocol and supporting definitions as defined in the EFI 1.1 specification. - + The DebugSupport protocol is used by source level debuggers to abstract the processor and handle context save and restore operations. - + --*/ #ifndef _DEBUG_SUPPORT_H_ @@ -205,7 +205,7 @@ typedef struct { UINT8 Xmm7[16]; #if (EFI_SPECIFICATION_VERSION >= 0x00020000) // - // NOTE: UEFI 2.0 spec definition as follows. It should be updated + // NOTE: UEFI 2.0 spec definition as follows. It should be updated // after spec update. // UINT8 Reserved11[14 * 16]; @@ -534,11 +534,12 @@ VOID // Machine type definition // typedef enum { - IsaIa32 = EFI_IMAGE_MACHINE_IA32, - IsaX64 = EFI_IMAGE_MACHINE_X64, - IsaIpf = EFI_IMAGE_MACHINE_IA64, - IsaEbc = EFI_IMAGE_MACHINE_EBC, - IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED + IsaIa32 = EFI_IMAGE_MACHINE_IA32, + IsaX64 = EFI_IMAGE_MACHINE_X64, + IsaIpf = EFI_IMAGE_MACHINE_IA64, + IsaEbc = EFI_IMAGE_MACHINE_EBC, + IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED, + IsaAArch64 = EFI_IMAGE_MACHINE_AARCH64 } EFI_INSTRUCTION_SET_ARCHITECTURE; EFI_FORWARD_DECLARATION (EFI_DEBUG_SUPPORT_PROTOCOL); diff --git a/EdkCompatibilityPkg/Foundation/Include/AArch64/EfiBind.h b/EdkCompatibilityPkg/Foundation/Include/AArch64/EfiBind.h new file mode 100644 index 0000000000..f8db9069d2 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Include/AArch64/EfiBind.h @@ -0,0 +1,143 @@ +/** @file + + Copyright (c) 2013, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which 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. + +Module Name: + + EfiBind.h + +Abstract: + + Processor or Compiler specific defines and types for AArch64. + We are using the ANSI C 2000 _t type definitions for basic types. + This it technically a violation of the coding standard, but they + are used to make EfiTypes.h portable. Code other than EfiTypes.h + should never use any ANSI C 2000 _t integer types. + +**/ + + +#ifndef _EFI_BIND_H_ +#define _EFI_BIND_H_ + + +#define EFI_DRIVER_ENTRY_POINT(InitFunction) +#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT + + +// +// Make sure we are using the correct packing rules per EFI specification. +// +#ifndef __GNUC__ +#pragma pack() +#endif + + +// +// Assume standard AArch64 alignment. +// BugBug: Need to check portability of long long +// +typedef unsigned long long uint64_t; +typedef long long int64_t; +typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned short uint16_t; +typedef short int16_t; +typedef unsigned char uint8_t; +typedef signed char int8_t; + +// +// Native integer size in stdint.h +// +typedef uint64_t uintn_t; +typedef int64_t intn_t; + +// +// Processor specific defines +// +#define EFI_MAX_BIT 0x8000000000000000 +#define MAX_2_BITS 0xC000000000000000 + +// +// Maximum legal AArch64 address +// +#define EFI_MAX_ADDRESS 0xFFFFFFFFFFFFFFFF + +// +// Bad pointer value to use in check builds. +// if you see this value you are using uninitialized or free'ed data +// +#define EFI_BAD_POINTER 0xAFAFAFAFAFAFAFAF +#define EFI_BAD_POINTER_AS_BYTE 0xAF + +#define EFI_DEADLOOP() { volatile UINTN __iii; __iii = 1; while (__iii); } + +// +// For real hardware, just put in a halt loop. Don't do a while(1) because the +// compiler will optimize away the rest of the function following, so that you run out in +// the weeds if you skip over it with a debugger. +// +#define EFI_BREAKPOINT EFI_DEADLOOP() + + +// +// Memory Fence forces serialization, and is needed to support out of order +// memory transactions. The Memory Fence is mainly used to make sure IO +// transactions complete in a deterministic sequence, and to syncronize locks +// an other MP code. Currently no memory fencing is required. +// +#define MEMORY_FENCE() + +// +// Some compilers don't support the forward reference construct: +// typedef struct XXXXX. The forward reference is required for +// ANSI compatibility. +// +// The following macro provide a workaround for such cases. +// + + +#ifdef EFI_NO_INTERFACE_DECL + #define EFI_FORWARD_DECLARATION(x) +#else + #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x +#endif + + +// +// Some C compilers optimize the calling conventions to increase performance. +// _EFIAPI is used to make all public APIs follow the standard C calling +// convention. +// +#define _EFIAPI + + + +// +// For symbol name in GNU assembly code, an extra "_" is necessary +// +#if defined(__GNUC__) + /// + /// Private worker functions for ASM_PFX() + /// + #define _CONCATENATE(a, b) __CONCATENATE(a, b) + #define __CONCATENATE(a, b) a ## b + + /// + /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix + /// on symbols in assembly language. + /// + #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name) + +#endif + +#endif + diff --git a/EdkCompatibilityPkg/Foundation/Include/AArch64/EfiPeOptionalHeader.h b/EdkCompatibilityPkg/Foundation/Include/AArch64/EfiPeOptionalHeader.h new file mode 100644 index 0000000000..bb5df545a0 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Include/AArch64/EfiPeOptionalHeader.h @@ -0,0 +1,39 @@ +/** @file + + Copyright (c) 2013, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which 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. + +Module Name: + + EfiPeOptionalHeader.h + +Abstract: + Defines the optional header in the PE image per the PE specification. This + file must be included only from within EfiImage.h since + EFI_IMAGE_DATA_DIRECTORY and EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES are defined + there. + +--*/ + +#ifndef _EFI_PE_OPTIONAL_HEADER_H_ +#define _EFI_PE_OPTIONAL_HEADER_H_ + +#define EFI_IMAGE_MACHINE_TYPE (EFI_IMAGE_MACHINE_AARCH64) + +#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \ + (((Machine) == EFI_IMAGE_MACHINE_AARCH64) || ((Machine) == EFI_IMAGE_MACHINE_EBC)) + +#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE) + +#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC +typedef EFI_IMAGE_OPTIONAL_HEADER64 EFI_IMAGE_OPTIONAL_HEADER; +typedef EFI_IMAGE_NT_HEADERS64 EFI_IMAGE_NT_HEADERS; + +#endif diff --git a/EdkCompatibilityPkg/Foundation/Include/AArch64/TianoBind.h b/EdkCompatibilityPkg/Foundation/Include/AArch64/TianoBind.h new file mode 100644 index 0000000000..f669928312 --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Include/AArch64/TianoBind.h @@ -0,0 +1,32 @@ +/** @file + + Copyright (c) 2013, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which 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. + +Module Name: + + TianoBind.h + +Abstract: + + Tiano's Processor or Compiler specific defines and types for AArch64 + besides EfiBind.h. + +--*/ + +#ifndef _TIANO_BIND_H_ +#define _TIANO_BIND_H_ + +#include + +#define EFI_DXE_ENTRY_POINT(InitFunction) +#define EFI_SMI_HANDLER_ENTRY_POINT(InitFunction) + +#endif diff --git a/EdkCompatibilityPkg/Foundation/Library/CompilerStub/CompilerStubLib.inf b/EdkCompatibilityPkg/Foundation/Library/CompilerStub/CompilerStubLib.inf index 4f15892447..afc72f1679 100644 --- a/EdkCompatibilityPkg/Foundation/Library/CompilerStub/CompilerStubLib.inf +++ b/EdkCompatibilityPkg/Foundation/Library/CompilerStub/CompilerStubLib.inf @@ -47,6 +47,9 @@ COMPONENT_TYPE = LIBRARY [sources.ARM] Dummy.c + +[sources.AARCH64] + Dummy.c [includes.common] $(EDK_SOURCE)/Foundation @@ -69,6 +72,9 @@ COMPONENT_TYPE = LIBRARY [libraries.ARM] CompilerIntrinsicsLib +[libraries.AArch64] + CompilerIntrinsicsLib + [nmake.common] [nmake.ia32,nmake.x64] diff --git a/EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf b/EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf index de28353320..885e52cb20 100644 --- a/EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf +++ b/EdkCompatibilityPkg/Foundation/Library/Dxe/EfiDriverLib/EfiDriverLib.inf @@ -58,6 +58,9 @@ COMPONENT_TYPE = LIBRARY [sources.ARM] Ebc/PerformancePrimitives.c +[sources.AArch64] + Ebc/PerformancePrimitives.c + [includes.common] $(EDK_SOURCE)/Foundation @@ -88,8 +91,11 @@ COMPONENT_TYPE = LIBRARY [libraries.ipf] CpuIA64Lib - -[libraries.ARM] - CompilerIntrinsicsLib + +[libraries.ARM] + CompilerIntrinsicsLib + +[libraries.AArch64] + CompilerIntrinsicsLib [nmake.common] diff --git a/EdkCompatibilityPkg/Foundation/Library/Dxe/Include/AArch64/ProcDep.h b/EdkCompatibilityPkg/Foundation/Library/Dxe/Include/AArch64/ProcDep.h new file mode 100644 index 0000000000..bd9b6cde1c --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/Dxe/Include/AArch64/ProcDep.h @@ -0,0 +1,26 @@ +/** @file + + Copyright (c) 2013, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which 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. + +Module Name: + + ProcDep.h + +Abstract: + + AArch64 specific Runtime Lib code. At this time there is none. + +--*/ + +#ifndef _PROC_DEP_H_ +#define _PROC_DEP_H_ + +#endif diff --git a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib.inf b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib.inf index 722c9a9664..07b02b7656 100644 --- a/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib.inf +++ b/EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/EfiCommonLib.inf @@ -74,6 +74,11 @@ COMPONENT_TYPE = LIBRARY EfiZeroMem.c Math.c +[sources.AArch64] + EfiCopyMem.c + EfiSetMem.c + EfiZeroMem.c + Math.c [includes.common] $(EDK_SOURCE)/Foundation @@ -94,7 +99,10 @@ COMPONENT_TYPE = LIBRARY [libraries.common] EdkFrameworkGuidLib -[libraries.ARM] - CompilerIntrinsicsLib +[libraries.ARM] + CompilerIntrinsicsLib + +[libraries.AArch64] + CompilerIntrinsicsLib [nmake.common] diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/AArch64/PerformancePrimitives.c b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/AArch64/PerformancePrimitives.c new file mode 100644 index 0000000000..9f820650bb --- /dev/null +++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/AArch64/PerformancePrimitives.c @@ -0,0 +1,48 @@ +/** @file + + Copyright (c) 2013, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which 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. + +Module Name: + + PerformancePrimitives.c + +Abstract: + + Support for Performance library + +--*/ + +#include "TianoCommon.h" + +EFI_STATUS +GetTimerValue ( + OUT UINT64 *TimerValue + ) +/*++ + +Routine Description: + + Get timer value. + +Arguments: + + TimerValue - Pointer to the returned timer value + +Returns: + + EFI_SUCCESS - Successfully got timer value + +--*/ +{ + // CPU does not have a timer for AArch64 ... + ASSERT (FALSE); + return EFI_SUCCESS; +} diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Arm/PerformancePrimitives.c b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Arm/PerformancePrimitives.c index 6b8995e0dd..aeb08713a3 100755 --- a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Arm/PerformancePrimitives.c +++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Arm/PerformancePrimitives.c @@ -1,13 +1,14 @@ -/*++ +/** @file + + Copyright (c) 2013, ARM Ltd. All rights reserved.
+ + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php -Copyright (c) 2005, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which 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. + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: @@ -20,7 +21,6 @@ Abstract: --*/ #include "TianoCommon.h" -#include "CpuIA32.h" EFI_STATUS GetTimerValue ( diff --git a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib.inf b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib.inf index 16abf04b55..6ac8794fc2 100644 --- a/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib.inf +++ b/EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/PeiLib.inf @@ -71,10 +71,13 @@ COMPONENT_TYPE = LIBRARY Ipf/Ia_64Gen.h Ipf/HwAccess.s Ipf/PeiServicePointer.c - + [sources.ARM] Arm/PerformancePrimitives.c - + +[sources.AArch64] + AArch64/PerformancePrimitives.c + [libraries.common] EdkGuidLib EfiCommonLib -- cgit v1.2.3