ARM: 8324/1: move cpu_resume() to .text section
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 25 Mar 2015 06:39:21 +0000 (07:39 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 29 Mar 2015 22:11:57 +0000 (23:11 +0100)
Move cpu_resume() to the .text section where it belongs. Change
the adr reference to sleep_save_sp to an explicit PC relative
reference so sleep_save_sp itself can remain in .data.

This helps prevent linker failure on large kernels, as the code
in the .data section may be too far away to be in range for normal
b/bl instructions.

Reviewed-by: Nicolas Pitre <nico@linaro.org>
Tested-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/sleep.S

index e1e60e5..7d37bfc 100644 (file)
@@ -116,14 +116,7 @@ cpu_resume_after_mmu:
        ldmfd   sp!, {r4 - r11, pc}
 ENDPROC(cpu_resume_after_mmu)
 
-/*
- * Note: Yes, part of the following code is located into the .data section.
- *       This is to allow sleep_save_sp to be accessed with a relative load
- *       while we can't rely on any MMU translation.  We could have put
- *       sleep_save_sp in the .text section as well, but some setups might
- *       insist on it to be truly read-only.
- */
-       .data
+       .text
        .align
 ENTRY(cpu_resume)
 ARM_BE8(setend be)                     @ ensure we are in BE mode
@@ -145,6 +138,8 @@ ARM_BE8(setend be)                  @ ensure we are in BE mode
        compute_mpidr_hash      r1, r4, r5, r6, r0, r3
 1:
        adr     r0, _sleep_save_sp
+       ldr     r2, [r0]
+       add     r0, r0, r2
        ldr     r0, [r0, #SLEEP_SAVE_SP_PHYS]
        ldr     r0, [r0, r1, lsl #2]
 
@@ -156,10 +151,12 @@ THUMB(    bx      r3                      )
 ENDPROC(cpu_resume)
 
        .align 2
+_sleep_save_sp:
+       .long   sleep_save_sp - .
 mpidr_hash_ptr:
        .long   mpidr_hash - .                  @ mpidr_hash struct offset
 
+       .data
        .type   sleep_save_sp, #object
 ENTRY(sleep_save_sp)
-_sleep_save_sp:
        .space  SLEEP_SAVE_SP_SZ                @ struct sleep_save_sp