hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/arch/arm/lib/backtrace.S
....@@ -1,14 +1,10 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * linux/arch/arm/lib/backtrace.S
34 *
45 * Copyright (C) 1995, 1996 Russell King
56 *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License version 2 as
8
- * published by the Free Software Foundation.
9
- *
107 * 27/03/03 Ian Molton Clean up CONFIG_CPU
11
- *
128 */
139 #include <linux/kern_levels.h>
1410 #include <linux/linkage.h>
....@@ -22,6 +18,7 @@
2218 #define sv_pc r6
2319 #define mask r7
2420 #define offset r8
21
+#define loglvl r9
2522
2623 ENTRY(c_backtrace)
2724
....@@ -29,9 +26,10 @@
2926 ret lr
3027 ENDPROC(c_backtrace)
3128 #else
32
- stmfd sp!, {r4 - r8, lr} @ Save an extra register so we have a location...
29
+ stmfd sp!, {r4 - r9, lr} @ Save an extra register so we have a location...
3330 movs frame, r0 @ if frame pointer is zero
3431 beq no_frame @ we have no stack frames
32
+ mov loglvl, r2
3533
3634 tst r1, #0x10 @ 26 or 32-bit mode?
3735 ARM( moveq mask, #0xfc000003 )
....@@ -70,13 +68,14 @@
7068
7169 1003: ldr r2, [sv_pc, #-4] @ if stmfd sp!, {args} exists,
7270 ldr r3, .Ldsi+4 @ adjust saved 'pc' back one
73
- teq r3, r2, lsr #10 @ instruction
71
+ teq r3, r2, lsr #11 @ instruction
7472 subne r0, sv_pc, #4 @ allow for mov
7573 subeq r0, sv_pc, #8 @ allow for mov + stmia
7674
7775 ldr r1, [frame, #-4] @ get saved lr
7876 mov r2, frame
7977 bic r1, r1, mask @ mask PC/LR for the mode
78
+ mov r3, loglvl
8079 bl dump_backtrace_entry
8180
8281 ldr r1, [sv_pc, #-4] @ if stmfd sp!, {args} exists,
....@@ -84,12 +83,14 @@
8483 teq r3, r1, lsr #11
8584 ldreq r0, [frame, #-8] @ get sp
8685 subeq r0, r0, #4 @ point at the last arg
86
+ mov r2, loglvl
8787 bleq dump_backtrace_stm @ dump saved registers
8888
8989 1004: ldr r1, [sv_pc, #0] @ if stmfd sp!, {..., fp, ip, lr, pc}
9090 ldr r3, .Ldsi @ instruction exists,
9191 teq r3, r1, lsr #11
9292 subeq r0, frame, #16
93
+ mov r2, loglvl
9394 bleq dump_backtrace_stm @ dump saved registers
9495
9596 teq sv_fp, #0 @ zero saved fp means
....@@ -100,9 +101,10 @@
100101 bhi for_each_frame
101102
102103 1006: adr r0, .Lbad
103
- mov r1, frame
104
+ mov r1, loglvl
105
+ mov r2, frame
104106 bl printk
105
-no_frame: ldmfd sp!, {r4 - r8, pc}
107
+no_frame: ldmfd sp!, {r4 - r9, pc}
106108 ENDPROC(c_backtrace)
107109
108110 .pushsection __ex_table,"a"
....@@ -113,7 +115,7 @@
113115 .long 1004b, 1006b
114116 .popsection
115117
116
-.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n"
118
+.Lbad: .asciz "%sBacktrace aborted due to bad frame pointer <%p>\n"
117119 .align
118120 .Ldsi: .word 0xe92dd800 >> 11 @ stmfd sp!, {... fp, ip, lr, pc}
119121 .word 0xe92d0000 >> 11 @ stmfd sp!, {}