public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v5 0/6] Add ARM support for VS2017
@ 2018-01-12 13:33 Pete Batard
  2018-01-12 13:33 ` [PATCH v5 1/6] MdePkg: Disable some Level 4 warnings for VS2017/ARM Pete Batard
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

(Same as v4, except for the AREA names where we replaced the RVCT macros, in
patch 4/6, so that it matches what would have been produced with the macros)


The following series adds ARM compilation support for the VS2017 toolchain.
* PATCH 1 targets the disabling of VS Level 4 warnings. The disabled warnings
  for ARM are now aligned with IA32 and X64.
* PATCH 2 adds a NULL handler for the base stack check, since this is a GCC
  functionality.
* PATCH 3 updates MdePkg/Library/BaseLib so that the RVCT assembly sources
  are also used for MSFT.
* PATCH 4 adds the required compiler intrinsics replacements for division,
  shift, by reusing the RVCT code, as well as memset/memcpy.
* PATCH 5 adds variable argument handlers for print output. Note that this
  is done without relying on any external headers, with the VA_ARG macro
  having been reverse engineered from MSFT ARM assembly output.
* PATCH 6 enables the selection of ARM in the conf templates.

With these patches, VS2017 toolchain users should be able to compile
regular UEFI ARM applications using EDK2. Note that, unlike ARM64 support,
ARM support does not require a specific update of Visual Studio 2017, as
the ARM toolchain has been available from the very first release.

Additional notes:

We tested compiling and running the full UEFI Shell with this series, as
well as a small set of applications and drivers, and found no issues.
With an additional patch [1], it is also possible to use this proposal to
compile a complete QEMU ARM firmware. As the patch shows, the changes that
need to be applied to the EDK2 sources to achieve this are actually very
minimal.

However, the generated firmware does not currently boot, possibly because
of the following warnings being generated by the MS compiler:
- ArmCpuDxe.dll : warning LNK4072: section count 118 exceeds max (96); image may not run
- UiApp.dll : warning LNK4072: section count 113 exceeds max (96); image may not run

As far as I could see, the section count max is hardcoded so a workaround
would be needed to address those.

Also, because the VS2017 ARM compiler forces a section alignment of 4096
bytes (which in turn forces use to use /FILEALIGN:4096 as a linker option
for the firmware generation), the generated firmware exceeds 2MB and we
had to double its size to 4MB.

At this stage, since the goal of this series is to allow users to compile
regular ARM UEFI applications using the VS2017 toolchain, I have no plans
to spend more time on the QEMU firmware issues, especially as I suspect 
that reducing the firmware size back to 2 MB may not be achievable without
Microsoft altering their compiler. I am however hopeful that ARM
specialists can take this matter over eventually...

Regards,

/Pete

[1] https://github.com/pbatard/edk2/commit/c4ce41094a46f4f3dc7ccc64a90604813f037b13

Pete Batard (6):
  MdePkg: Disable some Level 4 warnings for VS2017/ARM
  MdePkg/Library/BaseStackCheckLib: Add Null handler for VS2017/ARM
  MdePkg/Library/BaseLib: Enable VS2017/ARM builds
  ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
  MdePkg/Include: Add VA list support for VS2017/ARM
  BaseTools/Conf: Add VS2017/ARM support

 ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++--
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 ++++++--
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++--
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++-
 ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++-
 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 +++++++
 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++
 BaseTools/Conf/build_rule.template                             | 31 ++++++-
 BaseTools/Conf/tools_def.template                              | 31 +++++++
 MdePkg/Include/Arm/ProcessorBind.h                             | 96 +++++++++++++++-----
 MdePkg/Include/Base.h                                          | 13 +++
 MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm                   |  5 +-
 MdePkg/Library/BaseLib/BaseLib.inf                             | 16 +++-
 MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf         |  5 +-
 MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c          | 18 ++++
 15 files changed, 372 insertions(+), 60 deletions(-)
 create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
 create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
 create mode 100644 MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c

-- 
2.9.3.windows.2



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v5 1/6] MdePkg: Disable some Level 4 warnings for VS2017/ARM
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
@ 2018-01-12 13:33 ` Pete Batard
  2018-01-12 13:33 ` [PATCH v5 2/6] MdePkg/Library/BaseStackCheckLib: Add Null handler " Pete Batard
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

We disable the exact same warnings as IA32 and X64.

Also create a dummy macro for PRESERVE8, as this is not supported by
the Microsoft ARM assembler.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 MdePkg/Include/Arm/ProcessorBind.h | 96 +++++++++++++++-----
 1 file changed, 75 insertions(+), 21 deletions(-)

diff --git a/MdePkg/Include/Arm/ProcessorBind.h b/MdePkg/Include/Arm/ProcessorBind.h
index 42ea2f3055f3..afb2f05446f0 100644
--- a/MdePkg/Include/Arm/ProcessorBind.h
+++ b/MdePkg/Include/Arm/ProcessorBind.h
@@ -1,15 +1,15 @@
 /** @file
   Processor or Compiler specific defines and types for ARM.
 
-  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2018, 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                                            
+  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.
 
 **/
 
@@ -28,14 +28,63 @@
 #pragma pack()
 #endif
 
+#if defined(_MSC_EXTENSIONS)
+
 //
-// RVCT does not support the __builtin_unreachable() macro
+// Disable some level 4 compilation warnings (same as IA32 and X64)
 //
-#ifdef __ARMCC_VERSION
+
+//
+// Disabling bitfield type checking warnings.
+//
+#pragma warning ( disable : 4214 )
+
+//
+// Disabling the unreferenced formal parameter warnings.
+//
+#pragma warning ( disable : 4100 )
+
+//
+// Disable slightly different base types warning as CHAR8 * can not be set
+// to a constant string.
+//
+#pragma warning ( disable : 4057 )
+
+//
+// ASSERT(FALSE) or while (TRUE) are legal constructs so suppress this warning
+//
+#pragma warning ( disable : 4127 )
+
+//
+// This warning is caused by functions defined but not used. For precompiled header only.
+//
+#pragma warning ( disable : 4505 )
+
+//
+// This warning is caused by empty (after preprocessing) source file. For precompiled header only.
+//
+#pragma warning ( disable : 4206 )
+
+//
+// Disable 'potentially uninitialized local variable X used' warnings
+//
+#pragma warning ( disable : 4701 )
+
+//
+// Disable 'potentially uninitialized local pointer variable X used' warnings
+//
+#pragma warning ( disable : 4703 )
+
+#endif
+
+//
+// RVCT and MSFT don't support the __builtin_unreachable() macro
+//
+#if defined(__ARMCC_VERSION) || defined(_MSC_EXTENSIONS)
 #define UNREACHABLE()
 #endif
 
-#if _MSC_EXTENSIONS 
+#if defined(_MSC_EXTENSIONS)
   //
   // use Microsoft* C compiler dependent integer width types
   //
@@ -52,7 +101,7 @@
   typedef signed char         INT8;
 #else
   //
-  // Assume standard ARM alignment. 
+  // Assume standard ARM alignment.
   // Need to check portability of long long
   //
   typedef unsigned long long  UINT64;
@@ -121,7 +170,7 @@ typedef INT32   INTN;
 // use the correct C calling convention. All protocol member functions and
 // EFI intrinsics are required to modify their member functions with EFIAPI.
 //
-#define EFIAPI    
+#define EFIAPI
 
 // When compiling with Clang, we still use GNU as for the assembler, so we still
 // need to define the GCC_ASM* macros.
@@ -142,34 +191,39 @@ typedef INT32   INTN;
 
     #define GCC_ASM_EXPORT(func__)  \
              .global  _CONCATENATE (__USER_LABEL_PREFIX__, func__)    ;\
-             .type ASM_PFX(func__), %function  
+             .type ASM_PFX(func__), %function
 
     #define GCC_ASM_IMPORT(func__)  \
              .extern  _CONCATENATE (__USER_LABEL_PREFIX__, func__)
-             
+
   #else
     //
-    // .type not supported by Apple Xcode tools 
+    // .type not supported by Apple Xcode tools
     //
-    #define INTERWORK_FUNC(func__)  
+    #define INTERWORK_FUNC(func__)
 
     #define GCC_ASM_EXPORT(func__)  \
              .globl  _CONCATENATE (__USER_LABEL_PREFIX__, func__)    \
-  
-    #define GCC_ASM_IMPORT(name)  
+
+    #define GCC_ASM_IMPORT(name)
 
   #endif
+#elif defined(_MSC_EXTENSIONS)
+  //
+  // PRESERVE8 is not supported by the MSFT assembler.
+  //
+  #define PRESERVE8
 #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, 
+  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)
 
-- 
2.9.3.windows.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v5 2/6] MdePkg/Library/BaseStackCheckLib: Add Null handler for VS2017/ARM
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
  2018-01-12 13:33 ` [PATCH v5 1/6] MdePkg: Disable some Level 4 warnings for VS2017/ARM Pete Batard
@ 2018-01-12 13:33 ` Pete Batard
  2018-01-12 13:33 ` [PATCH v5 3/6] MdePkg/Library/BaseLib: Enable VS2017/ARM builds Pete Batard
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf |  5 +++--
 MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c  | 18 ++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
index d02d97107b08..e280651b1199 100644
--- a/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
+++ b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
@@ -30,8 +30,9 @@ [Defines]
 #
 
 [Sources]
-  BaseStackCheckGcc.c | GCC
-  BaseStackCheckGcc.c | RVCT
+  BaseStackCheckGcc.c  | GCC
+  BaseStackCheckGcc.c  | RVCT
+  BaseStackCheckNull.c | MSFT
 
 [Packages]
   MdePkg/MdePkg.dec
diff --git a/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
new file mode 100644
index 000000000000..ebb387fee5e1
--- /dev/null
+++ b/MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
@@ -0,0 +1,18 @@
+/*++
+
+ Copyright (c) 2018, 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
+ 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.
+
+Abstract:
+
+  This file is purely empty as a work around for BaseStackCheck to pass MSVC build.
+
+**/
+
+extern int __BaseStackCheckNull;
-- 
2.9.3.windows.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v5 3/6] MdePkg/Library/BaseLib: Enable VS2017/ARM builds
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
  2018-01-12 13:33 ` [PATCH v5 1/6] MdePkg: Disable some Level 4 warnings for VS2017/ARM Pete Batard
  2018-01-12 13:33 ` [PATCH v5 2/6] MdePkg/Library/BaseStackCheckLib: Add Null handler " Pete Batard
@ 2018-01-12 13:33 ` Pete Batard
  2018-01-12 13:33 ` [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: " Pete Batard
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

Most of the RVCT assembly can be reused as is for MSFT except
for CpuBreakpoint.asm, which we need to force to Arm mode.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm |  5 ++++-
 MdePkg/Library/BaseLib/BaseLib.inf           | 16 +++++++++++++---
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm b/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm
index 8a8065159bf2..e7490b09d3dc 100644
--- a/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm
+++ b/MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm
@@ -16,7 +16,10 @@
 
     EXPORT CpuBreakpoint
 
-  AREA Cpu_Breakpoint, CODE, READONLY
+; Force ARM mode for this section, as MSFT assembler defaults to THUMB
+  AREA Cpu_Breakpoint, CODE, READONLY, ARM
+
+  ARM
 
 ;/**
 ;  Generates a breakpoint on the CPU.
diff --git a/MdePkg/Library/BaseLib/BaseLib.inf b/MdePkg/Library/BaseLib/BaseLib.inf
index fbfb0063b75f..3c07e6bad977 100644
--- a/MdePkg/Library/BaseLib/BaseLib.inf
+++ b/MdePkg/Library/BaseLib/BaseLib.inf
@@ -824,8 +824,9 @@ [Sources.EBC]
 [Sources.ARM]
   Arm/InternalSwitchStack.c
   Arm/Unaligned.c
-  Math64.c                   | RVCT 
-    
+  Math64.c                   | RVCT
+  Math64.c                   | MSFT
+
   Arm/SwitchStack.asm        | RVCT
   Arm/SetJumpLongJump.asm    | RVCT
   Arm/DisableInterrupts.asm  | RVCT
@@ -834,7 +835,16 @@ [Sources.ARM]
   Arm/CpuPause.asm           | RVCT
   Arm/CpuBreakpoint.asm      | RVCT
   Arm/MemoryFence.asm        | RVCT
- 
+
+  Arm/SwitchStack.asm        | MSFT
+  Arm/SetJumpLongJump.asm    | MSFT
+  Arm/DisableInterrupts.asm  | MSFT
+  Arm/EnableInterrupts.asm   | MSFT
+  Arm/GetInterruptsState.asm | MSFT
+  Arm/CpuPause.asm           | MSFT
+  Arm/CpuBreakpoint.asm      | MSFT
+  Arm/MemoryFence.asm        | MSFT
+
   Arm/Math64.S                  | GCC
   Arm/SwitchStack.S             | GCC
   Arm/EnableInterrupts.S        | GCC
-- 
2.9.3.windows.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
                   ` (2 preceding siblings ...)
  2018-01-12 13:33 ` [PATCH v5 3/6] MdePkg/Library/BaseLib: Enable VS2017/ARM builds Pete Batard
@ 2018-01-12 13:33 ` Pete Batard
  2018-01-15 12:07   ` Ard Biesheuvel
  2018-01-12 13:33 ` [PATCH v5 5/6] MdePkg/Include: Add VA list support for VS2017/ARM Pete Batard
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

Introduce CRT assembly replacements for __rt_sdiv, __rt_udiv,
__rt_udiv64, __rt_sdiv64, __rt_srsh (by reusing the RVCT code)
as well as memcpy and memset.
For MSFT compatibility, some of the code needs to be explicitly
forced to ARM, and the /oldit assembly flag needs to be added.
Also, while RVCT_ASM_EXPORT macro invocations have been removed,
the replacement code is designed to be as close as possible to
the one that would have been generated if using the macros.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++++++++++++---
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 +++++++++++++-----
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++++-----
 ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++++++++--
 ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++++++-
 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 ++++++++++++++++
 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++++++++++
 7 files changed, 185 insertions(+), 32 deletions(-)

diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
index b539e516892d..f9e0107395f2 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -17,18 +18,19 @@
     EXPORT  __aeabi_uidivmod
     EXPORT  __aeabi_idiv
     EXPORT  __aeabi_idivmod
+    EXPORT  __rt_udiv
+    EXPORT  __rt_sdiv
 
     AREA  Math, CODE, READONLY
 
 ;
 ;UINT32
 ;EFIAPI
-;__aeabi_uidivmode (
-;  IN UINT32  Dividen
+;__aeabi_uidivmod (
+;  IN UINT32  Dividend
 ;  IN UINT32  Divisor
 ;  );
 ;
-
 __aeabi_uidiv
 __aeabi_uidivmod
     RSBS    r12, r1, r0, LSR #4
@@ -40,10 +42,40 @@ __aeabi_uidivmod
     B       __arm_div_large
 
 ;
+;UINT64
+;EFIAPI
+;__rt_udiv (
+;  IN UINT32  Divisor,
+;  IN UINT32  Dividend
+;  );
+;
+__rt_udiv
+    ; Swap R0 and R1
+    MOV     r12, r0
+    MOV     r0, r1
+    MOV     r1, r12
+    B       __aeabi_uidivmod
+
+;
+;UINT64
+;EFIAPI
+;__rt_sdiv (
+;  IN INT32  Divisor,
+;  IN INT32  Dividend
+;  );
+;
+__rt_sdiv
+    ; Swap R0 and R1
+    MOV     r12, r0
+    MOV     r0, r1
+    MOV     r1, r12
+    B       __aeabi_idivmod
+
+;
 ;INT32
 ;EFIAPI
-;__aeabi_idivmode (
-;  IN INT32  Dividen
+;__aeabi_idivmod (
+;  IN INT32  Dividend
 ;  IN INT32  Divisor
 ;  );
 ;
@@ -152,4 +184,3 @@ __aeabi_idiv0
     BX      r14
 
     END
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
index c71bd59e4520..115a2b9c0e3c 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -13,20 +14,41 @@
 //------------------------------------------------------------------------------
 
 
-    EXTERN  __aeabi_uldivmod
+    IMPORT  __aeabi_uldivmod
+    EXPORT  __aeabi_ldivmod
+    EXPORT  __rt_sdiv64
 
-    INCLUDE AsmMacroExport.inc
+    AREA  s___aeabi_ldivmod, CODE, READONLY, ARM
+
+    ARM
 
 ;
-;UINT32
+;INT64
 ;EFIAPI
-;__aeabi_uidivmode (
-;  IN UINT32  Dividen
-;  IN UINT32  Divisor
+;__rt_sdiv64 (
+;  IN  INT64  Divisor
+;  IN  INT64  Dividend
 ;  );
 ;
+__rt_sdiv64
+    ; Swap r0-r1 and r2-r3
+    MOV     r12, r0
+    MOV     r0, r2
+    MOV     r2, r12
+    MOV     r12, r1
+    MOV     r1, r3
+    MOV     r3, r12
+    B       __aeabi_ldivmod
 
- RVCT_ASM_EXPORT __aeabi_ldivmod
+;
+;INT64
+;EFIAPI
+;__aeabi_ldivmod (
+;  IN  INT64  Dividend
+;  IN  INT64  Divisor
+;  );
+;
+__aeabi_ldivmod
     PUSH     {r4,lr}
     ASRS     r4,r1,#1
     EOR      r4,r4,r3,LSR #1
@@ -39,7 +61,7 @@ L_Test1
     RSBS     r2,r2,#0
     RSC      r3,r3,#0
 L_Test2
-    BL       __aeabi_uldivmod  ;
+    BL       __aeabi_uldivmod
     TST      r4,#0x40000000
     BEQ      L_Test3
     RSBS     r0,r0,#0
@@ -53,5 +75,3 @@ L_Exit
     POP      {r4,pc}
 
     END
-
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
index 881db106d9d7..abfd7ab64a79 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -12,32 +13,33 @@
 //
 //------------------------------------------------------------------------------
 
+  EXPORT  __aeabi_llsr
+  EXPORT  __rt_srsh
 
+  AREA  s___aeabi_llsr, CODE, READONLY, ARM
 
-    INCLUDE AsmMacroExport.inc
+  ARM
 
 ;
 ;VOID
 ;EFIAPI
 ;__aeabi_llsr (
-; IN  VOID    *Destination,
-; IN  VOID    *Source,
-; IN  UINT32  Size
-; );
+;  IN  UINT64  Value,
+;  IN  UINT32  Shift
+;)
 ;
- RVCT_ASM_EXPORT __aeabi_llsr
+__aeabi_llsr
+__rt_srsh
     SUBS     r3,r2,#0x20
-    BPL      {pc} + 0x18  ; 0x1c
+    BPL      __aeabi_llsr_label1
     RSB      r3,r2,#0x20
     LSR      r0,r0,r2
     ORR      r0,r0,r1,LSL r3
     LSR      r1,r1,r2
     BX       lr
+__aeabi_llsr_label1
     LSR      r0,r1,r3
     MOV      r1,#0
     BX       lr
 
     END
-
-
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
index 6b6184ebd3fc..aedaac8c6c7f 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
@@ -1,6 +1,7 @@
 //------------------------------------------------------------------------------
 //
 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
 //
 // This program and the accompanying materials
 // are licensed and made available under the terms and conditions of the BSD License
@@ -13,9 +14,30 @@
 //------------------------------------------------------------------------------
 
 
+    EXPORT  __aeabi_uldivmod
+    EXPORT  __rt_udiv64
 
+    AREA  s___aeabi_uldivmod, CODE, READONLY, ARM
 
-    INCLUDE AsmMacroExport.inc
+    ARM
+
+;
+;UINT64
+;EFIAPI
+;__rt_udiv64 (
+;  IN  UINT64   Divisor
+;  IN  UINT64   Dividend
+;  )
+;
+__rt_udiv64
+  ; Swap r0-r1 and r2-r3
+  mov     r12, r0
+  mov     r0, r2
+  mov     r2, r12
+  mov     r12, r1
+  mov     r1, r3
+  mov     r3, r12
+  b       __aeabi_uldivmod
 
 ;
 ;UINT64
@@ -25,7 +47,7 @@
 ;  IN  UINT64   Divisor
 ;  )
 ;
- RVCT_ASM_EXPORT __aeabi_uldivmod
+__aeabi_uldivmod
   stmdb   sp!, {r4, r5, r6, lr}
   mov     r4, r1
   mov     r5, r0
@@ -261,7 +283,6 @@ _ll_div0
   b       __aeabi_ldiv0
 
 __aeabi_ldiv0
-  BX        r14
+  bx        r14
 
   END
-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
index 44333141a70a..14e88da7ce06 100644
--- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
@@ -23,8 +23,12 @@ [Defines]
   LIBRARY_CLASS                  = CompilerIntrinsicsLib
 
 [Sources]
-  memcpy.c
-  memset.c
+  memcpy.c             | RVCT
+  memcpy.c             | GCC
+  memcpy_ms.c          | MSFT
+  memset.c             | RVCT
+  memset.c             | GCC
+  memset_ms.c          | MSFT
 
 [Sources.ARM]
   Arm/mullu.asm        | RVCT
@@ -94,6 +98,10 @@ [Sources.ARM]
   Arm/llsr.S       | GCC
   Arm/llsl.S       | GCC
 
+  Arm/div.asm      | MSFT
+  Arm/uldiv.asm    | MSFT
+  Arm/ldivmod.asm  | MSFT
+  Arm/llsr.asm     | MSFT
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -101,3 +109,7 @@ [Packages]
 
 [LibraryClasses]
 
+[BuildOptions]
+  MSFT:*_*_ARM_CC_FLAGS = /GL-
+  MSFT:*_*_ARM_ASM_FLAGS = /oldit
+  MSFT:*_*_AARCH64_CC_FLAGS = /GL-
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
new file mode 100644
index 000000000000..90bbbb930d31
--- /dev/null
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
@@ -0,0 +1,34 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2017, Pete Batard. 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.
+//
+//------------------------------------------------------------------------------
+
+#if defined(_M_ARM64)
+typedef unsigned __int64  size_t;
+#else
+typedef unsigned __int32  size_t;
+#endif
+
+void* memcpy(void *, const void *, size_t);
+#pragma intrinsic(memcpy)
+#pragma function(memcpy)
+void* memcpy(void *dest, const void *src, size_t n)
+{
+  unsigned char *d = dest;
+  unsigned char const *s = src;
+
+  while (n--)
+    *d++ = *s++;
+
+  return dest;
+}
diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
new file mode 100644
index 000000000000..64205e5d1012
--- /dev/null
+++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
@@ -0,0 +1,33 @@
+//------------------------------------------------------------------------------
+//
+// Copyright (c) 2017, Pete Batard. 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.
+//
+//------------------------------------------------------------------------------
+
+#if defined(_M_ARM64)
+typedef unsigned __int64  size_t;
+#else
+typedef unsigned __int32  size_t;
+#endif
+
+void* memset(void *, int, size_t);
+#pragma intrinsic(memset)
+#pragma function(memset)
+void *memset(void *s, int c, size_t n)
+{
+  unsigned char *d = s;
+
+  while (n--)
+    *d++ = (unsigned char)c;
+
+  return s;
+}
-- 
2.9.3.windows.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v5 5/6] MdePkg/Include: Add VA list support for VS2017/ARM
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
                   ` (3 preceding siblings ...)
  2018-01-12 13:33 ` [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: " Pete Batard
@ 2018-01-12 13:33 ` Pete Batard
  2018-01-12 13:33 ` [PATCH v5 6/6] BaseTools/Conf: Add VS2017/ARM support Pete Batard
  2018-01-25 10:27 ` [PATCH v5 0/6] Add ARM support for VS2017 Gao, Liming
  6 siblings, 0 replies; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

VA_START, VA_END and VA_COPY are the same as the generic macros.
VA_ARG was reverse engineered from MS ARM assembly output.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 MdePkg/Include/Base.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h
index 29db8a253e2f..7152ccda9764 100644
--- a/MdePkg/Include/Base.h
+++ b/MdePkg/Include/Base.h
@@ -660,6 +660,19 @@ struct _LIST_ENTRY {
 
 #define VA_COPY(Dest, Start)          __va_copy (Dest, Start)
 
+#elif defined(_M_ARM)
+//
+// MSFT ARM variable argument list support.
+// Same as the generic macros below, except for VA_ARG that needs extra adjustment.
+//
+
+typedef char* VA_LIST;
+
+#define VA_START(Marker, Parameter)     (Marker = (VA_LIST) ((UINTN) & (Parameter) + _INT_SIZE_OF(Parameter)))
+#define VA_ARG(Marker, TYPE)            (*(TYPE *) ((Marker += _INT_SIZE_OF(TYPE) + ((-(INTN)Marker) & (sizeof(TYPE) - 1))) - _INT_SIZE_OF (TYPE)))
+#define VA_END(Marker)                  (Marker = (VA_LIST) 0)
+#define VA_COPY(Dest, Start)            ((void)((Dest) = (Start)))
+
 #elif defined(__GNUC__)
 
 #if defined(MDE_CPU_X64) && !defined(NO_MSABI_VA_FUNCS)
-- 
2.9.3.windows.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v5 6/6] BaseTools/Conf: Add VS2017/ARM support
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
                   ` (4 preceding siblings ...)
  2018-01-12 13:33 ` [PATCH v5 5/6] MdePkg/Include: Add VA list support for VS2017/ARM Pete Batard
@ 2018-01-12 13:33 ` Pete Batard
  2018-01-25 10:27 ` [PATCH v5 0/6] Add ARM support for VS2017 Gao, Liming
  6 siblings, 0 replies; 12+ messages in thread
From: Pete Batard @ 2018-01-12 13:33 UTC (permalink / raw)
  To: edk2-devel; +Cc: liming.gao, ard.biesheuvel, eugene

We duplicate the Assembly-Code-File section from build_rule.template
because --convert-hex cannot be used with the MSFT ARM assembler.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Pete Batard <pete@akeo.ie>
---
 BaseTools/Conf/build_rule.template | 31 +++++++++++++++++++-
 BaseTools/Conf/tools_def.template  | 31 ++++++++++++++++++++
 2 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 3e6aa8ff0f34..6ea14fb7aa02 100755
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -182,7 +182,6 @@
 
     <Command>
 
-
 [Assembly-Code-File.COMMON.COMMON]
     <InputFile.MSFT, InputFile.INTEL, InputFile.RVCT>
         ?.asm, ?.Asm, ?.ASM
@@ -207,6 +206,36 @@
         # For RVCTCYGWIN ASM_FLAGS must be first to work around pathing issues
         "$(ASM)" $(ASM_FLAGS) -o ${dst} $(INC) ${d_path}(+)${s_base}.iii
 
+[Assembly-Code-File.COMMON.ARM]
+    # Remove --convert-hex for ARM as it breaks MSFT assemblers
+    <InputFile.MSFT, InputFile.INTEL, InputFile.RVCT>
+        ?.asm, ?.Asm, ?.ASM
+
+    <InputFile.GCC, InputFile.GCCLD>
+        ?.S, ?.s
+
+    <ExtraDependency>
+        $(MAKE_FILE)
+
+    <OutputFile>
+        $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj
+
+    <Command.INTEL>
+        "$(PP)" $(PP_FLAGS) $(INC) ${src} > ${d_path}(+)${s_base}.i
+        Trim --source-code --convert-hex --trim-long -o ${d_path}(+)${s_base}.iii ${d_path}(+)${s_base}.i
+        "$(ASM)" /Fo${dst} $(ASM_FLAGS) /I${s_path} $(INC) ${d_path}(+)${s_base}.iii
+
+    <Command.MSFT>
+        "$(PP)" $(PP_FLAGS) $(INC) ${src} > ${d_path}(+)${s_base}.i
+        Trim --source-code --trim-long -o ${d_path}(+)${s_base}.iii ${d_path}(+)${s_base}.i
+        "$(ASM)" /Fo${dst} $(ASM_FLAGS) /I${s_path} $(INC) ${d_path}(+)${s_base}.iii
+
+    <Command.GCC, Command.GCCLD, Command.RVCT>
+        "$(PP)" $(PP_FLAGS) $(INC) ${src} > ${d_path}(+)${s_base}.i
+        Trim --trim-long --source-code -o ${d_path}(+)${s_base}.iii ${d_path}(+)${s_base}.i
+        # For RVCTCYGWIN ASM_FLAGS must be first to work around pathing issues
+        "$(ASM)" $(ASM_FLAGS) -o ${dst} $(INC) ${d_path}(+)${s_base}.iii
+
 [Nasm-Assembly-Code-File.COMMON.COMMON]
     <InputFile>
         ?.nasm
diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index 98ab6dd45e81..f76c4da05938 100755
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -79,6 +79,7 @@ DEFINE VS2017_HOST        = x86
 DEFINE VS2017_BIN_HOST    = DEF(VS2017_BIN)\HostDEF(VS2017_HOST)\DEF(VS2017_HOST)
 DEFINE VS2017_BIN_IA32    = DEF(VS2017_BIN)\HostDEF(VS2017_HOST)\x86
 DEFINE VS2017_BIN_X64     = DEF(VS2017_BIN)\HostDEF(VS2017_HOST)\x64
+DEFINE VS2017_BIN_ARM     = DEF(VS2017_BIN)\HostDEF(VS2017_HOST)\arm
 
 DEFINE WINSDK_BIN       = ENV(WINSDK_PREFIX)
 DEFINE WINSDKx86_BIN    = ENV(WINSDKx86_PREFIX)
@@ -335,6 +336,9 @@ DEFINE DTC_BIN                 = ENV(DTC_PREFIX)dtc
 #                             Required to build platforms or ACPI tables:
 #                               Intel(r) ACPI Compiler (iasl.exe) from
 #                               https://acpica.org/downloads
+#                        Note:
+#                             Building of XIP firmware images for ARM is not currently supported (only applications).
+#                             /FILEALIGN:4096 and other changes are needed for ARM firmware builds.
 #   DDK3790     -win32-  Requires:
 #                             Microsoft Windows Server 2003 Driver Development Kit (Microsoft WINDDK) version 3790.1830
 #                        Optional:
@@ -4169,6 +4173,33 @@ NOOPT_VS2017_X64_NASM_FLAGS     = -O0 -f win64 -g
 RELEASE_VS2017_X64_DLINK_FLAGS  = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data
 NOOPT_VS2017_X64_DLINK_FLAGS    = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /ALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG
 
+#################
+# ARM definitions
+#################
+*_VS2017_ARM_CC_PATH              = DEF(VS2017_BIN_ARM)\cl.exe
+*_VS2017_ARM_VFRPP_PATH           = DEF(VS2017_BIN_ARM)\cl.exe
+*_VS2017_ARM_SLINK_PATH           = DEF(VS2017_BIN_ARM)\lib.exe
+*_VS2017_ARM_DLINK_PATH           = DEF(VS2017_BIN_ARM)\link.exe
+*_VS2017_ARM_APP_PATH             = DEF(VS2017_BIN_ARM)\cl.exe
+*_VS2017_ARM_PP_PATH              = DEF(VS2017_BIN_ARM)\cl.exe
+*_VS2017_ARM_ASM_PATH             = DEF(VS2017_BIN_ARM)\armasm.exe
+*_VS2017_ARM_ASLCC_PATH           = DEF(VS2017_BIN_ARM)\cl.exe
+*_VS2017_ARM_ASLPP_PATH           = DEF(VS2017_BIN_ARM)\cl.exe
+*_VS2017_ARM_ASLDLINK_PATH        = DEF(VS2017_BIN_ARM)\link.exe
+
+      *_VS2017_ARM_MAKE_FLAGS     = /nologo
+  DEBUG_VS2017_ARM_CC_FLAGS       = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /Gw /Oi-
+RELEASE_VS2017_ARM_CC_FLAGS       = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /O1b2 /GL /FIAutoGen.h /EHs-c- /GR- /GF /Gw /Oi-
+NOOPT_VS2017_ARM_CC_FLAGS         = /nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /FIAutoGen.h /EHs-c- /GR- /GF /Gy /Zi /Gm /Od /Oi-
+
+  DEBUG_VS2017_ARM_ASM_FLAGS      = /nologo /g
+RELEASE_VS2017_ARM_ASM_FLAGS      = /nologo
+NOOPT_VS2017_ARM_ASM_FLAGS        = /nologo
+
+  DEBUG_VS2017_ARM_DLINK_FLAGS    = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG
+RELEASE_VS2017_ARM_DLINK_FLAGS    = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /IGNORE:4254 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /MERGE:.rdata=.data
+NOOPT_VS2017_ARM_DLINK_FLAGS      = /NOLOGO /NODEFAULTLIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /MAP /SECTION:.xdata,D /SECTION:.pdata,D /MACHINE:ARM /LTCG /DLL /ENTRY:$(IMAGE_ENTRY_POINT) /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DRIVER /DEBUG
+
 ##################
 # EBC definitions
 ##################
-- 
2.9.3.windows.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
  2018-01-12 13:33 ` [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: " Pete Batard
@ 2018-01-15 12:07   ` Ard Biesheuvel
  0 siblings, 0 replies; 12+ messages in thread
From: Ard Biesheuvel @ 2018-01-15 12:07 UTC (permalink / raw)
  To: Pete Batard; +Cc: edk2-devel@lists.01.org, Gao, Liming, Cohen, Eugene

On 12 January 2018 at 13:33, Pete Batard <pete@akeo.ie> wrote:
> Introduce CRT assembly replacements for __rt_sdiv, __rt_udiv,
> __rt_udiv64, __rt_sdiv64, __rt_srsh (by reusing the RVCT code)
> as well as memcpy and memset.
> For MSFT compatibility, some of the code needs to be explicitly
> forced to ARM, and the /oldit assembly flag needs to be added.
> Also, while RVCT_ASM_EXPORT macro invocations have been removed,
> the replacement code is designed to be as close as possible to
> the one that would have been generated if using the macros.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Pete Batard <pete@akeo.ie>

Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++++++++++++---
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 +++++++++++++-----
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++++-----
>  ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++++++++--
>  ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++++++-
>  ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 ++++++++++++++++
>  ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++++++++++
>  7 files changed, 185 insertions(+), 32 deletions(-)
>
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
> index b539e516892d..f9e0107395f2 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -17,18 +18,19 @@
>      EXPORT  __aeabi_uidivmod
>      EXPORT  __aeabi_idiv
>      EXPORT  __aeabi_idivmod
> +    EXPORT  __rt_udiv
> +    EXPORT  __rt_sdiv
>
>      AREA  Math, CODE, READONLY
>
>  ;
>  ;UINT32
>  ;EFIAPI
> -;__aeabi_uidivmode (
> -;  IN UINT32  Dividen
> +;__aeabi_uidivmod (
> +;  IN UINT32  Dividend
>  ;  IN UINT32  Divisor
>  ;  );
>  ;
> -
>  __aeabi_uidiv
>  __aeabi_uidivmod
>      RSBS    r12, r1, r0, LSR #4
> @@ -40,10 +42,40 @@ __aeabi_uidivmod
>      B       __arm_div_large
>
>  ;
> +;UINT64
> +;EFIAPI
> +;__rt_udiv (
> +;  IN UINT32  Divisor,
> +;  IN UINT32  Dividend
> +;  );
> +;
> +__rt_udiv
> +    ; Swap R0 and R1
> +    MOV     r12, r0
> +    MOV     r0, r1
> +    MOV     r1, r12
> +    B       __aeabi_uidivmod
> +
> +;
> +;UINT64
> +;EFIAPI
> +;__rt_sdiv (
> +;  IN INT32  Divisor,
> +;  IN INT32  Dividend
> +;  );
> +;
> +__rt_sdiv
> +    ; Swap R0 and R1
> +    MOV     r12, r0
> +    MOV     r0, r1
> +    MOV     r1, r12
> +    B       __aeabi_idivmod
> +
> +;
>  ;INT32
>  ;EFIAPI
> -;__aeabi_idivmode (
> -;  IN INT32  Dividen
> +;__aeabi_idivmod (
> +;  IN INT32  Dividend
>  ;  IN INT32  Divisor
>  ;  );
>  ;
> @@ -152,4 +184,3 @@ __aeabi_idiv0
>      BX      r14
>
>      END
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
> index c71bd59e4520..115a2b9c0e3c 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -13,20 +14,41 @@
>  //------------------------------------------------------------------------------
>
>
> -    EXTERN  __aeabi_uldivmod
> +    IMPORT  __aeabi_uldivmod
> +    EXPORT  __aeabi_ldivmod
> +    EXPORT  __rt_sdiv64
>
> -    INCLUDE AsmMacroExport.inc
> +    AREA  s___aeabi_ldivmod, CODE, READONLY, ARM
> +
> +    ARM
>
>  ;
> -;UINT32
> +;INT64
>  ;EFIAPI
> -;__aeabi_uidivmode (
> -;  IN UINT32  Dividen
> -;  IN UINT32  Divisor
> +;__rt_sdiv64 (
> +;  IN  INT64  Divisor
> +;  IN  INT64  Dividend
>  ;  );
>  ;
> +__rt_sdiv64
> +    ; Swap r0-r1 and r2-r3
> +    MOV     r12, r0
> +    MOV     r0, r2
> +    MOV     r2, r12
> +    MOV     r12, r1
> +    MOV     r1, r3
> +    MOV     r3, r12
> +    B       __aeabi_ldivmod
>
> - RVCT_ASM_EXPORT __aeabi_ldivmod
> +;
> +;INT64
> +;EFIAPI
> +;__aeabi_ldivmod (
> +;  IN  INT64  Dividend
> +;  IN  INT64  Divisor
> +;  );
> +;
> +__aeabi_ldivmod
>      PUSH     {r4,lr}
>      ASRS     r4,r1,#1
>      EOR      r4,r4,r3,LSR #1
> @@ -39,7 +61,7 @@ L_Test1
>      RSBS     r2,r2,#0
>      RSC      r3,r3,#0
>  L_Test2
> -    BL       __aeabi_uldivmod  ;
> +    BL       __aeabi_uldivmod
>      TST      r4,#0x40000000
>      BEQ      L_Test3
>      RSBS     r0,r0,#0
> @@ -53,5 +75,3 @@ L_Exit
>      POP      {r4,pc}
>
>      END
> -
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
> index 881db106d9d7..abfd7ab64a79 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -12,32 +13,33 @@
>  //
>  //------------------------------------------------------------------------------
>
> +  EXPORT  __aeabi_llsr
> +  EXPORT  __rt_srsh
>
> +  AREA  s___aeabi_llsr, CODE, READONLY, ARM
>
> -    INCLUDE AsmMacroExport.inc
> +  ARM
>
>  ;
>  ;VOID
>  ;EFIAPI
>  ;__aeabi_llsr (
> -; IN  VOID    *Destination,
> -; IN  VOID    *Source,
> -; IN  UINT32  Size
> -; );
> +;  IN  UINT64  Value,
> +;  IN  UINT32  Shift
> +;)
>  ;
> - RVCT_ASM_EXPORT __aeabi_llsr
> +__aeabi_llsr
> +__rt_srsh
>      SUBS     r3,r2,#0x20
> -    BPL      {pc} + 0x18  ; 0x1c
> +    BPL      __aeabi_llsr_label1
>      RSB      r3,r2,#0x20
>      LSR      r0,r0,r2
>      ORR      r0,r0,r1,LSL r3
>      LSR      r1,r1,r2
>      BX       lr
> +__aeabi_llsr_label1
>      LSR      r0,r1,r3
>      MOV      r1,#0
>      BX       lr
>
>      END
> -
> -
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
> index 6b6184ebd3fc..aedaac8c6c7f 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm
> @@ -1,6 +1,7 @@
>  //------------------------------------------------------------------------------
>  //
>  // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
>  //
>  // This program and the accompanying materials
>  // are licensed and made available under the terms and conditions of the BSD License
> @@ -13,9 +14,30 @@
>  //------------------------------------------------------------------------------
>
>
> +    EXPORT  __aeabi_uldivmod
> +    EXPORT  __rt_udiv64
>
> +    AREA  s___aeabi_uldivmod, CODE, READONLY, ARM
>
> -    INCLUDE AsmMacroExport.inc
> +    ARM
> +
> +;
> +;UINT64
> +;EFIAPI
> +;__rt_udiv64 (
> +;  IN  UINT64   Divisor
> +;  IN  UINT64   Dividend
> +;  )
> +;
> +__rt_udiv64
> +  ; Swap r0-r1 and r2-r3
> +  mov     r12, r0
> +  mov     r0, r2
> +  mov     r2, r12
> +  mov     r12, r1
> +  mov     r1, r3
> +  mov     r3, r12
> +  b       __aeabi_uldivmod
>
>  ;
>  ;UINT64
> @@ -25,7 +47,7 @@
>  ;  IN  UINT64   Divisor
>  ;  )
>  ;
> - RVCT_ASM_EXPORT __aeabi_uldivmod
> +__aeabi_uldivmod
>    stmdb   sp!, {r4, r5, r6, lr}
>    mov     r4, r1
>    mov     r5, r0
> @@ -261,7 +283,6 @@ _ll_div0
>    b       __aeabi_ldiv0
>
>  __aeabi_ldiv0
> -  BX        r14
> +  bx        r14
>
>    END
> -
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> index 44333141a70a..14e88da7ce06 100644
> --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> @@ -23,8 +23,12 @@ [Defines]
>    LIBRARY_CLASS                  = CompilerIntrinsicsLib
>
>  [Sources]
> -  memcpy.c
> -  memset.c
> +  memcpy.c             | RVCT
> +  memcpy.c             | GCC
> +  memcpy_ms.c          | MSFT
> +  memset.c             | RVCT
> +  memset.c             | GCC
> +  memset_ms.c          | MSFT
>
>  [Sources.ARM]
>    Arm/mullu.asm        | RVCT
> @@ -94,6 +98,10 @@ [Sources.ARM]
>    Arm/llsr.S       | GCC
>    Arm/llsl.S       | GCC
>
> +  Arm/div.asm      | MSFT
> +  Arm/uldiv.asm    | MSFT
> +  Arm/ldivmod.asm  | MSFT
> +  Arm/llsr.asm     | MSFT
>
>  [Packages]
>    MdePkg/MdePkg.dec
> @@ -101,3 +109,7 @@ [Packages]
>
>  [LibraryClasses]
>
> +[BuildOptions]
> +  MSFT:*_*_ARM_CC_FLAGS = /GL-
> +  MSFT:*_*_ARM_ASM_FLAGS = /oldit
> +  MSFT:*_*_AARCH64_CC_FLAGS = /GL-
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
> new file mode 100644
> index 000000000000..90bbbb930d31
> --- /dev/null
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
> @@ -0,0 +1,34 @@
> +//------------------------------------------------------------------------------
> +//
> +// Copyright (c) 2017, Pete Batard. 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.
> +//
> +//------------------------------------------------------------------------------
> +
> +#if defined(_M_ARM64)
> +typedef unsigned __int64  size_t;
> +#else
> +typedef unsigned __int32  size_t;
> +#endif
> +
> +void* memcpy(void *, const void *, size_t);
> +#pragma intrinsic(memcpy)
> +#pragma function(memcpy)
> +void* memcpy(void *dest, const void *src, size_t n)
> +{
> +  unsigned char *d = dest;
> +  unsigned char const *s = src;
> +
> +  while (n--)
> +    *d++ = *s++;
> +
> +  return dest;
> +}
> diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
> new file mode 100644
> index 000000000000..64205e5d1012
> --- /dev/null
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
> @@ -0,0 +1,33 @@
> +//------------------------------------------------------------------------------
> +//
> +// Copyright (c) 2017, Pete Batard. 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.
> +//
> +//------------------------------------------------------------------------------
> +
> +#if defined(_M_ARM64)
> +typedef unsigned __int64  size_t;
> +#else
> +typedef unsigned __int32  size_t;
> +#endif
> +
> +void* memset(void *, int, size_t);
> +#pragma intrinsic(memset)
> +#pragma function(memset)
> +void *memset(void *s, int c, size_t n)
> +{
> +  unsigned char *d = s;
> +
> +  while (n--)
> +    *d++ = (unsigned char)c;
> +
> +  return s;
> +}
> --
> 2.9.3.windows.2
>


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v5 0/6] Add ARM support for VS2017
  2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
                   ` (5 preceding siblings ...)
  2018-01-12 13:33 ` [PATCH v5 6/6] BaseTools/Conf: Add VS2017/ARM support Pete Batard
@ 2018-01-25 10:27 ` Gao, Liming
  2018-01-25 11:31   ` Pete Batard
  6 siblings, 1 reply; 12+ messages in thread
From: Gao, Liming @ 2018-01-25 10:27 UTC (permalink / raw)
  To: Pete Batard, edk2-devel@lists.01.org
  Cc: ard.biesheuvel@linaro.org, eugene@hp.com

Pete:
  The changes in BaseTools and MdePkg are good to me. You can add my R-B.

>-----Original Message-----
>From: Pete Batard [mailto:pete@akeo.ie]
>Sent: Friday, January 12, 2018 9:33 PM
>To: edk2-devel@lists.01.org
>Cc: Gao, Liming <liming.gao@intel.com>; ard.biesheuvel@linaro.org;
>eugene@hp.com
>Subject: [PATCH v5 0/6] Add ARM support for VS2017
>
>(Same as v4, except for the AREA names where we replaced the RVCT macros,
>in
>patch 4/6, so that it matches what would have been produced with the
>macros)
>
>
>The following series adds ARM compilation support for the VS2017 toolchain.
>* PATCH 1 targets the disabling of VS Level 4 warnings. The disabled warnings
>  for ARM are now aligned with IA32 and X64.
>* PATCH 2 adds a NULL handler for the base stack check, since this is a GCC
>  functionality.
>* PATCH 3 updates MdePkg/Library/BaseLib so that the RVCT assembly
>sources
>  are also used for MSFT.
>* PATCH 4 adds the required compiler intrinsics replacements for division,
>  shift, by reusing the RVCT code, as well as memset/memcpy.
>* PATCH 5 adds variable argument handlers for print output. Note that this
>  is done without relying on any external headers, with the VA_ARG macro
>  having been reverse engineered from MSFT ARM assembly output.
>* PATCH 6 enables the selection of ARM in the conf templates.
>
>With these patches, VS2017 toolchain users should be able to compile
>regular UEFI ARM applications using EDK2. Note that, unlike ARM64 support,
>ARM support does not require a specific update of Visual Studio 2017, as
>the ARM toolchain has been available from the very first release.
>
>Additional notes:
>
>We tested compiling and running the full UEFI Shell with this series, as
>well as a small set of applications and drivers, and found no issues.
>With an additional patch [1], it is also possible to use this proposal to
>compile a complete QEMU ARM firmware. As the patch shows, the changes
>that
>need to be applied to the EDK2 sources to achieve this are actually very
>minimal.
>
>However, the generated firmware does not currently boot, possibly because
>of the following warnings being generated by the MS compiler:
>- ArmCpuDxe.dll : warning LNK4072: section count 118 exceeds max (96);
>image may not run
>- UiApp.dll : warning LNK4072: section count 113 exceeds max (96); image may
>not run
>
>As far as I could see, the section count max is hardcoded so a workaround
>would be needed to address those.
>
>Also, because the VS2017 ARM compiler forces a section alignment of 4096
>bytes (which in turn forces use to use /FILEALIGN:4096 as a linker option
>for the firmware generation), the generated firmware exceeds 2MB and we
>had to double its size to 4MB.
>
>At this stage, since the goal of this series is to allow users to compile
>regular ARM UEFI applications using the VS2017 toolchain, I have no plans
>to spend more time on the QEMU firmware issues, especially as I suspect
>that reducing the firmware size back to 2 MB may not be achievable without
>Microsoft altering their compiler. I am however hopeful that ARM
>specialists can take this matter over eventually...
>
>Regards,
>
>/Pete
>
>[1]
>https://github.com/pbatard/edk2/commit/c4ce41094a46f4f3dc7ccc64a906048
>13f037b13
>
>Pete Batard (6):
>  MdePkg: Disable some Level 4 warnings for VS2017/ARM
>  MdePkg/Library/BaseStackCheckLib: Add Null handler for VS2017/ARM
>  MdePkg/Library/BaseLib: Enable VS2017/ARM builds
>  ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
>  MdePkg/Include: Add VA list support for VS2017/ARM
>  BaseTools/Conf: Add VS2017/ARM support
>
> ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++--
> ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 ++++++--
> ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++--
> ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++-
> ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++-
> ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 +++++++
> ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++
> BaseTools/Conf/build_rule.template                             | 31 ++++++-
> BaseTools/Conf/tools_def.template                              | 31 +++++++
> MdePkg/Include/Arm/ProcessorBind.h                             | 96
>+++++++++++++++-----
> MdePkg/Include/Base.h                                          | 13 +++
> MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm                   |  5 +-
> MdePkg/Library/BaseLib/BaseLib.inf                             | 16 +++-
> MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf         |  5 +-
> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c          | 18 ++++
> 15 files changed, 372 insertions(+), 60 deletions(-)
> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
> create mode 100644
>MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
>
>--
>2.9.3.windows.2



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v5 0/6] Add ARM support for VS2017
  2018-01-25 10:27 ` [PATCH v5 0/6] Add ARM support for VS2017 Gao, Liming
@ 2018-01-25 11:31   ` Pete Batard
  2018-01-26 15:05     ` Gao, Liming
  0 siblings, 1 reply; 12+ messages in thread
From: Pete Batard @ 2018-01-25 11:31 UTC (permalink / raw)
  To: Gao, Liming, edk2-devel@lists.01.org
  Cc: ard.biesheuvel@linaro.org, eugene@hp.com

Thanks Liming.

 From the way you framed your comment, I'm not completely sure if 
there's action still needed on my side...

Do I actually need to resubmit a patch set with "Reviewed By"?
Or, now that each patch should have flagged as reviewed, are we simply 
supposed to wait for formal integration?

Regards,

/Pete

On 2018.01.25 10:27, Gao, Liming wrote:
> Pete:
>    The changes in BaseTools and MdePkg are good to me. You can add my R-B.
> 
>> -----Original Message-----
>> From: Pete Batard [mailto:pete@akeo.ie]
>> Sent: Friday, January 12, 2018 9:33 PM
>> To: edk2-devel@lists.01.org
>> Cc: Gao, Liming <liming.gao@intel.com>; ard.biesheuvel@linaro.org;
>> eugene@hp.com
>> Subject: [PATCH v5 0/6] Add ARM support for VS2017
>>
>> (Same as v4, except for the AREA names where we replaced the RVCT macros,
>> in
>> patch 4/6, so that it matches what would have been produced with the
>> macros)
>>
>>
>> The following series adds ARM compilation support for the VS2017 toolchain.
>> * PATCH 1 targets the disabling of VS Level 4 warnings. The disabled warnings
>>   for ARM are now aligned with IA32 and X64.
>> * PATCH 2 adds a NULL handler for the base stack check, since this is a GCC
>>   functionality.
>> * PATCH 3 updates MdePkg/Library/BaseLib so that the RVCT assembly
>> sources
>>   are also used for MSFT.
>> * PATCH 4 adds the required compiler intrinsics replacements for division,
>>   shift, by reusing the RVCT code, as well as memset/memcpy.
>> * PATCH 5 adds variable argument handlers for print output. Note that this
>>   is done without relying on any external headers, with the VA_ARG macro
>>   having been reverse engineered from MSFT ARM assembly output.
>> * PATCH 6 enables the selection of ARM in the conf templates.
>>
>> With these patches, VS2017 toolchain users should be able to compile
>> regular UEFI ARM applications using EDK2. Note that, unlike ARM64 support,
>> ARM support does not require a specific update of Visual Studio 2017, as
>> the ARM toolchain has been available from the very first release.
>>
>> Additional notes:
>>
>> We tested compiling and running the full UEFI Shell with this series, as
>> well as a small set of applications and drivers, and found no issues.
>> With an additional patch [1], it is also possible to use this proposal to
>> compile a complete QEMU ARM firmware. As the patch shows, the changes
>> that
>> need to be applied to the EDK2 sources to achieve this are actually very
>> minimal.
>>
>> However, the generated firmware does not currently boot, possibly because
>> of the following warnings being generated by the MS compiler:
>> - ArmCpuDxe.dll : warning LNK4072: section count 118 exceeds max (96);
>> image may not run
>> - UiApp.dll : warning LNK4072: section count 113 exceeds max (96); image may
>> not run
>>
>> As far as I could see, the section count max is hardcoded so a workaround
>> would be needed to address those.
>>
>> Also, because the VS2017 ARM compiler forces a section alignment of 4096
>> bytes (which in turn forces use to use /FILEALIGN:4096 as a linker option
>> for the firmware generation), the generated firmware exceeds 2MB and we
>> had to double its size to 4MB.
>>
>> At this stage, since the goal of this series is to allow users to compile
>> regular ARM UEFI applications using the VS2017 toolchain, I have no plans
>> to spend more time on the QEMU firmware issues, especially as I suspect
>> that reducing the firmware size back to 2 MB may not be achievable without
>> Microsoft altering their compiler. I am however hopeful that ARM
>> specialists can take this matter over eventually...
>>
>> Regards,
>>
>> /Pete
>>
>> [1]
>> https://github.com/pbatard/edk2/commit/c4ce41094a46f4f3dc7ccc64a906048
>> 13f037b13
>>
>> Pete Batard (6):
>>   MdePkg: Disable some Level 4 warnings for VS2017/ARM
>>   MdePkg/Library/BaseStackCheckLib: Add Null handler for VS2017/ARM
>>   MdePkg/Library/BaseLib: Enable VS2017/ARM builds
>>   ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
>>   MdePkg/Include: Add VA list support for VS2017/ARM
>>   BaseTools/Conf: Add VS2017/ARM support
>>
>> ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++--
>> ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 ++++++--
>> ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++--
>> ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++-
>> ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++-
>> ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 +++++++
>> ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++
>> BaseTools/Conf/build_rule.template                             | 31 ++++++-
>> BaseTools/Conf/tools_def.template                              | 31 +++++++
>> MdePkg/Include/Arm/ProcessorBind.h                             | 96
>> +++++++++++++++-----
>> MdePkg/Include/Base.h                                          | 13 +++
>> MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm                   |  5 +-
>> MdePkg/Library/BaseLib/BaseLib.inf                             | 16 +++-
>> MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf         |  5 +-
>> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c          | 18 ++++
>> 15 files changed, 372 insertions(+), 60 deletions(-)
>> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
>> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
>> create mode 100644
>> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
>>
>> --
>> 2.9.3.windows.2
> 



^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v5 0/6] Add ARM support for VS2017
  2018-01-25 11:31   ` Pete Batard
@ 2018-01-26 15:05     ` Gao, Liming
  2018-01-26 15:20       ` Ard Biesheuvel
  0 siblings, 1 reply; 12+ messages in thread
From: Gao, Liming @ 2018-01-26 15:05 UTC (permalink / raw)
  To: Pete Batard, edk2-devel@lists.01.org
  Cc: ard.biesheuvel@linaro.org, eugene@hp.com

After the change in ArmPkg is reviewed, I will help push this patch serial. 

> -----Original Message-----
> From: Pete Batard [mailto:pete@akeo.ie]
> Sent: Thursday, January 25, 2018 7:32 PM
> To: Gao, Liming <liming.gao@intel.com>; edk2-devel@lists.01.org
> Cc: ard.biesheuvel@linaro.org; eugene@hp.com
> Subject: Re: [PATCH v5 0/6] Add ARM support for VS2017
> 
> Thanks Liming.
> 
>  From the way you framed your comment, I'm not completely sure if
> there's action still needed on my side...
> 
> Do I actually need to resubmit a patch set with "Reviewed By"?
> Or, now that each patch should have flagged as reviewed, are we simply
> supposed to wait for formal integration?
> 
> Regards,
> 
> /Pete
> 
> On 2018.01.25 10:27, Gao, Liming wrote:
> > Pete:
> >    The changes in BaseTools and MdePkg are good to me. You can add my R-B.
> >
> >> -----Original Message-----
> >> From: Pete Batard [mailto:pete@akeo.ie]
> >> Sent: Friday, January 12, 2018 9:33 PM
> >> To: edk2-devel@lists.01.org
> >> Cc: Gao, Liming <liming.gao@intel.com>; ard.biesheuvel@linaro.org;
> >> eugene@hp.com
> >> Subject: [PATCH v5 0/6] Add ARM support for VS2017
> >>
> >> (Same as v4, except for the AREA names where we replaced the RVCT macros,
> >> in
> >> patch 4/6, so that it matches what would have been produced with the
> >> macros)
> >>
> >>
> >> The following series adds ARM compilation support for the VS2017 toolchain.
> >> * PATCH 1 targets the disabling of VS Level 4 warnings. The disabled warnings
> >>   for ARM are now aligned with IA32 and X64.
> >> * PATCH 2 adds a NULL handler for the base stack check, since this is a GCC
> >>   functionality.
> >> * PATCH 3 updates MdePkg/Library/BaseLib so that the RVCT assembly
> >> sources
> >>   are also used for MSFT.
> >> * PATCH 4 adds the required compiler intrinsics replacements for division,
> >>   shift, by reusing the RVCT code, as well as memset/memcpy.
> >> * PATCH 5 adds variable argument handlers for print output. Note that this
> >>   is done without relying on any external headers, with the VA_ARG macro
> >>   having been reverse engineered from MSFT ARM assembly output.
> >> * PATCH 6 enables the selection of ARM in the conf templates.
> >>
> >> With these patches, VS2017 toolchain users should be able to compile
> >> regular UEFI ARM applications using EDK2. Note that, unlike ARM64 support,
> >> ARM support does not require a specific update of Visual Studio 2017, as
> >> the ARM toolchain has been available from the very first release.
> >>
> >> Additional notes:
> >>
> >> We tested compiling and running the full UEFI Shell with this series, as
> >> well as a small set of applications and drivers, and found no issues.
> >> With an additional patch [1], it is also possible to use this proposal to
> >> compile a complete QEMU ARM firmware. As the patch shows, the changes
> >> that
> >> need to be applied to the EDK2 sources to achieve this are actually very
> >> minimal.
> >>
> >> However, the generated firmware does not currently boot, possibly because
> >> of the following warnings being generated by the MS compiler:
> >> - ArmCpuDxe.dll : warning LNK4072: section count 118 exceeds max (96);
> >> image may not run
> >> - UiApp.dll : warning LNK4072: section count 113 exceeds max (96); image may
> >> not run
> >>
> >> As far as I could see, the section count max is hardcoded so a workaround
> >> would be needed to address those.
> >>
> >> Also, because the VS2017 ARM compiler forces a section alignment of 4096
> >> bytes (which in turn forces use to use /FILEALIGN:4096 as a linker option
> >> for the firmware generation), the generated firmware exceeds 2MB and we
> >> had to double its size to 4MB.
> >>
> >> At this stage, since the goal of this series is to allow users to compile
> >> regular ARM UEFI applications using the VS2017 toolchain, I have no plans
> >> to spend more time on the QEMU firmware issues, especially as I suspect
> >> that reducing the firmware size back to 2 MB may not be achievable without
> >> Microsoft altering their compiler. I am however hopeful that ARM
> >> specialists can take this matter over eventually...
> >>
> >> Regards,
> >>
> >> /Pete
> >>
> >> [1]
> >> https://github.com/pbatard/edk2/commit/c4ce41094a46f4f3dc7ccc64a906048
> >> 13f037b13
> >>
> >> Pete Batard (6):
> >>   MdePkg: Disable some Level 4 warnings for VS2017/ARM
> >>   MdePkg/Library/BaseStackCheckLib: Add Null handler for VS2017/ARM
> >>   MdePkg/Library/BaseLib: Enable VS2017/ARM builds
> >>   ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
> >>   MdePkg/Include: Add VA list support for VS2017/ARM
> >>   BaseTools/Conf: Add VS2017/ARM support
> >>
> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++--
> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 ++++++--
> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++--
> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++-
> >> ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++-
> >> ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 +++++++
> >> ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++
> >> BaseTools/Conf/build_rule.template                             | 31 ++++++-
> >> BaseTools/Conf/tools_def.template                              | 31 +++++++
> >> MdePkg/Include/Arm/ProcessorBind.h                             | 96
> >> +++++++++++++++-----
> >> MdePkg/Include/Base.h                                          | 13 +++
> >> MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm                   |  5 +-
> >> MdePkg/Library/BaseLib/BaseLib.inf                             | 16 +++-
> >> MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf         |  5 +-
> >> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c          | 18 ++++
> >> 15 files changed, 372 insertions(+), 60 deletions(-)
> >> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
> >> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
> >> create mode 100644
> >> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
> >>
> >> --
> >> 2.9.3.windows.2
> >


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v5 0/6] Add ARM support for VS2017
  2018-01-26 15:05     ` Gao, Liming
@ 2018-01-26 15:20       ` Ard Biesheuvel
  0 siblings, 0 replies; 12+ messages in thread
From: Ard Biesheuvel @ 2018-01-26 15:20 UTC (permalink / raw)
  To: Gao, Liming; +Cc: Pete Batard, edk2-devel@lists.01.org, eugene@hp.com

On 26 January 2018 at 15:05, Gao, Liming <liming.gao@intel.com> wrote:
> After the change in ArmPkg is reviewed, I will help push this patch serial.
>

That change is

Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

Thanks.

>> -----Original Message-----
>> From: Pete Batard [mailto:pete@akeo.ie]
>> Sent: Thursday, January 25, 2018 7:32 PM
>> To: Gao, Liming <liming.gao@intel.com>; edk2-devel@lists.01.org
>> Cc: ard.biesheuvel@linaro.org; eugene@hp.com
>> Subject: Re: [PATCH v5 0/6] Add ARM support for VS2017
>>
>> Thanks Liming.
>>
>>  From the way you framed your comment, I'm not completely sure if
>> there's action still needed on my side...
>>
>> Do I actually need to resubmit a patch set with "Reviewed By"?
>> Or, now that each patch should have flagged as reviewed, are we simply
>> supposed to wait for formal integration?
>>
>> Regards,
>>
>> /Pete
>>
>> On 2018.01.25 10:27, Gao, Liming wrote:
>> > Pete:
>> >    The changes in BaseTools and MdePkg are good to me. You can add my R-B.
>> >
>> >> -----Original Message-----
>> >> From: Pete Batard [mailto:pete@akeo.ie]
>> >> Sent: Friday, January 12, 2018 9:33 PM
>> >> To: edk2-devel@lists.01.org
>> >> Cc: Gao, Liming <liming.gao@intel.com>; ard.biesheuvel@linaro.org;
>> >> eugene@hp.com
>> >> Subject: [PATCH v5 0/6] Add ARM support for VS2017
>> >>
>> >> (Same as v4, except for the AREA names where we replaced the RVCT macros,
>> >> in
>> >> patch 4/6, so that it matches what would have been produced with the
>> >> macros)
>> >>
>> >>
>> >> The following series adds ARM compilation support for the VS2017 toolchain.
>> >> * PATCH 1 targets the disabling of VS Level 4 warnings. The disabled warnings
>> >>   for ARM are now aligned with IA32 and X64.
>> >> * PATCH 2 adds a NULL handler for the base stack check, since this is a GCC
>> >>   functionality.
>> >> * PATCH 3 updates MdePkg/Library/BaseLib so that the RVCT assembly
>> >> sources
>> >>   are also used for MSFT.
>> >> * PATCH 4 adds the required compiler intrinsics replacements for division,
>> >>   shift, by reusing the RVCT code, as well as memset/memcpy.
>> >> * PATCH 5 adds variable argument handlers for print output. Note that this
>> >>   is done without relying on any external headers, with the VA_ARG macro
>> >>   having been reverse engineered from MSFT ARM assembly output.
>> >> * PATCH 6 enables the selection of ARM in the conf templates.
>> >>
>> >> With these patches, VS2017 toolchain users should be able to compile
>> >> regular UEFI ARM applications using EDK2. Note that, unlike ARM64 support,
>> >> ARM support does not require a specific update of Visual Studio 2017, as
>> >> the ARM toolchain has been available from the very first release.
>> >>
>> >> Additional notes:
>> >>
>> >> We tested compiling and running the full UEFI Shell with this series, as
>> >> well as a small set of applications and drivers, and found no issues.
>> >> With an additional patch [1], it is also possible to use this proposal to
>> >> compile a complete QEMU ARM firmware. As the patch shows, the changes
>> >> that
>> >> need to be applied to the EDK2 sources to achieve this are actually very
>> >> minimal.
>> >>
>> >> However, the generated firmware does not currently boot, possibly because
>> >> of the following warnings being generated by the MS compiler:
>> >> - ArmCpuDxe.dll : warning LNK4072: section count 118 exceeds max (96);
>> >> image may not run
>> >> - UiApp.dll : warning LNK4072: section count 113 exceeds max (96); image may
>> >> not run
>> >>
>> >> As far as I could see, the section count max is hardcoded so a workaround
>> >> would be needed to address those.
>> >>
>> >> Also, because the VS2017 ARM compiler forces a section alignment of 4096
>> >> bytes (which in turn forces use to use /FILEALIGN:4096 as a linker option
>> >> for the firmware generation), the generated firmware exceeds 2MB and we
>> >> had to double its size to 4MB.
>> >>
>> >> At this stage, since the goal of this series is to allow users to compile
>> >> regular ARM UEFI applications using the VS2017 toolchain, I have no plans
>> >> to spend more time on the QEMU firmware issues, especially as I suspect
>> >> that reducing the firmware size back to 2 MB may not be achievable without
>> >> Microsoft altering their compiler. I am however hopeful that ARM
>> >> specialists can take this matter over eventually...
>> >>
>> >> Regards,
>> >>
>> >> /Pete
>> >>
>> >> [1]
>> >> https://github.com/pbatard/edk2/commit/c4ce41094a46f4f3dc7ccc64a906048
>> >> 13f037b13
>> >>
>> >> Pete Batard (6):
>> >>   MdePkg: Disable some Level 4 warnings for VS2017/ARM
>> >>   MdePkg/Library/BaseStackCheckLib: Add Null handler for VS2017/ARM
>> >>   MdePkg/Library/BaseLib: Enable VS2017/ARM builds
>> >>   ArmPkg/Library/CompilerIntrinsicsLib: Enable VS2017/ARM builds
>> >>   MdePkg/Include: Add VA list support for VS2017/ARM
>> >>   BaseTools/Conf: Add VS2017/ARM support
>> >>
>> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/div.asm               | 43 +++++++--
>> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/ldivmod.asm           | 40 ++++++--
>> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/llsr.asm              | 22 +++--
>> >> ArmPkg/Library/CompilerIntrinsicsLib/Arm/uldiv.asm             | 29 +++++-
>> >> ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 16 +++-
>> >> ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c               | 34 +++++++
>> >> ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c               | 33 +++++++
>> >> BaseTools/Conf/build_rule.template                             | 31 ++++++-
>> >> BaseTools/Conf/tools_def.template                              | 31 +++++++
>> >> MdePkg/Include/Arm/ProcessorBind.h                             | 96
>> >> +++++++++++++++-----
>> >> MdePkg/Include/Base.h                                          | 13 +++
>> >> MdePkg/Library/BaseLib/Arm/CpuBreakpoint.asm                   |  5 +-
>> >> MdePkg/Library/BaseLib/BaseLib.inf                             | 16 +++-
>> >> MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf         |  5 +-
>> >> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c          | 18 ++++
>> >> 15 files changed, 372 insertions(+), 60 deletions(-)
>> >> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
>> >> create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
>> >> create mode 100644
>> >> MdePkg/Library/BaseStackCheckLib/BaseStackCheckNull.c
>> >>
>> >> --
>> >> 2.9.3.windows.2
>> >
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-01-26 15:14 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-12 13:33 [PATCH v5 0/6] Add ARM support for VS2017 Pete Batard
2018-01-12 13:33 ` [PATCH v5 1/6] MdePkg: Disable some Level 4 warnings for VS2017/ARM Pete Batard
2018-01-12 13:33 ` [PATCH v5 2/6] MdePkg/Library/BaseStackCheckLib: Add Null handler " Pete Batard
2018-01-12 13:33 ` [PATCH v5 3/6] MdePkg/Library/BaseLib: Enable VS2017/ARM builds Pete Batard
2018-01-12 13:33 ` [PATCH v5 4/6] ArmPkg/Library/CompilerIntrinsicsLib: " Pete Batard
2018-01-15 12:07   ` Ard Biesheuvel
2018-01-12 13:33 ` [PATCH v5 5/6] MdePkg/Include: Add VA list support for VS2017/ARM Pete Batard
2018-01-12 13:33 ` [PATCH v5 6/6] BaseTools/Conf: Add VS2017/ARM support Pete Batard
2018-01-25 10:27 ` [PATCH v5 0/6] Add ARM support for VS2017 Gao, Liming
2018-01-25 11:31   ` Pete Batard
2018-01-26 15:05     ` Gao, Liming
2018-01-26 15:20       ` Ard Biesheuvel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox