2 * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #include <mach/mach_types.h>
30 #include <mach/exception_types.h>
31 #include <ppc/exception.h>
32 #include <ppc/proc_reg.h>
33 #include <kdp/kdp_internal.h>
34 #include <ppc/savearea.h>
35 #include <ppc/misc_protos.h>
36 #include <kern/debug.h>
37 #include <IOKit/IOPlatformExpert.h>
39 #include <kern/thread.h>
40 #include <ppc/thread.h>
41 #include <vm/vm_map.h>
44 #define KDP_TEST_HARNESS 0
46 #define dprintf(x) kprintf x
51 void print_saved_state(void *);
54 boolean_t
kdp_call_kdb(void);
56 extern pmap_t kdp_pmap
;
57 extern uint32_t kdp_src_high32
;
60 extern unsigned kdp_vm_read(caddr_t src
, caddr_t dst
, unsigned len
);
63 machine_trace_thread(thread_t thread
, char *tracepos
, char *tracebound
, int nframes
, boolean_t user_p
);
66 machine_trace_thread64(thread_t thread
, char *tracepos
, char *tracebound
, int nframes
, boolean_t user_p
);
69 machine_read64(addr64_t srcaddr
, caddr_t dstaddr
, uint32_t len
);
75 unsigned short *remote_port
,
76 unsigned int exception
,
85 kdp_exception_t
*rq
= (kdp_exception_t
*)&aligned_pkt
;
87 bcopy((char *)pkt
, (char *)rq
, sizeof(*rq
));
88 rq
->hdr
.request
= KDP_EXCEPTION
;
90 rq
->hdr
.seq
= kdp
.exception_seq
;
92 rq
->hdr
.len
= sizeof (*rq
) + sizeof(kdp_exc_info_t
);
95 rq
->exc_info
[0].cpu
= 0;
96 rq
->exc_info
[0].exception
= exception
;
97 rq
->exc_info
[0].code
= code
;
98 rq
->exc_info
[0].subcode
= subcode
;
100 rq
->hdr
.len
+= rq
->n_exc_info
* sizeof (kdp_exc_info_t
);
102 bcopy((char *)rq
, (char *)pkt
, rq
->hdr
.len
);
104 kdp
.exception_ack_needed
= TRUE
;
106 *remote_port
= kdp
.exception_port
;
116 kdp_exception_ack_t aligned_pkt
;
117 kdp_exception_ack_t
*rq
= (kdp_exception_ack_t
*)&aligned_pkt
;
119 if ((size_t)len
< sizeof (*rq
))
122 bcopy((char *)pkt
, (char *)rq
, sizeof(*rq
));
124 if (!rq
->hdr
.is_reply
|| rq
->hdr
.request
!= KDP_EXCEPTION
)
127 dprintf(("kdp_exception_ack seq %x %x\n", rq
->hdr
.seq
, kdp
.exception_seq
));
129 if (rq
->hdr
.seq
== kdp
.exception_seq
) {
130 kdp
.exception_ack_needed
= FALSE
;
138 struct ppc_thread_state
*state
141 struct savearea
*saved_state
;
143 saved_state
= kdp
.saved_state
;
145 bzero((char *)state
,sizeof (struct ppc_thread_state
)) ;
147 state
->srr0
= (unsigned int)saved_state
->save_srr0
;
148 state
->srr1
= (unsigned int)saved_state
->save_srr1
;
149 state
->r0
= (unsigned int)saved_state
->save_r0
;
150 state
->r1
= (unsigned int)saved_state
->save_r1
;
151 state
->r2
= (unsigned int)saved_state
->save_r2
;
152 state
->r3
= (unsigned int)saved_state
->save_r3
;
153 state
->r4
= (unsigned int)saved_state
->save_r4
;
154 state
->r5
= (unsigned int)saved_state
->save_r5
;
155 state
->r6
= (unsigned int)saved_state
->save_r6
;
156 state
->r7
= (unsigned int)saved_state
->save_r7
;
157 state
->r8
= (unsigned int)saved_state
->save_r8
;
158 state
->r9
= (unsigned int)saved_state
->save_r9
;
159 state
->r10
= (unsigned int)saved_state
->save_r10
;
160 state
->r11
= (unsigned int)saved_state
->save_r11
;
161 state
->r12
= (unsigned int)saved_state
->save_r12
;
162 state
->r13
= (unsigned int)saved_state
->save_r13
;
163 state
->r14
= (unsigned int)saved_state
->save_r14
;
164 state
->r15
= (unsigned int)saved_state
->save_r15
;
165 state
->r16
= (unsigned int)saved_state
->save_r16
;
166 state
->r17
= (unsigned int)saved_state
->save_r17
;
167 state
->r18
= (unsigned int)saved_state
->save_r18
;
168 state
->r19
= (unsigned int)saved_state
->save_r19
;
169 state
->r20
= (unsigned int)saved_state
->save_r20
;
170 state
->r21
= (unsigned int)saved_state
->save_r21
;
171 state
->r22
= (unsigned int)saved_state
->save_r22
;
172 state
->r23
= (unsigned int)saved_state
->save_r23
;
173 state
->r24
= (unsigned int)saved_state
->save_r24
;
174 state
->r25
= (unsigned int)saved_state
->save_r25
;
175 state
->r26
= (unsigned int)saved_state
->save_r26
;
176 state
->r27
= (unsigned int)saved_state
->save_r27
;
177 state
->r28
= (unsigned int)saved_state
->save_r28
;
178 state
->r29
= (unsigned int)saved_state
->save_r29
;
179 state
->r30
= (unsigned int)saved_state
->save_r30
;
180 state
->r31
= (unsigned int)saved_state
->save_r31
;
181 state
->cr
= (unsigned int)saved_state
->save_cr
;
182 state
->xer
= (unsigned int)saved_state
->save_xer
;
183 state
->lr
= (unsigned int)saved_state
->save_lr
;
184 state
->ctr
= (unsigned int)saved_state
->save_ctr
;
188 kdp_getintegerstate64(
189 struct ppc_thread_state64
*state
192 struct savearea
*saved_state
;
194 saved_state
= kdp
.saved_state
;
196 bzero((char *)state
,sizeof (struct ppc_thread_state64
)) ;
198 state
->srr0
= saved_state
->save_srr0
;
199 state
->srr1
= saved_state
->save_srr1
;
200 state
->r0
= saved_state
->save_r0
;
201 state
->r1
= saved_state
->save_r1
;
202 state
->r2
= saved_state
->save_r2
;
203 state
->r3
= saved_state
->save_r3
;
204 state
->r4
= saved_state
->save_r4
;
205 state
->r5
= saved_state
->save_r5
;
206 state
->r6
= saved_state
->save_r6
;
207 state
->r7
= saved_state
->save_r7
;
208 state
->r8
= saved_state
->save_r8
;
209 state
->r9
= saved_state
->save_r9
;
210 state
->r10
= saved_state
->save_r10
;
211 state
->r11
= saved_state
->save_r11
;
212 state
->r12
= saved_state
->save_r12
;
213 state
->r13
= saved_state
->save_r13
;
214 state
->r14
= saved_state
->save_r14
;
215 state
->r15
= saved_state
->save_r15
;
216 state
->r16
= saved_state
->save_r16
;
217 state
->r17
= saved_state
->save_r17
;
218 state
->r18
= saved_state
->save_r18
;
219 state
->r19
= saved_state
->save_r19
;
220 state
->r20
= saved_state
->save_r20
;
221 state
->r21
= saved_state
->save_r21
;
222 state
->r22
= saved_state
->save_r22
;
223 state
->r23
= saved_state
->save_r23
;
224 state
->r24
= saved_state
->save_r24
;
225 state
->r25
= saved_state
->save_r25
;
226 state
->r26
= saved_state
->save_r26
;
227 state
->r27
= saved_state
->save_r27
;
228 state
->r28
= saved_state
->save_r28
;
229 state
->r29
= saved_state
->save_r29
;
230 state
->r30
= saved_state
->save_r30
;
231 state
->r31
= saved_state
->save_r31
;
232 state
->cr
= saved_state
->save_cr
;
233 state
->xer
= saved_state
->save_xer
;
234 state
->lr
= saved_state
->save_lr
;
235 state
->ctr
= saved_state
->save_ctr
;
239 kdp_machine_read_regs(
240 __unused
unsigned int cpu
,
248 case PPC_THREAD_STATE
:
249 dprintf(("kdp_readregs THREAD_STATE\n"));
250 kdp_getintegerstate((struct ppc_thread_state
*)data
);
251 *size
= PPC_THREAD_STATE_COUNT
* sizeof(int);
252 return KDPERR_NO_ERROR
;
254 case PPC_THREAD_STATE64
:
255 dprintf(("kdp_readregs THREAD_STATE\n"));
256 kdp_getintegerstate64((struct ppc_thread_state64
*)data
);
257 *size
= PPC_THREAD_STATE64_COUNT
* sizeof(int);
258 return KDPERR_NO_ERROR
;
260 case PPC_FLOAT_STATE
:
261 dprintf(("kdp_readregs THREAD_FPSTATE\n"));
262 bzero((char *)data
,sizeof(struct ppc_float_state
));
263 *size
= PPC_FLOAT_STATE_COUNT
* sizeof(int);
264 return KDPERR_NO_ERROR
;
267 dprintf(("kdp_readregs bad flavor %d\n"));
268 return KDPERR_BADFLAVOR
;
274 struct ppc_thread_state
*state
277 struct savearea
*saved_state
;
279 saved_state
= kdp
.saved_state
;
281 saved_state
->save_srr0
= state
->srr0
;
282 saved_state
->save_srr1
= state
->srr1
;
283 saved_state
->save_r0
= state
->r0
;
284 saved_state
->save_r1
= state
->r1
;
285 saved_state
->save_r2
= state
->r2
;
286 saved_state
->save_r3
= state
->r3
;
287 saved_state
->save_r4
= state
->r4
;
288 saved_state
->save_r5
= state
->r5
;
289 saved_state
->save_r6
= state
->r6
;
290 saved_state
->save_r7
= state
->r7
;
291 saved_state
->save_r8
= state
->r8
;
292 saved_state
->save_r9
= state
->r9
;
293 saved_state
->save_r10
= state
->r10
;
294 saved_state
->save_r11
= state
->r11
;
295 saved_state
->save_r12
= state
->r12
;
296 saved_state
->save_r13
= state
->r13
;
297 saved_state
->save_r14
= state
->r14
;
298 saved_state
->save_r15
= state
->r15
;
299 saved_state
->save_r16
= state
->r16
;
300 saved_state
->save_r17
= state
->r17
;
301 saved_state
->save_r18
= state
->r18
;
302 saved_state
->save_r19
= state
->r19
;
303 saved_state
->save_r20
= state
->r20
;
304 saved_state
->save_r21
= state
->r21
;
305 saved_state
->save_r22
= state
->r22
;
306 saved_state
->save_r23
= state
->r23
;
307 saved_state
->save_r24
= state
->r24
;
308 saved_state
->save_r25
= state
->r25
;
309 saved_state
->save_r26
= state
->r26
;
310 saved_state
->save_r27
= state
->r27
;
311 saved_state
->save_r28
= state
->r28
;
312 saved_state
->save_r29
= state
->r29
;
313 saved_state
->save_r30
= state
->r30
;
314 saved_state
->save_r31
= state
->r31
;
315 saved_state
->save_cr
= state
->cr
;
316 saved_state
->save_xer
= state
->xer
;
317 saved_state
->save_lr
= state
->lr
;
318 saved_state
->save_ctr
= state
->ctr
;
322 kdp_setintegerstate64(
323 struct ppc_thread_state64
*state
326 struct savearea
*saved_state
;
328 saved_state
= kdp
.saved_state
;
330 saved_state
->save_srr0
= state
->srr0
;
331 saved_state
->save_srr1
= state
->srr1
;
332 saved_state
->save_r0
= state
->r0
;
333 saved_state
->save_r1
= state
->r1
;
334 saved_state
->save_r2
= state
->r2
;
335 saved_state
->save_r3
= state
->r3
;
336 saved_state
->save_r4
= state
->r4
;
337 saved_state
->save_r5
= state
->r5
;
338 saved_state
->save_r6
= state
->r6
;
339 saved_state
->save_r7
= state
->r7
;
340 saved_state
->save_r8
= state
->r8
;
341 saved_state
->save_r9
= state
->r9
;
342 saved_state
->save_r10
= state
->r10
;
343 saved_state
->save_r11
= state
->r11
;
344 saved_state
->save_r12
= state
->r12
;
345 saved_state
->save_r13
= state
->r13
;
346 saved_state
->save_r14
= state
->r14
;
347 saved_state
->save_r15
= state
->r15
;
348 saved_state
->save_r16
= state
->r16
;
349 saved_state
->save_r17
= state
->r17
;
350 saved_state
->save_r18
= state
->r18
;
351 saved_state
->save_r19
= state
->r19
;
352 saved_state
->save_r20
= state
->r20
;
353 saved_state
->save_r21
= state
->r21
;
354 saved_state
->save_r22
= state
->r22
;
355 saved_state
->save_r23
= state
->r23
;
356 saved_state
->save_r24
= state
->r24
;
357 saved_state
->save_r25
= state
->r25
;
358 saved_state
->save_r26
= state
->r26
;
359 saved_state
->save_r27
= state
->r27
;
360 saved_state
->save_r28
= state
->r28
;
361 saved_state
->save_r29
= state
->r29
;
362 saved_state
->save_r30
= state
->r30
;
363 saved_state
->save_r31
= state
->r31
;
364 saved_state
->save_cr
= state
->cr
;
365 saved_state
->save_xer
= state
->xer
;
366 saved_state
->save_lr
= state
->lr
;
367 saved_state
->save_ctr
= state
->ctr
;
371 kdp_machine_write_regs(
372 __unused
unsigned int cpu
,
380 case PPC_THREAD_STATE
:
381 dprintf(("kdp_writeregs THREAD_STATE\n"));
382 kdp_setintegerstate((struct ppc_thread_state
*)data
);
385 DumpTheSave((struct savearea
*)data
); /* (TEST/DEBUG) */
387 return KDPERR_NO_ERROR
;
389 case PPC_THREAD_STATE64
:
390 dprintf(("kdp_writeregs THREAD_STATE64\n"));
391 kdp_setintegerstate64((struct ppc_thread_state64
*)data
);
394 DumpTheSave((struct savearea
*)data
); /* (TEST/DEBUG) */
396 return KDPERR_NO_ERROR
;
397 case PPC_FLOAT_STATE
:
398 dprintf(("kdp_writeregs THREAD_FPSTATE\n"));
399 return KDPERR_NO_ERROR
;
402 dprintf(("kdp_writeregs bad flavor %d\n"));
403 return KDPERR_BADFLAVOR
;
408 kdp_machine_hostinfo(
409 kdp_hostinfo_t
*hostinfo
414 hostinfo
->cpus_mask
= 0;
415 hostinfo
->cpu_type
= 0;
417 for (i
= 0; i
< machine_info
.max_cpus
; i
++) {
418 if ((PerProcTable
[i
].ppe_vaddr
== (struct per_proc_info
*)NULL
) ||
419 !(PerProcTable
[i
].ppe_vaddr
->running
))
422 hostinfo
->cpus_mask
|= (1 << i
);
423 if (hostinfo
->cpu_type
== 0) {
424 hostinfo
->cpu_type
= slot_type(i
);
425 hostinfo
->cpu_subtype
= slot_subtype(i
);
435 printf("kdp panic: %s\n", msg
);
439 extern void halt_all_cpus(boolean_t
);
444 printf("Attempting system restart...");
445 /* Call the platform specific restart*/
447 (*PE_halt_restart
)(kPERestartCPU
);
448 /* If we do reach this, give up */
465 kdp_us_spin(int usec
)
470 void print_saved_state(void *state
)
472 struct ppc_thread_state
*saved_state
;
476 printf("pc = 0x%x\n", saved_state
->srr0
);
477 printf("msr = 0x%x\n", saved_state
->srr1
);
478 printf("rp = 0x%x\n", saved_state
->lr
);
479 printf("sp = 0x%x\n", saved_state
->r1
);
486 Debugger("inline call to debugger(machine_startup)");
490 * table to convert system specific code to generic codes for kdb
492 int kdp_trap_codes
[] = {
493 EXC_BAD_ACCESS
, /* 0x0000 INVALID EXCEPTION */
494 EXC_BAD_ACCESS
, /* 0x0100 System reset */
495 EXC_BAD_ACCESS
, /* 0x0200 Machine check */
496 EXC_BAD_ACCESS
, /* 0x0300 Data access */
497 EXC_BAD_ACCESS
, /* 0x0400 Instruction access */
498 EXC_BAD_ACCESS
, /* 0x0500 External interrupt */
499 EXC_BAD_ACCESS
, /* 0x0600 Alignment */
500 EXC_BREAKPOINT
, /* 0x0700 Program - fp exc, ill/priv instr, trap */
501 EXC_ARITHMETIC
, /* 0x0800 Floating point disabled */
502 EXC_SOFTWARE
, /* 0x0900 Decrementer */
503 EXC_BAD_ACCESS
, /* 0x0A00 I/O controller interface */
504 EXC_BAD_ACCESS
, /* 0x0B00 INVALID EXCEPTION */
505 EXC_SOFTWARE
, /* 0x0C00 System call exception */
506 EXC_BREAKPOINT
, /* 0x0D00 Trace */
507 EXC_SOFTWARE
, /* 0x0E00 FP assist */
508 EXC_SOFTWARE
, /* 0x0F00 Performance monitoring */
509 EXC_ARITHMETIC
, /* 0x0F20 Altivec disabled */
510 EXC_BAD_ACCESS
, /* 0x1000 Instruction PTE miss */
511 EXC_BAD_ACCESS
, /* 0x1100 Data load PTE miss */
512 EXC_BAD_ACCESS
, /* 0x1200 Data store PTE miss */
513 EXC_BREAKPOINT
, /* 0x1300 Instruction bkpt */
514 EXC_SOFTWARE
, /* 0x1400 System management */
515 EXC_BAD_ACCESS
, /* 0x1500 INVALID EXCEPTION */
516 EXC_ARITHMETIC
, /* 0x1600 Altivec Assist */
517 EXC_BAD_ACCESS
, /* 0x1700 INVALID EXCEPTION */
518 EXC_BAD_ACCESS
, /* 0x1800 INVALID EXCEPTION */
519 EXC_BAD_ACCESS
, /* 0x1900 INVALID EXCEPTION */
520 EXC_BAD_ACCESS
, /* 0x1A00 INVALID EXCEPTION */
521 EXC_BAD_ACCESS
, /* 0x1B00 INVALID EXCEPTION */
522 EXC_BAD_ACCESS
, /* 0x1C00 INVALID EXCEPTION */
523 EXC_BAD_ACCESS
, /* 0x1D00 INVALID EXCEPTION */
524 EXC_BAD_ACCESS
, /* 0x1E00 INVALID EXCEPTION */
525 EXC_BAD_ACCESS
, /* 0x1F00 INVALID EXCEPTION */
526 EXC_BREAKPOINT
, /* 0x2000 Run Mode/Trace */
527 EXC_BAD_ACCESS
, /* 0x2100 INVALID EXCEPTION */
528 EXC_BAD_ACCESS
, /* 0x2200 INVALID EXCEPTION */
529 EXC_BAD_ACCESS
, /* 0x2300 INVALID EXCEPTION */
530 EXC_BAD_ACCESS
, /* 0x2400 INVALID EXCEPTION */
531 EXC_BAD_ACCESS
, /* 0x2500 INVALID EXCEPTION */
532 EXC_BAD_ACCESS
, /* 0x2600 INVALID EXCEPTION */
533 EXC_BAD_ACCESS
, /* 0x2700 INVALID EXCEPTION */
534 EXC_BAD_ACCESS
, /* 0x2800 INVALID EXCEPTION */
535 EXC_BAD_ACCESS
, /* 0x2900 INVALID EXCEPTION */
536 EXC_BAD_ACCESS
, /* 0x2A00 INVALID EXCEPTION */
537 EXC_BAD_ACCESS
, /* 0x2B00 INVALID EXCEPTION */
538 EXC_BAD_ACCESS
, /* 0x2C00 INVALID EXCEPTION */
539 EXC_BAD_ACCESS
, /* 0x2D00 INVALID EXCEPTION */
540 EXC_BAD_ACCESS
, /* 0x2E00 INVALID EXCEPTION */
541 EXC_BAD_ACCESS
, /* 0x2F00 INVALID EXCEPTION */
542 EXC_SOFTWARE
/* 0x3000 AST trap (software) */
556 #define kdp_code(x) kdp_trap_codes[((x)==T_AST?0x31:(x)/T_VECTOR_SIZE)]
560 unsigned int exception
,
561 struct savearea
*saved_state
569 printf("\nvector=%x, \n", exception
/4);
570 sp
= saved_state
->save_r1
;
571 printf("stack backtrace - sp(%x) ", sp
);
572 fp
= (unsigned int *) *((unsigned int *)sp
);
574 printf("0x%08x ", fp
[2]);
575 fp
= (unsigned int *)*fp
;
581 dump_segment_registers();
585 printf("vector=%d ", exception
/4);
587 kdp_raise_exception(kdp_code(exception
), 0, 0, saved_state
);
590 printf("kdp_trap: kdp_raise_exception() ret\n");
592 if ((unsigned int)(saved_state
->save_srr0
) == 0x7c800008)
593 saved_state
->save_srr0
+= 4; /* BKPT_SIZE */
595 if(saved_state
->save_srr1
& (MASK(MSR_SE
) | MASK(MSR_BE
))) { /* Are we just stepping or continuing */
596 db_run_mode
= STEP_ONCE
; /* We are stepping */
598 else db_run_mode
= STEP_CONTINUE
; /* Otherwise we are continuing */
601 mtspr(dabr
, kdp_dabr
);
613 static void kdp_print_registers(struct savearea
*state
)
616 for (i
=0; i
<32; i
++) {
619 printf(" %08llx",*(&state
->save_r0
+i
));
622 printf("cr = 0x%08x\t\t",state
->save_cr
);
623 printf("xer = 0x%08llx\n",state
->save_xer
);
624 printf("lr = 0x%08llx\t\t",state
->save_lr
);
625 printf("ctr = 0x%08llx\n",state
->save_ctr
);
626 printf("srr0(iar) = 0x%08llx\t\t",state
->save_srr0
);
627 printf("srr1(msr) = 0x%08B\n",state
->save_srr1
,
628 "\x10\x11""EE\x12PR\x13""FP\x14ME\x15""FE0\x16SE\x18"
629 "FE1\x19""AL\x1a""EP\x1bIT\x1c""DT");
633 void kdp_print_backtrace(unsigned, struct savearea
*);
637 unsigned int exception
,
638 struct savearea
*saved_state
)
640 disable_debug_output
= FALSE
;
642 printf("re-entering kdp:\n");
643 printf("vector=%x, \n", exception
/4);
644 kdp_print_registers(saved_state
);
645 print_backtrace(saved_state
);
646 printf("panic: We are hanging here...\n");
650 unsigned int kdp_ml_get_breakinsn(void)
655 #define LR_OFFSET64 16
658 machine_trace_thread(thread_t thread
, char *tracepos
, char *tracebound
, int nframes
, boolean_t user_p
)
660 uint32_t *tracebuf
= (uint32_t *)tracepos
;
662 uint32_t stackptr
= 0;
663 uint32_t stacklimit
= 0xb0000000;
665 uint32_t init_srr0
= 0;
667 uint32_t framesize
= 2 * sizeof(vm_offset_t
);
670 /* Examine the user savearea */
671 init_srr0
= thread
->machine
.upcb
->save_srr0
;
672 stackptr
= thread
->machine
.upcb
->save_r1
;
673 /* This bound isn't useful, but it doesn't hinder us */
674 stacklimit
= 0xffffffff;
675 kdp_pmap
= thread
->task
->map
->pmap
;
678 stackptr
= thread
->machine
.pcb
->save_r1
;
679 init_srr0
= thread
->machine
.pcb
->save_srr0
;
681 /* Fill in the "current" program counter */
682 *tracebuf
++ = init_srr0
;
684 for (framecount
= 0; framecount
< nframes
; framecount
++) {
686 if ((uint32_t) (tracebound
- ((char *)tracebuf
)) < (4 * framesize
)) {
691 *tracebuf
++ = stackptr
;
692 /* Invalid frame, or hit fence */
693 if (!stackptr
|| (stackptr
== fence
)) {
696 /* Stack grows downward */
697 if (stackptr
< prevsp
) {
700 /* Unaligned frame */
701 if (stackptr
& 0x000000F) {
704 if (stackptr
> stacklimit
) {
707 /* Assume there's a saved link register, and read it */
708 if (kdp_vm_read((caddr_t
) (stackptr
+ LR_OFFSET
), (caddr_t
) tracebuf
, sizeof(caddr_t
)) != sizeof(caddr_t
)) {
715 if (kdp_vm_read((caddr_t
) stackptr
, (caddr_t
) &stackptr
, sizeof(caddr_t
)) != sizeof(caddr_t
)) {
720 /* Reset the target pmap */
722 return (uint32_t) (((char *) tracebuf
) - tracepos
);
725 /* Routine to encapsulate the 64-bit address read hack*/
727 machine_read64(addr64_t srcaddr
, caddr_t dstaddr
, uint32_t len
)
729 uint32_t kdp_vm_read_low32
;
732 kdp_src_high32
= srcaddr
>> 32;
733 kdp_vm_read_low32
= srcaddr
& 0x00000000FFFFFFFFUL
;
734 retval
= kdp_vm_read((caddr_t
)kdp_vm_read_low32
, dstaddr
, len
);
740 machine_trace_thread64(thread_t thread
, char *tracepos
, char *tracebound
, int nframes
, boolean_t user_p
)
742 uint64_t *tracebuf
= (uint64_t *)tracepos
;
744 addr64_t stackptr
= 0;
745 uint64_t stacklimit
= 0xb0000000;
747 addr64_t init_srr0
= 0;
749 unsigned framesize
= 2 * sizeof(addr64_t
);
752 init_srr0
= thread
->machine
.upcb
->save_srr0
;
753 stackptr
= thread
->machine
.upcb
->save_r1
;
754 stacklimit
= 0xffffffffffffffffULL
;
755 kdp_pmap
= thread
->task
->map
->pmap
;
758 stackptr
= thread
->machine
.pcb
->save_r1
;
759 init_srr0
= thread
->machine
.pcb
->save_srr0
;
762 *tracebuf
++ = init_srr0
;
764 for (framecount
= 0; framecount
< nframes
; framecount
++) {
766 if ((uint32_t)(tracebound
- ((char *)tracebuf
)) < (4 * framesize
)) {
771 *tracebuf
++ = stackptr
;
773 if (!stackptr
|| (stackptr
== fence
)){
776 if (stackptr
< prevsp
) {
779 if (stackptr
& 0x000000F) {
782 if (stackptr
> stacklimit
) {
786 if (machine_read64(stackptr
+LR_OFFSET64
, (caddr_t
) tracebuf
, sizeof(addr64_t
)) != sizeof(addr64_t
)) {
792 if (machine_read64(stackptr
, (caddr_t
) &stackptr
, sizeof(addr64_t
)) != sizeof(addr64_t
)) {
799 return (uint32_t) (((char *) tracebuf
) - tracepos
);
804 kdp_ml_enter_debugger(void)
806 __asm__
__volatile__("tw 4,r3,r3");