Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52eb053b authored by David S. Miller's avatar David S. Miller
Browse files

[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: default avatarDavid S. Miller <davem@davemloft.net>
parent d6898556
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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"
+3 −1
Original line number Diff line number Diff line
@@ -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)					\
+4 −2
Original line number Diff line number Diff line
@@ -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"					\