|
@@ -10,6 +10,7 @@
|
|
|
* 27/03/03 Ian Molton Clean up CONFIG_CPU
|
|
|
*
|
|
|
*/
|
|
|
+#include <linux/kern_levels.h>
|
|
|
#include <linux/linkage.h>
|
|
|
#include <asm/assembler.h>
|
|
|
.text
|
|
@@ -83,13 +84,13 @@ for_each_frame: tst frame, mask @ Check for address exceptions
|
|
|
teq r3, r1, lsr #11
|
|
|
ldreq r0, [frame, #-8] @ get sp
|
|
|
subeq r0, r0, #4 @ point at the last arg
|
|
|
- bleq .Ldumpstm @ dump saved registers
|
|
|
+ bleq dump_backtrace_stm @ dump saved registers
|
|
|
|
|
|
1004: ldr r1, [sv_pc, #0] @ if stmfd sp!, {..., fp, ip, lr, pc}
|
|
|
ldr r3, .Ldsi @ instruction exists,
|
|
|
teq r3, r1, lsr #11
|
|
|
subeq r0, frame, #16
|
|
|
- bleq .Ldumpstm @ dump saved registers
|
|
|
+ bleq dump_backtrace_stm @ dump saved registers
|
|
|
|
|
|
teq sv_fp, #0 @ zero saved fp means
|
|
|
beq no_frame @ no further frames
|
|
@@ -112,38 +113,6 @@ ENDPROC(c_backtrace)
|
|
|
.long 1004b, 1006b
|
|
|
.popsection
|
|
|
|
|
|
-#define instr r4
|
|
|
-#define reg r5
|
|
|
-#define stack r6
|
|
|
-
|
|
|
-.Ldumpstm: stmfd sp!, {instr, reg, stack, r7, lr}
|
|
|
- mov stack, r0
|
|
|
- mov instr, r1
|
|
|
- mov reg, #10
|
|
|
- mov r7, #0
|
|
|
-1: mov r3, #1
|
|
|
- ARM( tst instr, r3, lsl reg )
|
|
|
- THUMB( lsl r3, reg )
|
|
|
- THUMB( tst instr, r3 )
|
|
|
- beq 2f
|
|
|
- add r7, r7, #1
|
|
|
- teq r7, #6
|
|
|
- moveq r7, #0
|
|
|
- adr r3, .Lcr
|
|
|
- addne r3, r3, #1 @ skip newline
|
|
|
- ldr r2, [stack], #-4
|
|
|
- mov r1, reg
|
|
|
- adr r0, .Lfp
|
|
|
- bl printk
|
|
|
-2: subs reg, reg, #1
|
|
|
- bpl 1b
|
|
|
- teq r7, #0
|
|
|
- adrne r0, .Lcr
|
|
|
- blne printk
|
|
|
- ldmfd sp!, {instr, reg, stack, r7, pc}
|
|
|
-
|
|
|
-.Lfp: .asciz " r%d:%08x%s"
|
|
|
-.Lcr: .asciz "\n"
|
|
|
.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n"
|
|
|
.align
|
|
|
.Ldsi: .word 0xe92dd800 >> 11 @ stmfd sp!, {... fp, ip, lr, pc}
|