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>
This commit is contained in:
Ard Biesheuvel 2016-08-10 11:43:50 +02:00
parent 66edb631f8
commit d2d0e27c76
2 changed files with 42 additions and 1 deletions

View File

@ -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

View File

@ -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__