提交 6de6066c 编写于 作者: Y Yuriy Kolerov 提交者: Vineet Gupta

ARC: change some branchs to jumps to resolve linkage errors

When kernel's binary becomes large enough (32M and more) errors
may occur during the final linkage stage. It happens because
the build system uses short relocations for ARC  by default.
This problem may be easily resolved by passing -mlong-calls
option to GCC to use long absolute jumps (j) instead of short
relative branchs (b).

But there are fragments of pure assembler code exist which use
branchs in inappropriate places and cause a linkage error because
of relocations overflow.

First of these fragments is .fixup insertion in futex.h and
unaligned.c. It inserts a code in the separate section (.fixup)
with branch instruction. It leads to the linkage error when
kernel becomes large.

Second of these fragments is calling scheduler's functions
(common kernel code) from entry.S of ARC's code. When kernel's
binary becomes large it may lead to the linkage error because
scheduler may occur far enough from ARC's code in the final
binary.
Signed-off-by: NYuriy Kolerov <yuriy.kolerov@synopsys.com>
Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
上级 eb2cd8b7
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
" .section .fixup,\"ax\" \n" \ " .section .fixup,\"ax\" \n" \
" .align 4 \n" \ " .align 4 \n" \
"4: mov %0, %4 \n" \ "4: mov %0, %4 \n" \
" b 3b \n" \ " j 3b \n" \
" .previous \n" \ " .previous \n" \
" .section __ex_table,\"a\" \n" \ " .section __ex_table,\"a\" \n" \
" .align 4 \n" \ " .align 4 \n" \
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
" .section .fixup,\"ax\" \n" \ " .section .fixup,\"ax\" \n" \
" .align 4 \n" \ " .align 4 \n" \
"4: mov %0, %4 \n" \ "4: mov %0, %4 \n" \
" b 3b \n" \ " j 3b \n" \
" .previous \n" \ " .previous \n" \
" .section __ex_table,\"a\" \n" \ " .section __ex_table,\"a\" \n" \
" .align 4 \n" \ " .align 4 \n" \
...@@ -178,7 +178,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 expval, ...@@ -178,7 +178,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 expval,
"3: \n" "3: \n"
" .section .fixup,\"ax\" \n" " .section .fixup,\"ax\" \n"
"4: mov %0, %5 \n" "4: mov %0, %5 \n"
" b 3b \n" " j 3b \n"
" .previous \n" " .previous \n"
" .section __ex_table,\"a\" \n" " .section __ex_table,\"a\" \n"
" .align 4 \n" " .align 4 \n"
......
...@@ -42,7 +42,7 @@ ENTRY(ret_from_fork) ...@@ -42,7 +42,7 @@ ENTRY(ret_from_fork)
; when the forked child comes here from the __switch_to function ; when the forked child comes here from the __switch_to function
; r0 has the last task pointer. ; r0 has the last task pointer.
; put last task in scheduler queue ; put last task in scheduler queue
bl @schedule_tail jl @schedule_tail
ld r9, [sp, PT_status32] ld r9, [sp, PT_status32]
brne r9, 0, 1f brne r9, 0, 1f
...@@ -320,7 +320,7 @@ resume_user_mode_begin: ...@@ -320,7 +320,7 @@ resume_user_mode_begin:
; --- (Slow Path #1) task preemption --- ; --- (Slow Path #1) task preemption ---
bbit0 r9, TIF_NEED_RESCHED, .Lchk_pend_signals bbit0 r9, TIF_NEED_RESCHED, .Lchk_pend_signals
mov blink, resume_user_mode_begin ; tail-call to U mode ret chks mov blink, resume_user_mode_begin ; tail-call to U mode ret chks
b @schedule ; BTST+Bnz causes relo error in link j @schedule ; BTST+Bnz causes relo error in link
.Lchk_pend_signals: .Lchk_pend_signals:
IRQ_ENABLE r10 IRQ_ENABLE r10
...@@ -381,7 +381,7 @@ resume_kernel_mode: ...@@ -381,7 +381,7 @@ resume_kernel_mode:
bbit0 r9, TIF_NEED_RESCHED, .Lrestore_regs bbit0 r9, TIF_NEED_RESCHED, .Lrestore_regs
; Invoke PREEMPTION ; Invoke PREEMPTION
bl preempt_schedule_irq jl preempt_schedule_irq
; preempt_schedule_irq() always returns with IRQ disabled ; preempt_schedule_irq() always returns with IRQ disabled
#endif #endif
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
" .section .fixup,\"ax\"\n" \ " .section .fixup,\"ax\"\n" \
" .align 4\n" \ " .align 4\n" \
"3: mov %0, 1\n" \ "3: mov %0, 1\n" \
" b 2b\n" \ " j 2b\n" \
" .previous\n" \ " .previous\n" \
" .section __ex_table,\"a\"\n" \ " .section __ex_table,\"a\"\n" \
" .align 4\n" \ " .align 4\n" \
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
" .section .fixup,\"ax\"\n" \ " .section .fixup,\"ax\"\n" \
" .align 4\n" \ " .align 4\n" \
"4: mov %0, 1\n" \ "4: mov %0, 1\n" \
" b 3b\n" \ " j 3b\n" \
" .previous\n" \ " .previous\n" \
" .section __ex_table,\"a\"\n" \ " .section __ex_table,\"a\"\n" \
" .align 4\n" \ " .align 4\n" \
...@@ -113,7 +113,7 @@ ...@@ -113,7 +113,7 @@
" .section .fixup,\"ax\"\n" \ " .section .fixup,\"ax\"\n" \
" .align 4\n" \ " .align 4\n" \
"6: mov %0, 1\n" \ "6: mov %0, 1\n" \
" b 5b\n" \ " j 5b\n" \
" .previous\n" \ " .previous\n" \
" .section __ex_table,\"a\"\n" \ " .section __ex_table,\"a\"\n" \
" .align 4\n" \ " .align 4\n" \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册