X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/4452a7af2eac33dbad800bcc91f2399d62c18f53..7e4a7d3939db04e70062ae6c7bf24b8c8b2f5a7c:/osfmk/i386/db_trace.c diff --git a/osfmk/i386/db_trace.c b/osfmk/i386/db_trace.c index 2a61d9bf4..a14bb16b5 100644 --- a/osfmk/i386/db_trace.c +++ b/osfmk/i386/db_trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -83,7 +83,7 @@ #include extern jmp_buf_t *db_recover; -struct x86_kernel_state32 ddb_null_kregs; +struct x86_kernel_state ddb_null_kregs; extern kmod_info_t *kmod; @@ -116,12 +116,12 @@ struct i386_kregs { char *name; unsigned int offset; } i386_kregs[] = { - { "ebx", (unsigned int)(&((struct x86_kernel_state32 *)0)->k_ebx) }, - { "esp", (unsigned int)(&((struct x86_kernel_state32 *)0)->k_esp) }, - { "ebp", (unsigned int)(&((struct x86_kernel_state32 *)0)->k_ebp) }, - { "edi", (unsigned int)(&((struct x86_kernel_state32 *)0)->k_edi) }, - { "esi", (unsigned int)(&((struct x86_kernel_state32 *)0)->k_esi) }, - { "eip", (unsigned int)(&((struct x86_kernel_state32 *)0)->k_eip) }, + { "ebx", (unsigned int)(&((struct x86_kernel_state *)0)->k_ebx) }, + { "esp", (unsigned int)(&((struct x86_kernel_state *)0)->k_esp) }, + { "ebp", (unsigned int)(&((struct x86_kernel_state *)0)->k_ebp) }, + { "edi", (unsigned int)(&((struct x86_kernel_state *)0)->k_edi) }, + { "esi", (unsigned int)(&((struct x86_kernel_state *)0)->k_esi) }, + { "eip", (unsigned int)(&((struct x86_kernel_state *)0)->k_eip) }, { 0 } }; @@ -345,6 +345,9 @@ struct interrupt_frame { int if_efl; /* saved efl(iret_i) */ }; +extern const char *trap_type[]; +extern int TRAP_TYPES; + /* * Figure out the next frame up in the call stack. * For trap(), we print the address of the faulting instruction and @@ -363,66 +366,65 @@ db_nextframe( int frame_type, /* in */ thread_t thr_act) /* in */ { - x86_saved_state32_t *iss32; - extern char * trap_type[]; - extern int TRAP_TYPES; - + x86_saved_state32_t *iss32; struct interrupt_frame *ifp; task_t task = (thr_act != THREAD_NULL)? thr_act->task: TASK_NULL; switch(frame_type) { case TRAP: - /* - * We know that trap() has 1 argument and we know that - * it is an (x86_saved_state32_t *). - */ - iss32 = (x86_saved_state32_t *) - db_get_task_value((int)&((*fp)->f_arg0),4,FALSE,task); - - if (iss32->trapno >= 0 && iss32->trapno < TRAP_TYPES) { - db_printf(">>>>> %s trap at ", - trap_type[iss32->trapno]); - } else { - db_printf(">>>>> trap (number %d) at ", - iss32->trapno & 0xffff); - } - db_task_printsym(iss32->eip, DB_STGY_PROC, task); - db_printf(" <<<<<\n"); - *fp = (struct i386_frame *)iss32->ebp; - *ip = (db_addr_t)iss32->eip; - break; + /* + * We know that trap() has 1 argument and we know that + * it is an (strcut x86_saved_state32_t *). + */ + iss32 = (x86_saved_state32_t *) + db_get_task_value((int)&((*fp)->f_arg0),4,FALSE,task); + + if (iss32->trapno >= 0 && iss32->trapno < TRAP_TYPES) { + db_printf(">>>>> %s trap at ", + trap_type[iss32->trapno]); + } else { + db_printf(">>>>> trap (number %d) at ", + iss32->trapno & 0xffff); + } + db_task_printsym(iss32->eip, DB_STGY_PROC, task); + db_printf(" <<<<<\n"); + *fp = (struct i386_frame *)iss32->ebp; + *ip = (db_addr_t)iss32->eip; + break; + case INTERRUPT: - if (*lfp == 0) { - db_printf(">>>>> interrupt <<<<<\n"); - goto miss_frame; - } - db_printf(">>>>> interrupt at "); - ifp = (struct interrupt_frame *)(*lfp); - *fp = ifp->if_frame; - if (ifp->if_iretaddr == db_return_to_iret_symbol_value) { - *ip = ((x86_saved_state32_t *) ifp->if_edx)->eip; - } else - *ip = (db_addr_t) ifp->if_eip; - db_task_printsym(*ip, DB_STGY_PROC, task); - db_printf(" <<<<<\n"); - break; + if (*lfp == 0) { + db_printf(">>>>> interrupt <<<<<\n"); + goto miss_frame; + } + db_printf(">>>>> interrupt at "); + ifp = (struct interrupt_frame *)(*lfp); + *fp = ifp->if_frame; + if (ifp->if_iretaddr == db_return_to_iret_symbol_value) { + *ip = ((x86_saved_state32_t *)ifp->if_edx)->eip; + } else + *ip = (db_addr_t)ifp->if_eip; + db_task_printsym(*ip, DB_STGY_PROC, task); + db_printf(" <<<<<\n"); + break; + case SYSCALL: - if (thr_act != THREAD_NULL && thr_act->machine.pcb) { - iss32 = (x86_saved_state32_t *)thr_act->machine.pcb->iss; + if (thr_act != THREAD_NULL && thr_act->machine.pcb) { + iss32 = (x86_saved_state32_t *)thr_act->machine.pcb->iss; - *ip = (db_addr_t)(iss32->eip); - *fp = (struct i386_frame *)(iss32->ebp); - } - break; - /* falling down for unknown case */ - default: - miss_frame: - *ip = (db_addr_t) - db_get_task_value((int)&(*fp)->f_retaddr, 4, FALSE, task); - *lfp = *fp; - *fp = (struct i386_frame *) - db_get_task_value((int)&(*fp)->f_frame, 4, FALSE, task); - break; + *ip = (db_addr_t)(iss32->eip); + *fp = (struct i386_frame *)(iss32->ebp); + } + break; + + default: /* falling down for unknown case */ +miss_frame: + *ip = (db_addr_t) + db_get_task_value((int)&(*fp)->f_retaddr, 4, FALSE, task); + *lfp = *fp; + *fp = (struct i386_frame *) + db_get_task_value((int)&(*fp)->f_frame, 4, FALSE, task); + break; } } @@ -507,7 +509,7 @@ db_stack_trace_cmd( if (count == -1) count = 65535; - next_thread: +next_thread: top_act = THREAD_NULL; user_frame = 0; @@ -565,8 +567,8 @@ db_stack_trace_cmd( iss32 = (x86_saved_state32_t *)th->machine.pcb->iss; - frame = (struct i386_frame *) (iss32->ebp); - callpc = (db_addr_t) (iss32->eip); + frame = (struct i386_frame *) (iss32->ebp); + callpc = (db_addr_t) (iss32->eip); } else { int cpu; @@ -586,11 +588,11 @@ db_stack_trace_cmd( */ iss32 = (x86_saved_state32_t *)th->machine.pcb->iss; - frame = (struct i386_frame *) (iss32->ebp); - callpc = (db_addr_t) (iss32->eip); + frame = (struct i386_frame *) (iss32->ebp); + callpc = (db_addr_t) (iss32->eip); } else { if (cpu == real_ncpus) { - register struct x86_kernel_state32 *iks; + register struct x86_kernel_state *iks; int r; iks = STACK_IKS(th->kernel_stack); @@ -618,12 +620,12 @@ db_stack_trace_cmd( iss32 = (x86_saved_state32_t *)cpu_datap(cpu)->cpu_kdb_saved_state; - frame = (struct i386_frame *) (iss32->ebp); - callpc = (db_addr_t) (iss32->eip); + frame = (struct i386_frame *) (iss32->ebp); + callpc = (db_addr_t) (iss32->eip); + } } } } - } } else { frame = (struct i386_frame *)addr; th = (db_default_act)? db_default_act: current_thread(); @@ -758,7 +760,7 @@ db_stack_trace_cmd( } db_printf("\n"); - next_frame: +next_frame: lastcallpc = callpc; db_nextframe(&lastframe, &frame, &callpc, frame_type, (user_frame) ? th : THREAD_NULL); @@ -794,7 +796,7 @@ db_stack_trace_cmd( } } - thread_done: +thread_done: if (trace_all_threads) { if (top_act != THREAD_NULL) th = top_act; @@ -809,26 +811,29 @@ db_stack_trace_cmd( } } -extern int kdp_vm_read(caddr_t, caddr_t, unsigned int ); +extern mach_vm_size_t kdp_machine_vm_read(mach_vm_address_t, caddr_t, mach_vm_size_t); extern boolean_t kdp_trans_off; /* * Print out 256 bytes of real storage * * dr [entaddr] */ -void db_display_real(db_expr_t addr, __unused int have_addr, __unused db_expr_t count, __unused char * modif) { - +void +db_display_real(db_expr_t addr, boolean_t have_addr, db_expr_t count, + char *modif) +{ int i; unsigned int xbuf[8]; unsigned read_result = 0; /* Print 256 bytes */ for(i=0; i<8; i++) { -/* Do a physical read using kdp_vm_read(), rather than replicating the same +/* + * Do a physical read using kdp_machine_vm_read(), rather than replicating the same * facility */ kdp_trans_off = 1; - read_result = kdp_vm_read(addr, &xbuf[0], 32); + read_result = kdp_machine_vm_read(addr, &xbuf[0], 32); kdp_trans_off = 0; if (read_result != 32) @@ -845,10 +850,11 @@ void db_display_real(db_expr_t addr, __unused int have_addr, __unused db_expr_t /* * Displays all of the kmods in the system. * - * dk + * dk */ void -db_display_kmod(__unused db_expr_t addr, __unused int have_addr, __unused db_expr_t count, __unused char *modif) +db_display_kmod(__unused db_expr_t addr, __unused boolean_t have_addr, + __unused db_expr_t count, __unused char *modif) { kmod_info_t *kmd; @@ -865,6 +871,10 @@ db_display_kmod(__unused db_expr_t addr, __unused int have_addr, __unused db_exp kmd, kmd->address, strt, end, kmd->name, kmd->version); kmd = kmd->next; } +} - return; +void +db_display_iokit(__unused db_expr_t addr, __unused boolean_t have_addr, + __unused db_expr_t count, __unused char *modif) +{ }