| .. | .. |
|---|
| 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 |
|---|