The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kgmacros

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 #
    2 # Kernel gdb macros
    3 #
    4 #  These gdb macros should be useful during kernel development in
    5 #  determining what's going on in the kernel.
    6 #
    7 #  All the convenience variables used by these macros begin with $kgm_
    8 
    9 define showversion
   10 #Display version string, a pointer to which is pinned at 0x501C in the kernel's
   11 #low memory globals
   12        p (char *) *0x501c
   13 end
   14 
   15 document showversion
   16 Syntax: showversion
   17 | Read the kernel version string from a fixed address in low
   18 | memory. Useful if you don't know which kernel is on the other end,
   19 | and need to find the appropriate symbols. Beware that if you've
   20 | loaded a symbol file, but aren't connected to a remote target,
   21 | the version string from the symbol file will be displayed instead.
   22 | This macro expects to be connected to the remote kernel to function
   23 | correctly.
   24 end
   25 
   26 set $kgm_dummy = &proc0
   27 set $kgm_dummy = &kmod
   28 set $kgm_mtype = ((struct mach_header)_mh_execute_header).cputype
   29 
   30 echo Loading Kernel GDB Macros package.  Type "help kgm" for more info.\n
   31 
   32 define kgm
   33 printf ""
   34 echo  These are the gdb macros for kernel debugging.  Type "help kgm" for more info.\n
   35 end
   36 
   37 document kgm
   38 | These are the kernel gdb macros.  These gdb macros are intended to be
   39 | used when debugging a remote kernel via the kdp protocol.  Typically, you
   40 | would connect to your remote target like so:
   41 |     (gdb) target remote-kdp
   42 |     (gdb) attach <name-of-remote-host>
   43 |
   44 | The following macros are available in this package:
   45 |     showversion    Displays a string describing the remote kernel version
   46 |
   47 |     showalltasks   Display a summary listing of all tasks
   48 |     showallthreads Display info about all threads in the system
   49 |     showallstacks  Display the stack for each thread in the system
   50 |     showcurrentthreads   Display info about the thread running on each cpu
   51 |     showcurrentstacks    Display the stack for the thread running on each cpu
   52 |     showallvm      Display a summary listing of all the vm maps
   53 |     showallvme     Display a summary listing of all the vm map entries
   54 |     showallipc     Display a summary listing of all the ipc spaces
   55 |     showallrights  Display a summary listing of all the ipc rights
   56 |     showallkmods   Display a summary listing of all the kernel modules
   57 |     showallclasses Display info about all OSObject subclasses in the system
   58 |
   59 |     showtask       Display info about the specified task
   60 |     showtaskthreads      Display info about the threads in the task
   61 |     showtaskstacks Display the stack for each thread in the task
   62 |     showtaskvm     Display info about the specified task's vm_map
   63 |     showtaskvme    Display info about the task's vm_map entries
   64 |     showtaskipc    Display info about the specified task's ipc space
   65 |     showtaskrights Display info about the task's ipc space entries
   66 |
   67 |     showact        Display info about a thread specified by activation
   68 |     showactstack   Display the stack for a thread specified by activation
   69 |
   70 |     showmap        Display info about the specified vm_map
   71 |     showmapvme     Display a summary list of the specified vm_map's entries
   72 |
   73 |     showipc        Display info about the specified ipc space
   74 |     showrights     Display a summary list of all the rights in an ipc space
   75 |
   76 |     showpid        Display info about the process identified by pid
   77 |     showproc       Display info about the process identified by proc struct
   78 |
   79 |     showkmod       Display info about a kernel module
   80 |     showkmodaddr   Given an address, display the kernel module and offset
   81 |
   82 |     dumpcallqueue  Dump out all the entries given a queue head
   83 |
   84 |     showallmtx     Display info about mutexes usage
   85 |     showallrwlck   Display info about reader/writer locks usage
   86 |
   87 |     zprint         Display info about the memory zones
   88 |     showioalloc    Display info about iokit allocations
   89 |     paniclog       Display the panic log info
   90 |
   91 |     switchtoact    Switch to different context specified by activation
   92 |     switchtoctx    Switch to different context
   93 |     showuserstack  Display numeric backtrace of the user stack for an 
   94 |                    activation
   95 |
   96 |     switchtouserthread Switch to the user context of the specified thread
   97 |     resetstacks    Return to the original kernel context
   98 |
   99 |     resetctx       Reset context
  100 |     resume_on      Resume when detaching from gdb
  101 |     resume_off     Don't resume when detaching from gdb 
  102 |
  103 |     sendcore       Configure kernel to send a coredump to the specified IP
  104 |     disablecore    Configure the kernel to disable coredump transmission
  105 |     switchtocorethread Corefile version of "switchtoact"
  106 |     resetcorectx   Corefile version of "resetctx"
  107 |     
  108 |     kdp-reboot     Restart remote target
  109 |       
  110 | Type "help <macro>" for more specific help on a particular macro.
  111 | Type "show user <macro>" to see what the macro is really doing.
  112 end
  113 
  114 
  115 define showkmodheader
  116     printf "kmod        address     size        "
  117     printf "id    refs     version  name\n"
  118 end
  119 
  120 define showkmodint
  121     set $kgm_kmodp = (struct kmod_info *)$arg0
  122     printf "0x%08x  ", $arg0
  123     printf "0x%08x  ", $kgm_kmodp->address
  124     printf "0x%08x  ", $kgm_kmodp->size
  125     printf "%3d  ", $kgm_kmodp->id
  126     printf "%5d  ", $kgm_kmodp->reference_count
  127     printf "%10s  ", &$kgm_kmodp->version
  128     printf "%s\n", &$kgm_kmodp->name
  129 end
  130 
  131 set $kgm_kmodmin = 0xffffffff
  132 set $kgm_fkmodmin = 0x00000000
  133 set $kgm_kmodmax = 0x00000000
  134 set $kgm_fkmodmax = 0xffffffff
  135 set $kgm_pkmod = 0
  136 set $kgm_pkmodst = 0
  137 set $kgm_pkmoden = 0
  138 define showkmodaddr
  139     printf "0x%x" , $arg0
  140     if ((unsigned int)$arg0 >= (unsigned int)$kgm_pkmodst) && ((unsigned int)$arg0 <= (unsigned int)$kgm_pkmoden)
  141         set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_pkmodst)
  142         printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off
  143     else
  144         if  ((unsigned int)$arg0 <= (unsigned int)$kgm_fkmodmax) && ((unsigned int)$arg0 >= (unsigned int)$kgm_fkmodmin)
  145             set $kgm_kmodp = (struct kmod_info *)kmod
  146             while $kgm_kmodp
  147                 set $kgm_kmod = *$kgm_kmodp
  148                 if $kgm_kmod.address && ($kgm_kmod.address < $kgm_kmodmin)
  149                     set $kgm_kmodmin = $kgm_kmod.address
  150                 end
  151                 if ($kgm_kmod.address + $kgm_kmod.size) > $kgm_kmodmax
  152                     set $kgm_kmodmax = $kgm_kmod.address
  153                 end
  154                 set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address)
  155                 if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size)
  156                     printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off
  157                     set $kgm_pkmod = $kgm_kmodp
  158                     set $kgm_pkmodst = $kgm_kmod.address
  159                     set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmod.size
  160                     set $kgm_kmodp = 0
  161                 else
  162                     set $kgm_kmodp = $kgm_kmod.next
  163                 end
  164             end
  165             if !$kgm_pkmod
  166                 set $kgm_fkmodmin = $kgm_kmodmin
  167                 set $kgm_fkmodmax = $kgm_kmodmax
  168             end
  169         end
  170     end
  171 end
  172 document showkmodaddr
  173 | Given an address, print the offset and name for the kmod containing it
  174 | The following is the syntax:
  175 |     (gdb) showkmodaddr <addr>
  176 end
  177 
  178 define showkmod
  179     showkmodheader
  180     showkmodint $arg0
  181 end
  182 document showkmod
  183 | Routine to print info about a kernel module
  184 | The following is the syntax:
  185 |     (gdb) showkmod <kmod>
  186 end
  187 
  188 define showallkmods
  189     showkmodheader
  190     set $kgm_kmodp = (struct kmod_info *)kmod
  191     while $kgm_kmodp
  192         showkmodint $kgm_kmodp
  193         set $kgm_kmodp = $kgm_kmodp->next
  194     end
  195 end
  196 document showallkmods
  197 | Routine to print a summary listing of all the kernel modules
  198 | The following is the syntax:
  199 |     (gdb) showallkmods
  200 end
  201 
  202 define showactheader
  203     printf "            activation  "
  204     printf "thread      pri  state  wait_queue  wait_event\n"
  205 end
  206 
  207 
  208 define showactint
  209         printf "            0x%08x  ", $arg0
  210         set $kgm_thread = *(struct thread *)$arg0
  211         printf "0x%08x  ", $arg0
  212         printf "%3d  ", $kgm_thread.sched_pri
  213         set $kgm_state = $kgm_thread.state
  214         if $kgm_state & 0x80
  215             printf "I" 
  216         end
  217         if $kgm_state & 0x40
  218             printf "P" 
  219         end
  220         if $kgm_state & 0x20
  221             printf "A" 
  222         end
  223         if $kgm_state & 0x10
  224             printf "H" 
  225         end
  226         if $kgm_state & 0x08
  227             printf "U" 
  228         end
  229         if $kgm_state & 0x04
  230             printf "R" 
  231         end
  232         if $kgm_state & 0x02
  233             printf "S" 
  234         end
  235         if $kgm_state & 0x01
  236             printf "W\t" 
  237             printf "0x%08x  ", $kgm_thread.wait_queue
  238                 
  239                 if ((unsigned)$kgm_thread.wait_event > (unsigned)sectPRELINKB)
  240                     showkmodaddr $kgm_thread.wait_event
  241                 else
  242                         output /a (unsigned) $kgm_thread.wait_event
  243                 end
  244         end
  245         if $arg1 != 0
  246             if ($kgm_thread.kernel_stack != 0)
  247                 if ($kgm_thread.reserved_stack != 0)
  248                         printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
  249                 end
  250                 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
  251                 if ($kgm_mtype == 18)
  252                         set $mysp = $kgm_thread.machine.pcb->save_r1
  253                 else
  254                         set $kgm_statep = (struct i386_kernel_state *) \
  255                                 ($kgm_thread->kernel_stack + 0x4000 \
  256                                  - sizeof(struct i386_kernel_state))
  257                         set $mysp = $kgm_statep->k_ebp
  258                 end
  259                 set $prevsp = 0
  260                 printf "\n\t\tstacktop=0x%08x", $mysp
  261                 if ($kgm_mtype == 18)
  262                         set $stkmask = 0xf
  263                         set $stklimit = 0xb0000000
  264                 else
  265                         set $stkmask = 0x3
  266                         set $stklimit = 0xfc000000
  267                 end
  268                 while ($mysp != 0) && (($mysp & $stkmask) == 0) \
  269                        && ($mysp < $stklimit) \
  270                        && ((unsigned)$mysp > (unsigned)$prevsp)
  271                         printf "\n\t\t0x%08x  ", $mysp
  272                         if ($kgm_mtype == 18)
  273                                 set $kgm_return = *($mysp + 8)
  274                         else
  275                                 set $kgm_return = *($mysp + 4)
  276                         end
  277                         if ((unsigned) $kgm_return > (unsigned) sectPRELINKB)
  278                             showkmodaddr $kgm_return
  279                         else
  280                             output /a (unsigned) $kgm_return
  281                         end
  282                         set $prevsp = $mysp
  283                         set $mysp = * $mysp
  284                 end
  285                 printf "\n\t\tstackbottom=0x%08x", $prevsp
  286             else
  287                 printf "\n\t\t\tcontinuation="
  288                 output /a (unsigned) $kgm_thread.continuation
  289             end
  290             printf "\n"
  291         else
  292             printf "\n"
  293         end
  294 end         
  295 
  296 define showact
  297     showactheader
  298     showactint $arg0 0
  299 end
  300 document showact
  301 | Routine to print out the state of a specific thread.
  302 | The following is the syntax:
  303 |     (gdb) showact <activation> 
  304 end
  305 
  306 
  307 define showactstack
  308     showactheader
  309     showactint $arg0 1
  310 end
  311 document showactstack
  312 | Routine to print out the stack of a specific thread.
  313 | The following is the syntax:
  314 |     (gdb) showactstack <activation> 
  315 end
  316 
  317 
  318 define showallthreads
  319     set $kgm_head_taskp = &default_pset.tasks
  320     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
  321     while $kgm_taskp != $kgm_head_taskp
  322         showtaskheader
  323         showtaskint $kgm_taskp
  324         showactheader
  325         set $kgm_head_actp = &($kgm_taskp->threads)
  326         set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
  327         while $kgm_actp != $kgm_head_actp
  328             showactint $kgm_actp 0
  329             set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
  330         end
  331         printf "\n"
  332         set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
  333     end
  334 end
  335 document showallthreads
  336 | Routine to print out info about all threads in the system.
  337 | The following is the syntax:
  338 |     (gdb) showallthreads
  339 end
  340 
  341 define showcurrentthreads
  342 set $kgm_prp = processor_list
  343     while $kgm_prp != 0
  344         if ($kgm_prp)->active_thread != 0
  345             set $kgm_actp = ($kgm_prp)->active_thread
  346             showtaskheader
  347             showtaskint ($kgm_actp)->task
  348             showactheader
  349             showactint $kgm_actp 0
  350             printf "\n"
  351         end
  352         set $kgm_prp = ($kgm_prp)->processor_list
  353     end
  354 end
  355 document showcurrentthreads
  356 | Routine to print out info about the thread running on each cpu.
  357 | The following is the syntax:
  358 |     (gdb) showcurrentthreads
  359 end
  360 
  361 define showallstacks
  362     set $kgm_head_taskp = &default_pset.tasks
  363     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
  364     while $kgm_taskp != $kgm_head_taskp
  365         showtaskheader
  366         showtaskint $kgm_taskp
  367         set $kgm_head_actp = &($kgm_taskp->threads)
  368         set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
  369         while $kgm_actp != $kgm_head_actp
  370             showactheader
  371             showactint $kgm_actp 1
  372             set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
  373         end
  374         printf "\n"
  375         set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
  376     end
  377 end
  378 document showallstacks
  379 | Routine to print out the stack for each thread in the system.
  380 | The following is the syntax:
  381 |     (gdb) showallstacks
  382 end
  383 
  384 define showcurrentstacks
  385 set $kgm_prp = processor_list
  386     while $kgm_prp != 0
  387         if ($kgm_prp)->active_thread != 0
  388             set $kgm_actp = ($kgm_prp)->active_thread
  389             showtaskheader
  390             showtaskint ($kgm_actp)->task
  391             showactheader
  392             showactint $kgm_actp 1
  393             printf "\n"
  394         end
  395         set $kgm_prp = ($kgm_prp)->processor_list
  396     end
  397 end
  398 document showcurrentstacks
  399 | Routine to print out the thread running on each cpu (incl. its stack)
  400 | The following is the syntax:
  401 |     (gdb) showcurrentstacks
  402 end
  403 
  404 define showwaiterheader
  405     printf "waiters     activation  "
  406     printf "thread      pri  state  wait_queue  wait_event\n"
  407 end
  408 
  409 define showwaitqwaiters
  410     set $kgm_w_waitqp = (struct wait_queue *)$arg0
  411     set $kgm_w_linksp = &($kgm_w_waitqp->wq_queue)
  412     set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_linksp->next
  413     set $kgm_w_found = 0
  414     while ( (queue_entry_t)$kgm_w_wqe != (queue_entry_t)$kgm_w_linksp)
  415         if ($kgm_w_wqe->wqe_type != &_wait_queue_link)
  416                 if !$kgm_w_found
  417                         set $kgm_w_found = 1
  418                         showwaiterheader
  419                 end
  420                 set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe
  421                 showactint $kgm_w_shuttle 0
  422         end     
  423         set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_wqe->wqe_links.next
  424     end
  425 end
  426 
  427 define showwaitqwaitercount
  428     set $kgm_wc_waitqp = (struct wait_queue *)$arg0
  429     set $kgm_wc_linksp = &($kgm_wc_waitqp->wq_queue)
  430     set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_linksp->next
  431     set $kgm_wc_count = 0
  432     while ( (queue_entry_t)$kgm_wc_wqe != (queue_entry_t)$kgm_wc_linksp)
  433         if ($kgm_wc_wqe->wqe_type != &_wait_queue_link)
  434                 set $kgm_wc_count = $kgm_wc_count + 1
  435         end
  436         set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_wqe->wqe_links.next
  437     end
  438     printf "0x%08x  ", $kgm_wc_count
  439 end
  440 
  441 define showwaitqmembercount
  442     set $kgm_mc_waitqsetp = (struct wait_queue_set *)$arg0
  443     set $kgm_mc_setlinksp = &($kgm_mc_waitqsetp->wqs_setlinks)
  444     set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_setlinksp->next
  445     set $kgm_mc_count = 0
  446     while ( (queue_entry_t)$kgm_mc_wql != (queue_entry_t)$kgm_mc_setlinksp)
  447         set $kgm_mc_count = $kgm_mc_count + 1
  448         set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_wql->wql_setlinks.next
  449     end
  450     printf "0x%08x  ", $kgm_mc_count
  451 end
  452 
  453     
  454 define showwaitqmemberheader
  455     printf "set-members wait_queue  interlock   "
  456     printf "pol  type   member_cnt  waiter_cnt\n"
  457 end
  458 
  459 define showwaitqmemberint
  460     set $kgm_m_waitqp = (struct wait_queue *)$arg0
  461     printf "            0x%08x  ", $kgm_m_waitqp
  462     printf "0x%08x  ", $kgm_m_waitqp->wq_interlock.lock_data
  463     if ($kgm_m_waitqp->wq_fifo)
  464         printf "Fifo "
  465     else
  466         printf "Prio "
  467     end
  468     if ($kgm_m_waitqp->wq_type == 0xf1d1)
  469         printf "Set    "
  470         showwaitqmembercount $kgm_m_waitqp
  471     else
  472         printf "Que    0x00000000  "
  473     end
  474     showwaitqwaitercount $kgm_m_waitqp
  475     printf "\n"
  476 end
  477 
  478 
  479 define showwaitqmemberofheader
  480     printf "member-of   wait_queue  interlock   "
  481     printf "pol  type   member_cnt  waiter_cnt\n"
  482 end
  483 
  484 define showwaitqmemberof
  485     set $kgm_mo_waitqp = (struct wait_queue *)$arg0
  486     set $kgm_mo_linksp = &($kgm_mo_waitqp->wq_queue)
  487     set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_linksp->next
  488     set $kgm_mo_found = 0
  489     while ( (queue_entry_t)$kgm_mo_wqe != (queue_entry_t)$kgm_mo_linksp)
  490         if ($kgm_mo_wqe->wqe_type == &_wait_queue_link)
  491                 if !$kgm_mo_found
  492                         set $kgm_mo_found = 1
  493                         showwaitqmemberofheader
  494                 end
  495                 set $kgm_mo_wqlp = (struct wait_queue_link *)$kgm_mo_wqe
  496                 set $kgm_mo_wqsetp = (struct wait_queue *)($kgm_mo_wqlp->wql_setqueue)
  497                 showwaitqmemberint $kgm_mo_wqsetp
  498         end     
  499         set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_wqe->wqe_links.next
  500     end
  501 end
  502 
  503 define showwaitqmembers
  504     set $kgm_ms_waitqsetp = (struct wait_queue_set *)$arg0
  505     set $kgm_ms_setlinksp = &($kgm_ms_waitqsetp->wqs_setlinks)
  506     set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_setlinksp->next
  507     set $kgm_ms_found = 0
  508     while ( (queue_entry_t)$kgm_ms_wql != (queue_entry_t)$kgm_ms_setlinksp)
  509         set $kgm_ms_waitqp = $kgm_ms_wql->wql_element.wqe_queue
  510         if !$kgm_ms_found  
  511             showwaitqmemberheader
  512             set $kgm_ms_found = 1
  513         end
  514         showwaitqmemberint $kgm_ms_waitqp
  515         set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_wql->wql_setlinks.next
  516     end
  517 end
  518 
  519 define showwaitqheader
  520     printf "wait_queue  ref_count   interlock   "
  521     printf "pol  type   member_cnt  waiter_cnt\n"
  522 end
  523 
  524 define showwaitqint
  525     set $kgm_waitqp = (struct wait_queue *)$arg0
  526     printf "0x%08x  ", $kgm_waitqp
  527     if ($kgm_waitqp->wq_type == 0xf1d1)
  528         printf "0x%08x  ", ((struct wait_queue_set *)$kgm_waitqp)->wqs_refcount
  529     else
  530         printf "0x00000000  "
  531     end
  532     printf "0x%08x  ", $kgm_waitqp->wq_interlock.lock_data
  533     if ($kgm_waitqp->wq_fifo)
  534         printf "Fifo "
  535     else
  536         printf "Prio "
  537     end
  538     if ($kgm_waitqp->wq_type == 0xf1d1)
  539         printf "Set    "
  540         showwaitqmembercount $kgm_waitqp
  541     else
  542         printf "Que    0x00000000  "
  543     end
  544     showwaitqwaitercount $kgm_waitqp
  545     printf "\n"
  546 end
  547 
  548 define showwaitq
  549     set $kgm_waitq1p = (wait_queue_t)$arg0
  550     showwaitqheader
  551     showwaitqint $kgm_waitq1p   
  552     if ($kgm_waitq1p->wq_type == 0xf1d1)
  553         showwaitqmembers $kgm_waitq1p
  554     else
  555         showwaitqmemberof $kgm_waitq1p
  556     end
  557     showwaitqwaiters $kgm_waitq1p
  558 end
  559 
  560 define showmapheader
  561     printf "vm_map      pmap        vm_size    "
  562     printf "#ents rpage  hint        first_free\n"
  563 end
  564 
  565 define showvmeheader
  566     printf "    entry       start       "
  567     printf "        prot #page  object      offset\n"
  568 end
  569 
  570 define showvmint
  571     set $kgm_mapp = (vm_map_t)$arg0
  572     set $kgm_map = *$kgm_mapp
  573     printf "0x%08x  ", $arg0
  574     printf "0x%08x  ", $kgm_map.pmap
  575     printf "0x%08x  ", $kgm_map.size
  576     printf "%3d  ", $kgm_map.hdr.nentries
  577     if $kgm_map.pmap
  578         printf "%5d  ", $kgm_map.pmap->stats.resident_count
  579     else
  580         printf "<n/a>  "
  581     end
  582     printf "0x%08x  ", $kgm_map.hint
  583     printf "0x%08x\n", $kgm_map.first_free
  584     if $arg1 != 0
  585         showvmeheader   
  586         set $kgm_head_vmep = &($kgm_mapp->hdr.links)
  587         set $kgm_vmep = $kgm_map.hdr.links.next
  588         while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
  589             set $kgm_vme = *$kgm_vmep
  590             printf "    0x%08x  ", $kgm_vmep
  591             printf "0x%016llx  ", $kgm_vme.links.start
  592             printf "%1x", $kgm_vme.protection
  593             printf "%1x", $kgm_vme.max_protection
  594             if $kgm_vme.inheritance == 0x0
  595                 printf "S"
  596             end
  597             if $kgm_vme.inheritance == 0x1
  598                 printf "C"
  599             end
  600             if $kgm_vme.inheritance == 0x2
  601                 printf "-"
  602             end
  603             if $kgm_vme.inheritance == 0x3
  604                 printf "D"
  605             end
  606             if $kgm_vme.is_sub_map
  607                 printf "s "
  608             else
  609                 if $kgm_vme.needs_copy
  610                     printf "n "
  611                 else
  612                     printf "  "
  613                 end
  614             end
  615             printf "%5d  ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
  616             printf "0x%08x  ", $kgm_vme.object.vm_object
  617             printf "0x%016llx\n", $kgm_vme.offset
  618             set $kgm_vmep = $kgm_vme.links.next
  619         end
  620     end
  621     printf "\n"
  622 end
  623 
  624 
  625 define showmapvme
  626         showmapheader
  627         showvmint $arg0 1
  628 end
  629 document showmapvme
  630 | Routine to print out a summary listing of all the entries in a vm_map
  631 | The following is the syntax:
  632 |     (gdb) showmapvme <vm_map>
  633 end
  634 
  635 
  636 define showmap
  637         showmapheader
  638         showvmint $arg0 0
  639 end
  640 document showmap
  641 | Routine to print out info about the specified vm_map
  642 | The following is the syntax:
  643 |     (gdb) showmap <vm_map>
  644 end
  645 
  646 define showallvm
  647     set $kgm_head_taskp = &default_pset.tasks
  648     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
  649     while $kgm_taskp != $kgm_head_taskp
  650         showtaskheader
  651         showmapheader
  652         showtaskint $kgm_taskp
  653         showvmint $kgm_taskp->map 0
  654         set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
  655     end
  656 end
  657 document showallvm
  658 | Routine to print a summary listing of all the vm maps
  659 | The following is the syntax:
  660 |     (gdb) showallvm
  661 end
  662 
  663 
  664 define showallvme
  665     set $kgm_head_taskp = &default_pset.tasks
  666     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
  667     while $kgm_taskp != $kgm_head_taskp
  668         showtaskheader
  669         showmapheader
  670         showtaskint $kgm_taskp
  671         showvmint $kgm_taskp->map 1
  672         set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
  673     end
  674 end
  675 document showallvme
  676 | Routine to print a summary listing of all the vm map entries
  677 | The following is the syntax:
  678 |     (gdb) showallvme
  679 end
  680 
  681 
  682 define showipcheader
  683     printf "ipc_space   is_table    table_next "
  684     printf "flags tsize  splaytree   splaybase\n"
  685 end
  686 
  687 define showipceheader
  688     printf "            name        object      "
  689     printf "rite urefs  destname    destination\n"
  690 end
  691 
  692 define showipceint
  693     set $kgm_ie = *(ipc_entry_t)$arg0
  694     printf "            0x%08x  ", $arg1
  695     printf "0x%08x  ", $kgm_ie.ie_object
  696     if $kgm_ie.ie_bits & 0x00100000
  697         printf "Dead "
  698         printf "%5d\n", $kgm_ie.ie_bits & 0xffff
  699     else
  700         if $kgm_ie.ie_bits & 0x00080000
  701             printf "SET  "
  702             printf "%5d\n", $kgm_ie.ie_bits & 0xffff
  703         else
  704             if $kgm_ie.ie_bits & 0x00010000
  705                 if $kgm_ie.ie_bits & 0x00020000
  706                     printf " SR"
  707                 else
  708                     printf "  S"
  709                 end
  710             else
  711                 if $kgm_ie.ie_bits & 0x00020000
  712                    printf "  R"
  713                 end
  714             end
  715             if $kgm_ie.ie_bits & 0x00040000
  716                 printf "  O"
  717             end
  718             if $kgm_ie.index.request
  719                 printf "n"
  720             else
  721                 printf " "
  722             end
  723             if $kgm_ie.ie_bits & 0x00800000
  724                 printf "c"
  725             else
  726                 printf " "
  727             end
  728             printf "%5d  ", $kgm_ie.ie_bits & 0xffff
  729             showportdest $kgm_ie.ie_object
  730         end
  731     end
  732 end
  733 
  734 define showipcint
  735     set $kgm_isp = (ipc_space_t)$arg0
  736     set $kgm_is = *$kgm_isp
  737     printf "0x%08x  ", $arg0
  738     printf "0x%08x  ", $kgm_is.is_table
  739     printf "0x%08x  ", $kgm_is.is_table_next
  740     if $kgm_is.is_growing != 0
  741         printf "G"
  742     else
  743         printf " "
  744     end
  745     if $kgm_is.is_fast != 0
  746         printf "F"
  747     else
  748         printf " "
  749     end
  750     if $kgm_is.is_active != 0
  751         printf "A  "
  752     else
  753         printf "   "
  754     end
  755     printf "%5d  ", $kgm_is.is_table_size
  756     printf "0x%08x  ", $kgm_is.is_tree_total
  757     printf "0x%08x\n", &$kgm_isp->is_tree
  758     if $arg1 != 0
  759         showipceheader
  760         set $kgm_iindex = 0
  761         set $kgm_iep = $kgm_is.is_table
  762         set $kgm_destspacep = (ipc_space_t)0
  763         while ( $kgm_iindex < $kgm_is.is_table_size )
  764             set $kgm_ie = *$kgm_iep
  765             if $kgm_ie.ie_bits & 0x001f0000
  766                 set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
  767                 showipceint $kgm_iep $kgm_name
  768             end
  769             set $kgm_iindex = $kgm_iindex + 1
  770             set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
  771         end
  772         if $kgm_is.is_tree_total
  773             printf "Still need to write tree traversal\n"
  774         end
  775     end
  776     printf "\n"
  777 end
  778 
  779 
  780 define showipc
  781         set $kgm_isp = (ipc_space_t)$arg0
  782         showipcheader
  783         showipcint $kgm_isp 0
  784 end
  785 document showipc
  786 | Routine to print the status of the specified ipc space
  787 | The following is the syntax:
  788 |     (gdb) showipc <ipc_space>
  789 end
  790 
  791 define showrights
  792         set $kgm_isp = (ipc_space_t)$arg0
  793         showipcheader
  794         showipcint $kgm_isp 1
  795 end
  796 document showrights
  797 | Routine to print a summary list of all the rights in a specified ipc space
  798 | The following is the syntax:
  799 |     (gdb) showrights <ipc_space>
  800 end
  801 
  802 
  803 define showtaskipc
  804         set $kgm_taskp = (task_t)$arg0
  805         showtaskheader
  806     showipcheader
  807         showtaskint $kgm_taskp
  808         showipcint $kgm_taskp->itk_space 0
  809 end
  810 document showtaskipc
  811 | Routine to print info about the ipc space for a task
  812 | The following is the syntax:
  813 |     (gdb) showtaskipc <task>
  814 end
  815 
  816 
  817 define showtaskrights
  818         set $kgm_taskp = (task_t)$arg0
  819         showtaskheader
  820         showipcheader
  821         showtaskint $kgm_taskp
  822         showipcint $kgm_taskp->itk_space 1
  823 end
  824 document showtaskrights
  825 | Routine to print info about the ipc rights for a task
  826 | The following is the syntax:
  827 |     (gdb) showtaskrights <task>
  828 end
  829 
  830 define showallipc
  831     set $kgm_head_taskp = &default_pset.tasks
  832     set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
  833     while $kgm_cur_taskp != $kgm_head_taskp
  834         showtaskheader
  835         showipcheader
  836         showtaskint $kgm_cur_taskp
  837         showipcint $kgm_cur_taskp->itk_space 0
  838         set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->pset_tasks.next)
  839     end
  840 end
  841 document showallipc
  842 | Routine to print a summary listing of all the ipc spaces
  843 | The following is the syntax:
  844 |     (gdb) showallipc
  845 end
  846 
  847 
  848 define showallrights
  849     set $kgm_head_taskp = &default_pset.tasks
  850     set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
  851     while $kgm_cur_taskp != $kgm_head_taskp
  852         showtaskheader
  853         showipcheader
  854         showtaskint $kgm_cur_taskp
  855         showipcint $kgm_cur_taskp->itk_space 1
  856         set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->pset_tasks.next)
  857     end
  858 end
  859 document showallrights
  860 | Routine to print a summary listing of all the ipc rights
  861 | The following is the syntax:
  862 |     (gdb) showallrights
  863 end
  864 
  865 
  866 define showtaskvm
  867         set $kgm_taskp = (task_t)$arg0
  868         showtaskheader
  869         showmapheader
  870         showtaskint $kgm_taskp
  871         showvmint $kgm_taskp->map 0
  872 end
  873 document showtaskvm
  874 | Routine to print out info about a task's vm_map
  875 | The following is the syntax:
  876 |     (gdb) showtaskvm <task>
  877 end
  878 
  879 define showtaskvme
  880         set $kgm_taskp = (task_t)$arg0
  881         showtaskheader
  882         showmapheader
  883         showtaskint $kgm_taskp
  884         showvmint $kgm_taskp->map 1
  885 end
  886 document showtaskvme
  887 | Routine to print out info about a task's vm_map_entries
  888 | The following is the syntax:
  889 |     (gdb) showtaskvme <task>
  890 end
  891 
  892 
  893 define showtaskheader
  894     printf "task        vm_map      ipc_space  #acts  "
  895     showprocheader
  896 end
  897 
  898 
  899 define showtaskint
  900     set $kgm_task = *(struct task *)$arg0
  901     printf "0x%08x  ", $arg0
  902     printf "0x%08x  ", $kgm_task.map
  903     printf "0x%08x  ", $kgm_task.itk_space
  904     printf "%3d  ", $kgm_task.thread_count
  905     showprocint $kgm_task.bsd_info
  906 end
  907 
  908 define showtask
  909     showtaskheader
  910     showtaskint $arg0
  911 end
  912 document showtask
  913 | Routine to print out info about a task.
  914 | The following is the syntax:
  915 |     (gdb) showtask <task>
  916 end
  917 
  918 
  919 define showtaskthreads
  920     showtaskheader
  921     set $kgm_taskp = (struct task *)$arg0
  922     showtaskint $kgm_taskp
  923     showactheader
  924     set $kgm_head_actp = &($kgm_taskp->threads)
  925     set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
  926     while $kgm_actp != $kgm_head_actp
  927         showactint $kgm_actp 0
  928         set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
  929     end
  930 end
  931 document showtaskthreads
  932 | Routine to print info about the threads in a task.
  933 | The following is the syntax:
  934 |     (gdb) showtaskthreads <task>
  935 end
  936 
  937 
  938 define showtaskstacks
  939     showtaskheader
  940     set $kgm_taskp = (struct task *)$arg0
  941     showtaskint $kgm_taskp
  942     set $kgm_head_actp = &($kgm_taskp->threads)
  943     set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
  944     while $kgm_actp != $kgm_head_actp
  945         showactheader
  946         showactint $kgm_actp 1
  947         set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
  948     end
  949 end
  950 document showtaskstacks
  951 | Routine to print out the stack for each thread in a task.
  952 | The following is the syntax:
  953 |     (gdb) showtaskstacks <task>
  954 end
  955 
  956 
  957 define showalltasks
  958     showtaskheader
  959     set $kgm_head_taskp = &default_pset.tasks
  960     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
  961     while $kgm_taskp != $kgm_head_taskp
  962         showtaskint $kgm_taskp
  963         set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
  964     end
  965 end
  966 document showalltasks
  967 | Routine to print a summary listing of all the tasks
  968 | The following is the syntax:
  969 |     (gdb) showalltasks
  970 end
  971 
  972 
  973 define showprocheader
  974     printf " pid  proc        command\n"
  975 end
  976 
  977 define showprocint
  978     set $kgm_procp = (struct proc *)$arg0
  979     if $kgm_procp != 0
  980         printf "%5d  ", $kgm_procp->p_pid
  981         printf "0x%08x  ", $kgm_procp
  982         printf "%s\n", $kgm_procp->p_comm
  983     else
  984         printf "  *0*  0x00000000  --\n"
  985     end
  986 end
  987 
  988 define showpid
  989     showtaskheader
  990     set $kgm_head_taskp = &default_pset.tasks
  991     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
  992     while $kgm_taskp != $kgm_head_taskp
  993         set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info
  994         if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0))
  995             showtaskint $kgm_taskp
  996             set $kgm_taskp = $kgm_head_taskp
  997         else
  998             set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
  999         end
 1000     end
 1001 end
 1002 document showpid
 1003 | Routine to print a single process by pid
 1004 | The following is the syntax:
 1005 |     (gdb) showpid <pid>
 1006 end
 1007 
 1008 define showproc
 1009     showtaskheader
 1010     set $kgm_procp = (struct proc *)$arg0
 1011     showtaskint $kgm_procp->task $arg1 $arg2
 1012 end
 1013 
 1014 
 1015 define kdb
 1016     set switch_debugger=1
 1017     continue
 1018 end
 1019 document kdb
 1020 | kdb - Switch to the inline kernel debugger
 1021 |
 1022 | usage: kdb
 1023 |
 1024 | The kdb macro allows you to invoke the inline kernel debugger.
 1025 end
 1026 
 1027 define showpsetheader
 1028     printf "portset     waitqueue   recvname    "
 1029     printf "flags refs  recvname    process\n"
 1030 end
 1031 
 1032 define showportheader
 1033     printf "port        mqueue      recvname    "
 1034     printf "flags refs  recvname    process\n"
 1035 end
 1036 
 1037 define showportmemberheader
 1038     printf "members     port        recvname    "
 1039     printf "flags refs  mqueue      msgcount\n"
 1040 end
 1041 
 1042 define showkmsgheader
 1043     printf "messages    kmsg        size        "
 1044     printf "disp msgid  remote-port local-port\n"
 1045 end
 1046 
 1047 define showkmsgint
 1048     printf "            0x%08x  ", $arg0
 1049     set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header
 1050     printf "0x%08x  ", $kgm_kmsgh.msgh_size
 1051     if (($kgm_kmsgh.msgh_bits & 0xff) == 19)
 1052         printf "rC"
 1053     else
 1054         printf "rM"
 1055     end
 1056     if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 < 8))
 1057         printf "lC"
 1058     else
 1059         printf "lM"
 1060     end
 1061     if ($kgm_kmsgh.msgh_bits & 0xf0000000)
 1062         printf "c"
 1063     else
 1064         printf "s"
 1065     end
 1066     printf "%5d  ", $kgm_kmsgh.msgh_id
 1067     printf "0x%08x  ", $kgm_kmsgh.msgh_remote_port
 1068     printf "0x%08x\n", $kgm_kmsgh.msgh_local_port
 1069 end
 1070 
 1071 
 1072 
 1073 define showkobject
 1074     set $kgm_portp = (struct ipc_port *)$arg0
 1075     printf "0x%08x  kobject(", $kgm_portp->ip_kobject
 1076     set $kgm_kotype = ($kgm_portp->ip_object.io_bits & 0x00000fff)
 1077     if ($kgm_kotype == 1)
 1078         printf "THREAD"
 1079     end
 1080     if ($kgm_kotype == 2)
 1081         printf "TASK"
 1082     end
 1083     if ($kgm_kotype == 3)
 1084         printf "HOST"
 1085     end
 1086     if ($kgm_kotype == 4)
 1087         printf "HOST_PRIV"
 1088     end
 1089     if ($kgm_kotype == 5)
 1090         printf "PROCESSOR"
 1091     end
 1092     if ($kgm_kotype == 6)
 1093         printf "PSET"
 1094     end
 1095     if ($kgm_kotype == 7)
 1096         printf "PSET_NAME"
 1097     end
 1098     if ($kgm_kotype == 8)
 1099         printf "TIMER"
 1100     end
 1101     if ($kgm_kotype == 9)
 1102         printf "PAGER_REQ"
 1103     end
 1104     if ($kgm_kotype == 10)
 1105         printf "DEVICE"
 1106     end
 1107     if ($kgm_kotype == 11)
 1108         printf "XMM_OBJECT"
 1109     end
 1110     if ($kgm_kotype == 12)
 1111         printf "XMM_PAGER"
 1112     end
 1113     if ($kgm_kotype == 13)
 1114         printf "XMM_KERNEL"
 1115     end
 1116     if ($kgm_kotype == 14)
 1117         printf "XMM_REPLY"
 1118     end
 1119     if ($kgm_kotype == 15)
 1120         printf "NOTDEF 15"
 1121     end
 1122     if ($kgm_kotype == 16)
 1123         printf "NOTDEF 16"
 1124     end
 1125     if ($kgm_kotype == 17)
 1126         printf "HOST_SEC"
 1127     end
 1128     if ($kgm_kotype == 18)
 1129         printf "LEDGER"
 1130     end
 1131     if ($kgm_kotype == 19)
 1132         printf "MASTER_DEV"
 1133     end
 1134     if ($kgm_kotype == 20)
 1135         printf "ACTIVATION"
 1136     end
 1137     if ($kgm_kotype == 21)
 1138         printf "SUBSYSTEM"
 1139     end
 1140     if ($kgm_kotype == 22)
 1141         printf "IO_DONE_QUE"
 1142     end
 1143     if ($kgm_kotype == 23)
 1144         printf "SEMAPHORE"
 1145     end
 1146     if ($kgm_kotype == 24)
 1147         printf "LOCK_SET"
 1148     end
 1149     if ($kgm_kotype == 25)
 1150         printf "CLOCK"
 1151     end
 1152     if ($kgm_kotype == 26)
 1153         printf "CLOCK_CTRL"
 1154     end
 1155     if ($kgm_kotype == 27)
 1156         printf "IOKIT_SPARE"
 1157     end
 1158     if ($kgm_kotype == 28)
 1159         printf "NAMED_MEM"
 1160     end
 1161     if ($kgm_kotype == 29)
 1162         printf "IOKIT_CON"
 1163     end
 1164     if ($kgm_kotype == 30)
 1165         printf "IOKIT_OBJ"
 1166     end
 1167     if ($kgm_kotype == 31)
 1168         printf "UPL"
 1169     end
 1170     printf ")\n"
 1171 end
 1172 
 1173 define showportdestproc
 1174     set $kgm_portp = (struct ipc_port *)$arg0
 1175     set $kgm_spacep = $kgm_portp->data.receiver
 1176 #   check against the previous cached value - this is slow
 1177     if ($kgm_spacep != $kgm_destspacep)
 1178         set $kgm_destprocp = (struct proc *)0
 1179         set $kgm_head_taskp = &default_pset.tasks
 1180         set $kgm_desttaskp = (struct task *)($kgm_head_taskp->next)
 1181         while (($kgm_destprocp == 0) && ($kgm_desttaskp != $kgm_head_taskp))
 1182             set $kgm_destspacep = $kgm_desttaskp->itk_space
 1183             if ($kgm_destspacep == $kgm_spacep)
 1184                set $kgm_destprocp = (struct proc *)$kgm_desttaskp->bsd_info
 1185             else
 1186                set $kgm_desttaskp = (struct task *)($kgm_desttaskp->pset_tasks.next)
 1187             end
 1188         end
 1189     end
 1190     if $kgm_destprocp != 0
 1191        printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid
 1192     else
 1193        printf "task 0x%08x\n", $kgm_desttaskp
 1194     end
 1195 end
 1196 
 1197 define showportdest
 1198     set $kgm_portp = (struct ipc_port *)$arg0
 1199     set $kgm_spacep = $kgm_portp->data.receiver
 1200     if ($kgm_spacep == ipc_space_kernel)
 1201         showkobject $kgm_portp
 1202     else
 1203         if ($kgm_portp->ip_object.io_bits & 0x80000000)
 1204             printf "0x%08x  ", $kgm_portp->ip_object.io_receiver_name
 1205             showportdestproc $kgm_portp
 1206         else
 1207             printf "0x%08x  inactive-port\n", $kgm_portp
 1208         end
 1209     end
 1210 end
 1211 
 1212 define showportmember
 1213     printf "            0x%08x  ", $arg0
 1214     set $kgm_portp = (struct ipc_port *)$arg0
 1215     printf "0x%08x  ", $kgm_portp->ip_object.io_receiver_name
 1216     if ($kgm_portp->ip_object.io_bits & 0x80000000)
 1217         printf "A"
 1218     else
 1219         printf " "
 1220     end
 1221     if ($kgm_portp->ip_object.io_bits & 0x7fff0000)
 1222         printf "Set "
 1223     else
 1224         printf "Port"
 1225     end
 1226     printf "%5d  ", $kgm_portp->ip_object.io_references
 1227     printf "0x%08x  ", &($kgm_portp->ip_messages)
 1228     printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount
 1229 end
 1230 
 1231 define showportint
 1232     printf "0x%08x  ", $arg0
 1233     set $kgm_portp = (struct ipc_port *)$arg0
 1234     printf "0x%08x  ", &($kgm_portp->ip_messages)
 1235     printf "0x%08x  ", $kgm_portp->ip_object.io_receiver_name
 1236     if ($kgm_portp->ip_object.io_bits & 0x80000000)
 1237         printf "A"
 1238     else
 1239         printf "D"
 1240     end
 1241     printf "Port"
 1242     printf "%5d  ", $kgm_portp->ip_object.io_references
 1243     set $kgm_destspacep = (struct ipc_space *)0
 1244     showportdest $kgm_portp
 1245     set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base
 1246     if $arg1 && $kgm_kmsgp
 1247         showkmsgheader
 1248         showkmsgint $kgm_kmsgp
 1249         set $kgm_kmsgheadp = $kgm_kmsgp
 1250         set $kgm_kmsgp = $kgm_kmsgp->ikm_next
 1251         while $kgm_kmsgp != $kgm_kmsgheadp
 1252             showkmsgint $kgm_kmsgp
 1253             set $kgm_kmsgp = $kgm_kmsgp->ikm_next
 1254         end
 1255     end
 1256 end
 1257 
 1258 define showpsetint
 1259     printf "0x%08x  ", $arg0
 1260     set $kgm_psetp = (struct ipc_pset *)$arg0
 1261     printf "0x%08x  ", &($kgm_psetp->ips_messages)
 1262     printf "0x%08x  ", $kgm_psetp->ips_object.io_receiver_name
 1263     if ($kgm_psetp->ips_object.io_bits & 0x80000000)
 1264         printf "A"
 1265     else
 1266         printf "D"
 1267     end
 1268     printf "Set "
 1269     printf "%5d  ", $kgm_psetp->ips_object.io_references
 1270     printf "0x%08x  ", $kgm_psetp->ips_object.io_receiver_name
 1271     set $kgm_setlinksp = &($kgm_psetp->ips_messages.data.set_queue.wqs_setlinks)
 1272     set $kgm_wql = (struct wait_queue_link *)$kgm_setlinksp->next
 1273     set $kgm_found = 0
 1274     while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_setlinksp)
 1275         set $kgm_portp = (struct ipc_port *)((int)($kgm_wql->wql_element->wqe_queue) - ((int)$kgm_portoff))
 1276         if !$kgm_found  
 1277             set $kgm_destspacep = (struct ipc_space *)0
 1278             showportdestproc $kgm_portp
 1279             showportmemberheader
 1280             set $kgm_found = 1
 1281         end
 1282         showportmember $kgm_portp 0
 1283         set $kgm_wql = (struct wait_queue_link *)$kgm_wql->wql_setlinks.next
 1284     end
 1285     if !$kgm_found
 1286         printf "--n/e--\n"
 1287     end
 1288 end
 1289 
 1290 define showpset
 1291     showpsetheader
 1292     showpsetint $arg0 1
 1293 end
 1294 
 1295 define showport
 1296     showportheader
 1297     showportint $arg0 1
 1298 end
 1299 
 1300 define showipcobject
 1301     set $kgm_object = (ipc_object_t)$arg0
 1302     if ($kgm_objectp->io_bits & 0x7fff0000)
 1303         showpset $kgm_objectp
 1304     else
 1305         showport $kgm_objectp
 1306     end
 1307 end
 1308 
 1309 define showmqueue
 1310     set $kgm_mqueue = *(struct ipc_mqueue *)$arg0
 1311     set $kgm_psetoff = &(((struct ipc_pset *)0)->ips_messages)
 1312     set $kgm_portoff = &(((struct ipc_port *)0)->ip_messages)
 1313     if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d1)
 1314         set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff))
 1315         showpsetheader
 1316         showpsetint $kgm_pset 1
 1317     end
 1318     if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d0)
 1319         showportheader
 1320         set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff))
 1321         showportint $kgm_port 1
 1322     end
 1323 end
 1324 
 1325 define zprint_one
 1326 set $kgm_zone = (struct zone *)$arg0
 1327 
 1328 printf "0x%08x ", $kgm_zone
 1329 printf "%8d ",$kgm_zone->count
 1330 printf "%8x ",$kgm_zone->cur_size
 1331 printf "%8x ",$kgm_zone->max_size
 1332 printf "%6d ",$kgm_zone->elem_size
 1333 printf "%8x ",$kgm_zone->alloc_size
 1334 printf "%s ",$kgm_zone->zone_name
 1335 
 1336 if ($kgm_zone->exhaustible)
 1337         printf "H"
 1338 end
 1339 if ($kgm_zone->collectable)
 1340         printf "C"
 1341 end
 1342 if ($kgm_zone->expandable)
 1343         printf "X"
 1344 end
 1345 printf "\n"
 1346 end
 1347 
 1348 
 1349 define zprint
 1350 printf "ZONE          COUNT   TOT_SZ   MAX_SZ ELT_SZ ALLOC_SZ NAME\n"
 1351 set $kgm_zone_ptr = (struct zone *)first_zone
 1352 while ($kgm_zone_ptr != 0)
 1353         zprint_one $kgm_zone_ptr
 1354         set $kgm_zone_ptr = $kgm_zone_ptr->next_zone
 1355 end
 1356 printf "\n"
 1357 end
 1358 document zprint
 1359 | Routine to print a summary listing of all the kernel zones
 1360 | The following is the syntax:
 1361 |     (gdb) zprint
 1362 end
 1363 
 1364 define showmtxgrp
 1365 set $kgm_mtxgrp = (lck_grp_t *)$arg0
 1366 
 1367 if ($kgm_mtxgrp->lck_grp_mtxcnt)
 1368 printf "0x%08x ", $kgm_mtxgrp
 1369 printf "%8d ",$kgm_mtxgrp->lck_grp_mtxcnt
 1370 printf "%12u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_util_cnt
 1371 printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_miss_cnt
 1372 printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_wait_cnt
 1373 printf "%s ",&$kgm_mtxgrp->lck_grp_name
 1374 printf "\n"
 1375 end
 1376 end
 1377 
 1378 
 1379 define showallmtx
 1380 printf "LCK GROUP       CNT         UTIL     MISS     WAIT NAME\n"
 1381 set $kgm_mtxgrp_ptr = (lck_grp_t *)&lck_grp_queue
 1382 set $kgm_mtxgrp_ptr = (lck_grp_t *)$kgm_mtxgrp_ptr->lck_grp_link.next
 1383 while ($kgm_mtxgrp_ptr != (lck_grp_t *)&lck_grp_queue)
 1384         showmtxgrp $kgm_mtxgrp_ptr
 1385         set $kgm_mtxgrp_ptr = (lck_grp_t *)$kgm_mtxgrp_ptr->lck_grp_link.next
 1386 end
 1387 printf "\n"
 1388 end
 1389 document showallmtx
 1390 | Routine to print a summary listing of all mutexes
 1391 | The following is the syntax:
 1392 |     (gdb) showallmtx
 1393 end
 1394 
 1395 define showrwlckgrp
 1396 set $kgm_rwlckgrp = (lck_grp_t *)$arg0
 1397 
 1398 if ($kgm_rwlckgrp->lck_grp_rwcnt)
 1399 printf "0x%08x ", $kgm_rwlckgrp
 1400 printf "%8d ",$kgm_rwlckgrp->lck_grp_rwcnt
 1401 printf "%12u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt
 1402 printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_miss_cnt
 1403 printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_wait_cnt
 1404 printf "%s ",&$kgm_rwlckgrp->lck_grp_name
 1405 printf "\n"
 1406 end
 1407 end
 1408 
 1409 
 1410 define showallrwlck
 1411 printf "LCK GROUP       CNT         UTIL     MISS     WAIT NAME\n"
 1412 set $kgm_rwlckgrp_ptr = (lck_grp_t *)&lck_grp_queue
 1413 set $kgm_rwlckgrp_ptr = (lck_grp_t *)$kgm_rwlckgrp_ptr->lck_grp_link.next
 1414 while ($kgm_rwlckgrp_ptr != (lck_grp_t *)&lck_grp_queue)
 1415         showrwlckgrp $kgm_rwlckgrp_ptr
 1416         set $kgm_rwlckgrp_ptr = (lck_grp_t *)$kgm_rwlckgrp_ptr->lck_grp_link.next
 1417 end
 1418 printf "\n"
 1419 end
 1420 document showallrwlck
 1421 | Routine to print a summary listing of all read/writer locks
 1422 | The following is the syntax:
 1423 |     (gdb) showallrwlck
 1424 end
 1425 
 1426 set $kdp_act_counter = 0
 1427 
 1428 define switchtoact
 1429         if ($kgm_mtype == 18)
 1430                 if ($kdp_act_counter == 0)
 1431                 set $kdpstate = (struct savearea *) kdp.saved_state
 1432                 end
 1433                 set $kdp_act_counter = $kdp_act_counter + 1
 1434                 set $newact = (struct thread *) $arg0
 1435                 if ($newact->kernel_stack == 0)
 1436                    echo This activation does not have a stack.\n
 1437                    echo continuation:
 1438                    output/a (unsigned) $newact.continuation
 1439                    echo \n
 1440                 else
 1441                    set (struct savearea *) kdp.saved_state=$newact->machine->pcb
 1442                    flush
 1443                    set $pc=$newact->machine->pcb.save_srr0
 1444                    update
 1445                 end
 1446         else
 1447                 echo switchtoact not implemented for this architecture.\n
 1448         end
 1449 end
 1450 
 1451 document switchtoact  
 1452 Syntax: switchtoact <address of activation>
 1453 | This command allows gdb to examine the execution context and call
 1454 | stack for the specified activation. For example, to view the backtrace
 1455 | for an activation issue "switchtoact <address>", followed by "bt".
 1456 | Before resuming execution, issue a "resetctx" command, to
 1457 | return to the original execution context.
 1458 end     
 1459 
 1460 define switchtoctx
 1461         if ($kgm_mtype == 18)
 1462                 if ($kdp_act_counter == 0)
 1463                 set $kdpstate = (struct savearea *) kdp.saved_state
 1464                 end
 1465                 set $kdp_act_counter = $kdp_act_counter + 1
 1466                 set (struct savearea *) kdp.saved_state=(struct savearea *) $arg0
 1467                 flush
 1468                 set $pc=((struct savearea *) $arg0)->save_srr0
 1469                 update
 1470         else
 1471                 echo switchtoctx not implemented for this architecture.\n
 1472         end
 1473 end
 1474 
 1475 document switchtoctx  
 1476 Syntax: switchtoctx <address of pcb>
 1477 | This command allows gdb to examine an execution context and dump the
 1478 | backtrace for this execution context.
 1479 | Before resuming execution, issue a "resetctx" command, to
 1480 | return to the original execution context.
 1481 end     
 1482 
 1483 define resetctx
 1484         if ($kgm_mtype == 18)
 1485                 set (struct savearea *)kdp.saved_state=$kdpstate
 1486                 flush
 1487                 set $pc=((struct savearea *) kdp.saved_state)->save_srr0
 1488                 update
 1489                 set $kdp_act_counter = 0
 1490         else
 1491                 echo resetctx not implemented for this architecture.\n
 1492         end
 1493 end     
 1494         
 1495 document resetctx
 1496 | Syntax: resetctx
 1497 | Returns to the original execution context. This command should be
 1498 | issued if you wish to resume execution after using the "switchtoact"
 1499 | or "switchtoctx" commands.
 1500 end     
 1501 
 1502 define resume_on
 1503         set noresume_on_disconnect = 0
 1504 end
 1505 
 1506 document resume_on
 1507 | Syntax: resume_on
 1508 | The target system will resume when detaching  or exiting from gdb. 
 1509 | This is the default behavior.
 1510 end
 1511 
 1512 define resume_off
 1513         set noresume_on_disconnect = 1
 1514 end
 1515 
 1516 document resume_off
 1517 | Syntax: resume_off
 1518 | The target system  won't resume after detaching from gdb and
 1519 | can be attached with a new gdb session
 1520 end
 1521 
 1522 define paniclog
 1523         set $kgm_panic_bufptr = debug_buf
 1524         set $kgm_panic_bufptr_max = debug_buf_ptr
 1525         while $kgm_panic_bufptr < $kgm_panic_bufptr_max
 1526                 if *(char *)$kgm_panic_bufptr == 10
 1527                         printf "\n"
 1528                 else
 1529                         printf "%c", *$kgm_panic_bufptr
 1530                 end
 1531                 set $kgm_panic_bufptr= (char *)$kgm_panic_bufptr + 1
 1532         end
 1533 end
 1534 
 1535 document paniclog
 1536 | Syntax: paniclog
 1537 | Display the panic log information
 1538 |
 1539 end
 1540 
 1541 define dumpcallqueue
 1542         set $kgm_callhead = (queue_t)&$arg0
 1543         set $kgm_call = (struct call_entry *)$kgm_callhead.next
 1544         set $kgm_i = 0
 1545         while $kgm_call != $kgm_callhead
 1546                 printf "0x%08x ", $kgm_call
 1547                 printf "0x%08x 0x%08x ", $kgm_call->param0, $kgm_call->param1
 1548                 output $kgm_call->state
 1549                 printf "\t"
 1550                 output $kgm_call->deadline
 1551                 printf "\t"
 1552                 output $kgm_call->func
 1553                 printf "\n"
 1554                 set $kgm_i = $kgm_i + 1
 1555                 set $kgm_call = (struct call_entry *)$kgm_call->q_link.next
 1556         end
 1557         printf "%d entries\n", $kgm_i
 1558 end
 1559 
 1560 document dumpcallqueue
 1561 | Syntax: dumpcallqueue <queue head>
 1562 | Displays the contents of the specified call_entry queue.
 1563 end
 1564 
 1565 define showtaskacts
 1566 showtaskthreads $arg0
 1567 end
 1568 document showtaskacts
 1569 | See help showtaskthreads.
 1570 end
 1571 
 1572 define showallacts
 1573 showallthreads
 1574 end
 1575 document showallacts
 1576 | See help showallthreads.
 1577 end
 1578 
 1579 
 1580 define resetstacks
 1581        _kgm_flush_loop
 1582        set kdp_pmap = 0
 1583        _kgm_flush_loop
 1584        resetctx
 1585        _kgm_flush_loop
 1586        _kgm_update_loop
 1587        resetctx
 1588        _kgm_update_loop
 1589 end
 1590 
 1591 document resetstacks
 1592 | Syntax: resetstacks
 1593 | Internal kgmacro routine used by the "showuserstack" macro 
 1594 | to reset the target pmap to the kernel pmap.
 1595 end
 1596 
 1597 #Barely effective hacks to work around bugs in the "flush" and "update" 
 1598 #gdb commands in Tiger (up to 219); these aren't necessary with Panther
 1599 #gdb, but do no harm.
 1600 define _kgm_flush_loop
 1601        set $kgm_flush_loop_ctr = 0
 1602        while ($kgm_flush_loop_ctr < 30)
 1603              flush
 1604              set $kgm_flush_loop_ctr = $kgm_flush_loop_ctr + 1
 1605        end
 1606 end
 1607 
 1608 define _kgm_update_loop
 1609        set $kgm_update_loop_ctr = 0
 1610        while ($kgm_update_loop_ctr < 30)
 1611              update
 1612              set $kgm_update_loop_ctr = $kgm_update_loop_ctr + 1
 1613        end
 1614 end
 1615 
 1616 define showuserstack
 1617                 if ($kgm_mtype == 18)   
 1618                    if ($kdp_act_counter == 0)
 1619                       set $kdpstate = (struct savearea *) kdp.saved_state
 1620                    end
 1621                    set $kdp_act_counter = $kdp_act_counter + 1
 1622                    set $newact = (struct thread *) $arg0
 1623                    _kgm_flush_loop
 1624                    set $checkpc = $newact->machine->upcb.save_srr0
 1625                    if ($checkpc == 0)
 1626                       echo This activation does not appear to have
 1627                       echo \20 a valid user context.\n
 1628                    else       
 1629                      set (struct savearea *) kdp.saved_state=$newact->machine->upcb
 1630                      set $pc = $checkpc
 1631 #flush and update seem to be executed lazily by gdb on Tiger, hence the
 1632 #repeated invocations - see 3743135
 1633                     _kgm_flush_loop
 1634 # This works because the new pmap is used only for reads
 1635                      set kdp_pmap = $newact->task->map->pmap
 1636                      _kgm_flush_loop
 1637                      _kgm_update_loop
 1638                      bt
 1639                      resetstacks
 1640                      _kgm_flush_loop
 1641                      _kgm_update_loop
 1642                      resetstacks
 1643                      _kgm_flush_loop
 1644                      _kgm_update_loop
 1645                    end
 1646                 else
 1647                 echo showuserstack not implemented for this architecture.\n
 1648         end             
 1649 end
 1650 
 1651 document showuserstack
 1652 Syntax: showuserstack <address of thread activation>
 1653 |This command displays a numeric backtrace for the user space stack of
 1654 |the given thread activation. It may, of course, fail to display a
 1655 |complete backtrace if portions of the user stack are not mapped in.
 1656 |Symbolic backtraces can be obtained either by running gdb on the
 1657 |user space binary, or a tool such as "symbolicate".
 1658 |Note that while this command works on Panther's gdb, an issue
 1659 |with Tiger gdb (3743135) appears to hamper the evaluation of this
 1660 |macro in some cases.
 1661 end
 1662 
 1663 #Stopgap until gdb can generate the HOSTREBOOT packet
 1664 define kdp-reboot
 1665        set flag_kdp_trigger_reboot = 1
 1666        continue
 1667 end
 1668 
 1669 document kdp-reboot
 1670 Syntax: kdp-reboot
 1671 |Reboot the remote target machine; not guaranteed to succeed. Requires symbols
 1672 |until gdb support for the HOSTREBOOT packet is implemented.
 1673 end
 1674 
 1675 define sendcore
 1676        set kdp_trigger_core_dump = 1
 1677        set kdp_flag |= 0x40
 1678        set panicd_ip_str = "$arg0"
 1679        set panicd_specified = 1
 1680        set disableDebugOuput = 0
 1681        set disableConsoleOutput = 0
 1682        set logPanicDataToScreen = 1
 1683        set reattach_wait = 1
 1684        resume_off
 1685 end
 1686 
 1687 document sendcore
 1688 Syntax: sendcore <IP address>
 1689 |Configure the kernel to transmit a kernel coredump to a server (kdumpd) 
 1690 |at the specified IP address. This is useful when the remote target has
 1691 |not been previously configured to transmit coredumps, and you wish to
 1692 |preserve kernel state for later examination. NOTE: You must issue a "continue"
 1693 |command after using this macro to trigger the kernel coredump. The kernel
 1694 |will resume waiting in the debugger after completion of the coredump. You
 1695 |may disable coredumps by executing the "disablecore" macro.
 1696 end
 1697 
 1698 define disablecore
 1699        set kdp_trigger_core_dump = 0
 1700        set kdp_flag |= 0x40
 1701        set kdp_flag &= ~0x10
 1702        set panicd_specified = 0
 1703 end
 1704 
 1705 document disablecore
 1706 Syntax: disablecore
 1707 |Reconfigures the kernel so that it no longer transmits kernel coredumps. This
 1708 |complements the "sendcore" macro, but it may be used if the kernel has been
 1709 |configured to transmit coredumps through boot-args as well.
 1710 end
 1711 
 1712 #Use of this macro requires the gdb submission from 3401283
 1713 define switchtocorethread
 1714         if ($kgm_mtype == 18)
 1715                 if ($kdp_act_counter == 0)
 1716                 set $kdpstate = (struct savearea *) kdp.saved_state
 1717                 end
 1718                 set $kdp_act_counter = $kdp_act_counter + 1
 1719                 set $newact = (struct thread *) $arg0
 1720                 if ($newact->kernel_stack == 0)
 1721                    echo This thread does not have a stack.\n
 1722                    echo continuation:
 1723                    output/a (unsigned) $newact.continuation
 1724                    echo \n
 1725                 else
 1726                    loadcontext $newact->machine->pcb
 1727 # flushstack will be introduced in a gdb version > gdb-357
 1728                    flushstack
 1729                    set $pc = $newact->machine->pcb.save_srr0
 1730                 end
 1731         else
 1732                 echo switchtocorethread not implemented for this architecture.\n
 1733         end
 1734 end
 1735 
 1736 document switchtocorethread
 1737 Syntax: switchtocorethread <address of activation>
 1738 | The corefile equivalent of "switchtoact". When debugging a kernel coredump
 1739 | file, this command can be used to examine the execution context and stack
 1740 | trace for a given thread activation. For example, to view the backtrace
 1741 | for a thread issue "switchtocorethread <address>", followed by "bt".
 1742 | Before resuming execution, issue a "resetcorectx" command, to
 1743 | return to the original execution context. Note that this command
 1744 | requires gdb support, as documented in Radar 3401283.
 1745 end
 1746 
 1747 define loadcontext
 1748        set $pc = $arg0.save_srr0
 1749        set $r1 = $arg0.save_r1
 1750        set $lr = $arg0.save_lr
 1751        
 1752        set $r2 = $arg0.save_r2
 1753        set $r3 = $arg0.save_r3
 1754        set $r4 = $arg0.save_r4
 1755        set $r5 = $arg0.save_r5
 1756        set $r6 = $arg0.save_r6
 1757        set $r7 = $arg0.save_r7
 1758        set $r8 = $arg0.save_r8
 1759        set $r9 = $arg0.save_r9
 1760        set $r10 = $arg0.save_r10
 1761        set $r11 = $arg0.save_r11
 1762        set $r12 = $arg0.save_r12
 1763        set $r13 = $arg0.save_r13
 1764        set $r14 = $arg0.save_r14
 1765        set $r15 = $arg0.save_r15
 1766        set $r16 = $arg0.save_r16
 1767        set $r17 = $arg0.save_r17
 1768        set $r18 = $arg0.save_r18
 1769        set $r19 = $arg0.save_r19
 1770        set $r20 = $arg0.save_r20
 1771        set $r21 = $arg0.save_r21
 1772        set $r22 = $arg0.save_r22
 1773        set $r23 = $arg0.save_r23
 1774        set $r24 = $arg0.save_r24
 1775        set $r25 = $arg0.save_r25
 1776        set $r26 = $arg0.save_r26
 1777        set $r27 = $arg0.save_r27
 1778        set $r28 = $arg0.save_r28
 1779        set $r29 = $arg0.save_r29
 1780        set $r30 = $arg0.save_r30
 1781        set $r31 = $arg0.save_r31
 1782        
 1783        set $cr = $arg0.save_cr
 1784        set $ctr = $arg0.save_ctr
 1785 end
 1786 
 1787 define resetcorectx
 1788        set $kgm_corecontext = (struct savearea *) kdp.saved_state
 1789        loadcontext $kgm_corecontext
 1790 # Maintaining this act counter wouldn't be necessary if we just initialized
 1791 # $kdpstate at the beginning of the macro..
 1792        set $kdp_act_counter = 0 
 1793 end
 1794 
 1795 document resetcorectx
 1796 Syntax: resetcorectx
 1797 | The corefile equivalent of "resetctx". Returns to the original
 1798 | execution context (that of the active thread at the time of the NMI or
 1799 | panic). This command should be issued if you wish to resume
 1800 | execution after using the "switchtocorethread" command.
 1801 end
 1802 
 1803 #Helper function for "showallgdbstacks"
 1804 
 1805 define showgdbthread
 1806         printf "            0x%08x  ", $arg0
 1807         set $kgm_thread = *(struct thread *)$arg0
 1808         printf "0x%08x  ", $arg0
 1809         printf "%3d  ", $kgm_thread.sched_pri
 1810         set $kgm_state = $kgm_thread.state
 1811         if $kgm_state & 0x80
 1812             printf "I" 
 1813         end
 1814         if $kgm_state & 0x40
 1815             printf "P" 
 1816         end
 1817         if $kgm_state & 0x20
 1818             printf "A" 
 1819         end
 1820         if $kgm_state & 0x10
 1821             printf "H" 
 1822         end
 1823         if $kgm_state & 0x08
 1824             printf "U" 
 1825         end
 1826         if $kgm_state & 0x04
 1827             printf "R" 
 1828         end
 1829         if $kgm_state & 0x02
 1830             printf "S" 
 1831         end
 1832         if $kgm_state & 0x01
 1833             printf "W\t" 
 1834             printf "0x%08x  ", $kgm_thread.wait_queue
 1835             output /a (unsigned) $kgm_thread.wait_event
 1836         end
 1837         if $arg1 != 0
 1838             if ($kgm_thread.kernel_stack != 0)
 1839                 if ($kgm_thread.reserved_stack != 0)
 1840                         printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
 1841                 end
 1842                 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
 1843                 if ($kgm_mtype == 18)
 1844                         set $mysp = $kgm_thread.machine.pcb->save_r1
 1845                 else
 1846                         set $kgm_statep = (struct i386_kernel_state *) \
 1847                                 ($kgm_thread->kernel_stack + 0x4000 \
 1848                                  - sizeof(struct i386_kernel_state))
 1849                         set $mysp = $kgm_statep->k_ebp
 1850                 end
 1851                 set $prevsp = 0
 1852                 printf "\n\t\tstacktop=0x%08x", $mysp
 1853                 switchtoact $arg0
 1854                 bt
 1855             else
 1856                 printf "\n\t\t\tcontinuation="
 1857                 output /a (unsigned) $kgm_thread.continuation
 1858             end
 1859             printf "\n"
 1860         else
 1861             printf "\n"
 1862         end
 1863 end         
 1864 
 1865 #Use of this macro is currently (8/04) blocked by the fact that gdb
 1866 #stops evaluating macros when encountering an error, such as a failure
 1867 #to read memory from a certain location. Until this issue (described in
 1868 #3758949) is addressed, evaluation of this macro may stop upon
 1869 #encountering such an error.
 1870 
 1871 define showallgdbstacks
 1872     set $kgm_head_taskp = &default_pset.tasks
 1873     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
 1874     while $kgm_taskp != $kgm_head_taskp
 1875         showtaskheader
 1876         showtaskint $kgm_taskp
 1877         set $kgm_head_actp = &($kgm_taskp->threads)
 1878         set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
 1879         while $kgm_actp != $kgm_head_actp
 1880             showactheader
 1881             showgdbthread $kgm_actp 1
 1882             set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
 1883         end
 1884         printf "\n"
 1885         set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
 1886     end
 1887     resetctx
 1888 end
 1889 
 1890 document showallgdbstacks
 1891 Syntax: showallgdbstacks
 1892 | An alternative to "showallstacks". Iterates through the task list and
 1893 | displays a gdb generated backtrace for each kernel thread. It is
 1894 | advantageous in that it is much faster than "showallstacks", and
 1895 | decodes function call arguments and displays source level traces, but
 1896 | it has the drawback that it doesn't determine if frames belong to
 1897 | functions from kernel extensions, as with "showallstacks".
 1898 | This command may terminate prematurely because of a gdb bug
 1899 | (Radar 3758949), which stops macro evaluation on memory read
 1900 | errors.
 1901 end
 1902 
 1903 define switchtouserthread
 1904                 if ($kgm_mtype == 18)   
 1905                    if ($kdp_act_counter == 0)
 1906                       set $kdpstate = (struct savearea *) kdp.saved_state
 1907                    end
 1908                    set $kdp_act_counter = $kdp_act_counter + 1
 1909                    set $newact = (struct thread *) $arg0
 1910                    _kgm_flush_loop
 1911                    set $checkpc = $newact->machine->upcb.save_srr0
 1912                    if ($checkpc == 0)
 1913                       echo This activation does not appear to have
 1914                       echo \20 a valid user context.\n
 1915                    else       
 1916                      set (struct savearea *) kdp.saved_state=$newact->machine->upcb
 1917                      set $pc = $checkpc
 1918 #flush and update seem to be executed lazily by gdb on Tiger, hence the
 1919 #repeated invocations - see 3743135
 1920                     _kgm_flush_loop
 1921 # This works because the new pmap is used only for reads
 1922                      set kdp_pmap = $newact->task->map->pmap
 1923                      _kgm_flush_loop
 1924                      _kgm_update_loop
 1925                    end
 1926                 else
 1927                    echo switchtouserthread not implemented for this architecture.\n
 1928         end
 1929 end
 1930 
 1931 document switchtouserthread
 1932 Syntax: switchtouserthread <address of thread>
 1933 | Analogous to switchtoact, but switches to the user context of a
 1934 | specified thread address. Similar to the "showuserstack"
 1935 | command, but this command does not return gdb to the kernel context
 1936 | immediately. This is to assist with the following (rather risky)
 1937 | manoeuvre - upon switching to the user context and virtual address
 1938 | space, the user may choose to call remove-symbol-file on the
 1939 | mach_kernel symbol file, and then add-symbol-file on the user space
 1940 | binary's symfile. gdb can then generate symbolic backtraces 
 1941 | for the user space thread. To return to the
 1942 | kernel context and virtual address space, the process must be
 1943 | reversed, i.e. call remove-symbol-file on the user space symbols, and
 1944 | then add-symbol-file on the appropriate mach_kernel, and issue the
 1945 | "resetstacks" command. Note that gdb may not react kindly to all these
 1946 | symbol file switches. The same restrictions that apply to "showuserstack"
 1947 | apply here - pages that have been paged out cannot be read while in the
 1948 | debugger context, so backtraces may terminate early.
 1949 | If the virtual addresses in the stack trace do not conflict with those
 1950 | of symbols in the kernel's address space, it may be sufficient to
 1951 | just do an add-symbol-file on the user space binary's symbol file.
 1952 | Note that while this command works on Panther's gdb, an issue
 1953 | with Tiger gdb (3743135) appears to hamper the evaluation of this
 1954 | macro in some cases.
 1955 end
 1956 
 1957 define showmetaclass
 1958     set cp-abi gnu-v2
 1959     set $kgm_metaclassp = (OSMetaClass *)$arg0
 1960     printf "%-5d", $kgm_metaclassp->instanceCount
 1961     printf "x %5d bytes", $kgm_metaclassp->classSize
 1962     printf " %s\n", $kgm_metaclassp->className->string
 1963 end
 1964 
 1965 define showallclasses
 1966     set cp-abi gnu-v2
 1967     set $kgm_classidx = 0
 1968     while $kgm_classidx < sAllClassesDict->count
 1969         set $kgm_meta = (OSMetaClass *) sAllClassesDict->dictionary[$kgm_classidx].value
 1970         showmetaclass $kgm_meta
 1971         set $kgm_classidx = $kgm_classidx + 1
 1972     end
 1973 end
 1974 document showallclasses
 1975 | Show the instance counts and ivar size of all OSObject subclasses. See ioclasscount man page for details.
 1976 | The following is the syntax:
 1977 |     (gdb) showallclasses
 1978 end
 1979 
 1980 define showioalloc
 1981     printf " Instance allocation = 0x%08lx = %4ld K\n", (int) debug_ivars_size, ((int) debug_ivars_size) / 1024
 1982     printf "Container allocation = 0x%08lx = %4ld K\n", (int) debug_container_malloc_size, ((int) debug_container_malloc_size) / 1024
 1983     printf " IOMalloc allocation = 0x%08lx = %4ld K\n", (int) debug_iomalloc_size, ((int) debug_iomalloc_size) / 1024
 1984     printf " Pageable allocation = 0x%08lx = %4ld K\n", (vm_size_t) debug_iomallocpageable_size, ((vm_size_t) debug_iomallocpageable_size) / 1024
 1985 end
 1986 
 1987 document showioalloc
 1988 | Show some accounting of memory allocated by IOKit allocators. See ioalloccount man page for details.
 1989 | The following is the syntax:
 1990 |     (gdb) showioalloc
 1991 end

Cache object: 6d40291042f477b790ec255d9dfc8117


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.