Hi,

The two patches attached enable native builds on ARM linux system as
well as improves flexibility for using alternative GCC cross-compilers.
We have been using them internally within Linaro for a few months now,
without issue.

/
    Leif
>From 401ccca8487bdffb0094e330444d0bc857e3935a Mon Sep 17 00:00:00 2001
From: Leif Lindholm <[email protected]>
Date: Tue, 16 Apr 2013 15:10:15 +0000
Subject: [PATCH 1/2] Update ARMGCC/ARMLINUXGCC to support cross/native
 compilation.

The ARMGCC and ARMLINUXGCC targets currently have hard-wired toolchain
binary names (arm-none-eabi-*/arm-linux-eabi-*). This is quite unflexible,
does not match all existing compatible cross-toolchains and does not
permit cross-compiling at all.

This patch makes the ARMGCC and ARMLINUXGCC targets use the CROSS_COMPILE
environment variable, just like the Linux kernel, as a full prefix to the
actual toolchain binaries. Omitting or unsetting CROSS_COMPILE will make
both targets equivalent to ELFGCC, enabling native builds on ARM platforms..

It will break existing build scripts, but the fix would be a one-line
change of an environment variable.

Signed-off-by: [email protected]
---
 Conf/tools_def.template |   36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/Conf/tools_def.template b/Conf/tools_def.template
index b91225f..7906b30 100755
--- a/Conf/tools_def.template
+++ b/Conf/tools_def.template
@@ -4894,16 +4894,16 @@ RELEASE_RVCTCYGWIN_ARM_CC_FLAGS  = "$(CCPATH_FLAG)" $(ARCHCC_FLAGS) $(PLATFORM_F
 # ARM definitions
 ##################
 
-*_ARMGCC_ARM_ASLCC_PATH      = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-gcc
-*_ARMGCC_ARM_ASLDLINK_PATH   = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-ld
-*_ARMGCC_ARM_ASLPP_PATH      = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-gcc
+*_ARMGCC_ARM_ASLCC_PATH      = ENV(CROSS_COMPILE)gcc
+*_ARMGCC_ARM_ASLDLINK_PATH   = ENV(CROSS_COMPILE)ld
+*_ARMGCC_ARM_ASLPP_PATH      = ENV(CROSS_COMPILE)gcc
 
-*_ARMGCC_ARM_CC_PATH         = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-gcc
-*_ARMGCC_ARM_SLINK_PATH      = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-ar
-*_ARMGCC_ARM_DLINK_PATH      = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-ld
-*_ARMGCC_ARM_ASM_PATH        = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-as
-*_ARMGCC_ARM_PP_PATH         = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-gcc
-*_ARMGCC_ARM_VFRPP_PATH      = ENV(ARMGCC_TOOLS_PATH)arm-none-eabi-gcc
+*_ARMGCC_ARM_CC_PATH         = ENV(CROSS_COMPILE)gcc
+*_ARMGCC_ARM_SLINK_PATH      = ENV(CROSS_COMPILE)ar
+*_ARMGCC_ARM_DLINK_PATH      = ENV(CROSS_COMPILE)ld
+*_ARMGCC_ARM_ASM_PATH        = ENV(CROSS_COMPILE)as
+*_ARMGCC_ARM_PP_PATH         = ENV(CROSS_COMPILE)gcc
+*_ARMGCC_ARM_VFRPP_PATH      = ENV(CROSS_COMPILE)gcc
 
 #
 # Use default values, or override in DSC file
@@ -4952,16 +4952,16 @@ RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_C
 # ARM definitions
 ##################
 
-*_ARMLINUXGCC_ARM_ASLCC_PATH      = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
-*_ARMLINUXGCC_ARM_ASLDLINK_PATH   = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-ld
-*_ARMLINUXGCC_ARM_ASLPP_PATH      = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
+*_ARMLINUXGCC_ARM_ASLCC_PATH      = ENV(CROSS_COMPILE)gcc
+*_ARMLINUXGCC_ARM_ASLDLINK_PATH   = ENV(CROSS_COMPILE)ld
+*_ARMLINUXGCC_ARM_ASLPP_PATH      = ENV(CROSS_COMPILE)gcc
 
-*_ARMLINUXGCC_ARM_CC_PATH         = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
-*_ARMLINUXGCC_ARM_SLINK_PATH      = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-ar
-*_ARMLINUXGCC_ARM_DLINK_PATH      = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-ld
-*_ARMLINUXGCC_ARM_ASM_PATH        = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-as
-*_ARMLINUXGCC_ARM_PP_PATH         = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
-*_ARMLINUXGCC_ARM_VFRPP_PATH      = ENV(ARMLINUXGCC_TOOLS_PATH)arm-linux-gnueabi-gcc
+*_ARMLINUXGCC_ARM_CC_PATH         = ENV(CROSS_COMPILE)gcc
+*_ARMLINUXGCC_ARM_SLINK_PATH      = ENV(CROSS_COMPILE)ar
+*_ARMLINUXGCC_ARM_DLINK_PATH      = ENV(CROSS_COMPILE)ld
+*_ARMLINUXGCC_ARM_ASM_PATH        = ENV(CROSS_COMPILE)as
+*_ARMLINUXGCC_ARM_PP_PATH         = ENV(CROSS_COMPILE)gcc
+*_ARMLINUXGCC_ARM_VFRPP_PATH      = ENV(CROSS_COMPILE)gcc
 
 #
 # Use default values, or override in DSC file
-- 
1.7.10.4

>From 168dc0a88f1bf359b0e59bc76cc45b19c27dcdb3 Mon Sep 17 00:00:00 2001
From: Leif Lindholm <[email protected]>
Date: Tue, 16 Apr 2013 15:49:02 +0000
Subject: [PATCH 2/2] Enable native ARM builds of BaseTools.

This patch, incoorporating some earlier work by [email protected],
enables full support for the BaseTools on ARM platforms - for building
edk2 natively under ARM Linux.

Signed-off-by: [email protected]
---
 Source/C/Include/Arm/ProcessorBind.h |  158 ++++++++++++++++++++++++++++++++++
 Source/C/Makefiles/header.makefile   |    6 ++
 2 files changed, 164 insertions(+)
 create mode 100644 Source/C/Include/Arm/ProcessorBind.h

diff --git a/Source/C/Include/Arm/ProcessorBind.h b/Source/C/Include/Arm/ProcessorBind.h
new file mode 100644
index 0000000..455f60f
--- /dev/null
+++ b/Source/C/Include/Arm/ProcessorBind.h
@@ -0,0 +1,158 @@
+/** @file
+  Processor or Compiler specific defines and types for ARM.
+
+  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+  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.             
+
+**/
+
+#ifndef __PROCESSOR_BIND_H__
+#define __PROCESSOR_BIND_H__
+
+///
+/// Define the processor type so other code can make processor based choices
+///
+#define MDE_CPU_ARM
+
+//
+// Make sure we are using the correct packing rules per EFI specification
+//
+#ifndef __GNUC__
+#pragma pack()
+#endif
+
+#if _MSC_EXTENSIONS 
+  //
+  // use Microsoft* C complier dependent integer width types 
+  //
+  typedef unsigned __int64    UINT64;
+  typedef __int64             INT64;
+  typedef unsigned __int32    UINT32;
+  typedef __int32             INT32;
+  typedef unsigned short      UINT16;
+  typedef unsigned short      CHAR16;
+  typedef short               INT16;
+  typedef unsigned char       BOOLEAN;
+  typedef unsigned char       UINT8;
+  typedef char                CHAR8;
+  typedef signed char         INT8;
+#else
+  //
+  // Assume standard ARM alignment. 
+  //
+  typedef unsigned long long  UINT64;
+  typedef long long           INT64;
+  typedef unsigned int        UINT32;
+  typedef int                 INT32;
+  typedef unsigned short      UINT16;
+  typedef unsigned short      CHAR16;
+  typedef short               INT16;
+  typedef unsigned char       BOOLEAN;
+  typedef unsigned char       UINT8;
+  typedef char                CHAR8;
+  typedef signed char         INT8;
+
+  #define UINT8_MAX 0xff
+#endif
+
+///
+/// Unsigned value of native width.  (4 bytes on supported 32-bit processor instructions,
+/// 8 bytes on supported 64-bit processor instructions)
+///
+typedef UINT32  UINTN;
+
+///
+/// Signed value of native width.  (4 bytes on supported 32-bit processor instructions,
+/// 8 bytes on supported 64-bit processor instructions)
+///
+typedef INT32   INTN;
+
+//
+// Processor specific defines
+//
+
+///
+/// A value of native width with the highest bit set.
+///
+#define MAX_BIT      0x80000000
+
+///
+/// A value of native width with the two highest bits set.
+///
+#define MAX_2_BITS   0xC0000000
+
+///
+/// Maximum legal ARM address
+///
+#define MAX_ADDRESS  0xFFFFFFFF
+
+///
+/// The stack alignment required for ARM
+///
+#define CPU_STACK_ALIGNMENT  sizeof(UINT64)
+
+//
+// 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.
+//
+#define EFIAPI    
+
+#if defined(__GNUC__)
+  ///
+  /// For GNU assembly code, .global or .globl can declare global symbols.
+  /// Define this macro to unify the usage.
+  ///
+  #define ASM_GLOBAL .globl
+
+  #if !defined(__APPLE__)
+    ///
+    /// ARM EABI defines that the linker should not manipulate call relocations
+    /// (do bl/blx conversion) unless the target symbol has function type.
+    /// CodeSourcery 2010.09 started requiring the .type to function properly
+    ///
+    #define INTERWORK_FUNC(func__)   .type ASM_PFX(func__), %function
+
+    #define GCC_ASM_EXPORT(func__)  \
+             .global  _CONCATENATE (__USER_LABEL_PREFIX__, func__)    ;\
+             .type ASM_PFX(func__), %function  
+
+    #define GCC_ASM_IMPORT(func__)  \
+             .extern  _CONCATENATE (__USER_LABEL_PREFIX__, func__)
+             
+  #else
+    //
+    // .type not supported by Apple Xcode tools 
+    //
+    #define INTERWORK_FUNC(func__)  
+
+    #define GCC_ASM_EXPORT(func__)  \
+             .globl  _CONCATENATE (__USER_LABEL_PREFIX__, func__)    \
+  
+    #define GCC_ASM_IMPORT(name)  
+
+  #endif
+#endif
+
+/**
+  Return the pointer to the first instruction of a function given a function pointer.
+  On ARM CPU 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)
+
+#endif
+
+
diff --git a/Source/C/Makefiles/header.makefile b/Source/C/Makefiles/header.makefile
index 9aa83c0..070af84 100644
--- a/Source/C/Makefiles/header.makefile
+++ b/Source/C/Makefiles/header.makefile
@@ -4,6 +4,7 @@
 # ARCH = x86_64 or x64 for EM64T build
 # ARCH = ia32 or IA32 for IA32 build
 # ARCH = ia64 or IA64 for IA64 build
+# ARCH = Arm or ARM for ARM build
 #
 # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
 # This program and the accompanying materials
@@ -34,6 +35,11 @@ ifeq ($(ARCH), X64)
 ARCH_INCLUDE = -I $(MAKEROOT)/Include/X64/
 endif
 
+ifeq ($(ARCH), ARM)
+ARCH_INCLUDE = -I $(MAKEROOT)/Include/Arm/
+endif
+
+
 INCLUDE = $(TOOL_INCLUDE) -I $(MAKEROOT) -I $(MAKEROOT)/Include/Common -I $(MAKEROOT)/Include/ -I $(MAKEROOT)/Include/IndustryStandard -I $(MAKEROOT)/Common/ -I .. -I . $(ARCH_INCLUDE) 
 CPPFLAGS = $(INCLUDE)
 CFLAGS = -MD -fshort-wchar -fno-strict-aliasing -fno-merge-constants -nostdlib -Wall -Werror -c -g
-- 
1.7.10.4

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
edk2-buildtools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-buildtools-devel

Reply via email to