.. | .. |
---|
17 | 17 | #define sv_pc r6 |
---|
18 | 18 | #define mask r7 |
---|
19 | 19 | #define sv_lr r8 |
---|
| 20 | +#define loglvl r9 |
---|
20 | 21 | |
---|
21 | 22 | ENTRY(c_backtrace) |
---|
22 | 23 | |
---|
.. | .. |
---|
99 | 100 | @ to ensure 8 byte alignment |
---|
100 | 101 | movs frame, r0 @ if frame pointer is zero |
---|
101 | 102 | beq no_frame @ we have no stack frames |
---|
| 103 | + mov loglvl, r2 |
---|
102 | 104 | tst r1, #0x10 @ 26 or 32-bit mode? |
---|
103 | 105 | moveq mask, #0xfc000003 |
---|
104 | 106 | movne mask, #0 @ mask for 32-bit |
---|
.. | .. |
---|
167 | 169 | mov r1, sv_lr |
---|
168 | 170 | mov r2, frame |
---|
169 | 171 | bic r1, r1, mask @ mask PC/LR for the mode |
---|
| 172 | + mov r3, loglvl |
---|
170 | 173 | bl dump_backtrace_entry |
---|
171 | 174 | |
---|
172 | 175 | /* |
---|
.. | .. |
---|
183 | 186 | ldr r0, [frame] @ locals are stored in |
---|
184 | 187 | @ the preceding frame |
---|
185 | 188 | subeq r0, r0, #4 |
---|
| 189 | + mov r2, loglvl |
---|
186 | 190 | bleq dump_backtrace_stm @ dump saved registers |
---|
187 | 191 | |
---|
188 | 192 | /* |
---|
.. | .. |
---|
196 | 200 | bhi for_each_frame |
---|
197 | 201 | |
---|
198 | 202 | 1006: adr r0, .Lbad |
---|
199 | | - mov r1, frame |
---|
| 203 | + mov r1, loglvl |
---|
| 204 | + mov r2, frame |
---|
200 | 205 | bl printk |
---|
201 | 206 | no_frame: ldmfd sp!, {r4 - r9, fp, pc} |
---|
202 | 207 | ENDPROC(c_backtrace) |
---|
.. | .. |
---|
209 | 214 | .long 1005b, 1006b |
---|
210 | 215 | .popsection |
---|
211 | 216 | |
---|
212 | | -.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n" |
---|
| 217 | +.Lbad: .asciz "%sBacktrace aborted due to bad frame pointer <%p>\n" |
---|
213 | 218 | .align |
---|
214 | 219 | .Lopcode: .word 0xe92d4800 >> 11 @ stmfd sp!, {... fp, lr} |
---|
215 | 220 | .word 0x0b000000 @ bl if these bits are set |
---|