ArmPkg: introduce ASM_FUNC, MOV32/MOV64 and ADRL/LDRL macros

This introduces the ASM_FUNC() macro to annotate function entry points
in assembler files. This allows us to add additional metadata that
marks a function entry point as a function, and allows us to emit
a .section directive for each function, which makes it possible for
the linker to drop unreferenced code.

In addition, introduce a couple of utility macros that we can use to
clean up the code.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Eugene Cohen <eugene@hp.com>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
diff --git a/ArmPkg/Include/AsmMacroIoLib.h b/ArmPkg/Include/AsmMacroIoLib.h
index 551b878..fb73ea9 100644
--- a/ArmPkg/Include/AsmMacroIoLib.h
+++ b/ArmPkg/Include/AsmMacroIoLib.h
@@ -3,6 +3,7 @@
 

   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>

   Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>

+  Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>

 

   This program and the accompanying materials

   are licensed and made available under the terms and conditions of the BSD License

@@ -51,4 +52,26 @@
 

 #endif

 

+#define _ASM_FUNC(Name, Section)    \

+  .global   Name                  ; \

+  .section  #Section, "ax"        ; \

+  .type     Name, %function       ; \

+  Name:

+

+#define ASM_FUNC(Name)            _ASM_FUNC(ASM_PFX(Name), .text. ## Name)

+

+#define MOV32(Reg, Val)                       \

+  movw      Reg, #(Val) & 0xffff            ; \

+  movt      Reg, #(Val) >> 16

+

+#define ADRL(Reg, Sym)                        \

+  movw      Reg, #:lower16:(Sym) - (. + 16) ; \

+  movt      Reg, #:upper16:(Sym) - (. + 12) ; \

+  add       Reg, Reg, pc

+

+#define LDRL(Reg, Sym)                        \

+  movw      Reg, #:lower16:(Sym) - (. + 16) ; \

+  movt      Reg, #:upper16:(Sym) - (. + 12) ; \

+  ldr       Reg, [pc, Reg]

+

 #endif

diff --git a/ArmPkg/Include/AsmMacroIoLibV8.h b/ArmPkg/Include/AsmMacroIoLibV8.h
index 37fa255..e9285f7 100644
--- a/ArmPkg/Include/AsmMacroIoLibV8.h
+++ b/ArmPkg/Include/AsmMacroIoLibV8.h
@@ -3,6 +3,7 @@
 

   Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>

   Portions copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>

+  Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>

 

   This program and the accompanying materials

   are licensed and made available under the terms and conditions of the BSD License

@@ -71,5 +72,22 @@
 

 #endif // __GNUC__

 

-#endif // __MACRO_IO_LIBV8_H__

+#define _ASM_FUNC(Name, Section)    \

+  .global   Name                  ; \

+  .section  #Section, "ax"        ; \

+  .type     Name, %function       ; \

+  Name:

 

+#define ASM_FUNC(Name)            _ASM_FUNC(ASM_PFX(Name), .text. ## Name)

+

+#define MOV32(Reg, Val)                   \

+  movz      Reg, (Val) >> 16, lsl #16   ; \

+  movk      Reg, (Val) & 0xffff

+

+#define MOV64(Reg, Val)                             \

+  movz      Reg, (Val) >> 48, lsl #48             ; \

+  movk      Reg, ((Val) >> 32) & 0xffff, lsl #32  ; \

+  movk      Reg, ((Val) >> 16) & 0xffff, lsl #16  ; \

+  movk      Reg, (Val) & 0xffff

+

+#endif // __MACRO_IO_LIBV8_H__