Commit 81479c24 authored by Laura Abbott's avatar Laura Abbott Committed by Russell King

ARM: 6945/1: Add unwinding support for division functions

The software division functions never had unwinding annotations
added. Currently, when a division by zero occurs the backtrace shown
will stop at Ldiv0 or some completely unrelated function. Add
unwinding annotations in hopes of getting a more useful backtrace
when a division by zero occurs.
Signed-off-by: default avatarLaura Abbott <lauraa@codeaurora.org>
Acked-by: default avatarDave Martin <dave.martin@linaro.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 45b95235
...@@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/assembler.h> #include <asm/assembler.h>
#include <asm/unwind.h>
.macro ARM_DIV_BODY dividend, divisor, result, curbit .macro ARM_DIV_BODY dividend, divisor, result, curbit
...@@ -207,6 +207,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -207,6 +207,7 @@ Boston, MA 02111-1307, USA. */
ENTRY(__udivsi3) ENTRY(__udivsi3)
ENTRY(__aeabi_uidiv) ENTRY(__aeabi_uidiv)
UNWIND(.fnstart)
subs r2, r1, #1 subs r2, r1, #1
moveq pc, lr moveq pc, lr
...@@ -230,10 +231,12 @@ ENTRY(__aeabi_uidiv) ...@@ -230,10 +231,12 @@ ENTRY(__aeabi_uidiv)
mov r0, r0, lsr r2 mov r0, r0, lsr r2
mov pc, lr mov pc, lr
UNWIND(.fnend)
ENDPROC(__udivsi3) ENDPROC(__udivsi3)
ENDPROC(__aeabi_uidiv) ENDPROC(__aeabi_uidiv)
ENTRY(__umodsi3) ENTRY(__umodsi3)
UNWIND(.fnstart)
subs r2, r1, #1 @ compare divisor with 1 subs r2, r1, #1 @ compare divisor with 1
bcc Ldiv0 bcc Ldiv0
...@@ -247,10 +250,12 @@ ENTRY(__umodsi3) ...@@ -247,10 +250,12 @@ ENTRY(__umodsi3)
mov pc, lr mov pc, lr
UNWIND(.fnend)
ENDPROC(__umodsi3) ENDPROC(__umodsi3)
ENTRY(__divsi3) ENTRY(__divsi3)
ENTRY(__aeabi_idiv) ENTRY(__aeabi_idiv)
UNWIND(.fnstart)
cmp r1, #0 cmp r1, #0
eor ip, r0, r1 @ save the sign of the result. eor ip, r0, r1 @ save the sign of the result.
...@@ -287,10 +292,12 @@ ENTRY(__aeabi_idiv) ...@@ -287,10 +292,12 @@ ENTRY(__aeabi_idiv)
rsbmi r0, r0, #0 rsbmi r0, r0, #0
mov pc, lr mov pc, lr
UNWIND(.fnend)
ENDPROC(__divsi3) ENDPROC(__divsi3)
ENDPROC(__aeabi_idiv) ENDPROC(__aeabi_idiv)
ENTRY(__modsi3) ENTRY(__modsi3)
UNWIND(.fnstart)
cmp r1, #0 cmp r1, #0
beq Ldiv0 beq Ldiv0
...@@ -310,11 +317,14 @@ ENTRY(__modsi3) ...@@ -310,11 +317,14 @@ ENTRY(__modsi3)
rsbmi r0, r0, #0 rsbmi r0, r0, #0
mov pc, lr mov pc, lr
UNWIND(.fnend)
ENDPROC(__modsi3) ENDPROC(__modsi3)
#ifdef CONFIG_AEABI #ifdef CONFIG_AEABI
ENTRY(__aeabi_uidivmod) ENTRY(__aeabi_uidivmod)
UNWIND(.fnstart)
UNWIND(.save {r0, r1, ip, lr} )
stmfd sp!, {r0, r1, ip, lr} stmfd sp!, {r0, r1, ip, lr}
bl __aeabi_uidiv bl __aeabi_uidiv
...@@ -323,10 +333,12 @@ ENTRY(__aeabi_uidivmod) ...@@ -323,10 +333,12 @@ ENTRY(__aeabi_uidivmod)
sub r1, r1, r3 sub r1, r1, r3
mov pc, lr mov pc, lr
UNWIND(.fnend)
ENDPROC(__aeabi_uidivmod) ENDPROC(__aeabi_uidivmod)
ENTRY(__aeabi_idivmod) ENTRY(__aeabi_idivmod)
UNWIND(.fnstart)
UNWIND(.save {r0, r1, ip, lr} )
stmfd sp!, {r0, r1, ip, lr} stmfd sp!, {r0, r1, ip, lr}
bl __aeabi_idiv bl __aeabi_idiv
ldmfd sp!, {r1, r2, ip, lr} ldmfd sp!, {r1, r2, ip, lr}
...@@ -334,15 +346,18 @@ ENTRY(__aeabi_idivmod) ...@@ -334,15 +346,18 @@ ENTRY(__aeabi_idivmod)
sub r1, r1, r3 sub r1, r1, r3
mov pc, lr mov pc, lr
UNWIND(.fnend)
ENDPROC(__aeabi_idivmod) ENDPROC(__aeabi_idivmod)
#endif #endif
Ldiv0: Ldiv0:
UNWIND(.fnstart)
UNWIND(.pad #4)
UNWIND(.save {lr})
str lr, [sp, #-8]! str lr, [sp, #-8]!
bl __div0 bl __div0
mov r0, #0 @ About as wrong as it could be. mov r0, #0 @ About as wrong as it could be.
ldr pc, [sp], #8 ldr pc, [sp], #8
UNWIND(.fnend)
ENDPROC(Ldiv0)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment