• Andreas Bießmann's avatar
    avr32: fix out-of-range jump in large kernels · d617b338
    Andreas Bießmann authored
    This patch fixes following error (for big kernels):
    
    ---8<---
    arch/avr32/boot/u-boot/head.o: In function `no_tag_table':
    (.init.text+0x44): relocation truncated to fit: R_AVR32_22H_PCREL against symbol `panic' defined in .text.unlikely section in kernel/built-in.o
    arch/avr32/kernel/built-in.o: In function `bad_return':
    (.ex.text+0x236): relocation truncated to fit: R_AVR32_22H_PCREL against symbol `panic' defined in .text.unlikely section in kernel/built-in.o
    --->8---
    
    It comes up when the kernel increases and 'panic()' is too far away to fit in
    the +/- 2MiB range. Which in turn issues from the 21-bit displacement in
    'br{cond4}' mnemonic which is one of the two ways to do jumps (rjmp has just
    10-bit displacement and therefore a way smaller range). This fact was stated
    before in 8d29b7b9.
    One solution to solve this is to add a local storage for the symbol address
    and just load the $pc with that value.
    Signed-off-by: default avatarAndreas Bießmann <andreas@biessmann.de>
    Acked-by: default avatarHans-Christian Egtvedt <egtvedt@samfundet.no>
    Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
    Cc: stable@vger.kernel.org
    d617b338
head.S 1.83 KB