avr32: fix out-of-range jump in large kernels
authorAndreas Bießmann <andreas@biessmann.de>
Thu, 24 Oct 2013 10:31:04 +0000 (12:31 +0200)
committerHans-Christian Egtvedt <hegtvedt@cisco.com>
Wed, 20 Nov 2013 08:53:21 +0000 (09:53 +0100)
commitd617b338bbfdd77e9cbd8e7dc949cee3dd73d575
treefb8f14a63ccc6338ec5acc89dfdeb8b449461ff2
parent7a2a74f4b856993218aa7cdeeb6c3103101340db
avr32: fix out-of-range jump in large kernels

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 8d29b7b9f81d6b83d869ff054e6c189d6da73f1f.
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: Andreas Bießmann <andreas@biessmann.de>
Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no>
Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
Cc: stable@vger.kernel.org
arch/avr32/boot/u-boot/head.S
arch/avr32/kernel/entry-avr32b.S