asm_macros: set the default assembly code alignment to 4 byte
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 31 Aug 2017 05:29:34 +0000 (14:29 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 31 Aug 2017 09:45:19 +0000 (18:45 +0900)
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>
include/common/asm_macros_common.S

index dbc9e2d308533407400c1a354b5784544661e245..6a02e18eef65d0ad8fa44d10aeff489d758b522c 100644 (file)
         * 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