aboutsummaryrefslogtreecommitdiffstats
path: root/include/common
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2017-08-31 14:29:34 +0900
committerMasahiro Yamada <yamada.masahiro@socionext.com>2017-08-31 18:45:19 +0900
commitfed18b3aec0f575752eeca0ca8c24d7dd16dac78 (patch)
tree084b5e3ff0a61c7aec9c5a1f86ec709e7614a017 /include/common
parentd818a02cb489eae1f99cabf949d47e56347e4537 (diff)
downloadplatform_external_arm-trusted-firmware-fed18b3aec0f575752eeca0ca8c24d7dd16dac78.tar.gz
platform_external_arm-trusted-firmware-fed18b3aec0f575752eeca0ca8c24d7dd16dac78.tar.bz2
platform_external_arm-trusted-firmware-fed18b3aec0f575752eeca0ca8c24d7dd16dac78.zip
asm_macros: set the default assembly code alignment to 4 byte
Assembly routines are usually defined by using "func" and "endfunc": func foo ... endfunc foo Currently, the "func" macro does not specify ".align" directive by default. It causes unaligned instruction under some circumstances. As far as I tested, this problem happens for GCC 5 or older. It did not happen for GCC 6 or newer. Taking into account that GCC 4.x / 5.x is still used, make sure that assembly code is at least 4 byte aligned. [ How to reproduce the problem ] For example, use GCC 5.3 downloaded from Linaro: http://releases.linaro.org/components/toolchain/binaries/5.3-2016.05/ aarch64-linux-gnu/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu.tar.xz Expand mbedtls-2.4.2 to the current directory. Try the following: $ git log --oneline -1 77544ef Merge pull request #1071 from jeenu-arm/syntax-fix $ aarch64-linux-gnu-gcc --version | head -1 aarch64-linux-gnu-gcc (Linaro GCC 5.3-2016.05) 5.3.1 20160412 $ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=uniphier \ TRUSTED_BOARD_BOOT=1 MBEDTLS_DIR=mbedtls-2.4.2 ( snip build log ) $ aarch64-linux-gnu-nm build/uniphier/release/bl1/bl1.elf | grep handler 00000000800088f4 T bl1_fwu_smc_handler 00000000800084c8 T bl1_smc_handler 000000008000a6e0 t _panic_handler 000000008000a8e0 W plat_error_handler 000000008000a8e8 W plat_panic_handler 000000008000a8d8 W plat_reset_handler 000000008000a39f T reset_handler 000000008000a367 t smc_handler 000000008000a2ef t smc_handler64 You will notice "smc_handler64", "reset_handler", etc. are not properly aligned. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Diffstat (limited to 'include/common')
-rw-r--r--include/common/asm_macros_common.S13
1 files changed, 6 insertions, 7 deletions
diff --git a/include/common/asm_macros_common.S b/include/common/asm_macros_common.S
index dbc9e2d30..6a02e18ee 100644
--- a/include/common/asm_macros_common.S
+++ b/include/common/asm_macros_common.S
@@ -12,11 +12,12 @@
* to enable elimination of unused code during linking. It also adds
* basic debug information to enable call stack printing most of the
* time. The optional _align parameter can be used to force a
- * non-standard alignment (indicated in powers of 2). Do *not* try to
- * use a raw .align directive. Since func switches to a new section,
- * this would not have the desired effect.
+ * non-standard alignment (indicated in powers of 2). The default is
+ * _align=2 because both Aarch32 and Aarch64 instructions must be
+ * word aligned. Do *not* try to use a raw .align directive. Since func
+ * switches to a new section, this would not have the desired effect.
*/
- .macro func _name, _align=-1
+ .macro func _name, _align=2
/*
* Add Call Frame Information entry in the .debug_frame section for
* debugger consumption. This enables callstack printing in debuggers.
@@ -36,9 +37,7 @@
* .debug_frame
*/
.cfi_startproc
- .if (\_align) != -1
- .align \_align
- .endif
+ .align \_align
\_name:
.endm