From: David S. Miller Date: Wed, 31 Oct 2007 04:11:28 +0000 (-0700) Subject: [SPARC64]: Fix linkage of enormous kernels. X-Git-Tag: v2.6.24-rc2~58 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=52eb053b7191f1d3017a56e921753e3097876c47;p=linux-2.6-omap-h63xx.git [SPARC64]: Fix linkage of enormous kernels. This was found by make randconfig If the kernel .text is very large, the .fixup section branches are too far away to be relocated correctly. Use "sethi %hi(label), reg; jmpl reg + %lo(label); %g0" sequence instead of the branch to fix this. There is another case in switch_to() involving a branch, which is fixed similarly. Signed-off-by: David S. Miller --- diff --git a/include/asm-sparc64/futex.h b/include/asm-sparc64/futex.h index 876312fe82c..df1097d6ffb 100644 --- a/include/asm-sparc64/futex.h +++ b/include/asm-sparc64/futex.h @@ -17,7 +17,8 @@ "3:\n" \ " .section .fixup,#alloc,#execinstr\n" \ " .align 4\n" \ - "4: ba 3b\n" \ + "4: sethi %%hi(3b), %0\n" \ + " jmpl %0 + %%lo(3b), %%g0\n" \ " mov %5, %0\n" \ " .previous\n" \ " .section __ex_table,\"a\"\n" \ @@ -91,7 +92,8 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) "2:\n" " .section .fixup,#alloc,#execinstr\n" " .align 4\n" - "3: ba 2b\n" + "3: sethi %%hi(2b), %0\n" + " jmpl %0 + %%lo(2b), %%g0\n" " mov %4, %0\n" " .previous\n" " .section __ex_table,\"a\"\n" diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index 159e62b51d7..99a669c190c 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h @@ -178,7 +178,9 @@ do { if (test_thread_flag(TIF_PERFCTR)) { \ "ldx [%%g6 + %9], %%g4\n\t" \ "brz,pt %%o7, 1f\n\t" \ " mov %%g7, %0\n\t" \ - "b,a ret_from_syscall\n\t" \ + "sethi %%hi(ret_from_syscall), %%g1\n\t" \ + "jmpl %%g1 + %%lo(ret_from_syscall), %%g0\n\t" \ + " nop\n\t" \ "1:\n\t" \ : "=&r" (last), "=r" (current), "=r" (current_thread_info_reg), \ "=r" (__local_per_cpu_offset) \ diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h index afe236ba555..93720e7b028 100644 --- a/include/asm-sparc64/uaccess.h +++ b/include/asm-sparc64/uaccess.h @@ -123,7 +123,8 @@ __asm__ __volatile__( \ ".section .fixup,#alloc,#execinstr\n\t" \ ".align 4\n" \ "3:\n\t" \ - "b 2b\n\t" \ + "sethi %%hi(2b), %0\n\t" \ + "jmpl %0 + %%lo(2b), %%g0\n\t" \ " mov %3, %0\n\n\t" \ ".previous\n\t" \ ".section __ex_table,\"a\"\n\t" \ @@ -165,8 +166,9 @@ __asm__ __volatile__( \ ".section .fixup,#alloc,#execinstr\n\t" \ ".align 4\n" \ "3:\n\t" \ + "sethi %%hi(2b), %0\n\t" \ "clr %1\n\t" \ - "b 2b\n\t" \ + "jmpl %0 + %%lo(2b), %%g0\n\t" \ " mov %3, %0\n\n\t" \ ".previous\n\t" \ ".section __ex_table,\"a\"\n\t" \