Commit 64726e6d authored by Julius Werner's avatar Julius Werner
Browse files

Add new alignment parameter to func assembler macro

Assembler programmers are used to being able to define functions with a
specific aligment with a pattern like this:

    .align X
  myfunction:

However, this pattern is subtly broken when instead of a direct label
like 'myfunction:', you use the 'func myfunction' macro that's standard
in Trusted Firmware. Since the func macro declares a new section for the
function, the .align directive written above it actually applies to the
*previous* section in the assembly file, and the function it was
supposed to apply to is linked with default alignment.

An extreme case can be seen in Rockchip's plat_helpers.S which contains
this code:

  [...]
  endfunc plat_crash_console_putc

  .align 16
  func platform_cpu_warmboot
  [...]

This assembles into the following plat_helpers.o:

  Sections:
  Idx Name                             Size  [...]  Algn
   9 .text.plat_crash_console_putc 00010000  [...]  2**16
  10 .text.platform_cpu_warmboot   00000080  [...]  2**3

As...
parent 1a52aca5
...@@ -43,10 +43,7 @@ ...@@ -43,10 +43,7 @@
msr spsr_el1, \reg2 msr spsr_el1, \reg2
.endm .endm
.section .text, "ax" func tsp_entrypoint _align=3
.align 3
func tsp_entrypoint
/* --------------------------------------------- /* ---------------------------------------------
* Set the exception vector to something sane. * Set the exception vector to something sane.
......
/* /*
* Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -11,9 +11,12 @@ ...@@ -11,9 +11,12 @@
* code into a separate text section based on the function name * code into a separate text section based on the function name
* to enable elimination of unused code during linking. It also adds * to enable elimination of unused code during linking. It also adds
* basic debug information to enable call stack printing most of the * basic debug information to enable call stack printing most of the
* time. * 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.
*/ */
.macro func _name .macro func _name, _align=-1
/* /*
* Add Call Frame Information entry in the .debug_frame section for * Add Call Frame Information entry in the .debug_frame section for
* debugger consumption. This enables callstack printing in debuggers. * debugger consumption. This enables callstack printing in debuggers.
...@@ -33,6 +36,9 @@ ...@@ -33,6 +36,9 @@
* .debug_frame * .debug_frame
*/ */
.cfi_startproc .cfi_startproc
.if (\_align) != -1
.align \_align
.endif
\_name: \_name:
.endm .endm
......
...@@ -15,8 +15,7 @@ ...@@ -15,8 +15,7 @@
.global v7_asm .global v7_asm
.global v7_asm_end .global v7_asm_end
.align 3 func pm_asm_code _align=3
func pm_asm_code
mov x0, 0 mov x0, 0
msr oslar_el1, x0 msr oslar_el1, x0
......
...@@ -307,8 +307,7 @@ endfunc plat_reset_handler ...@@ -307,8 +307,7 @@ endfunc plat_reset_handler
* Secure entrypoint function for CPU boot * Secure entrypoint function for CPU boot
* ---------------------------------------- * ----------------------------------------
*/ */
.align 6 func tegra_secure_entrypoint _align=6
func tegra_secure_entrypoint
#if ERRATA_TEGRA_INVALIDATE_BTB_AT_BOOT #if ERRATA_TEGRA_INVALIDATE_BTB_AT_BOOT
......
...@@ -12,11 +12,10 @@ ...@@ -12,11 +12,10 @@
#define TEGRA186_SMMU_CTX_SIZE 0x420 #define TEGRA186_SMMU_CTX_SIZE 0x420
.align 4
.globl tegra186_cpu_reset_handler .globl tegra186_cpu_reset_handler
/* CPU reset handler routine */ /* CPU reset handler routine */
func tegra186_cpu_reset_handler func tegra186_cpu_reset_handler _align=4
/* /*
* The TZRAM loses state during System Suspend. We use this * The TZRAM loses state during System Suspend. We use this
* information to decide if the reset handler is running after a * information to decide if the reset handler is running after a
......
...@@ -112,8 +112,7 @@ endfunc plat_crash_console_putc ...@@ -112,8 +112,7 @@ endfunc plat_crash_console_putc
* cpus online or resume enterpoint * cpus online or resume enterpoint
* -------------------------------------------------------------------- * --------------------------------------------------------------------
*/ */
.align 16 func platform_cpu_warmboot _align=16
func platform_cpu_warmboot
mrs x0, MPIDR_EL1 mrs x0, MPIDR_EL1
and x19, x0, #MPIDR_CPU_MASK and x19, x0, #MPIDR_CPU_MASK
and x20, x0, #MPIDR_CLUSTER_MASK and x20, x0, #MPIDR_CLUSTER_MASK
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment