From aecc0840805672279e4165f4d368a59b5c20771e Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Tue, 19 Aug 2014 11:26:00 +0100 Subject: [PATCH] Rework use of labels in assembly macros. This patch provides a workaround for the ASM_ASSERT label issue and also reworks the use of labels in assembly macros. If the caller of the ASM_ASSERT macro happened to use the label '1' to jump past the ASM_ASSERT macro, it would not have worked since the ASM_ASSERT macro internally used the same label. Hence, as a workaround, this patch makes the label a high number in the expectation that the caller will never use it. Also updated the other assembly macros using numerical labels to named lables. Change-Id: Iec892359db84f2391ad2a83a92141c4d7049776a --- common/aarch64/debug.S | 4 ++-- include/common/assert_macros.S | 9 ++++++--- plat/fvp/include/plat_macros.S | 10 +++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/common/aarch64/debug.S b/common/aarch64/debug.S index b7d7ac236..fcf5f268a 100644 --- a/common/aarch64/debug.S +++ b/common/aarch64/debug.S @@ -58,13 +58,13 @@ assert_msg2: .macro asm_print_line_dec mov x6, #10 /* Divide by 10 after every loop iteration */ mov x5, #MAX_DEC_DIVISOR -1: +dec_print_loop: udiv x0, x4, x5 /* Get the quotient */ msub x4, x0, x5, x4 /* Find the remainder */ add x0, x0, #ASCII_OFFSET_NUM /* Convert to ascii */ bl plat_crash_console_putc udiv x5, x5, x6 /* Reduce divisor */ - cbnz x5, 1b + cbnz x5, dec_print_loop .endm diff --git a/include/common/assert_macros.S b/include/common/assert_macros.S index 45d699bd9..807972f3d 100644 --- a/include/common/assert_macros.S +++ b/include/common/assert_macros.S @@ -30,7 +30,10 @@ /* * Assembler macro to enable asm_assert. Use this macro wherever - * assert is required in assembly. + * assert is required in assembly. Please note that the macro makes + * use of label '300' to provide the logic and the caller + * should make sure that this label is not used to branch prior + * to calling this macro. */ #define ASM_ASSERT(_cc) \ .ifndef .L_assert_filename ;\ @@ -39,8 +42,8 @@ .string __FILE__ ;\ .popsection ;\ .endif ;\ - b._cc 1f ;\ + b._cc 300f ;\ adr x0, .L_assert_filename ;\ mov x1, __LINE__ ;\ b asm_assert ;\ -1: +300: diff --git a/plat/fvp/include/plat_macros.S b/plat/fvp/include/plat_macros.S index 5d11d3648..892dbfbb9 100644 --- a/plat/fvp/include/plat_macros.S +++ b/plat/fvp/include/plat_macros.S @@ -52,7 +52,7 @@ spacer: .macro plat_print_gic_regs adr x0, plat_config ldr w16, [x0, #CONFIG_GICC_BASE_OFFSET] - cbz x16, 1f + cbz x16, exit_print_gic_regs /* gic base address is now in x16 */ adr x6, gic_regs /* Load the gic reg list to x6 */ /* Load the gic regs to gp regs used by str_in_crash_buf_print */ @@ -66,10 +66,10 @@ spacer: add x7, x16, #GICD_ISPENDR adr x4, gicd_pend_reg bl asm_print_str -2: +gicd_ispendr_loop: sub x4, x7, x16 cmp x4, #0x280 - b.eq 1f + b.eq exit_print_gic_regs bl asm_print_hex adr x4, spacer bl asm_print_str @@ -77,8 +77,8 @@ spacer: bl asm_print_hex adr x4, newline bl asm_print_str - b 2b -1: + b gicd_ispendr_loop +exit_print_gic_regs: .endm .section .rodata.cci_reg_name, "aS"