Rework use of labels in assembly macros.
authorSoby Mathew <soby.mathew@arm.com>
Tue, 19 Aug 2014 10:26:00 +0000 (11:26 +0100)
committerSoby Mathew <soby.mathew@arm.com>
Tue, 19 Aug 2014 13:42:35 +0000 (14:42 +0100)
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
include/common/assert_macros.S
plat/fvp/include/plat_macros.S

index b7d7ac236844665f2793e6b11a4c5cc297b9f80f..fcf5f268abdd98b3827c42a261eeac5aec972560 100644 (file)
@@ -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
 
 
index 45d699bd93e067566de7a3b9843280d73b0b61d1..807972f3d52ed1b057b20fa2bf68d4def9499a7c 100644 (file)
 
        /*
         * 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:
index 5d11d364844ee3ed6d3c355c6f5e479968dbd3ad..892dbfbb96ebd34ac60e1f278603df45bbeb3ed9 100644 (file)
@@ -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"