]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/db_trace.c
xnu-1486.2.11.tar.gz
[apple/xnu.git] / osfmk / i386 / db_trace.c
index 2a61d9bf40ccdcfd46e2e48d34ea47295d580acf..a14bb16b58efc0830a406f6c587e568463b9bc90 100644 (file)
@@ -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 <ddb/db_output.h>
 
 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)
+{
 }