| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: db_trace.c,v 1.61 2023/04/12 17:53:32 riastradh Exp $ */ | | 1 | /* $NetBSD: db_trace.c,v 1.62 2023/04/12 19:47:41 riastradh Exp $ */ |
2 | /* $OpenBSD: db_trace.c,v 1.3 1997/03/21 02:10:48 niklas Exp $ */ | | 2 | /* $OpenBSD: db_trace.c,v 1.3 1997/03/21 02:10:48 niklas Exp $ */ |
3 | | | 3 | |
4 | /* | | 4 | /* |
5 | * Mach Operating System | | 5 | * Mach Operating System |
6 | * Copyright (c) 1992 Carnegie Mellon University | | 6 | * Copyright (c) 1992 Carnegie Mellon University |
7 | * All Rights Reserved. | | 7 | * All Rights Reserved. |
8 | * | | 8 | * |
9 | * Permission to use, copy, modify and distribute this software and its | | 9 | * Permission to use, copy, modify and distribute this software and its |
10 | * documentation is hereby granted, provided that both the copyright | | 10 | * documentation is hereby granted, provided that both the copyright |
11 | * notice and this permission notice appear in all copies of the | | 11 | * notice and this permission notice appear in all copies of the |
12 | * software, derivative works or modified versions, and any portions | | 12 | * software, derivative works or modified versions, and any portions |
13 | * thereof, and that both notices appear in supporting documentation. | | 13 | * thereof, and that both notices appear in supporting documentation. |
14 | * | | 14 | * |
| @@ -18,27 +18,27 @@ | | | @@ -18,27 +18,27 @@ |
18 | * | | 18 | * |
19 | * Carnegie Mellon requests users of this software to return to | | 19 | * Carnegie Mellon requests users of this software to return to |
20 | * | | 20 | * |
21 | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU | | 21 | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU |
22 | * School of Computer Science | | 22 | * School of Computer Science |
23 | * Carnegie Mellon University | | 23 | * Carnegie Mellon University |
24 | * Pittsburgh PA 15213-3890 | | 24 | * Pittsburgh PA 15213-3890 |
25 | * | | 25 | * |
26 | * any improvements or extensions that they make and grant Carnegie Mellon | | 26 | * any improvements or extensions that they make and grant Carnegie Mellon |
27 | * the rights to redistribute these changes. | | 27 | * the rights to redistribute these changes. |
28 | */ | | 28 | */ |
29 | | | 29 | |
30 | #include <sys/cdefs.h> | | 30 | #include <sys/cdefs.h> |
31 | __KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.61 2023/04/12 17:53:32 riastradh Exp $"); | | 31 | __KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.62 2023/04/12 19:47:41 riastradh Exp $"); |
32 | | | 32 | |
33 | #ifdef _KERNEL_OPT | | 33 | #ifdef _KERNEL_OPT |
34 | #include "opt_ppcarch.h" | | 34 | #include "opt_ppcarch.h" |
35 | #endif | | 35 | #endif |
36 | | | 36 | |
37 | #include <sys/param.h> | | 37 | #include <sys/param.h> |
38 | #include <sys/proc.h> | | 38 | #include <sys/proc.h> |
39 | #include <sys/kernel.h> | | 39 | #include <sys/kernel.h> |
40 | | | 40 | |
41 | #include <uvm/uvm_extern.h> | | 41 | #include <uvm/uvm_extern.h> |
42 | | | 42 | |
43 | #include <machine/db_machdep.h> | | 43 | #include <machine/db_machdep.h> |
44 | #include <machine/pmap.h> | | 44 | #include <machine/pmap.h> |
| @@ -59,26 +59,33 @@ __KERNEL_RCSID(0, "$NetBSD: db_trace.c,v | | | @@ -59,26 +59,33 @@ __KERNEL_RCSID(0, "$NetBSD: db_trace.c,v |
59 | #endif | | 59 | #endif |
60 | | | 60 | |
61 | #ifndef _KERNEL /* crash(8) */ | | 61 | #ifndef _KERNEL /* crash(8) */ |
62 | #include <unistd.h> | | 62 | #include <unistd.h> |
63 | #define PAGE_SIZE ((unsigned)sysconf(_SC_PAGESIZE)) | | 63 | #define PAGE_SIZE ((unsigned)sysconf(_SC_PAGESIZE)) |
64 | #endif | | 64 | #endif |
65 | | | 65 | |
66 | #include <ddb/db_access.h> | | 66 | #include <ddb/db_access.h> |
67 | #include <ddb/db_interface.h> | | 67 | #include <ddb/db_interface.h> |
68 | #include <ddb/db_proc.h> | | 68 | #include <ddb/db_proc.h> |
69 | #include <ddb/db_sym.h> | | 69 | #include <ddb/db_sym.h> |
70 | #include <ddb/db_variables.h> | | 70 | #include <ddb/db_variables.h> |
71 | | | 71 | |
| | | 72 | #define R(P) \ |
| | | 73 | ({ \ |
| | | 74 | __typeof__(*(P)) __db_tmp; \ |
| | | 75 | db_read_bytes((db_addr_t)(P), sizeof(*(P)), (char *)&__db_tmp); \ |
| | | 76 | __db_tmp; \ |
| | | 77 | }) |
| | | 78 | |
72 | const struct db_variable db_regs[] = { | | 79 | const struct db_variable db_regs[] = { |
73 | { "r0", (long *)&ddb_regs.r[0], FCN_NULL, NULL }, | | 80 | { "r0", (long *)&ddb_regs.r[0], FCN_NULL, NULL }, |
74 | { "r1", (long *)&ddb_regs.r[1], FCN_NULL, NULL }, | | 81 | { "r1", (long *)&ddb_regs.r[1], FCN_NULL, NULL }, |
75 | { "r2", (long *)&ddb_regs.r[2], FCN_NULL, NULL }, | | 82 | { "r2", (long *)&ddb_regs.r[2], FCN_NULL, NULL }, |
76 | { "r3", (long *)&ddb_regs.r[3], FCN_NULL, NULL }, | | 83 | { "r3", (long *)&ddb_regs.r[3], FCN_NULL, NULL }, |
77 | { "r4", (long *)&ddb_regs.r[4], FCN_NULL, NULL }, | | 84 | { "r4", (long *)&ddb_regs.r[4], FCN_NULL, NULL }, |
78 | { "r5", (long *)&ddb_regs.r[5], FCN_NULL, NULL }, | | 85 | { "r5", (long *)&ddb_regs.r[5], FCN_NULL, NULL }, |
79 | { "r6", (long *)&ddb_regs.r[6], FCN_NULL, NULL }, | | 86 | { "r6", (long *)&ddb_regs.r[6], FCN_NULL, NULL }, |
80 | { "r7", (long *)&ddb_regs.r[7], FCN_NULL, NULL }, | | 87 | { "r7", (long *)&ddb_regs.r[7], FCN_NULL, NULL }, |
81 | { "r8", (long *)&ddb_regs.r[8], FCN_NULL, NULL }, | | 88 | { "r8", (long *)&ddb_regs.r[8], FCN_NULL, NULL }, |
82 | { "r9", (long *)&ddb_regs.r[9], FCN_NULL, NULL }, | | 89 | { "r9", (long *)&ddb_regs.r[9], FCN_NULL, NULL }, |
83 | { "r10", (long *)&ddb_regs.r[10], FCN_NULL, NULL }, | | 90 | { "r10", (long *)&ddb_regs.r[10], FCN_NULL, NULL }, |
84 | { "r11", (long *)&ddb_regs.r[11], FCN_NULL, NULL }, | | 91 | { "r11", (long *)&ddb_regs.r[11], FCN_NULL, NULL }, |
| @@ -99,27 +106,27 @@ const struct db_variable db_regs[] = { | | | @@ -99,27 +106,27 @@ const struct db_variable db_regs[] = { |
99 | { "r26", (long *)&ddb_regs.r[26], FCN_NULL, NULL }, | | 106 | { "r26", (long *)&ddb_regs.r[26], FCN_NULL, NULL }, |
100 | { "r27", (long *)&ddb_regs.r[27], FCN_NULL, NULL }, | | 107 | { "r27", (long *)&ddb_regs.r[27], FCN_NULL, NULL }, |
101 | { "r28", (long *)&ddb_regs.r[28], FCN_NULL, NULL }, | | 108 | { "r28", (long *)&ddb_regs.r[28], FCN_NULL, NULL }, |
102 | { "r29", (long *)&ddb_regs.r[29], FCN_NULL, NULL }, | | 109 | { "r29", (long *)&ddb_regs.r[29], FCN_NULL, NULL }, |
103 | { "r30", (long *)&ddb_regs.r[30], FCN_NULL, NULL }, | | 110 | { "r30", (long *)&ddb_regs.r[30], FCN_NULL, NULL }, |
104 | { "r31", (long *)&ddb_regs.r[31], FCN_NULL, NULL }, | | 111 | { "r31", (long *)&ddb_regs.r[31], FCN_NULL, NULL }, |
105 | { "iar", (long *)&ddb_regs.iar, FCN_NULL, NULL }, | | 112 | { "iar", (long *)&ddb_regs.iar, FCN_NULL, NULL }, |
106 | { "msr", (long *)&ddb_regs.msr, FCN_NULL, NULL }, | | 113 | { "msr", (long *)&ddb_regs.msr, FCN_NULL, NULL }, |
107 | { "lr", (long *)&ddb_regs.lr, FCN_NULL, NULL }, | | 114 | { "lr", (long *)&ddb_regs.lr, FCN_NULL, NULL }, |
108 | { "ctr", (long *)&ddb_regs.ctr, FCN_NULL, NULL }, | | 115 | { "ctr", (long *)&ddb_regs.ctr, FCN_NULL, NULL }, |
109 | { "cr", (long *)&ddb_regs.cr, FCN_NULL, NULL }, | | 116 | { "cr", (long *)&ddb_regs.cr, FCN_NULL, NULL }, |
110 | { "xer", (long *)&ddb_regs.xer, FCN_NULL, NULL }, | | 117 | { "xer", (long *)&ddb_regs.xer, FCN_NULL, NULL }, |
111 | { "mq", (long *)&ddb_regs.mq, FCN_NULL, NULL }, | | 118 | { "mq", (long *)&ddb_regs.mq, FCN_NULL, NULL }, |
112 | #ifdef PPC_IBM4XX | | 119 | #ifdef PPC_IBM4XX /* XXX crash(8) */ |
113 | { "dear", (long *)&ddb_regs.dear, FCN_NULL, NULL }, | | 120 | { "dear", (long *)&ddb_regs.dear, FCN_NULL, NULL }, |
114 | { "esr", (long *)&ddb_regs.esr, FCN_NULL, NULL }, | | 121 | { "esr", (long *)&ddb_regs.esr, FCN_NULL, NULL }, |
115 | { "pid", (long *)&ddb_regs.pid, FCN_NULL, NULL }, | | 122 | { "pid", (long *)&ddb_regs.pid, FCN_NULL, NULL }, |
116 | #endif | | 123 | #endif |
117 | }; | | 124 | }; |
118 | const struct db_variable * const db_eregs = db_regs + sizeof (db_regs)/sizeof (db_regs[0]); | | 125 | const struct db_variable * const db_eregs = db_regs + sizeof (db_regs)/sizeof (db_regs[0]); |
119 | | | 126 | |
120 | /* | | 127 | /* |
121 | * Frame tracing. | | 128 | * Frame tracing. |
122 | */ | | 129 | */ |
123 | void | | 130 | void |
124 | db_stack_trace_print(db_expr_t addr, bool have_addr, db_expr_t count, | | 131 | db_stack_trace_print(db_expr_t addr, bool have_addr, db_expr_t count, |
125 | const char *modif, void (*pr)(const char *, ...)) | | 132 | const char *modif, void (*pr)(const char *, ...)) |
| @@ -155,177 +162,188 @@ db_stack_trace_print(db_expr_t addr, boo | | | @@ -155,177 +162,188 @@ db_stack_trace_print(db_expr_t addr, boo |
155 | kernel_only = false; | | 162 | kernel_only = false; |
156 | if (c == 'f') | | 163 | if (c == 'f') |
157 | full = true; | | 164 | full = true; |
158 | } | | 165 | } |
159 | | | 166 | |
160 | if (have_addr) { | | 167 | if (have_addr) { |
161 | if (trace_thread) { | | 168 | if (trace_thread) { |
162 | struct proc *p; | | 169 | struct proc *p; |
163 | struct lwp *l; | | 170 | struct lwp *l; |
164 | struct pcb *pcb; | | 171 | struct pcb *pcb; |
165 | | | 172 | |
166 | if (lwpaddr) { | | 173 | if (lwpaddr) { |
167 | l = (struct lwp *)addr; | | 174 | l = (struct lwp *)addr; |
168 | p = l->l_proc; | | 175 | p = R(&l->l_proc); |
169 | (*pr)("trace: pid %d ", p->p_pid); | | 176 | (*pr)("trace: pid %d ", R(&p->p_pid)); |
170 | } else { | | 177 | } else { |
171 | (*pr)("trace: pid %d ", (int)addr); | | 178 | (*pr)("trace: pid %d ", (int)addr); |
172 | p = db_proc_find((pid_t)addr); | | 179 | p = db_proc_find((pid_t)addr); |
173 | if (p == NULL) { | | 180 | if (p == NULL) { |
174 | (*pr)("not found\n"); | | 181 | (*pr)("not found\n"); |
175 | return; | | 182 | return; |
176 | } | | 183 | } |
177 | l = LIST_FIRST(&p->p_lwps); | | 184 | l = R(&LIST_FIRST(&p->p_lwps)); |
178 | if (l == NULL) { | | 185 | if (l == NULL) { |
179 | (*pr)("trace: no LWP?\n"); | | 186 | (*pr)("trace: no LWP?\n"); |
180 | return; | | 187 | return; |
181 | } | | 188 | } |
182 | } | | 189 | } |
183 | (*pr)("lid %d ", l->l_lid); | | 190 | (*pr)("lid %d ", R(&l->l_lid)); |
184 | pcb = lwp_getpcb(l); | | 191 | pcb = lwp_getpcb(l); |
185 | frame = (db_addr_t)pcb->pcb_sp; | | 192 | frame = (db_addr_t)R(&pcb->pcb_sp); |
186 | (*pr)("at %p\n", frame); | | 193 | (*pr)("at %p\n", frame); |
187 | } else | | 194 | } else |
188 | frame = (db_addr_t)addr; | | 195 | frame = (db_addr_t)addr; |
189 | } else { | | 196 | } else { |
190 | frame = (db_addr_t)ddb_regs.r[1]; | | 197 | frame = (db_addr_t)ddb_regs.r[1]; |
191 | } | | 198 | } |
192 | for (;;) { | | 199 | for (;;) { |
193 | if (frame < PAGE_SIZE) | | 200 | if (frame < PAGE_SIZE) |
194 | break; | | 201 | break; |
195 | frame = *(db_addr_t *)frame; | | 202 | frame = R((db_addr_t *)frame); |
196 | next_frame: | | 203 | next_frame: |
197 | args = (db_addr_t *)(frame + 8); | | 204 | args = (db_addr_t *)(frame + 8); |
198 | if (frame < PAGE_SIZE) | | 205 | if (frame < PAGE_SIZE) |
199 | break; | | 206 | break; |
200 | if (count-- == 0) | | 207 | if (count-- == 0) |
201 | break; | | 208 | break; |
202 | | | 209 | |
203 | lr = *(db_addr_t *)(frame + 4) - 4; | | 210 | lr = R((db_addr_t *)(frame + 4)) - 4; |
204 | if ((lr & 3) || (lr < 0x100)) { | | 211 | if ((lr & 3) || (lr < 0x100)) { |
205 | (*pr)("saved LR(0x%x) is invalid.", lr); | | 212 | (*pr)("saved LR(0x%x) is invalid.", lr); |
206 | break; | | 213 | break; |
207 | } | | 214 | } |
208 | | | 215 | |
209 | (*pr)("0x%08lx: ", frame); | | 216 | (*pr)("0x%08lx: ", frame); |
210 | if (lr + 4 == (db_addr_t) trapexit || | | 217 | if (lr + 4 == (db_addr_t) trapexit || |
211 | #if !defined(_KERNEL) || defined(PPC_BOOKE) | | 218 | #if !defined(_KERNEL) || defined(PPC_BOOKE) /* XXX crash(*) */ |
212 | lr + 4 == (db_addr_t) intrcall || | | 219 | lr + 4 == (db_addr_t) intrcall || |
213 | #endif | | 220 | #endif |
214 | lr + 4 == (db_addr_t) sctrapexit) { | | 221 | lr + 4 == (db_addr_t) sctrapexit) { |
215 | const char *trapstr; | | 222 | const char *trapstr; |
216 | struct trapframe *tf = &((struct ktrapframe *)frame)->ktf_tf; | | 223 | struct trapframe *tf = |
217 | (*pr)("%s ", tf->tf_srr1 & PSL_PR ? "user" : "kernel"); | | 224 | &((struct ktrapframe *)frame)->ktf_tf; |
| | | 225 | (*pr)("%s ", |
| | | 226 | R(&tf->tf_srr1) & PSL_PR ? "user" : "kernel"); |
218 | if (lr + 4 == (db_addr_t) sctrapexit) { | | 227 | if (lr + 4 == (db_addr_t) sctrapexit) { |
219 | (*pr)("SC trap #%d by ", tf->tf_fixreg[0]); | | 228 | (*pr)("SC trap #%d by ", R(&tf->tf_fixreg[0])); |
220 | goto print_trap; | | 229 | goto print_trap; |
221 | } | | 230 | } |
222 | switch (tf->tf_exc) { | | 231 | switch (R(&tf->tf_exc)) { |
223 | case EXC_DSI: | | 232 | case EXC_DSI: |
224 | #ifdef PPC_OEA | | 233 | #ifdef PPC_OEA /* XXX crash(*) */ |
225 | (*pr)("DSI %s trap @ %#x by ", | | 234 | (*pr)("DSI %s trap @ %#x by ", |
226 | tf->tf_dsisr & DSISR_STORE ? "write" : "read", | | 235 | (R(&tf->tf_dsisr) & DSISR_STORE |
227 | tf->tf_dar); | | 236 | ? "write" |
| | | 237 | : "read"), |
| | | 238 | R(&tf->tf_dar)); |
228 | #endif | | 239 | #endif |
229 | #ifdef PPC_IBM4XX | | 240 | #ifdef PPC_IBM4XX /* XXX crash(*) */ |
230 | trapstr = "DSI"; | | 241 | trapstr = "DSI"; |
231 | dsi: | | 242 | dsi: |
232 | (*pr)("%s %s trap @ %#x by ", trapstr, | | 243 | (*pr)("%s %s trap @ %#x by ", trapstr, |
233 | tf->tf_esr & ESR_DST ? "write" : "read", | | 244 | (R(&tf->tf_esr) & ESR_DST |
234 | tf->tf_dear); | | 245 | ? "write" |
| | | 246 | : "read"), |
| | | 247 | R(&tf->tf_dear)); |
235 | #endif | | 248 | #endif |
236 | goto print_trap; | | 249 | goto print_trap; |
237 | case EXC_ALI: | | 250 | case EXC_ALI: |
238 | #ifdef PPC_OEA | | 251 | #ifdef PPC_OEA /* XXX crash(8) */ |
239 | (*pr)("ALI trap @ %#x (DSISR %#x) ", | | 252 | (*pr)("ALI trap @ %#x (DSISR %#x) ", |
240 | tf->tf_dar, tf->tf_dsisr); | | 253 | R(&tf->tf_dar), R(&tf->tf_dsisr)); |
241 | goto print_trap; | | 254 | goto print_trap; |
242 | #else | | 255 | #else |
243 | trapstr = "ALI"; break; | | 256 | trapstr = "ALI"; break; |
244 | #endif | | 257 | #endif |
245 | case EXC_ISI: trapstr = "ISI"; break; | | 258 | case EXC_ISI: trapstr = "ISI"; break; |
246 | case EXC_PGM: trapstr = "PGM"; break; | | 259 | case EXC_PGM: trapstr = "PGM"; break; |
247 | case EXC_SC: trapstr = "SC"; break; | | 260 | case EXC_SC: trapstr = "SC"; break; |
248 | case EXC_EXI: trapstr = "EXI"; break; | | 261 | case EXC_EXI: trapstr = "EXI"; break; |
249 | case EXC_MCHK: trapstr = "MCHK"; break; | | 262 | case EXC_MCHK: trapstr = "MCHK"; break; |
250 | case EXC_VEC: trapstr = "VEC"; break; | | 263 | case EXC_VEC: trapstr = "VEC"; break; |
251 | case EXC_FPU: trapstr = "FPU"; break; | | 264 | case EXC_FPU: trapstr = "FPU"; break; |
252 | case EXC_FPA: trapstr = "FPA"; break; | | 265 | case EXC_FPA: trapstr = "FPA"; break; |
253 | case EXC_DECR: trapstr = "DECR"; break; | | 266 | case EXC_DECR: trapstr = "DECR"; break; |
254 | case EXC_BPT: trapstr = "BPT"; break; | | 267 | case EXC_BPT: trapstr = "BPT"; break; |
255 | case EXC_TRC: trapstr = "TRC"; break; | | 268 | case EXC_TRC: trapstr = "TRC"; break; |
256 | case EXC_RUNMODETRC: trapstr = "RUNMODETRC"; break; | | 269 | case EXC_RUNMODETRC: trapstr = "RUNMODETRC"; break; |
257 | case EXC_PERF: trapstr = "PERF"; break; | | 270 | case EXC_PERF: trapstr = "PERF"; break; |
258 | case EXC_SMI: trapstr = "SMI"; break; | | 271 | case EXC_SMI: trapstr = "SMI"; break; |
259 | case EXC_RST: trapstr = "RST"; break; | | 272 | case EXC_RST: trapstr = "RST"; break; |
260 | case EXC_DTMISS: trapstr = "DTMISS"; | | 273 | case EXC_DTMISS: trapstr = "DTMISS"; |
261 | #ifdef PPC_IBM4XX | | 274 | #ifdef PPC_IBM4XX /* XXX crash(8) */ |
262 | goto dsi; | | 275 | goto dsi; |
263 | #endif | | 276 | #endif |
264 | break; | | 277 | break; |
265 | case EXC_ITMISS: trapstr = "ITMISS"; break; | | 278 | case EXC_ITMISS: trapstr = "ITMISS"; break; |
266 | case EXC_FIT: trapstr = "FIT"; break; | | 279 | case EXC_FIT: trapstr = "FIT"; break; |
267 | case EXC_PIT: trapstr = "PIT"; break; | | 280 | case EXC_PIT: trapstr = "PIT"; break; |
268 | case EXC_WDOG: trapstr = "WDOG"; break; | | 281 | case EXC_WDOG: trapstr = "WDOG"; break; |
269 | default: trapstr = NULL; break; | | 282 | default: trapstr = NULL; break; |
270 | } | | 283 | } |
271 | if (trapstr != NULL) { | | 284 | if (trapstr != NULL) { |
272 | (*pr)("%s trap by ", trapstr); | | 285 | (*pr)("%s trap by ", trapstr); |
273 | } else { | | 286 | } else { |
274 | (*pr)("trap %#x by ", tf->tf_exc); | | 287 | (*pr)("trap %#x by ", R(&tf->tf_exc)); |
275 | } | | 288 | } |
276 | print_trap: | | 289 | print_trap: |
277 | lr = (db_addr_t) tf->tf_srr0; | | 290 | lr = (db_addr_t)R(&tf->tf_srr0); |
278 | diff = 0; | | 291 | diff = 0; |
279 | symname = NULL; | | 292 | symname = NULL; |
280 | if (in_kernel && (tf->tf_srr1 & PSL_PR) == 0) { | | 293 | if (in_kernel && (R(&tf->tf_srr1) & PSL_PR) == 0) { |
281 | sym = db_search_symbol(lr, DB_STGY_ANY, &diff); | | 294 | sym = db_search_symbol(lr, DB_STGY_ANY, &diff); |
282 | db_symbol_values(sym, &symname, 0); | | 295 | db_symbol_values(sym, &symname, 0); |
283 | } | | 296 | } |
284 | if (symname == NULL || !strcmp(symname, "end")) { | | 297 | if (symname == NULL || !strcmp(symname, "end")) { |
285 | (*pr)("%p: srr1=%#x\n", lr, tf->tf_srr1); | | 298 | (*pr)("%p: srr1=%#x\n", lr, R(&tf->tf_srr1)); |
286 | } else { | | 299 | } else { |
287 | (*pr)("%s+%#x: srr1=%#x\n", symname, | | 300 | (*pr)("%s+%#x: srr1=%#x\n", symname, |
288 | diff, tf->tf_srr1); | | 301 | diff, R(&tf->tf_srr1)); |
289 | } | | 302 | } |
290 | (*pr)("%-10s r1=%#x cr=%#x xer=%#x ctr=%#x", | | 303 | (*pr)("%-10s r1=%#x cr=%#x xer=%#x ctr=%#x", |
291 | "", tf->tf_fixreg[1], tf->tf_cr, tf->tf_xer, tf->tf_ctr); | | 304 | "", |
292 | #ifdef PPC_OEA | | 305 | R(&tf->tf_fixreg[1]), |
293 | if (tf->tf_exc == EXC_DSI) | | 306 | R(&tf->tf_cr), |
294 | (*pr)(" dsisr=%#x", tf->tf_dsisr); | | 307 | R(&tf->tf_xer), |
295 | #ifdef PPC_OEA601 | | 308 | R(&tf->tf_ctr)); |
296 | if ((mfpvr() >> 16) == MPC601) | | 309 | #ifdef PPC_OEA /* XXX crash(8) */ |
297 | (*pr)(" mq=%#x", tf->tf_mq); | | 310 | if (R(&tf->tf_exc) == EXC_DSI) |
| | | 311 | (*pr)(" dsisr=%#x", R(&tf->tf_dsisr)); |
| | | 312 | #ifdef PPC_OEA601 /* XXX crash(8) */ |
| | | 313 | if ((mfpvr() >> 16) == MPC601) /* XXX crash(8) */ |
| | | 314 | (*pr)(" mq=%#x", R(&tf->tf_mq)); |
298 | #endif /* PPC_OEA601 */ | | 315 | #endif /* PPC_OEA601 */ |
299 | #endif /* PPC_OEA */ | | 316 | #endif /* PPC_OEA */ |
300 | #ifdef PPC_IBM4XX | | 317 | #ifdef PPC_IBM4XX /* XXX crash(8) */ |
301 | if (tf->tf_exc == EXC_DSI || | | 318 | if (R(&tf->tf_exc) == EXC_DSI || |
302 | tf->tf_exc == EXC_DTMISS) | | 319 | R(&tf->tf_exc) == EXC_DTMISS) |
303 | (*pr)(" dear=%#x", tf->tf_dear); | | 320 | (*pr)(" dear=%#x", R(&tf->tf_dear)); |
304 | (*pr)(" esr=%#x pid=%#x", tf->tf_esr, tf->tf_pid); | | 321 | (*pr)(" esr=%#x pid=%#x", R(&tf->tf_esr), |
| | | 322 | R(&tf->tf_pid)); |
305 | #endif | | 323 | #endif |
306 | (*pr)("\n"); | | 324 | (*pr)("\n"); |
307 | frame = (db_addr_t) tf->tf_fixreg[1]; | | 325 | frame = (db_addr_t)R(&tf->tf_fixreg[1]); |
308 | in_kernel = !(tf->tf_srr1 & PSL_PR); | | 326 | in_kernel = !(R(&tf->tf_srr1) & PSL_PR); |
309 | if (kernel_only && !in_kernel) | | 327 | if (kernel_only && !in_kernel) |
310 | break; | | 328 | break; |
311 | goto next_frame; | | 329 | goto next_frame; |
312 | } | | 330 | } |
313 | | | 331 | |
314 | diff = 0; | | 332 | diff = 0; |
315 | symname = NULL; | | 333 | symname = NULL; |
316 | if (in_kernel) { | | 334 | if (in_kernel) { |
317 | sym = db_search_symbol(lr, DB_STGY_ANY, &diff); | | 335 | sym = db_search_symbol(lr, DB_STGY_ANY, &diff); |
318 | db_symbol_values(sym, &symname, 0); | | 336 | db_symbol_values(sym, &symname, 0); |
319 | } | | 337 | } |
320 | if (symname == NULL || !strcmp(symname, "end")) | | 338 | if (symname == NULL || !strcmp(symname, "end")) |
321 | (*pr)("at %p", lr); | | 339 | (*pr)("at %p", lr); |
322 | else | | 340 | else |
323 | (*pr)("at %s+%#x", symname, diff); | | 341 | (*pr)("at %s+%#x", symname, diff); |
324 | if (full) | | 342 | if (full) |
325 | /* Print all the args stored in that stackframe. */ | | 343 | /* Print all the args stored in that stackframe. */ |
326 | (*pr)("(%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx)", | | 344 | (*pr)("(%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx)", |
327 | args[0], args[1], args[2], args[3], | | 345 | R(&args[0]), R(&args[1]), R(&args[2]), R(&args[3]), |
328 | args[4], args[5], args[6], args[7]); | | 346 | R(&args[4]), R(&args[5]), R(&args[6]), R(&args[7])); |
329 | (*pr)("\n"); | | 347 | (*pr)("\n"); |
330 | } | | 348 | } |
331 | } | | 349 | } |