]> git.saurik.com Git - apple/xnu.git/blob - kgmacros
xnu-1228.9.59.tar.gz
[apple/xnu.git] / kgmacros
1 # Kernel gdb macros
2 #
3 # These gdb macros should be useful during kernel development in
4 # determining what's going on in the kernel.
5 #
6 # All the convenience variables used by these macros begin with $kgm_
7
8 set print asm-demangle on
9 set cp-abi gnu-v2
10
11 echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n
12
13 define kgm
14 printf ""
15 echo These are the gdb macros for kernel debugging. Type "help kgm" for more info.\n
16 end
17
18 document kgm
19 | These are the kernel gdb macros. These gdb macros are intended to be
20 | used when debugging a remote kernel via the kdp protocol. Typically, you
21 | would connect to your remote target like so:
22 | (gdb) target remote-kdp
23 | (gdb) attach <name-of-remote-host>
24 |
25 | The following macros are available in this package:
26 | showversion Displays a string describing the remote kernel version
27 |
28 | showalltasks Display a summary listing of all tasks
29 | showallthreads Display info about all threads in the system
30 | showallstacks Display the stack for each thread in the system
31 | showcurrentthreads Display info about the thread running on each cpu
32 | showcurrentstacks Display the stack for the thread running on each cpu
33 | showallvm Display a summary listing of all the vm maps
34 | showallvme Display a summary listing of all the vm map entries
35 | showallipc Display a summary listing of all the ipc spaces
36 | showallrights Display a summary listing of all the ipc rights
37 | showallkmods Display a summary listing of all the kernel modules
38 |
39 | showallclasses Display info about all OSObject subclasses in the system
40 | showobject Show info about an OSObject - its vtable ptr and retain count, & more info for simple container classes.
41 | showregistry Show info about all registry entries in the current plane
42 | showregistryprops Show info about all registry entries in the current plane, and their properties
43 | showregistryentry Show info about a registry entry; its properties and descendants in the current plane
44 | setregistryplane Set the plane to be used for the iokit registry macros (pass zero for list)
45 |
46 | showtask Display info about the specified task
47 | showtaskthreads Display info about the threads in the task
48 | showtaskstacks Display the stack for each thread in the task
49 | showtaskvm Display info about the specified task's vm_map
50 | showtaskvme Display info about the task's vm_map entries
51 | showtaskipc Display info about the specified task's ipc space
52 | showtaskrights Display info about the task's ipc space entries
53 |
54 | showact Display info about a thread specified by activation
55 | showactstack Display the stack for a thread specified by activation
56 |
57 | showmap Display info about the specified vm_map
58 | showmapvme Display a summary list of the specified vm_map's entries
59 |
60 | showipc Display info about the specified ipc space
61 | showrights Display a summary list of all the rights in an ipc space
62 |
63 | showpid Display info about the process identified by pid
64 | showproc Display info about the process identified by proc struct
65 | showprocinfo Display detailed info about the process identified by proc struct
66 | showprocfiles Given a proc_t pointer, display the list of open file descriptors
67 | showproclocks Given a proc_t pointer, display the list of advisory file locks
68 | zombproc Print out all procs in the zombie list
69 | allproc Print out all process in the system not in the zombie list
70 | zombstacks Print out all stacks of tasks that are exiting
71 |
72 | showinitchild Print out all processes in the system which are children of init process
73 |
74 | showkmod Display info about a kernel module
75 | showkmodaddr Given an address, display the kernel module and offset
76 |
77 | dumpcallqueue Dump out all the entries given a queue head
78 |
79 | showallmtx Display info about mutexes usage
80 | showallrwlck Display info about reader/writer locks usage
81 |
82 | zprint Display info about the memory zones
83 | showioalloc Display info about iokit allocations
84 | paniclog Display the panic log info
85 |
86 | switchtoact Switch to different context specified by activation
87 | switchtoctx Switch to different context
88 | showuserstack Display numeric backtrace of the user stack for an
89 | activation
90 |
91 | switchtouserthread Switch to the user context of the specified thread
92 | resetstacks Return to the original kernel context
93 |
94 | resetctx Reset context
95 | resume_on Resume when detaching from gdb
96 | resume_off Don't resume when detaching from gdb
97 |
98 | sendcore Configure kernel to send a coredump to the specified IP
99 | disablecore Configure the kernel to disable coredump transmission
100 | switchtocorethread Corefile version of "switchtoact"
101 | resetcorectx Corefile version of "resetctx"
102 |
103 | readphys Reads the specified untranslated address
104 | readphys64 Reads the specified untranslated 64-bit address
105 |
106 | rtentry_showdbg Print the debug information of a route entry
107 | rtentry_trash Walk the list of trash route entries
108 |
109 | mbuf_walkpkt Walk the mbuf packet chain (m_nextpkt)
110 | mbuf_walk Walk the mbuf chain (m_next)
111 | mbuf_buf2slab Find the slab structure of the corresponding buffer
112 | mbuf_buf2mca Find the mcache audit structure of the corresponding mbuf
113 | mbuf_showmca Print the contents of an mbuf mcache audit structure
114 | mbuf_showactive Print all active/in-use mbuf objects
115 | mbuf_showinactive Print all freed/in-cache mbuf objects
116 | mbuf_showall Print all mbuf objects
117 | mbuf_slabs Print all slabs in the group
118 | mbuf_slabstbl Print slabs table
119 | mbuf_stat Print extended mbuf allocator statistics
120 |
121 | mcache_walkobj Walk the mcache object chain (obj_next)
122 | mcache_stat Print all mcaches in the system
123 | mcache_showcache Display the number of objects in the cache
124 |
125 | showbootermemorymap Dump phys memory map from EFI
126 |
127 | systemlog Display the kernel's printf ring buffer
128 |
129 | showvnodepath Print the path for a vnode
130 | showvnodelocks Display list of advisory locks held/blocked on a vnode
131 | showallvols Display a summary of mounted volumes
132 | showvnode Display info about one vnode
133 | showvolvnodes Display info about all vnodes of a given volume
134 | showvolbusyvnodes Display info about busy (iocount!=0) vnodes of a given volume
135 | showallbusyvnodes Display info about all busy (iocount!=0) vnodes
136 | showallvnodes Display info about all vnodes
137 | print_vnode Print out the fields of a vnode struct
138 | showprocvnodes Print out all the open fds which are vnodes in a process
139 | showallprocvnodes Print out all the open fds which are vnodes in any process
140 | showmountvnodes Print the vnode list
141 | showmountallvnodes Print the vnode inactive list
142 | showworkqvnodes Print the vnode worker list
143 | shownewvnodes Print the new vnode list
144 |
145 | ifconfig display ifconfig-like output
146 | showifaddrs show the list of addresses for the given ifp
147 | showifmultiaddrs show the list of multicast addresses for the given ifp
148 |
149 | showallpmworkqueues Display info about all IOPMWorkQueue objects
150 | showregistrypmstate Display power management state for all IOPower registry entries
151 | showioservicepm Display the IOServicePM object
152 | showstacksaftertask showallstacks starting after a given task
153 | showstacksafterthread showallstacks starting after a given thread
154 |
155 | showMCAstate Print machine-check register state after MC exception.
156 |
157 | showallgdbstacks Cause GDB to trace all thread stacks
158 | showallgdbcorestacks Corefile equivalent of "showallgdbstacks"
159 | kdp-reenter Schedule reentry into the debugger and continue.
160 | kdp-reboot Restart remote target
161 |
162 | Type "help <macro>" for more specific help on a particular macro.
163 | Type "show user <macro>" to see what the macro is really doing.
164 end
165
166 # This macro should appear before any symbol references, to facilitate
167 # a gdb "source" without a loaded symbol file.
168 define showversion
169 printf "%s\n", *(char **)0x501C
170 end
171
172 document showversion
173 Syntax: showversion
174 | Read the kernel version string from a fixed address in low
175 | memory. Useful if you don't know which kernel is on the other end,
176 | and need to find the appropriate symbols. Beware that if you've
177 | loaded a symbol file, but aren't connected to a remote target,
178 | the version string from the symbol file will be displayed instead.
179 | This macro expects to be connected to the remote kernel to function
180 | correctly.
181 end
182
183 set $kgm_mtype = ((struct mach_header)_mh_execute_header).cputype
184
185 # This option tells gdb to relax its stack tracing heuristics
186 # Useful for debugging across stack switches
187 # (to the interrupt stack, for instance). Requires gdb-675 or greater.
188 # Don't do this for arm as a workaround to 5486905
189 if ($kgm_mtype != 12)
190 set backtrace sanity-checks off
191 end
192
193 set $kgm_dummy = &proc0
194 set $kgm_dummy = &kmod
195
196 set $kgm_reg_depth = 0
197 set $kgm_reg_plane = (void **) gIOServicePlane
198 set $kgm_namekey = (OSSymbol *) 0
199 set $kgm_childkey = (OSSymbol *) 0
200
201 set $kgm_show_object_addrs = 0
202 set $kgm_show_object_retain = 0
203 set $kgm_show_props = 0
204
205 set $kgm_show_kmod_syms = 0
206
207 define showkmodheader
208 printf "kmod address size "
209 printf "id refs version name\n"
210 end
211
212 define showkmodint
213 set $kgm_kmodp = (struct kmod_info *)$arg0
214 printf "0x%08x ", $arg0
215 printf "0x%08x ", $kgm_kmodp->address
216 printf "0x%08x ", $kgm_kmodp->size
217 printf "%3d ", $kgm_kmodp->id
218 printf "%5d ", $kgm_kmodp->reference_count
219 printf "%10s ", &$kgm_kmodp->version
220 printf "%s\n", &$kgm_kmodp->name
221 end
222
223 set $kgm_kmodmin = 0xffffffff
224 set $kgm_fkmodmin = 0x00000000
225 set $kgm_kmodmax = 0x00000000
226 set $kgm_fkmodmax = 0xffffffff
227 set $kgm_pkmod = 0
228 set $kgm_pkmodst = 0
229 set $kgm_pkmoden = 0
230 define showkmodaddrint
231 printf "0x%x" , $arg0
232 if ((unsigned int)$arg0 >= (unsigned int)$kgm_pkmodst) && ((unsigned int)$arg0 <= (unsigned int)$kgm_pkmoden)
233 set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_pkmodst)
234 printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off
235 else
236 if ((unsigned int)$arg0 <= (unsigned int)$kgm_fkmodmax) && ((unsigned int)$arg0 >= (unsigned int)$kgm_fkmodmin)
237 set $kgm_kmodp = (struct kmod_info *)kmod
238 while $kgm_kmodp
239 set $kgm_kmod = *$kgm_kmodp
240 if $kgm_kmod.address && ($kgm_kmod.address < $kgm_kmodmin)
241 set $kgm_kmodmin = $kgm_kmod.address
242 end
243 if ($kgm_kmod.address + $kgm_kmod.size) > $kgm_kmodmax
244 set $kgm_kmodmax = $kgm_kmod.address + $kgm_kmod.size
245 end
246 set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address)
247 if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size)
248 printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off
249 set $kgm_pkmod = $kgm_kmodp
250 set $kgm_pkmodst = $kgm_kmod.address
251 set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmod.size
252 set $kgm_kmodp = 0
253 else
254 set $kgm_kmodp = $kgm_kmod.next
255 end
256 end
257 if !$kgm_pkmod
258 set $kgm_fkmodmin = $kgm_kmodmin
259 set $kgm_fkmodmax = $kgm_kmodmax
260 end
261 end
262 end
263 end
264
265 define showkmodaddr
266 showkmodaddrint $arg0
267 end
268
269 document showkmodaddr
270 Syntax: (gdb) showkmodaddr <addr>
271 | Given an address, print the offset and name for the kmod containing it
272 end
273
274 define showkmod
275 showkmodheader
276 showkmodint $arg0
277 end
278 document showkmod
279 Syntax: (gdb) showkmod <kmod>
280 | Routine to print info about a kernel module
281 end
282
283 define showallkmods
284 showkmodheader
285 set $kgm_kmodp = (struct kmod_info *)kmod
286 while $kgm_kmodp
287 showkmodint $kgm_kmodp
288 set $kgm_kmodp = $kgm_kmodp->next
289 end
290 end
291 document showallkmods
292 Syntax: (gdb) showallkmods
293 | Routine to print a summary listing of all the kernel modules
294 end
295
296 define showactheader
297 printf " thread "
298 printf "processor pri state wait_queue wait_event\n"
299 end
300
301
302 define showactint
303 printf " 0x%08x ", $arg0
304 set $kgm_thread = *(struct thread *)$arg0
305 printf "0x%08x ", $kgm_thread.last_processor
306 printf "%3d ", $kgm_thread.sched_pri
307 set $kgm_state = $kgm_thread.state
308 if $kgm_state & 0x80
309 printf "I"
310 end
311 if $kgm_state & 0x40
312 printf "P"
313 end
314 if $kgm_state & 0x20
315 printf "A"
316 end
317 if $kgm_state & 0x10
318 printf "H"
319 end
320 if $kgm_state & 0x08
321 printf "U"
322 end
323 if $kgm_state & 0x04
324 printf "R"
325 end
326 if $kgm_state & 0x02
327 printf "S"
328 end
329 if $kgm_state & 0x01
330 printf "W\t"
331 printf "0x%08x ", $kgm_thread.wait_queue
332 if (((unsigned)$kgm_thread.wait_event > (unsigned)sectPRELINKB) \
333 && ($arg1 != 2) && ($kgm_show_kmod_syms == 0))
334 showkmodaddr $kgm_thread.wait_event
335 else
336 output /a (unsigned) $kgm_thread.wait_event
337 end
338 if ($kgm_thread.uthread != 0)
339 set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
340 if ($kgm_uthread->uu_wmesg != 0)
341 printf " \"%s\"", $kgm_uthread->uu_wmesg
342 end
343 end
344 end
345 if $arg1 != 0
346 if ($kgm_thread.kernel_stack != 0)
347 if ($kgm_thread.reserved_stack != 0)
348 printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
349 end
350 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
351 if ($kgm_mtype == 18)
352 set $mysp = $kgm_thread.machine.pcb->save_r1
353 end
354 if ($kgm_mtype == 7)
355 set $kgm_statep = (struct x86_kernel_state32 *) \
356 ($kgm_thread->kernel_stack + 0x4000 \
357 - sizeof(struct x86_kernel_state32))
358 set $mysp = $kgm_statep->k_ebp
359 end
360 if ($kgm_mtype == 12)
361 if ($arg0 == $r9)
362 set $mysp = $r7
363 else
364 set $kgm_statep = (struct arm_saved_state *)$kgm_thread.machine.kstackptr
365 set $mysp = $kgm_statep->r[7]
366 end
367 end
368 set $prevsp = $mysp - 16
369 printf "\n\t\tstacktop=0x%08x", $mysp
370 if ($kgm_mtype == 18)
371 set $stkmask = 0xf
372 else
373 set $stkmask = 0x3
374 end
375 set $kgm_return = 0
376 while ($mysp != 0) && (($mysp & $stkmask) == 0) \
377 && ($mysp != $prevsp) \
378 && ((((unsigned) $mysp ^ (unsigned) $prevsp) < 0x2000) \
379 || (((unsigned)$mysp < ((unsigned) ($kgm_thread->kernel_stack+0x4000))) \
380 && ((unsigned)$mysp > (unsigned) ($kgm_thread->kernel_stack))))
381 printf "\n\t\t0x%08x ", $mysp
382 if ($kgm_mtype == 18)
383 set $kgm_return = *($mysp + 8)
384 end
385 if ($kgm_mtype == 7)
386 set $kgm_return = *($mysp + 4)
387 end
388 if ($kgm_mtype == 12)
389 set $kgm_return = *($mysp + 4)
390 end
391 if (((unsigned) $kgm_return > (unsigned) sectPRELINKB) \
392 && ($kgm_show_kmod_syms == 0))
393 showkmodaddr $kgm_return
394 else
395 output /a (unsigned) $kgm_return
396 end
397 set $prevsp = $mysp
398 set $mysp = * $mysp
399 end
400 set $kgm_return = 0
401 printf "\n\t\tstackbottom=0x%08x", $prevsp
402 else
403 printf "\n\t\t\tcontinuation="
404 output /a (unsigned) $kgm_thread.continuation
405 end
406 printf "\n"
407 else
408 printf "\n"
409 end
410 end
411
412 define showact
413 showactheader
414 showactint $arg0 0
415 end
416 document showact
417 Syntax: (gdb) showact <activation>
418 | Routine to print out the state of a specific thread.
419 end
420
421
422 define showactstack
423 showactheader
424 showactint $arg0 1
425 end
426 document showactstack
427 Syntax: (gdb) showactstack <activation>
428 | Routine to print out the stack of a specific thread.
429 end
430
431
432 define showallthreads
433 set $kgm_head_taskp = &tasks
434 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
435 while $kgm_taskp != $kgm_head_taskp
436 showtaskheader
437 showtaskint $kgm_taskp
438 showactheader
439 set $kgm_head_actp = &($kgm_taskp->threads)
440 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
441 while $kgm_actp != $kgm_head_actp
442 showactint $kgm_actp 0
443 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
444 end
445 printf "\n"
446 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
447 end
448 end
449 document showallthreads
450 Syntax: (gdb) showallthreads
451 | Routine to print out info about all threads in the system.
452 end
453
454 define showcurrentthreads
455 set $kgm_prp = (struct processor *)processor_list
456 while $kgm_prp != 0
457 if ($kgm_prp)->active_thread != 0
458 set $kgm_actp = ($kgm_prp)->active_thread
459 showtaskheader
460 showtaskint ($kgm_actp)->task
461 showactheader
462 showactint $kgm_actp 0
463 printf "\n"
464 end
465 set $kgm_prp = ($kgm_prp)->processor_list
466 end
467 end
468 document showcurrentthreads
469 Syntax: (gdb) showcurrentthreads
470 | Routine to print out info about the thread running on each cpu.
471 end
472
473 set $decode_wait_events = 0
474 define showallstacks
475 set $kgm_head_taskp = &tasks
476 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
477 while $kgm_taskp != $kgm_head_taskp
478 showtaskheader
479 showtaskint $kgm_taskp
480 set $kgm_head_actp = &($kgm_taskp->threads)
481 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
482 while $kgm_actp != $kgm_head_actp
483 showactheader
484 if ($decode_wait_events > 0)
485 showactint $kgm_actp 1
486 else
487 showactint $kgm_actp 2
488 end
489 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
490 end
491 printf "\n"
492 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
493 end
494 end
495
496 document showallstacks
497 Syntax: (gdb) showallstacks
498 | Routine to print out the stack for each thread in the system.
499 | If the variable $decode_wait_events is non-zero, the routine attempts to
500 | interpret thread wait_events as kernel module offsets, which can add to
501 | processing time.
502 end
503
504 define showcurrentstacks
505 set $kgm_prp = processor_list
506 while $kgm_prp != 0
507 if ($kgm_prp)->active_thread != 0
508 set $kgm_actp = ($kgm_prp)->active_thread
509 showtaskheader
510 showtaskint ($kgm_actp)->task
511 showactheader
512 showactint $kgm_actp 1
513 printf "\n"
514 end
515 set $kgm_prp = ($kgm_prp)->processor_list
516 end
517 end
518
519 document showcurrentstacks
520 Syntax: (gdb) showcurrentstacks
521 | Routine to print out the thread running on each cpu (incl. its stack)
522 end
523
524 define showwaiterheader
525 printf "waiters activation "
526 printf "thread pri state wait_queue wait_event\n"
527 end
528
529 define showwaitqwaiters
530 set $kgm_w_waitqp = (struct wait_queue *)$arg0
531 set $kgm_w_linksp = &($kgm_w_waitqp->wq_queue)
532 set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_linksp->next
533 set $kgm_w_found = 0
534 while ( (queue_entry_t)$kgm_w_wqe != (queue_entry_t)$kgm_w_linksp)
535 if ($kgm_w_wqe->wqe_type != &_wait_queue_link)
536 if !$kgm_w_found
537 set $kgm_w_found = 1
538 showwaiterheader
539 end
540 set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe
541 showactint $kgm_w_shuttle 0
542 end
543 set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_wqe->wqe_links.next
544 end
545 end
546
547 define showwaitqwaitercount
548 set $kgm_wc_waitqp = (struct wait_queue *)$arg0
549 set $kgm_wc_linksp = &($kgm_wc_waitqp->wq_queue)
550 set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_linksp->next
551 set $kgm_wc_count = 0
552 while ( (queue_entry_t)$kgm_wc_wqe != (queue_entry_t)$kgm_wc_linksp)
553 if ($kgm_wc_wqe->wqe_type != &_wait_queue_link)
554 set $kgm_wc_count = $kgm_wc_count + 1
555 end
556 set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_wqe->wqe_links.next
557 end
558 printf "0x%08x ", $kgm_wc_count
559 end
560
561 define showwaitqmembercount
562 set $kgm_mc_waitqsetp = (struct wait_queue_set *)$arg0
563 set $kgm_mc_setlinksp = &($kgm_mc_waitqsetp->wqs_setlinks)
564 set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_setlinksp->next
565 set $kgm_mc_count = 0
566 while ( (queue_entry_t)$kgm_mc_wql != (queue_entry_t)$kgm_mc_setlinksp)
567 set $kgm_mc_count = $kgm_mc_count + 1
568 set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_wql->wql_setlinks.next
569 end
570 printf "0x%08x ", $kgm_mc_count
571 end
572
573
574 define showwaitqmemberheader
575 printf "set-members wait_queue interlock "
576 printf "pol type member_cnt waiter_cnt\n"
577 end
578
579 define showwaitqmemberint
580 set $kgm_m_waitqp = (struct wait_queue *)$arg0
581 printf " 0x%08x ", $kgm_m_waitqp
582 printf "0x%08x ", $kgm_m_waitqp->wq_interlock.lock_data
583 if ($kgm_m_waitqp->wq_fifo)
584 printf "Fifo "
585 else
586 printf "Prio "
587 end
588 if ($kgm_m_waitqp->wq_type == 0xf1d1)
589 printf "Set "
590 showwaitqmembercount $kgm_m_waitqp
591 else
592 printf "Que 0x00000000 "
593 end
594 showwaitqwaitercount $kgm_m_waitqp
595 printf "\n"
596 end
597
598
599 define showwaitqmemberofheader
600 printf "member-of wait_queue interlock "
601 printf "pol type member_cnt waiter_cnt\n"
602 end
603
604 define showwaitqmemberof
605 set $kgm_mo_waitqp = (struct wait_queue *)$arg0
606 set $kgm_mo_linksp = &($kgm_mo_waitqp->wq_queue)
607 set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_linksp->next
608 set $kgm_mo_found = 0
609 while ( (queue_entry_t)$kgm_mo_wqe != (queue_entry_t)$kgm_mo_linksp)
610 if ($kgm_mo_wqe->wqe_type == &_wait_queue_link)
611 if !$kgm_mo_found
612 set $kgm_mo_found = 1
613 showwaitqmemberofheader
614 end
615 set $kgm_mo_wqlp = (struct wait_queue_link *)$kgm_mo_wqe
616 set $kgm_mo_wqsetp = (struct wait_queue *)($kgm_mo_wqlp->wql_setqueue)
617 showwaitqmemberint $kgm_mo_wqsetp
618 end
619 set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_wqe->wqe_links.next
620 end
621 end
622
623 define showwaitqmembers
624 set $kgm_ms_waitqsetp = (struct wait_queue_set *)$arg0
625 set $kgm_ms_setlinksp = &($kgm_ms_waitqsetp->wqs_setlinks)
626 set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_setlinksp->next
627 set $kgm_ms_found = 0
628 while ( (queue_entry_t)$kgm_ms_wql != (queue_entry_t)$kgm_ms_setlinksp)
629 set $kgm_ms_waitqp = $kgm_ms_wql->wql_element.wqe_queue
630 if !$kgm_ms_found
631 showwaitqmemberheader
632 set $kgm_ms_found = 1
633 end
634 showwaitqmemberint $kgm_ms_waitqp
635 set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_wql->wql_setlinks.next
636 end
637 end
638
639 define showwaitqheader
640 printf "wait_queue ref_count interlock "
641 printf "pol type member_cnt waiter_cnt\n"
642 end
643
644 define showwaitqint
645 set $kgm_waitqp = (struct wait_queue *)$arg0
646 printf "0x%08x ", $kgm_waitqp
647 if ($kgm_waitqp->wq_type == 0xf1d1)
648 printf "0x%08x ", ((struct wait_queue_set *)$kgm_waitqp)->wqs_refcount
649 else
650 printf "0x00000000 "
651 end
652 printf "0x%08x ", $kgm_waitqp->wq_interlock.lock_data
653 if ($kgm_waitqp->wq_fifo)
654 printf "Fifo "
655 else
656 printf "Prio "
657 end
658 if ($kgm_waitqp->wq_type == 0xf1d1)
659 printf "Set "
660 showwaitqmembercount $kgm_waitqp
661 else
662 printf "Que 0x00000000 "
663 end
664 showwaitqwaitercount $kgm_waitqp
665 printf "\n"
666 end
667
668 define showwaitq
669 set $kgm_waitq1p = (wait_queue_t)$arg0
670 showwaitqheader
671 showwaitqint $kgm_waitq1p
672 if ($kgm_waitq1p->wq_type == 0xf1d1)
673 showwaitqmembers $kgm_waitq1p
674 else
675 showwaitqmemberof $kgm_waitq1p
676 end
677 showwaitqwaiters $kgm_waitq1p
678 end
679
680 define showmapheader
681 printf "vm_map pmap vm_size "
682 printf "#ents rpage hint first_free\n"
683 end
684
685 define showvmeheader
686 printf " entry start "
687 printf " prot #page object offset\n"
688 end
689
690 define showvmint
691 set $kgm_mapp = (vm_map_t)$arg0
692 set $kgm_map = *$kgm_mapp
693 printf "0x%08x ", $arg0
694 printf "0x%08x ", $kgm_map.pmap
695 printf "0x%08x ", $kgm_map.size
696 printf "%3d ", $kgm_map.hdr.nentries
697 if $kgm_map.pmap
698 printf "%5d ", $kgm_map.pmap->stats.resident_count
699 else
700 printf "<n/a> "
701 end
702 printf "0x%08x ", $kgm_map.hint
703 printf "0x%08x\n", $kgm_map.first_free
704 if $arg1 != 0
705 showvmeheader
706 set $kgm_head_vmep = &($kgm_mapp->hdr.links)
707 set $kgm_vmep = $kgm_map.hdr.links.next
708 while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
709 set $kgm_vme = *$kgm_vmep
710 printf " 0x%08x ", $kgm_vmep
711 printf "0x%016llx ", $kgm_vme.links.start
712 printf "%1x", $kgm_vme.protection
713 printf "%1x", $kgm_vme.max_protection
714 if $kgm_vme.inheritance == 0x0
715 printf "S"
716 end
717 if $kgm_vme.inheritance == 0x1
718 printf "C"
719 end
720 if $kgm_vme.inheritance == 0x2
721 printf "-"
722 end
723 if $kgm_vme.inheritance == 0x3
724 printf "D"
725 end
726 if $kgm_vme.is_sub_map
727 printf "s "
728 else
729 if $kgm_vme.needs_copy
730 printf "n "
731 else
732 printf " "
733 end
734 end
735 printf "%5d ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
736 printf "0x%08x ", $kgm_vme.object.vm_object
737 printf "0x%016llx\n", $kgm_vme.offset
738 set $kgm_vmep = $kgm_vme.links.next
739 end
740 end
741 printf "\n"
742 end
743
744
745 define showmapvme
746 showmapheader
747 showvmint $arg0 1
748 end
749 document showmapvme
750 Syntax: (gdb) showmapvme <vm_map>
751 | Routine to print out a summary listing of all the entries in a vm_map
752 end
753
754
755 define showmap
756 showmapheader
757 showvmint $arg0 0
758 end
759 document showmap
760 Syntax: (gdb) showmap <vm_map>
761 | Routine to print out info about the specified vm_map
762 end
763
764 define showallvm
765 set $kgm_head_taskp = &tasks
766 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
767 while $kgm_taskp != $kgm_head_taskp
768 showtaskheader
769 showmapheader
770 showtaskint $kgm_taskp
771 showvmint $kgm_taskp->map 0
772 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
773 end
774 end
775 document showallvm
776 Syntax: (gdb) showallvm
777 | Routine to print a summary listing of all the vm maps
778 end
779
780
781 define showallvme
782 set $kgm_head_taskp = &tasks
783 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
784 while $kgm_taskp != $kgm_head_taskp
785 showtaskheader
786 showmapheader
787 showtaskint $kgm_taskp
788 showvmint $kgm_taskp->map 1
789 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
790 end
791 end
792 document showallvme
793 Syntax: (gdb) showallvme
794 | Routine to print a summary listing of all the vm map entries
795 end
796
797
798 define showipcheader
799 printf "ipc_space is_table table_next "
800 printf "flags tsize splaytree splaybase\n"
801 end
802
803 define showipceheader
804 printf " name object "
805 printf "rite urefs destname destination\n"
806 end
807
808 define showipceint
809 set $kgm_ie = *(ipc_entry_t)$arg0
810 printf " 0x%08x ", $arg1
811 printf "0x%08x ", $kgm_ie.ie_object
812 if $kgm_ie.ie_bits & 0x00100000
813 printf "Dead "
814 printf "%5d\n", $kgm_ie.ie_bits & 0xffff
815 else
816 if $kgm_ie.ie_bits & 0x00080000
817 printf "SET "
818 printf "%5d\n", $kgm_ie.ie_bits & 0xffff
819 else
820 if $kgm_ie.ie_bits & 0x00010000
821 if $kgm_ie.ie_bits & 0x00020000
822 printf " SR"
823 else
824 printf " S"
825 end
826 else
827 if $kgm_ie.ie_bits & 0x00020000
828 printf " R"
829 end
830 end
831 if $kgm_ie.ie_bits & 0x00040000
832 printf " O"
833 end
834 if $kgm_ie.index.request
835 printf "n"
836 else
837 printf " "
838 end
839 if $kgm_ie.ie_bits & 0x00800000
840 printf "c"
841 else
842 printf " "
843 end
844 printf "%5d ", $kgm_ie.ie_bits & 0xffff
845 showportdest $kgm_ie.ie_object
846 end
847 end
848 end
849
850 define showipcint
851 set $kgm_isp = (ipc_space_t)$arg0
852 set $kgm_is = *$kgm_isp
853 printf "0x%08x ", $arg0
854 printf "0x%08x ", $kgm_is.is_table
855 printf "0x%08x ", $kgm_is.is_table_next
856 if $kgm_is.is_growing != 0
857 printf "G"
858 else
859 printf " "
860 end
861 if $kgm_is.is_fast != 0
862 printf "F"
863 else
864 printf " "
865 end
866 if $kgm_is.is_active != 0
867 printf "A "
868 else
869 printf " "
870 end
871 printf "%5d ", $kgm_is.is_table_size
872 printf "0x%08x ", $kgm_is.is_tree_total
873 printf "0x%08x\n", &$kgm_isp->is_tree
874 if $arg1 != 0
875 showipceheader
876 set $kgm_iindex = 0
877 set $kgm_iep = $kgm_is.is_table
878 set $kgm_destspacep = (ipc_space_t)0
879 while ( $kgm_iindex < $kgm_is.is_table_size )
880 set $kgm_ie = *$kgm_iep
881 if $kgm_ie.ie_bits & 0x001f0000
882 set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
883 showipceint $kgm_iep $kgm_name
884 end
885 set $kgm_iindex = $kgm_iindex + 1
886 set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
887 end
888 if $kgm_is.is_tree_total
889 printf "Still need to write tree traversal\n"
890 end
891 end
892 printf "\n"
893 end
894
895
896 define showipc
897 set $kgm_isp = (ipc_space_t)$arg0
898 showipcheader
899 showipcint $kgm_isp 0
900 end
901 document showipc
902 Syntax: (gdb) showipc <ipc_space>
903 | Routine to print the status of the specified ipc space
904 end
905
906 define showrights
907 set $kgm_isp = (ipc_space_t)$arg0
908 showipcheader
909 showipcint $kgm_isp 1
910 end
911 document showrights
912 Syntax: (gdb) showrights <ipc_space>
913 | Routine to print a summary list of all the rights in a specified ipc space
914 end
915
916
917 define showtaskipc
918 set $kgm_taskp = (task_t)$arg0
919 showtaskheader
920 showipcheader
921 showtaskint $kgm_taskp
922 showipcint $kgm_taskp->itk_space 0
923 end
924 document showtaskipc
925 Syntax: (gdb) showtaskipc <task>
926 | Routine to print info about the ipc space for a task
927 end
928
929
930 define showtaskrights
931 set $kgm_taskp = (task_t)$arg0
932 showtaskheader
933 showipcheader
934 showtaskint $kgm_taskp
935 showipcint $kgm_taskp->itk_space 1
936 end
937 document showtaskrights
938 Syntax: (gdb) showtaskrights <task>
939 | Routine to print info about the ipc rights for a task
940 end
941
942 define showallipc
943 set $kgm_head_taskp = &tasks
944 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
945 while $kgm_cur_taskp != $kgm_head_taskp
946 showtaskheader
947 showipcheader
948 showtaskint $kgm_cur_taskp
949 showipcint $kgm_cur_taskp->itk_space 0
950 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
951 end
952 end
953 document showallipc
954 Syntax: (gdb) showallipc
955 | Routine to print a summary listing of all the ipc spaces
956 end
957
958
959 define showallrights
960 set $kgm_head_taskp = &tasks
961 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
962 while $kgm_cur_taskp != $kgm_head_taskp
963 showtaskheader
964 showipcheader
965 showtaskint $kgm_cur_taskp
966 showipcint $kgm_cur_taskp->itk_space 1
967 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
968 end
969 end
970 document showallrights
971 Syntax: (gdb) showallrights
972 | Routine to print a summary listing of all the ipc rights
973 end
974
975
976 define showtaskvm
977 set $kgm_taskp = (task_t)$arg0
978 showtaskheader
979 showmapheader
980 showtaskint $kgm_taskp
981 showvmint $kgm_taskp->map 0
982 end
983 document showtaskvm
984 Syntax: (gdb) showtaskvm <task>
985 | Routine to print out info about a task's vm_map
986 end
987
988 define showtaskvme
989 set $kgm_taskp = (task_t)$arg0
990 showtaskheader
991 showmapheader
992 showtaskint $kgm_taskp
993 showvmint $kgm_taskp->map 1
994 end
995 document showtaskvme
996 Syntax: (gdb) showtaskvme <task>
997 | Routine to print out info about a task's vm_map_entries
998 end
999
1000
1001 define showtaskheader
1002 printf "task vm_map ipc_space #acts "
1003 showprocheader
1004 end
1005
1006
1007 define showtaskint
1008 set $kgm_task = *(struct task *)$arg0
1009 printf "0x%08x ", $arg0
1010 printf "0x%08x ", $kgm_task.map
1011 printf "0x%08x ", $kgm_task.itk_space
1012 printf "%3d ", $kgm_task.thread_count
1013 showprocint $kgm_task.bsd_info
1014 end
1015
1016 define showtask
1017 showtaskheader
1018 showtaskint $arg0
1019 end
1020 document showtask
1021 Syntax (gdb) showtask <task>
1022 | Routine to print out info about a task.
1023 end
1024
1025
1026 define showtaskthreads
1027 showtaskheader
1028 set $kgm_taskp = (struct task *)$arg0
1029 showtaskint $kgm_taskp
1030 showactheader
1031 set $kgm_head_actp = &($kgm_taskp->threads)
1032 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1033 while $kgm_actp != $kgm_head_actp
1034 showactint $kgm_actp 0
1035 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1036 end
1037 end
1038 document showtaskthreads
1039 Syntax: (gdb) showtaskthreads <task>
1040 | Routine to print info about the threads in a task.
1041 end
1042
1043
1044 define showtaskstacks
1045 showtaskheader
1046 set $kgm_taskp = (struct task *)$arg0
1047 showtaskint $kgm_taskp
1048 set $kgm_head_actp = &($kgm_taskp->threads)
1049 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1050 while $kgm_actp != $kgm_head_actp
1051 showactheader
1052 showactint $kgm_actp 1
1053 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1054 end
1055 end
1056 document showtaskstacks
1057 Syntax: (gdb) showtaskstacks <task>
1058 | Routine to print out the stack for each thread in a task.
1059 end
1060
1061
1062 define showalltasks
1063 showtaskheader
1064 set $kgm_head_taskp = &tasks
1065 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1066 while $kgm_taskp != $kgm_head_taskp
1067 showtaskint $kgm_taskp
1068 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1069 end
1070 end
1071 document showalltasks
1072 Syntax: (gdb) showalltasks
1073 | Routine to print a summary listing of all the tasks
1074 end
1075
1076
1077 define showprocheader
1078 printf " pid proc command\n"
1079 end
1080
1081 define showprocint
1082 set $kgm_procp = (struct proc *)$arg0
1083 if $kgm_procp != 0
1084 printf "%5d ", $kgm_procp->p_pid
1085 printf "0x%08x ", $kgm_procp
1086 printf "%s\n", $kgm_procp->p_comm
1087 else
1088 printf " *0* 0x00000000 --\n"
1089 end
1090 end
1091
1092 define showpid
1093 showtaskheader
1094 set $kgm_head_taskp = &tasks
1095 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1096 while $kgm_taskp != $kgm_head_taskp
1097 set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info
1098 if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0))
1099 showtaskint $kgm_taskp
1100 set $kgm_taskp = $kgm_head_taskp
1101 else
1102 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1103 end
1104 end
1105 end
1106 document showpid
1107 Syntax: (gdb) showpid <pid>
1108 | Routine to print a single process by pid
1109 end
1110
1111 define showproc
1112 showtaskheader
1113 set $kgm_procp = (struct proc *)$arg0
1114 showtaskint $kgm_procp->task $arg1 $arg2
1115 end
1116
1117
1118 define kdb
1119 set switch_debugger=1
1120 continue
1121 end
1122 document kdb
1123 | kdb - Switch to the inline kernel debugger
1124 |
1125 | usage: kdb
1126 |
1127 | The kdb macro allows you to invoke the inline kernel debugger.
1128 end
1129
1130 define showpsetheader
1131 printf "portset waitqueue recvname "
1132 printf "flags refs recvname process\n"
1133 end
1134
1135 define showportheader
1136 printf "port mqueue recvname "
1137 printf "flags refs recvname process\n"
1138 end
1139
1140 define showportmemberheader
1141 printf "members port recvname "
1142 printf "flags refs mqueue msgcount\n"
1143 end
1144
1145 define showkmsgheader
1146 printf "messages kmsg size "
1147 printf "disp msgid remote-port local-port\n"
1148 end
1149
1150 define showkmsgint
1151 printf " 0x%08x ", $arg0
1152 set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header
1153 printf "0x%08x ", $kgm_kmsgh.msgh_size
1154 if (($kgm_kmsgh.msgh_bits & 0xff) == 19)
1155 printf "rC"
1156 else
1157 printf "rM"
1158 end
1159 if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 < 8))
1160 printf "lC"
1161 else
1162 printf "lM"
1163 end
1164 if ($kgm_kmsgh.msgh_bits & 0xf0000000)
1165 printf "c"
1166 else
1167 printf "s"
1168 end
1169 printf "%5d ", $kgm_kmsgh.msgh_id
1170 printf "0x%08x ", $kgm_kmsgh.msgh_remote_port
1171 printf "0x%08x\n", $kgm_kmsgh.msgh_local_port
1172 end
1173
1174
1175
1176 define showkobject
1177 set $kgm_portp = (struct ipc_port *)$arg0
1178 printf "0x%08x kobject(", $kgm_portp->ip_kobject
1179 set $kgm_kotype = ($kgm_portp->ip_object.io_bits & 0x00000fff)
1180 if ($kgm_kotype == 1)
1181 printf "THREAD"
1182 end
1183 if ($kgm_kotype == 2)
1184 printf "TASK"
1185 end
1186 if ($kgm_kotype == 3)
1187 printf "HOST"
1188 end
1189 if ($kgm_kotype == 4)
1190 printf "HOST_PRIV"
1191 end
1192 if ($kgm_kotype == 5)
1193 printf "PROCESSOR"
1194 end
1195 if ($kgm_kotype == 6)
1196 printf "PSET"
1197 end
1198 if ($kgm_kotype == 7)
1199 printf "PSET_NAME"
1200 end
1201 if ($kgm_kotype == 8)
1202 printf "TIMER"
1203 end
1204 if ($kgm_kotype == 9)
1205 printf "PAGER_REQ"
1206 end
1207 if ($kgm_kotype == 10)
1208 printf "DEVICE"
1209 end
1210 if ($kgm_kotype == 11)
1211 printf "XMM_OBJECT"
1212 end
1213 if ($kgm_kotype == 12)
1214 printf "XMM_PAGER"
1215 end
1216 if ($kgm_kotype == 13)
1217 printf "XMM_KERNEL"
1218 end
1219 if ($kgm_kotype == 14)
1220 printf "XMM_REPLY"
1221 end
1222 if ($kgm_kotype == 15)
1223 printf "NOTDEF 15"
1224 end
1225 if ($kgm_kotype == 16)
1226 printf "NOTDEF 16"
1227 end
1228 if ($kgm_kotype == 17)
1229 printf "HOST_SEC"
1230 end
1231 if ($kgm_kotype == 18)
1232 printf "LEDGER"
1233 end
1234 if ($kgm_kotype == 19)
1235 printf "MASTER_DEV"
1236 end
1237 if ($kgm_kotype == 20)
1238 printf "ACTIVATION"
1239 end
1240 if ($kgm_kotype == 21)
1241 printf "SUBSYSTEM"
1242 end
1243 if ($kgm_kotype == 22)
1244 printf "IO_DONE_QUE"
1245 end
1246 if ($kgm_kotype == 23)
1247 printf "SEMAPHORE"
1248 end
1249 if ($kgm_kotype == 24)
1250 printf "LOCK_SET"
1251 end
1252 if ($kgm_kotype == 25)
1253 printf "CLOCK"
1254 end
1255 if ($kgm_kotype == 26)
1256 printf "CLOCK_CTRL"
1257 end
1258 if ($kgm_kotype == 27)
1259 printf "IOKIT_SPARE"
1260 end
1261 if ($kgm_kotype == 28)
1262 printf "NAMED_MEM"
1263 end
1264 if ($kgm_kotype == 29)
1265 printf "IOKIT_CON"
1266 end
1267 if ($kgm_kotype == 30)
1268 printf "IOKIT_OBJ"
1269 end
1270 if ($kgm_kotype == 31)
1271 printf "UPL"
1272 end
1273 printf ")\n"
1274 end
1275
1276 define showportdestproc
1277 set $kgm_portp = (struct ipc_port *)$arg0
1278 set $kgm_spacep = $kgm_portp->data.receiver
1279 # check against the previous cached value - this is slow
1280 if ($kgm_spacep != $kgm_destspacep)
1281 set $kgm_destprocp = (struct proc *)0
1282 set $kgm_head_taskp = &tasks
1283 set $kgm_desttaskp = (struct task *)($kgm_head_taskp->next)
1284 while (($kgm_destprocp == 0) && ($kgm_desttaskp != $kgm_head_taskp))
1285 set $kgm_destspacep = $kgm_desttaskp->itk_space
1286 if ($kgm_destspacep == $kgm_spacep)
1287 set $kgm_destprocp = (struct proc *)$kgm_desttaskp->bsd_info
1288 else
1289 set $kgm_desttaskp = (struct task *)($kgm_desttaskp->tasks.next)
1290 end
1291 end
1292 end
1293 if $kgm_destprocp != 0
1294 printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid
1295 else
1296 printf "task 0x%08x\n", $kgm_desttaskp
1297 end
1298 end
1299
1300 define showportdest
1301 set $kgm_portp = (struct ipc_port *)$arg0
1302 set $kgm_spacep = $kgm_portp->data.receiver
1303 if ($kgm_spacep == ipc_space_kernel)
1304 showkobject $kgm_portp
1305 else
1306 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1307 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name
1308 showportdestproc $kgm_portp
1309 else
1310 printf "0x%08x inactive-port\n", $kgm_portp
1311 end
1312 end
1313 end
1314
1315 define showportmember
1316 printf " 0x%08x ", $arg0
1317 set $kgm_portp = (struct ipc_port *)$arg0
1318 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name
1319 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1320 printf "A"
1321 else
1322 printf " "
1323 end
1324 if ($kgm_portp->ip_object.io_bits & 0x7fff0000)
1325 printf "Set "
1326 else
1327 printf "Port"
1328 end
1329 printf "%5d ", $kgm_portp->ip_object.io_references
1330 printf "0x%08x ", &($kgm_portp->ip_messages)
1331 printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount
1332 end
1333
1334 define showportint
1335 printf "0x%08x ", $arg0
1336 set $kgm_portp = (struct ipc_port *)$arg0
1337 printf "0x%08x ", &($kgm_portp->ip_messages)
1338 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name
1339 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1340 printf "A"
1341 else
1342 printf "D"
1343 end
1344 printf "Port"
1345 printf "%5d ", $kgm_portp->ip_object.io_references
1346 set $kgm_destspacep = (struct ipc_space *)0
1347 showportdest $kgm_portp
1348 set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base
1349 if $arg1 && $kgm_kmsgp
1350 showkmsgheader
1351 showkmsgint $kgm_kmsgp
1352 set $kgm_kmsgheadp = $kgm_kmsgp
1353 set $kgm_kmsgp = $kgm_kmsgp->ikm_next
1354 while $kgm_kmsgp != $kgm_kmsgheadp
1355 showkmsgint $kgm_kmsgp
1356 set $kgm_kmsgp = $kgm_kmsgp->ikm_next
1357 end
1358 end
1359 end
1360
1361 define showpsetint
1362 printf "0x%08x ", $arg0
1363 set $kgm_psetp = (struct ipc_pset *)$arg0
1364 printf "0x%08x ", &($kgm_psetp->ips_messages)
1365 printf "0x%08x ", $kgm_psetp->ips_object.io_receiver_name
1366 if ($kgm_psetp->ips_object.io_bits & 0x80000000)
1367 printf "A"
1368 else
1369 printf "D"
1370 end
1371 printf "Set "
1372 printf "%5d ", $kgm_psetp->ips_object.io_references
1373 printf "0x%08x ", $kgm_psetp->ips_object.io_receiver_name
1374 set $kgm_setlinksp = &($kgm_psetp->ips_messages.data.set_queue.wqs_setlinks)
1375 set $kgm_wql = (struct wait_queue_link *)$kgm_setlinksp->next
1376 set $kgm_found = 0
1377 while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_setlinksp)
1378 set $kgm_portp = (struct ipc_port *)((int)($kgm_wql->wql_element->wqe_queue) - ((int)$kgm_portoff))
1379 if !$kgm_found
1380 set $kgm_destspacep = (struct ipc_space *)0
1381 showportdestproc $kgm_portp
1382 showportmemberheader
1383 set $kgm_found = 1
1384 end
1385 showportmember $kgm_portp 0
1386 set $kgm_wql = (struct wait_queue_link *)$kgm_wql->wql_setlinks.next
1387 end
1388 if !$kgm_found
1389 printf "--n/e--\n"
1390 end
1391 end
1392
1393 define showpset
1394 showpsetheader
1395 showpsetint $arg0 1
1396 end
1397
1398 define showport
1399 showportheader
1400 showportint $arg0 1
1401 end
1402
1403 define showipcobject
1404 set $kgm_object = (ipc_object_t)$arg0
1405 if ($kgm_objectp->io_bits & 0x7fff0000)
1406 showpset $kgm_objectp
1407 else
1408 showport $kgm_objectp
1409 end
1410 end
1411
1412 define showmqueue
1413 set $kgm_mqueue = *(struct ipc_mqueue *)$arg0
1414 set $kgm_psetoff = &(((struct ipc_pset *)0)->ips_messages)
1415 set $kgm_portoff = &(((struct ipc_port *)0)->ip_messages)
1416 if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d1)
1417 set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff))
1418 showpsetheader
1419 showpsetint $kgm_pset 1
1420 end
1421 if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d0)
1422 showportheader
1423 set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff))
1424 showportint $kgm_port 1
1425 end
1426 end
1427
1428 define zprint_one
1429 set $kgm_zone = (struct zone *)$arg0
1430
1431 printf "0x%08x ", $kgm_zone
1432 printf "%8d ",$kgm_zone->count
1433 printf "%8x ",$kgm_zone->cur_size
1434 printf "%8x ",$kgm_zone->max_size
1435 printf "%6d ",$kgm_zone->elem_size
1436 printf "%8x ",$kgm_zone->alloc_size
1437 printf "%s ",$kgm_zone->zone_name
1438
1439 if ($kgm_zone->exhaustible)
1440 printf "H"
1441 end
1442 if ($kgm_zone->collectable)
1443 printf "C"
1444 end
1445 if ($kgm_zone->expandable)
1446 printf "X"
1447 end
1448 printf "\n"
1449 end
1450
1451
1452 define zprint
1453 printf "ZONE COUNT TOT_SZ MAX_SZ ELT_SZ ALLOC_SZ NAME\n"
1454 set $kgm_zone_ptr = (struct zone *)first_zone
1455 while ($kgm_zone_ptr != 0)
1456 zprint_one $kgm_zone_ptr
1457 set $kgm_zone_ptr = $kgm_zone_ptr->next_zone
1458 end
1459 printf "\n"
1460 end
1461 document zprint
1462 Syntax: (gdb) zprint
1463 | Routine to print a summary listing of all the kernel zones
1464 end
1465
1466 define showmtxgrp
1467 set $kgm_mtxgrp = (struct _lck_grp_ *)$arg0
1468
1469 if ($kgm_mtxgrp->lck_grp_mtxcnt)
1470 printf "0x%08x ", $kgm_mtxgrp
1471 printf "%8d ",$kgm_mtxgrp->lck_grp_mtxcnt
1472 printf "%12u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_util_cnt
1473 printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_miss_cnt
1474 printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_wait_cnt
1475 printf "%s ",&$kgm_mtxgrp->lck_grp_name
1476 printf "\n"
1477 end
1478 end
1479
1480
1481 define showallmtx
1482 printf "LCK GROUP CNT UTIL MISS WAIT NAME\n"
1483 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)&lck_grp_queue
1484 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)$kgm_mtxgrp_ptr->lck_grp_link.next
1485 while ($kgm_mtxgrp_ptr != (struct _lck_grp_ *)&lck_grp_queue)
1486 showmtxgrp $kgm_mtxgrp_ptr
1487 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)$kgm_mtxgrp_ptr->lck_grp_link.next
1488 end
1489 printf "\n"
1490 end
1491 document showallmtx
1492 Syntax: (gdb) showallmtx
1493 | Routine to print a summary listing of all mutexes
1494 end
1495
1496 define showrwlckgrp
1497 set $kgm_rwlckgrp = (struct _lck_grp_ *)$arg0
1498
1499 if ($kgm_rwlckgrp->lck_grp_rwcnt)
1500 printf "0x%08x ", $kgm_rwlckgrp
1501 printf "%8d ",$kgm_rwlckgrp->lck_grp_rwcnt
1502 printf "%12u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt
1503 printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_miss_cnt
1504 printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_wait_cnt
1505 printf "%s ",&$kgm_rwlckgrp->lck_grp_name
1506 printf "\n"
1507 end
1508 end
1509
1510
1511 define showallrwlck
1512 printf "LCK GROUP CNT UTIL MISS WAIT NAME\n"
1513 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)&lck_grp_queue
1514 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)$kgm_rwlckgrp_ptr->lck_grp_link.next
1515 while ($kgm_rwlckgrp_ptr != (struct _lck_grp_ *)&lck_grp_queue)
1516 showrwlckgrp $kgm_rwlckgrp_ptr
1517 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)$kgm_rwlckgrp_ptr->lck_grp_link.next
1518 end
1519 printf "\n"
1520 end
1521 document showallrwlck
1522 Syntax: (gdb) showallrwlck
1523 | Routine to print a summary listing of all read/writer locks
1524 end
1525
1526 set $kdp_act_counter = 0
1527
1528 set $r0_save = 0
1529 set $r1_save = 0
1530 set $r2_save = 0
1531 set $r3_save = 0
1532 set $r4_save = 0
1533 set $r5_save = 0
1534 set $r6_save = 0
1535 set $r7_save = 0
1536 set $r8_save = 0
1537 set $r9_save = 0
1538 set $r10_save = 0
1539 set $r11_save = 0
1540 set $r12_save = 0
1541 set $sp_save = 0
1542 set $lr_save = 0
1543 set $pc_save = 0
1544
1545 define showcontext_int
1546 echo Context switched, current instruction pointer:
1547 output/a $pc
1548 echo \n
1549 end
1550
1551 define switchtoact
1552 set $newact = (struct thread *) $arg0
1553 select 0
1554 if ($newact->kernel_stack == 0)
1555 echo This activation does not have a stack.\n
1556 echo continuation:
1557 output/a (unsigned) $newact.continuation
1558 echo \n
1559 else
1560 if ($kgm_mtype == 18)
1561 if ($kdp_act_counter == 0)
1562 set $kdpstate = (struct savearea *) kdp.saved_state
1563 end
1564 set $kdp_act_counter = $kdp_act_counter + 1
1565 set (struct savearea *) kdp.saved_state=$newact->machine->pcb
1566 flushregs
1567 flushstack
1568 set $pc=$newact->machine->pcb.save_srr0
1569 update
1570 end
1571 if ($kgm_mtype == 7)
1572 set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
1573 if ($kdp_act_counter == 0)
1574 set $kdpstate = *($kdpstatep)
1575 end
1576 set $kdp_act_counter = $kdp_act_counter + 1
1577
1578 set $kgm_statep = (struct x86_kernel_state32 *) \
1579 ($newact->kernel_stack + 0x4000 \
1580 - sizeof(struct x86_kernel_state32))
1581 set $kdpstatep->ebx = $kgm_statep->k_ebx
1582 set $kdpstatep->ebp = $kgm_statep->k_ebp
1583 set $kdpstatep->edi = $kgm_statep->k_edi
1584 set $kdpstatep->esi = $kgm_statep->k_esi
1585 set $kdpstatep->eip = $kgm_statep->k_eip
1586 flushregs
1587 flushstack
1588 set $pc = $kgm_statep->k_eip
1589 update
1590 end
1591 if ($kgm_mtype == 12)
1592 set $r0_save = $r0
1593 set $r1_save = $r1
1594 set $r2_save = $r2
1595 set $r3_save = $r3
1596 set $r4_save = $r4
1597 set $r5_save = $r5
1598 set $r6_save = $r6
1599 set $r7_save = $r7
1600 set $r8_save = $r8
1601 set $r9_save = $r9
1602 set $r10_save = $r10
1603 set $r11_save = $r11
1604 set $r12_save = $r12
1605 set $sp_save = $sp
1606 set $lr_save = $lr
1607 set $pc_save = $pc
1608 set $pc_ctx = load_reg+8
1609 set $kgm_statep = (struct arm_saved_state *)((struct thread*)$arg0)->machine.kstackptr
1610 set $r0 = $kgm_statep->r[0]
1611 set $r1 = $kgm_statep->r[1]
1612 set $r2 = $kgm_statep->r[2]
1613 set $r3 = $kgm_statep->r[3]
1614 set $r4 = $kgm_statep->r[4]
1615 set $r5 = $kgm_statep->r[5]
1616 set $r6 = $kgm_statep->r[6]
1617 set $r8 = $kgm_statep->r[8]
1618 set $r9 = $kgm_statep->r[9]
1619 set $r10 = $kgm_statep->r[10]
1620 set $r11 = $kgm_statep->r[11]
1621 set $r12 = $kgm_statep->r[12]
1622 set $sp = $kgm_statep->sp
1623 set $lr = $kgm_statep->lr
1624 set $pc = $pc_ctx
1625 set $r7 = $kgm_statep->r[7]
1626 flushregs
1627 flushstack
1628 end
1629 end
1630 showcontext_int
1631 end
1632
1633 document switchtoact
1634 Syntax: switchtoact <address of activation>
1635 | This command allows gdb to examine the execution context and call
1636 | stack for the specified activation. For example, to view the backtrace
1637 | for an activation issue "switchtoact <address>", followed by "bt".
1638 | Before resuming execution, issue a "resetctx" command, to
1639 | return to the original execution context.
1640 end
1641
1642 define switchtoctx
1643 select 0
1644 if ($kgm_mtype == 18)
1645 if ($kdp_act_counter == 0)
1646 set $kdpstate = (struct savearea *) kdp.saved_state
1647 end
1648 set $kdp_act_counter = $kdp_act_counter + 1
1649 set (struct savearea *) kdp.saved_state=(struct savearea *) $arg0
1650 flushregs
1651 flushstack
1652 set $pc=((struct savearea *) $arg0)->save_srr0
1653 update
1654 else
1655 if ($kgm_mtype == 12)
1656 set $r0_save = $r0
1657 set $r1_save = $r1
1658 set $r2_save = $r2
1659 set $r3_save = $r3
1660 set $r4_save = $r4
1661 set $r5_save = $r5
1662 set $r6_save = $r6
1663 set $r7_save = $r7
1664 set $r8_save = $r8
1665 set $r9_save = $r9
1666 set $r10_save = $r10
1667 set $r11_save = $r11
1668 set $r12_save = $r12
1669 set $sp_save = $sp
1670 set $lr_save = $lr
1671 set $pc_save = $pc
1672 set $kgm_statep = (struct arm_saved_state *)$arg0
1673 set $r0 = $kgm_statep->r[0]
1674 set $r1 = $kgm_statep->r[1]
1675 set $r2 = $kgm_statep->r[2]
1676 set $r3 = $kgm_statep->r[3]
1677 set $r4 = $kgm_statep->r[4]
1678 set $r5 = $kgm_statep->r[5]
1679 set $r6 = $kgm_statep->r[6]
1680 set $r8 = $kgm_statep->r[8]
1681 set $r9 = $kgm_statep->r[9]
1682 set $r10 = $kgm_statep->r[10]
1683 set $r11 = $kgm_statep->r[11]
1684 set $r12 = $kgm_statep->r[12]
1685 set $sp = $kgm_statep->sp
1686 set $lr = $kgm_statep->lr
1687 set $r7 = $kgm_statep->r[7]
1688 set $pc = $kgm_statep->pc
1689 flushregs
1690 flushstack
1691 update
1692 else
1693 echo switchtoctx not implemented for this architecture.\n
1694 end
1695 end
1696
1697 document switchtoctx
1698 Syntax: switchtoctx <address of pcb>
1699 | This command allows gdb to examine an execution context and dump the
1700 | backtrace for this execution context.
1701 | Before resuming execution, issue a "resetctx" command, to
1702 | return to the original execution context.
1703 end
1704
1705 define resetctx
1706 select 0
1707 if ($kdp_act_counter != 0)
1708 if ($kgm_mtype == 18)
1709 set (struct savearea *)kdp.saved_state=$kdpstate
1710 flushregs
1711 flushstack
1712 set $pc=((struct savearea *) kdp.saved_state)->save_srr0
1713 update
1714 set $kdp_act_counter = 0
1715 end
1716 if ($kgm_mtype == 7)
1717 set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
1718 set *($kdpstatep)=$kdpstate
1719 flushregs
1720 flushstack
1721 set $pc=$kdpstatep->eip
1722 update
1723 set $kdp_act_counter = 0
1724 end
1725 if ($kgm_mtype == 12)
1726 set $r0 = $r0_save
1727 flushregs
1728 set $r1 = $r1_save
1729 flushregs
1730 set $r2 = $r2_save
1731 flushregs
1732 set $r3 = $r3_save
1733 flushregs
1734 set $r4 = $r4_save
1735 flushregs
1736 set $r5 = $r5_save
1737 flushregs
1738 set $r6 = $r6_save
1739 flushregs
1740 set $r8 = $r8_save
1741 flushregs
1742 set $r9 = $r9_save
1743 flushregs
1744 set $r10 = $r10_save
1745 flushregs
1746 set $r11 = $r11_save
1747 flushregs
1748 set $r12 = $r12_save
1749 flushregs
1750 set $sp = $sp_save
1751 flushregs
1752 set $lr = $lr_save
1753 flushregs
1754 set $pc = $pc_save
1755 flushregs
1756 set $r7 = $r7_save
1757 flushregs
1758 end
1759 showcontext_int
1760 end
1761 end
1762
1763 document resetctx
1764 | Syntax: resetctx
1765 | Returns to the original execution context. This command should be
1766 | issued if you wish to resume execution after using the "switchtoact"
1767 | or "switchtoctx" commands.
1768 end
1769
1770 # This is a pre-hook for the continue command, to prevent inadvertent attempts
1771 # to resume from the context switched to for examination.
1772 define hook-continue
1773 resetctx
1774 end
1775
1776 # This is a pre-hook for the detach command, to prevent inadvertent attempts
1777 # to resume from the context switched to for examination.
1778 define hook-detach
1779 resetctx
1780 end
1781
1782 define resume_on
1783 set noresume_on_disconnect = 0
1784 end
1785
1786 document resume_on
1787 | Syntax: resume_on
1788 | The target system will resume when detaching or exiting from gdb.
1789 | This is the default behavior.
1790 end
1791
1792 define resume_off
1793 set noresume_on_disconnect = 1
1794 end
1795
1796 document resume_off
1797 | Syntax: resume_off
1798 | The target system won't resume after detaching from gdb and
1799 | can be attached with a new gdb session
1800 end
1801
1802 define paniclog
1803 set $kgm_panic_bufptr = debug_buf
1804 set $kgm_panic_bufptr_max = debug_buf_ptr
1805 while $kgm_panic_bufptr < $kgm_panic_bufptr_max
1806 if *(char *)$kgm_panic_bufptr == 10
1807 printf "\n"
1808 else
1809 printf "%c", *$kgm_panic_bufptr
1810 end
1811 set $kgm_panic_bufptr= (char *)$kgm_panic_bufptr + 1
1812 end
1813 end
1814
1815 document paniclog
1816 | Syntax: paniclog
1817 | Display the panic log information
1818 |
1819 end
1820
1821 define dumpcallqueue
1822 set $kgm_callhead = (queue_t)&$arg0
1823 set $kgm_call = (struct call_entry *)$kgm_callhead.next
1824 set $kgm_i = 0
1825 while $kgm_call != $kgm_callhead
1826 printf "0x%08x ", $kgm_call
1827 printf "0x%08x 0x%08x ", $kgm_call->param0, $kgm_call->param1
1828 output $kgm_call->state
1829 printf "\t"
1830 output $kgm_call->deadline
1831 printf "\t"
1832 output $kgm_call->func
1833 printf "\n"
1834 set $kgm_i = $kgm_i + 1
1835 set $kgm_call = (struct call_entry *)$kgm_call->q_link.next
1836 end
1837 printf "%d entries\n", $kgm_i
1838 end
1839
1840 document dumpcallqueue
1841 | Syntax: dumpcallqueue <queue head>
1842 | Displays the contents of the specified call_entry queue.
1843 end
1844
1845 define showtaskacts
1846 showtaskthreads $arg0
1847 end
1848 document showtaskacts
1849 | See help showtaskthreads.
1850 end
1851
1852 define showallacts
1853 showallthreads
1854 end
1855 document showallacts
1856 | See help showallthreads.
1857 end
1858
1859
1860 define resetstacks
1861 _kgm_flush_loop
1862 set kdp_pmap = 0
1863 _kgm_flush_loop
1864 resetctx
1865 _kgm_flush_loop
1866 _kgm_update_loop
1867 resetctx
1868 _kgm_update_loop
1869 end
1870
1871 document resetstacks
1872 | Syntax: resetstacks
1873 | Internal kgmacro routine used by the "showuserstack" macro
1874 | to reset the target pmap to the kernel pmap.
1875 end
1876
1877 #Barely effective hacks to work around bugs in the "flush" and "update"
1878 #gdb commands in Tiger (up to 219); these aren't necessary with Panther
1879 #gdb, but do no harm.
1880 define _kgm_flush_loop
1881 set $kgm_flush_loop_ctr = 0
1882 while ($kgm_flush_loop_ctr < 30)
1883 flushregs
1884 flushstack
1885 set $kgm_flush_loop_ctr = $kgm_flush_loop_ctr + 1
1886 end
1887 end
1888
1889 define _kgm_update_loop
1890 set $kgm_update_loop_ctr = 0
1891 while ($kgm_update_loop_ctr < 30)
1892 update
1893 set $kgm_update_loop_ctr = $kgm_update_loop_ctr + 1
1894 end
1895 end
1896
1897 #This is necessary since gdb often doesn't do backtraces on x86 correctly
1898 #in the absence of symbols.The code below in showuserstack and
1899 #showx86backtrace also contains several workarouds for the gdb bug where
1900 #gdb stops macro evaluation because of spurious "Cannot read memory"
1901 #errors on x86. These errors appear on ppc as well, but they don't
1902 #always stop macro evaluation.
1903
1904 set $kgm_cur_ebp = 0
1905 set $kgm_cur_eip = 0
1906
1907 define showx86backtrace
1908 if ($kgm_cur_ebp == 0)
1909 set $kgm_cur_ebp = $ebp
1910 end
1911 if ($kgm_cur_eip == 0)
1912 set $kgm_cur_eip = $eip
1913 end
1914 printf "0: EBP: 0x%08x EIP: 0x%08x\n", $kgm_cur_ebp, $kgm_cur_eip
1915 x/i $kgm_cur_eip
1916 set $kgm_prev_ebp = *((uint32_t *) $kgm_cur_ebp)
1917 set $kgm_prev_eip = *((uint32_t *) ($kgm_cur_ebp + 4))
1918 set $kgm_cur_ebp = 0
1919 set $kgm_cur_eip = 0
1920 set $kgm_frameno = 1
1921 while $kgm_prev_ebp != 0
1922 printf "%d: saved EBP: 0x%08x saved EIP: 0x%08x\n", $kgm_frameno, $kgm_prev_ebp, $kgm_prev_eip
1923 x/i $kgm_prev_eip
1924 set $kgm_prev_eip = *((uint32_t *) ($kgm_prev_ebp + 4))
1925 set $kgm_prev_ebp = *((uint32_t *) $kgm_prev_ebp)
1926 set $kgm_frameno = $kgm_frameno + 1
1927 end
1928 set kdp_pmap = 0
1929 end
1930
1931 define showuserstack
1932 select 0
1933 if ($kgm_mtype == 18)
1934 if ($kdp_act_counter == 0)
1935 set $kdpstate = (struct savearea *) kdp.saved_state
1936 end
1937 set $kdp_act_counter = $kdp_act_counter + 1
1938 set $newact = (struct thread *) $arg0
1939 _kgm_flush_loop
1940 set $checkpc = $newact->machine->upcb.save_srr0
1941 if ($checkpc == 0)
1942 echo This activation does not appear to have
1943 echo \20 a valid user context.\n
1944 else
1945 set (struct savearea *) kdp.saved_state=$newact->machine->upcb
1946 set $pc = $checkpc
1947 #flush and update seem to be executed lazily by gdb on Tiger, hence the
1948 #repeated invocations - see 3743135
1949 _kgm_flush_loop
1950 # This works because the new pmap is used only for reads
1951 set kdp_pmap = $newact->task->map->pmap
1952 _kgm_flush_loop
1953 _kgm_update_loop
1954 bt
1955 resetstacks
1956 _kgm_flush_loop
1957 _kgm_update_loop
1958 resetstacks
1959 _kgm_flush_loop
1960 _kgm_update_loop
1961 end
1962 else
1963 if ($kgm_mtype == 7)
1964 set $newact = (struct thread *) $arg0
1965 #This needs to identify 64-bit processes as well
1966 set $newiss = (x86_saved_state32_t) ($newact->machine.pcb->iss.uss.ss_32)
1967 set $checkpc = $newiss.eip
1968 if ($checkpc == 0)
1969 echo This activation does not appear to have
1970 echo \20 a valid user context.\n
1971 else
1972 set $kgm_cur_ebp = $newiss.ebp
1973 set $kgm_cur_eip = $checkpc
1974 printf "You may now issue the showx86backtrace command to see the user space backtrace for this thread (0x%08x); you can also examine memory locations in this address space (pmap 0x%08x) before issuing the backtrace. This two-step process is necessary to work around various bugs in x86 gdb, which cause it to stop memory evaluation on spurious memory read errors. Additionally, you may need to issue a set kdp_pmap = 0 command after the showx86backtrace completes, to resume reading from the kernel address space.\n", $arg0, $newact->task->map->pmap
1975 set kdp_pmap = $newact->task->map->pmap
1976 _kgm_flush_loop
1977 _kgm_update_loop
1978 end
1979 else
1980 echo showuserstack not supported on this architecture\n
1981 end
1982 end
1983 end
1984 document showuserstack
1985 Syntax: showuserstack <address of thread activation>
1986 |This command displays a numeric backtrace for the user space stack of
1987 |the given thread activation. It may, of course, fail to display a
1988 |complete backtrace if portions of the user stack are not mapped in.
1989 |Symbolic backtraces can be obtained either by running gdb on the
1990 |user space binary, or a tool such as "symbolicate".
1991 |Note that while this command works on Panther's gdb, an issue
1992 |with Tiger gdb (3743135) appears to hamper the evaluation of this
1993 |macro in some cases.
1994 end
1995
1996 #Stopgap until gdb can generate the HOSTREBOOT packet
1997 define kdp-reboot
1998 #Alternatively, set *(*(unsigned **) 0x2498) = 1 (or 0x5498 on PPC)
1999 set flag_kdp_trigger_reboot = 1
2000 continue
2001 end
2002
2003 document kdp-reboot
2004 Syntax: kdp-reboot
2005 |Reboot the remote target machine; not guaranteed to succeed. Requires symbols
2006 |until gdb support for the HOSTREBOOT packet is implemented.
2007 end
2008
2009 define sendcore
2010 set kdp_trigger_core_dump = 1
2011 set kdp_flag |= 0x40
2012 set panicd_ip_str = "$arg0"
2013 set panicd_specified = 1
2014 set disable_debug_output = 0
2015 set disableConsoleOutput = 0
2016 set logPanicDataToScreen = 1
2017 set reattach_wait = 1
2018 resume_off
2019 end
2020
2021 document sendcore
2022 Syntax: sendcore <IP address>
2023 |Configure the kernel to transmit a kernel coredump to a server (kdumpd)
2024 |at the specified IP address. This is useful when the remote target has
2025 |not been previously configured to transmit coredumps, and you wish to
2026 |preserve kernel state for later examination. NOTE: You must issue a "continue"
2027 |command after using this macro to trigger the kernel coredump. The kernel
2028 |will resume waiting in the debugger after completion of the coredump. You
2029 |may disable coredumps by executing the "disablecore" macro.
2030 end
2031
2032 define disablecore
2033 set kdp_trigger_core_dump = 0
2034 set kdp_flag |= 0x40
2035 set kdp_flag &= ~0x10
2036 set panicd_specified = 0
2037 end
2038
2039 document disablecore
2040 Syntax: disablecore
2041 |Reconfigures the kernel so that it no longer transmits kernel coredumps. This
2042 |complements the "sendcore" macro, but it may be used if the kernel has been
2043 |configured to transmit coredumps through boot-args as well.
2044 end
2045
2046 define switchtocorethread
2047 set $newact = (struct thread *) $arg0
2048 select 0
2049 if ($newact->kernel_stack == 0)
2050 echo This thread does not have a stack.\n
2051 echo continuation:
2052 output/a (unsigned) $newact.continuation
2053 echo \n
2054 else
2055 if ($kgm_mtype == 18)
2056 loadcontext $newact->machine->pcb
2057 flushstack
2058 set $pc = $newact->machine->pcb.save_srr0
2059 else
2060 if ($kgm_mtype == 7)
2061 set $kgm_cstatep = (struct x86_kernel_state32 *) \
2062 ($newact->kernel_stack + 0x4000 \
2063 - sizeof(struct x86_kernel_state32))
2064 loadcontext $kgm_cstatep
2065 flushstack
2066 else
2067 echo switchtocorethread not supported on this architecture\n
2068 end
2069 end
2070 showcontext_int
2071 end
2072 end
2073
2074 document switchtocorethread
2075 Syntax: switchtocorethread <address of activation>
2076 | The corefile equivalent of "switchtoact". When debugging a kernel coredump
2077 | file, this command can be used to examine the execution context and stack
2078 | trace for a given thread activation. For example, to view the backtrace
2079 | for a thread issue "switchtocorethread <address>", followed by "bt".
2080 | Before resuming execution, issue a "resetcorectx" command, to
2081 | return to the original execution context. Note that this command
2082 | requires gdb support, as documented in Radar 3401283.
2083 end
2084
2085 define loadcontext
2086 select 0
2087 if ($kgm_mtype == 18)
2088 set $kgm_contextp = (struct savearea *) $arg0
2089 set $pc = $kgm_contextp.save_srr0
2090 set $r1 = $kgm_contextp.save_r1
2091 set $lr = $kgm_contextp.save_lr
2092
2093 set $r2 = $kgm_contextp.save_r2
2094 set $r3 = $kgm_contextp.save_r3
2095 set $r4 = $kgm_contextp.save_r4
2096 set $r5 = $kgm_contextp.save_r5
2097 set $r6 = $kgm_contextp.save_r6
2098 set $r7 = $kgm_contextp.save_r7
2099 set $r8 = $kgm_contextp.save_r8
2100 set $r9 = $kgm_contextp.save_r9
2101 set $r10 = $kgm_contextp.save_r10
2102 set $r11 = $kgm_contextp.save_r11
2103 set $r12 = $kgm_contextp.save_r12
2104 set $r13 = $kgm_contextp.save_r13
2105 set $r14 = $kgm_contextp.save_r14
2106 set $r15 = $kgm_contextp.save_r15
2107 set $r16 = $kgm_contextp.save_r16
2108 set $r17 = $kgm_contextp.save_r17
2109 set $r18 = $kgm_contextp.save_r18
2110 set $r19 = $kgm_contextp.save_r19
2111 set $r20 = $kgm_contextp.save_r20
2112 set $r21 = $kgm_contextp.save_r21
2113 set $r22 = $kgm_contextp.save_r22
2114 set $r23 = $kgm_contextp.save_r23
2115 set $r24 = $kgm_contextp.save_r24
2116 set $r25 = $kgm_contextp.save_r25
2117 set $r26 = $kgm_contextp.save_r26
2118 set $r27 = $kgm_contextp.save_r27
2119 set $r28 = $kgm_contextp.save_r28
2120 set $r29 = $kgm_contextp.save_r29
2121 set $r30 = $kgm_contextp.save_r30
2122 set $r31 = $kgm_contextp.save_r31
2123
2124 set $cr = $kgm_contextp.save_cr
2125 set $ctr = $kgm_contextp.save_ctr
2126 else
2127 if ($kgm_mtype == 7)
2128 set $kgm_contextp = (struct x86_kernel_state32 *) $arg0
2129 set $ebx = $kgm_contextp->k_ebx
2130 set $ebp = $kgm_contextp->k_ebp
2131 set $edi = $kgm_contextp->k_edi
2132 set $esi = $kgm_contextp->k_esi
2133 set $eip = $kgm_contextp->k_eip
2134 set $pc = $kgm_contextp->k_eip
2135 else
2136 echo loadcontext not supported on this architecture\n
2137 end
2138 end
2139 end
2140
2141 define resetcorectx
2142 select 0
2143 if ($kgm_mtype == 18)
2144 set $kgm_corecontext = (struct savearea *) kdp.saved_state
2145 loadcontext $kgm_corecontext
2146 else
2147 if ($kgm_mtype == 7)
2148 set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
2149 set $ebx = $kdpstatep->ebx
2150 set $ebp = $kdpstatep->ebp
2151 set $edi = $kdpstatep->edi
2152 set $esi = $kdpstatep->esi
2153 set $eip = $kdpstatep->eip
2154 set $eax = $kdpstatep->eax
2155 set $ecx = $kdpstatep->ecx
2156 set $edx = $kdpstatep->edx
2157 flushregs
2158 flushstack
2159 set $pc = $kdpstatep->eip
2160 update
2161 else
2162 echo resetcorectx not supported on this architecture\n
2163 end
2164 end
2165 showcontext_int
2166 end
2167
2168 document resetcorectx
2169 Syntax: resetcorectx
2170 | The corefile equivalent of "resetctx". Returns to the original
2171 | execution context (that of the active thread at the time of the NMI or
2172 | panic). This command should be issued if you wish to resume
2173 | execution after using the "switchtocorethread" command.
2174 end
2175
2176 #Helper function for "showallgdbstacks"
2177
2178 define showgdbthread
2179 printf " 0x%08x ", $arg0
2180 set $kgm_thread = *(struct thread *)$arg0
2181 printf "0x%08x ", $arg0
2182 printf "%3d ", $kgm_thread.sched_pri
2183 set $kgm_state = $kgm_thread.state
2184 if $kgm_state & 0x80
2185 printf "I"
2186 end
2187 if $kgm_state & 0x40
2188 printf "P"
2189 end
2190 if $kgm_state & 0x20
2191 printf "A"
2192 end
2193 if $kgm_state & 0x10
2194 printf "H"
2195 end
2196 if $kgm_state & 0x08
2197 printf "U"
2198 end
2199 if $kgm_state & 0x04
2200 printf "R"
2201 end
2202 if $kgm_state & 0x02
2203 printf "S"
2204 end
2205 if $kgm_state & 0x01
2206 printf "W\t"
2207 printf "0x%08x ", $kgm_thread.wait_queue
2208 output /a (unsigned) $kgm_thread.wait_event
2209 if ($kgm_thread.uthread != 0)
2210 set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
2211 if ($kgm_uthread->uu_wmesg != 0)
2212 printf " \"%s\"", $kgm_uthread->uu_wmesg
2213 end
2214 end
2215 end
2216 if $arg1 != 0
2217 if ($kgm_thread.kernel_stack != 0)
2218 if ($kgm_thread.reserved_stack != 0)
2219 printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
2220 end
2221 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
2222 if ($kgm_mtype == 18)
2223 set $mysp = $kgm_thread.machine.pcb->save_r1
2224 end
2225 if ($kgm_mtype == 7)
2226 set $kgm_statep = (struct x86_kernel_state32 *) \
2227 ($kgm_thread->kernel_stack + 0x4000 \
2228 - sizeof(struct x86_kernel_state32))
2229 set $mysp = $kgm_statep->k_ebp
2230 end
2231 if ($kgm_mtype == 12)
2232 if ($arg0 == $r9)
2233 set $mysp = $r7
2234 else
2235 set $kgm_statep = (struct arm_saved_state *)$kgm_thread.machine.kstackptr
2236 set $mysp = $kgm_statep->r[7]
2237 end
2238 end
2239 set $prevsp = 0
2240 printf "\n\t\tstacktop=0x%08x", $mysp
2241 if ($arg2 == 0)
2242 switchtoact $arg0
2243 else
2244 switchtocorethread $arg0
2245 end
2246 bt
2247 else
2248 printf "\n\t\t\tcontinuation="
2249 output /a (unsigned) $kgm_thread.continuation
2250 end
2251 printf "\n"
2252 else
2253 printf "\n"
2254 end
2255 end
2256
2257 #Use of this macro is currently (8/04) blocked by the fact that gdb
2258 #stops evaluating macros when encountering an error, such as a failure
2259 #to read memory from a certain location. Until this issue (described in
2260 #3758949) is addressed, evaluation of this macro may stop upon
2261 #encountering such an error.
2262
2263 define showallgdbstacks
2264 set $kgm_head_taskp = &tasks
2265 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
2266 while $kgm_taskp != $kgm_head_taskp
2267 showtaskheader
2268 showtaskint $kgm_taskp
2269 set $kgm_head_actp = &($kgm_taskp->threads)
2270 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
2271 while $kgm_actp != $kgm_head_actp
2272 showactheader
2273 showgdbthread $kgm_actp 1 0
2274 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
2275 end
2276 printf "\n"
2277 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
2278 end
2279 resetctx
2280 end
2281
2282 document showallgdbstacks
2283 Syntax: showallgdbstacks
2284 | An alternative to "showallstacks". Iterates through the task list and
2285 | displays a gdb generated backtrace for each kernel thread. It is
2286 | advantageous in that it is much faster than "showallstacks", and
2287 | decodes function call arguments and displays source level traces, but
2288 | it has the drawback that it doesn't determine if frames belong to
2289 | functions from kernel extensions, as with "showallstacks".
2290 | This command may terminate prematurely because of a gdb bug
2291 | (Radar 3758949), which stops macro evaluation on memory read
2292 | errors.
2293 end
2294
2295 define showallgdbcorestacks
2296 select 0
2297 set $kgm_head_taskp = &tasks
2298 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
2299 while $kgm_taskp != $kgm_head_taskp
2300 showtaskheader
2301 showtaskint $kgm_taskp
2302 set $kgm_head_actp = &($kgm_taskp->threads)
2303 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
2304 while $kgm_actp != $kgm_head_actp
2305 showactheader
2306 showgdbthread $kgm_actp 1 1
2307 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
2308 end
2309 printf "\n"
2310 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
2311 end
2312 resetcorectx
2313 end
2314
2315
2316 document showallgdbcorestacks
2317 Syntax: showallgdbcorestacks
2318 |Corefile version of "showallgdbstacks"
2319 end
2320
2321
2322 define switchtouserthread
2323 select 0
2324 if ($kgm_mtype == 18)
2325 if ($kdp_act_counter == 0)
2326 set $kdpstate = (struct savearea *) kdp.saved_state
2327 end
2328 set $kdp_act_counter = $kdp_act_counter + 1
2329 set $newact = (struct thread *) $arg0
2330 _kgm_flush_loop
2331 set $checkpc = $newact->machine->upcb.save_srr0
2332 if ($checkpc == 0)
2333 echo This activation does not appear to have
2334 echo \20 a valid user context.\n
2335 else
2336 set (struct savearea *) kdp.saved_state=$newact->machine->upcb
2337 set $pc = $checkpc
2338 #flush and update seem to be executed lazily by gdb on Tiger, hence the
2339 #repeated invocations - see 3743135
2340 _kgm_flush_loop
2341 # This works because the new pmap is used only for reads
2342 set kdp_pmap = $newact->task->map->pmap
2343 _kgm_flush_loop
2344 _kgm_update_loop
2345 end
2346 else
2347 echo switchtouserthread not implemented for this architecture.\n
2348 end
2349 end
2350
2351 document switchtouserthread
2352 Syntax: switchtouserthread <address of thread>
2353 | Analogous to switchtoact, but switches to the user context of a
2354 | specified thread address. Similar to the "showuserstack"
2355 | command, but this command does not return gdb to the kernel context
2356 | immediately. This is to assist with the following (rather risky)
2357 | manoeuvre - upon switching to the user context and virtual address
2358 | space, the user may choose to call remove-symbol-file on the
2359 | mach_kernel symbol file, and then add-symbol-file on the user space
2360 | binary's symfile. gdb can then generate symbolic backtraces
2361 | for the user space thread. To return to the
2362 | kernel context and virtual address space, the process must be
2363 | reversed, i.e. call remove-symbol-file on the user space symbols, and
2364 | then add-symbol-file on the appropriate mach_kernel, and issue the
2365 | "resetstacks" command. Note that gdb may not react kindly to all these
2366 | symbol file switches. The same restrictions that apply to "showuserstack"
2367 | apply here - pages that have been paged out cannot be read while in the
2368 | debugger context, so backtraces may terminate early.
2369 | If the virtual addresses in the stack trace do not conflict with those
2370 | of symbols in the kernel's address space, it may be sufficient to
2371 | just do an add-symbol-file on the user space binary's symbol file.
2372 | Note that while this command works on Panther's gdb, an issue
2373 | with Tiger gdb (3743135) appears to hamper the evaluation of this
2374 | macro in some cases.
2375 end
2376
2377 define showmetaclass
2378 set $kgm_metaclassp = (OSMetaClass *)$arg0
2379 printf "%-5d", $kgm_metaclassp->instanceCount
2380 printf "x %5d bytes", $kgm_metaclassp->classSize
2381 printf " %s\n", $kgm_metaclassp->className->string
2382 end
2383
2384 define showstring
2385 printf "\"%s\"", ((OSString *)$arg0)->string
2386 end
2387
2388 define shownumber
2389 printf "%lld", ((OSNumber *)$arg0)->value
2390 end
2391
2392 define showboolean
2393 if ($arg0 == gOSBooleanFalse)
2394 printf "No"
2395 else
2396 printf "Yes"
2397 end
2398 end
2399
2400 define showdata
2401 set $kgm_data = (OSData *)$arg0
2402
2403 printf "<"
2404 set $kgm_datap = (const unsigned char *) $kgm_data->data
2405
2406 set $kgm_printstr = 0
2407 if (0 == (3 & (unsigned int)$kgm_datap) && ($kgm_data->length >= 3))
2408 set $kgm_bytes = *(unsigned int *) $kgm_datap
2409 if (0xffff0000 & $kgm_bytes)
2410 set $kgm_idx = 0
2411 set $kgm_printstr = 1
2412 while ($kgm_idx++ < 4)
2413 set $kgm_bytes = $kgm_bytes >> 8
2414 set $kgm_char = 0xff & $kgm_bytes
2415 if ($kgm_char && (($kgm_char < 0x20) || ($kgm_char > 0x7e)))
2416 set $kgm_printstr = 0
2417 end
2418 end
2419 end
2420 end
2421
2422 set $kgm_idx = 0
2423 if ($kgm_printstr)
2424 set $kgm_quoted = 0
2425 while ($kgm_idx < $kgm_data->length)
2426 set $kgm_char = $kgm_datap[$kgm_idx++]
2427 if ($kgm_char)
2428 if (0 == $kgm_quoted)
2429 set $kgm_quoted = 1
2430 if ($kgm_idx > 1)
2431 printf ",\""
2432 else
2433 printf "\""
2434 end
2435 end
2436 printf "%c", $kgm_char
2437 else
2438 if ($kgm_quoted)
2439 set $kgm_quoted = 0
2440 printf "\""
2441 end
2442 end
2443 end
2444 if ($kgm_quoted)
2445 printf "\""
2446 end
2447 else
2448 if (0 == (3 & (unsigned int)$kgm_datap))
2449 while (($kgm_idx + 3) <= $kgm_data->length)
2450 printf "%08x", *(unsigned int *) &$kgm_datap[$kgm_idx]
2451 set $kgm_idx = $kgm_idx + 4
2452 end
2453 end
2454 while ($kgm_idx < $kgm_data->length)
2455 printf "%02x", $kgm_datap[$kgm_idx++]
2456 end
2457 end
2458 printf ">"
2459 end
2460
2461 define showdictionaryint
2462 set $kgm$arg0_dict = (OSDictionary *)$arg1
2463
2464 printf "{"
2465 set $kgm$arg0_idx = 0
2466 while ($kgm$arg0_idx < $kgm$arg0_dict->count)
2467 set $kgm_obj = $kgm$arg0_dict->dictionary[$kgm$arg0_idx].key
2468 showobjectint _$arg0 $kgm_obj
2469 printf "="
2470 set $kgm_obj = $kgm$arg0_dict->dictionary[$kgm$arg0_idx++].value
2471 showobjectint _$arg0 $kgm_obj
2472 if ($kgm$arg0_idx < $kgm$arg0_dict->count)
2473 printf ","
2474 end
2475 end
2476 printf "}"
2477 end
2478
2479 define indent
2480 set $kgm_idx = 0
2481 while ($kgm_idx < $arg0)
2482 if ($arg1 & (1 << $kgm_idx++))
2483 printf "| "
2484 else
2485 printf " "
2486 end
2487 end
2488 end
2489
2490 define showregdictionary
2491 indent $kgm_reg_depth+2 $arg1
2492 printf "{\n"
2493
2494 set $kgm_reg_idx = 0
2495 while ($kgm_reg_idx < $arg0->count)
2496 indent $kgm_reg_depth+2 $arg1
2497 printf " "
2498 set $kgm_obj = $arg0->dictionary[$kgm_reg_idx].key
2499 showobjectint _ $kgm_obj
2500 printf " = "
2501
2502 set $kgm_obj = $arg0->dictionary[$kgm_reg_idx++].value
2503 showobjectint _ $kgm_obj
2504 printf "\n"
2505 end
2506 indent $kgm_reg_depth+2 $arg1
2507 printf "}\n"
2508 end
2509
2510
2511 define showarraysetint
2512 set $kgm$arg0_array = (OSArray *)$arg1
2513
2514 set $kgm$arg0_idx = 0
2515 while ($kgm$arg0_idx < $kgm$arg0_array->count)
2516 set $kgm_obj = $kgm$arg0_array->array[$kgm$arg0_idx++]
2517 showobjectint _$arg0 $kgm_obj
2518 if ($kgm$arg0_idx < $kgm$arg0_array->count)
2519 printf ","
2520 end
2521 end
2522 end
2523
2524 define showarrayint
2525 printf "("
2526 showarraysetint $arg0 $arg1
2527 printf ")"
2528 end
2529
2530 define showsetint
2531 set $kgm_array = ((OSSet *)$arg1)->members
2532 printf "["
2533 showarraysetint $arg0 $kgm_array
2534 printf "]"
2535 end
2536
2537
2538 define showobjectint
2539 set $kgm_obj = (OSObject *) $arg1
2540 set $kgm_vt = *((void **) $arg1)
2541
2542 if ($kgm_show_object_addrs)
2543 printf "`object %p, vt ", $arg1
2544 output /a (unsigned) $kgm_vt
2545 if ($kgm_show_object_retain)
2546 printf ", retain count %d, container retain %d", (0xffff & $kgm_obj->retainCount), $kgm_obj->retainCount >> 16
2547 end
2548 printf "` "
2549 end
2550
2551 if ($kgm_vt == _ZTV8OSString)
2552 showstring $arg1
2553 else
2554 if ($kgm_vt == _ZTV8OSSymbol)
2555 showstring $arg1
2556 else
2557 if ($kgm_vt == _ZTV8OSNumber)
2558 shownumber $arg1
2559 else
2560 if ($kgm_vt == _ZTV6OSData)
2561 showdata $arg1
2562 else
2563 if ($kgm_vt == _ZTV9OSBoolean)
2564 showboolean $arg1
2565 else
2566 if ($kgm_vt == _ZTV12OSDictionary)
2567 showdictionaryint _$arg0 $arg1
2568 else
2569 if ($kgm_vt == _ZTV7OSArray)
2570 showarrayint _$arg0 $arg1
2571 else
2572 if ($kgm_vt == _ZTV5OSSet)
2573 showsetint _$arg0 $arg1
2574 else
2575 if ($kgm_show_object_addrs == 0)
2576 printf "`object %p, vt ", $arg1
2577 output /a (unsigned) $kgm_vt
2578 printf "`"
2579 end
2580 end
2581 end
2582 end
2583 end
2584 end
2585 end
2586 end
2587 end
2588 end
2589
2590 define showobject
2591 set $kgm_save = $kgm_show_object_addrs
2592 set $kgm_show_object_addrs = 1
2593 set $kgm_show_object_retain = 1
2594 showobjectint _ $arg0
2595 set $kgm_show_object_addrs = $kgm_save
2596 set $kgm_show_object_retain = 0
2597 printf "\n"
2598 end
2599 document showobject
2600 Syntax: (gdb) showobject <object address>
2601 | Show info about an OSObject - its vtable ptr and retain count.
2602 | If the object is a simple container class, more info will be shown.
2603 end
2604
2605 define dictget
2606 set $kgm_dictp = (OSDictionary *)$arg0
2607 set $kgm_keyp = (const OSSymbol *)$arg1
2608 set $kgm_idx = 0
2609 set $kgm_result = 0
2610 while (($kgm_idx < $kgm_dictp->count) && ($kgm_result == 0))
2611 if ($kgm_keyp == $kgm_dictp->dictionary[$kgm_idx].key)
2612 set $kgm_result = $kgm_dictp->dictionary[$kgm_idx].value
2613 end
2614 set $kgm_idx = $kgm_idx + 1
2615 end
2616 end
2617
2618
2619 define showregistryentryrecurse
2620 set $kgm_re = (IOService *)$arg1
2621 set $kgm$arg0_stack = (unsigned long long) $arg2
2622
2623 if ($arg3)
2624 set $kgm$arg0_stack = $kgm$arg0_stack | (1ULL << $kgm_reg_depth)
2625 else
2626 set $kgm$arg0_stack = $kgm$arg0_stack & ~(1ULL << $kgm_reg_depth)
2627 end
2628
2629 dictget $kgm_re->fRegistryTable $kgm_childkey
2630 set $kgm$arg0_child_array = (OSArray *) $kgm_result
2631
2632 if ($kgm$arg0_child_array)
2633 set $kgm$arg0_child_count = $kgm$arg0_child_array->count
2634 else
2635 set $kgm$arg0_child_count = 0
2636 end
2637
2638 if ($kgm$arg0_child_count)
2639 set $kgm$arg0_stack = $kgm$arg0_stack | (2ULL << $kgm_reg_depth)
2640 else
2641 set $kgm$arg0_stack = $kgm$arg0_stack & ~(2ULL << $kgm_reg_depth)
2642 end
2643
2644 indent $kgm_reg_depth $kgm$arg0_stack
2645 printf "+-o "
2646
2647 dictget $kgm_re->fRegistryTable $kgm_namekey
2648 if ($kgm_result == 0)
2649 dictget $kgm_re->fRegistryTable gIONameKey
2650 end
2651 if ($kgm_result == 0)
2652 dictget $kgm_re->fPropertyTable gIOClassKey
2653 end
2654
2655 if ($kgm_result != 0)
2656 printf "%s", ((OSString *)$kgm_result)->string
2657 else
2658 if (((IOService*)$kgm_re)->pwrMgt && ((IOService*)$kgm_re)->pwrMgt->Name)
2659 printf "%s", ((IOService*)$kgm_re)->pwrMgt->Name
2660 else
2661 # printf ", guessclass "
2662 # guessclass $kgm_re
2663 printf "??"
2664 end
2665 end
2666
2667
2668 printf " <object %p, ", $kgm_re
2669 printf "vtable "
2670 set $kgm_vt = (unsigned) *(void**) $kgm_re
2671 output /a $kgm_vt
2672
2673 if ($kgm_vt != _ZTV15IORegistryEntry)
2674 printf ", "
2675 set $kgm_state = $kgm_re->__state[0]
2676 # kIOServiceRegisteredState
2677 if (0 == ($kgm_state & 2))
2678 printf "!"
2679 end
2680 printf "registered, "
2681 # kIOServiceMatchedState
2682 if (0 == ($kgm_state & 4))
2683 printf "!"
2684 end
2685 printf "matched, "
2686 # kIOServiceInactiveState
2687 if ($kgm_state & 1)
2688 printf "in"
2689 end
2690 printf "active, busy %d, retain count %d", (0xff & $kgm_re->__state[1]), (0xffff & $kgm_re->retainCount)
2691 end
2692 printf ">\n"
2693
2694 if ($kgm_show_props)
2695 set $kgm_props = $kgm_re->fPropertyTable
2696 showregdictionary $kgm_props $kgm$arg0_stack
2697 end
2698
2699 # recurse
2700 if ($kgm$arg0_child_count != 0)
2701
2702 set $kgm_reg_depth = $kgm_reg_depth + 1
2703 set $kgm$arg0_child_idx = 0
2704
2705 while ($kgm$arg0_child_idx < $kgm$arg0_child_count)
2706 set $kgm_re = $kgm$arg0_child_array->array[$kgm$arg0_child_idx++]
2707 set $kgm_more_sib = ($kgm$arg0_child_idx < $kgm$arg0_child_count)
2708 showregistryentryrecurse _$arg0 $kgm_re $kgm$arg0_stack $kgm_more_sib
2709 end
2710
2711 set $kgm_reg_depth = $kgm_reg_depth - 1
2712 end
2713 end
2714
2715 define showregistryentryint
2716 set $kgm_namekey = (OSSymbol *) $kgm_reg_plane[2]
2717 set $kgm_childkey = (OSSymbol *) $kgm_reg_plane[4]
2718
2719 showregistryentryrecurse _ $arg0 0 0
2720 end
2721
2722 define showregistry
2723 set $kgm_reg_depth = 0
2724 set $kgm_show_props = 0
2725 showregistryentryint gRegistryRoot
2726 end
2727 document showregistry
2728 Syntax: (gdb) showregistry
2729 | Show info about all registry entries in the current plane.
2730 end
2731
2732 define showregistryprops
2733 set $kgm_reg_depth = 0
2734 set $kgm_show_props = 1
2735 showregistryentryint gRegistryRoot
2736 end
2737 document showregistryprops
2738 Syntax: (gdb) showregistryprops
2739 | Show info about all registry entries in the current plane, and their properties.
2740 | set $kgm_show_object_addrs = 1 and/or set $kgm_show_object_retain = 1 will display
2741 | more verbose information
2742 end
2743
2744 define showregistryentry
2745 set $kgm_reg_depth = 0
2746 set $kgm_show_props = 1
2747 showregistryentryint $arg0
2748 end
2749 document showregistryentry
2750 Syntax: (gdb) showregistryentry <object address>
2751 | Show info about a registry entry; its properties and descendants in the current plane.
2752 end
2753
2754 define setregistryplane
2755 if ($arg0)
2756 set $kgm_reg_plane = (void **) $arg0
2757 else
2758 showobjectint _ gIORegistryPlanes
2759 printf "\n"
2760 end
2761 end
2762 document setregistryplane
2763 Syntax: (gdb) setregistryplane <plane object address>
2764 | Set the plane to be used for the iokit registry macros. An argument of zero will
2765 | display known planes.
2766 end
2767
2768 define guessclass
2769 set $kgm_classidx = 0
2770 set $kgm_lookvt = *((void **) $arg0)
2771 set $kgm_bestvt = (void *) 0
2772 set $kgm_bestidx = 0
2773
2774 while $kgm_classidx < sAllClassesDict->count
2775 set $kgm_meta = (OSMetaClass *) sAllClassesDict->dictionary[$kgm_classidx].value
2776
2777 set $kgm_vt = *((void **) $kgm_meta)
2778
2779 if (($kgm_vt > $kgm_bestvt) && ($kgm_vt < $kgm_lookvt))
2780 set $kgm_bestvt = $kgm_vt
2781 set $kgm_bestidx = $kgm_classidx
2782 end
2783 set $kgm_classidx = $kgm_classidx + 1
2784 end
2785 printf "%s", sAllClassesDict->dictionary[$kgm_bestidx].key->string
2786 end
2787
2788 define showallclasses
2789 set $kgm_classidx = 0
2790 while $kgm_classidx < sAllClassesDict->count
2791 set $kgm_meta = (OSMetaClass *) sAllClassesDict->dictionary[$kgm_classidx++].value
2792 showmetaclass $kgm_meta
2793 end
2794 end
2795
2796 document showallclasses
2797 Syntax: (gdb) showallclasses
2798 | Show the instance counts and ivar size of all OSObject subclasses. See ioclasscount man page for details.
2799 end
2800
2801 define showioalloc
2802 printf " Instance allocation = 0x%08lx = %4ld K\n", (int) debug_ivars_size, ((int) debug_ivars_size) / 1024
2803 printf "Container allocation = 0x%08lx = %4ld K\n", (int) debug_container_malloc_size, ((int) debug_container_malloc_size) / 1024
2804 printf " IOMalloc allocation = 0x%08lx = %4ld K\n", (int) debug_iomalloc_size, ((int) debug_iomalloc_size) / 1024
2805 printf " Pageable allocation = 0x%08lx = %4ld K\n", (vm_size_t) debug_iomallocpageable_size, ((vm_size_t) debug_iomallocpageable_size) / 1024
2806 end
2807
2808 document showioalloc
2809 Syntax: (gdb) showioalloc
2810 | Show some accounting of memory allocated by IOKit allocators. See ioalloccount man page for details.
2811 end
2812
2813 define showosobjecttracking
2814 set $kgm_next = (OSObjectTracking *) gOSObjectTrackList.next
2815 while $kgm_next != &gOSObjectTrackList
2816 set $obj = (OSObject *) ($kgm_next+1)
2817 showobject $obj
2818 set $kgm_idx = 0
2819 while $kgm_idx < (sizeof($kgm_next->bt) / sizeof($kgm_next->bt[0]))
2820 if ((unsigned) $kgm_next->bt[$kgm_idx] > (unsigned) sectPRELINKB)
2821 showkmodaddr $kgm_next->bt[$kgm_idx]
2822 printf "\n"
2823 else
2824 if ((unsigned) $kgm_next->bt[$kgm_idx] > 0)
2825 output /a (unsigned) $kgm_next->bt[$kgm_idx]
2826 printf "\n"
2827 end
2828 end
2829 set $kgm_idx = $kgm_idx + 1
2830 end
2831 printf "\n"
2832 set $kgm_next = (OSObjectTracking *) $kgm_next->link.next
2833 end
2834 end
2835
2836 document showosobjecttracking
2837 Syntax: (gdb) showosobjecttracking
2838 | Show the list of tracked OSObject allocations with backtraces.
2839 | Boot with the kOSTraceObjectAlloc (0x00400000) io debug flag set.
2840 | Set gOSObjectTrackThread to 1 or a thread_t to capture new OSObjects allocated by a thread or all threads.
2841 end
2842
2843 define readphys
2844 set kdp_trans_off = 1
2845 x/x $arg0
2846 set kdp_trans_off = 0
2847 end
2848
2849 define readphys64
2850 if ($kgm_mtype == 18)
2851 set kdp_src_high32 = ((uint32_t) ($arg0)) >> 32
2852 x/x (uint32_t) (($arg0) & 0x00000000ffffffffUL)
2853 set kdp_src_high32 = 0
2854 else
2855 echo readphys64 not available on this architecture.\n
2856 end
2857 end
2858
2859 document readphys
2860 | The argument is interpreted as a physical address, and the word addressed is
2861 | displayed. While this fails if no physical page exists at the given address,
2862 | it must be used with caution.
2863 end
2864
2865 document readphys64
2866 | The argument is interpreted as a 64-bit physical address, and the word
2867 | addressed is displayed. While this fails if no physical page exists at the
2868 | given address, it must be used with caution.
2869 end
2870
2871 define addkextsyms
2872 shell ls $arg0/* | xargs -n 1 echo add-symbol-file > /tmp/gdb-syms
2873 source /tmp/gdb-syms
2874 set $kgm_show_kmod_syms = 1
2875 end
2876
2877 document addkextsyms
2878 | Takes a directory of symbols for kexts generated with kextcache -y and loads them
2879 | into gdb.
2880 | (gdb) addkextsyms /path/to/symboldir
2881 end
2882
2883 define showprocfiles
2884 if ($argc == 1)
2885 _showprocheader
2886 _showprocfiles $arg0
2887 else
2888 printf "| Usage:\n|\n"
2889 help showprocfiles
2890 end
2891 end
2892 document showprocfiles
2893 Syntax: (gdb) showprocfiles <proc_t>
2894 | Given a proc_t pointer, display the list of open file descriptors for the
2895 | referenced process.
2896 end
2897
2898 define _showprocheader
2899 printf "fd fileglob fg flags fg type fg data info\n"
2900 printf "----- ---------- ---------- -------- ---------- -------------------\n"
2901 end
2902
2903 define _showprocfiles
2904 set $kgm_spf_filedesc = ((proc_t)$arg0)->p_fd
2905 set $kgm_spf_last = $kgm_spf_filedesc->fd_lastfile
2906 set $kgm_spf_ofiles = $kgm_spf_filedesc->fd_ofiles
2907 set $kgm_spf_count = 0
2908 while ($kgm_spf_count <= $kgm_spf_last)
2909 if ($kgm_spf_ofiles[$kgm_spf_count] == 0)
2910 # DEBUG: For files that were open, but are now closed
2911 # printf "%-5d FILEPROC_NULL\n", $kgm_spf_count
2912 else
2913 # display fd #, fileglob address, fileglob flags
2914 set $kgm_spf_flags = $kgm_spf_ofiles[$kgm_spf_count].f_flags
2915 set $kgm_spf_fg = $kgm_spf_ofiles[$kgm_spf_count].f_fglob
2916 printf "%-5d 0x%08x 0x%08x ", $kgm_spf_count, $kgm_spf_fg, $kgm_spf_flags
2917 # decode fileglob type
2918 set $kgm_spf_fgt = $kgm_spf_fg->fg_type
2919 if ($kgm_spf_fgt == 1)
2920 printf "VNODE "
2921 end
2922 if ($kgm_spf_fgt == 2)
2923 printf "SOCKET "
2924 end
2925 if ($kgm_spf_fgt == 3)
2926 printf "PSXSHM "
2927 end
2928 if ($kgm_spf_fgt == 4)
2929 printf "PSXSEM "
2930 end
2931 if ($kgm_spf_fgt == 5)
2932 printf "KQUEUE "
2933 end
2934 if ($kgm_spf_fgt == 6)
2935 printf "PIPE "
2936 end
2937 if ($kgm_spf_fgt == 7)
2938 printf "FSEVENTS"
2939 end
2940 if ($kgm_spf_fgt < 1 || $kgm_spf_fgt > 7)
2941 printf "?: %-5d", $kgm_spf_fgt
2942 end
2943
2944 # display fileglob data address and decode interesting fact(s)
2945 # about data, if we know any
2946 set $kgm_spf_fgd = $kgm_spf_fg->fg_data
2947 printf " 0x%08x ", $kgm_spf_fgd
2948 if ($kgm_spf_fgt == 1)
2949 set $kgm_spf_name = ((struct vnode *)$kgm_spf_fgd)->v_name
2950 if ($kgm_spf_name == 0)
2951 printf "(null)"
2952 else
2953 printf "%s", $kgm_spf_name
2954 end
2955 end
2956 printf "\n"
2957 end
2958 set $kgm_spf_count = $kgm_spf_count + 1
2959 end
2960 end
2961
2962 #
2963 # Show all the advisory file locks held by a process for each of the vnode
2964 # type files that it has open; do this by walking the per process open file
2965 # table and looking at any vnode type fileglob that has a non-NULL lock list
2966 # associated with it.
2967 #
2968 define showproclocks
2969 if ($argc == 1)
2970 _showproclocks $arg0
2971 else
2972 printf "| Usage:\n|\n"
2973 help showproclocks
2974 end
2975 end
2976 document showproclocks
2977 Syntax: (gdb) showproclocks <proc_t>
2978 | Given a proc_t pointer, display the list of advisory file locks held by the
2979 | referenced process.
2980 end
2981
2982 define _showproclocks
2983 set $kgm_spl_filedesc = ((proc_t)$arg0)->p_fd
2984 set $kgm_spl_last = $kgm_spl_filedesc->fd_lastfile
2985 set $kgm_spl_ofiles = $kgm_spl_filedesc->fd_ofiles
2986 set $kgm_spl_count = 0
2987 set $kgm_spl_seen = 0
2988 while ($kgm_spl_count <= $kgm_spl_last)
2989 if ($kgm_spl_ofiles[$kgm_spl_count] == 0)
2990 # DEBUG: For files that were open, but are now closed
2991 # printf "%-5d FILEPROC_NULL\n", $kgm_spl_count
2992 else
2993 set $kgm_spl_fg = $kgm_spl_ofiles[$kgm_spl_count].f_fglob
2994 # decode fileglob type
2995 set $kgm_spl_fgt = $kgm_spl_fg->fg_type
2996 if ($kgm_spl_fgt == 1)
2997 set $kgm_spl_fgd = $kgm_spl_fg->fg_data
2998 set $kgm_spl_name = ((struct vnode *)$kgm_spl_fgd)->v_name
2999 set $kgm_spl_vnode = ((vnode_t)$kgm_spl_fgd)
3000 set $kgm_spl_lockiter = $kgm_spl_vnode->v_lockf
3001 if ($kgm_spl_lockiter != 0)
3002 if ($kgm_spl_seen == 0)
3003 _showvnodelockheader
3004 end
3005 set $kgm_spl_seen = $kgm_spl_seen + 1
3006 printf "( fd %d, name ", $kgm_spl_count
3007 if ($kgm_spl_name == 0)
3008 printf "(null) )"
3009 else
3010 printf "%s )\n", $kgm_spl_name
3011 end
3012 _showvnodelocks $kgm_spl_fgd
3013 end
3014 end
3015 end
3016 set $kgm_spl_count = $kgm_spf_count + 1
3017 end
3018 printf "%d total locks for 0x%08x\n", $kgm_spl_seen, $arg0
3019 end
3020
3021 define showprocinfo
3022 set $kgm_spi_proc = (proc_t)$arg0
3023 printf "Process 0x%08x\n", $kgm_spi_proc
3024 printf " name %s\n", $kgm_spi_proc->p_comm
3025 printf " pid:%.8d", $kgm_spi_proc->p_pid
3026 printf " task:0x%.8x", $kgm_spi_proc->task
3027 printf " p_stat:%.1d", $kgm_spi_proc->p_stat
3028 printf " parent pid:%.8d", $kgm_spi_proc->p_ppid
3029 # decode part of credential
3030 set $kgm_spi_cred = $kgm_spi_proc->p_ucred
3031 if ($kgm_spi_cred != 0)
3032 printf "Cred: euid %d ruid %d svuid %d\n", $kgm_spi_cred->cr_uid, $kgm_spi_cred->cr_ruid, $kgm_spi_cred->cr_svuid
3033 else
3034 printf "Cred: (null)\n"
3035 end
3036 # decode flags
3037 set $kgm_spi_flag = $kgm_spi_proc->p_flag
3038 printf "Flags: 0x%08x\n", $kgm_spi_flag
3039 if ($kgm_spi_flag & 0x00000001)
3040 printf " 0x00000001 - may hold advisory locks\n"
3041 end
3042 if ($kgm_spi_flag & 0x00000002)
3043 printf " 0x00000002 - has a controlling tty\n"
3044 end
3045 if ($kgm_spi_flag & 0x00000004)
3046 printf " 0x00000004 - process is 64 bit\n"
3047 else
3048 printf " !0x00000004 - process is 32 bit\n"
3049 end
3050 if ($kgm_spi_flag & 0x00000008)
3051 printf " 0x00000008 - no SIGCHLD on child stop\n"
3052 end
3053 if ($kgm_spi_flag & 0x00000010)
3054 printf " 0x00000010 - waiting for child exec/exit\n"
3055 end
3056 if ($kgm_spi_flag & 0x00000020)
3057 printf " 0x00000020 - has started profiling\n"
3058 end
3059 if ($kgm_spi_flag & 0x00000040)
3060 printf " 0x00000040 - in select; wakeup/waiting danger\n"
3061 end
3062 if ($kgm_spi_flag & 0x00000080)
3063 printf " 0x00000080 - was stopped and continued\n"
3064 end
3065 if ($kgm_spi_flag & 0x00000100)
3066 printf " 0x00000100 - has set privileges since exec\n"
3067 end
3068 if ($kgm_spi_flag & 0x00000200)
3069 printf " 0x00000200 - system process: no signals, stats, or swap\n"
3070 end
3071 if ($kgm_spi_flag & 0x00000400)
3072 printf " 0x00000400 - timing out during a sleep\n"
3073 end
3074 if ($kgm_spi_flag & 0x00000800)
3075 printf " 0x00000800 - debugged process being traced\n"
3076 end
3077 if ($kgm_spi_flag & 0x00001000)
3078 printf " 0x00001000 - debugging process has waited for child\n"
3079 end
3080 if ($kgm_spi_flag & 0x00002000)
3081 printf " 0x00002000 - exit in progress\n"
3082 end
3083 if ($kgm_spi_flag & 0x00004000)
3084 printf " 0x00004000 - process has called exec\n"
3085 end
3086 if ($kgm_spi_flag & 0x00008000)
3087 printf " 0x00008000 - owe process an addupc() XXX\n"
3088 end
3089 if ($kgm_spi_flag & 0x00010000)
3090 printf " 0x00010000 - affinity for Rosetta children\n"
3091 end
3092 if ($kgm_spi_flag & 0x00020000)
3093 printf " 0x00020000 - wants to run Rosetta\n"
3094 end
3095 if ($kgm_spi_flag & 0x00040000)
3096 printf " 0x00040000 - has wait() in progress\n"
3097 end
3098 if ($kgm_spi_flag & 0x00080000)
3099 printf " 0x00080000 - kdebug tracing on for this process\n"
3100 end
3101 if ($kgm_spi_flag & 0x00100000)
3102 printf " 0x00100000 - blocked due to SIGTTOU or SIGTTIN\n"
3103 end
3104 if ($kgm_spi_flag & 0x00200000)
3105 printf " 0x00200000 - has called reboot()\n"
3106 end
3107 if ($kgm_spi_flag & 0x00400000)
3108 printf " 0x00400000 - is TBE state\n"
3109 end
3110 if ($kgm_spi_flag & 0x00800000)
3111 printf " 0x00800000 - signal exceptions\n"
3112 end
3113 if ($kgm_spi_flag & 0x01000000)
3114 printf " 0x01000000 - being branch traced\n"
3115 end
3116 if ($kgm_spi_flag & 0x02000000)
3117 printf " 0x02000000 - has vfork() children\n"
3118 end
3119 if ($kgm_spi_flag & 0x04000000)
3120 printf " 0x04000000 - not allowed to attach\n"
3121 end
3122 if ($kgm_spi_flag & 0x08000000)
3123 printf " 0x08000000 - vfork() in progress\n"
3124 end
3125 if ($kgm_spi_flag & 0x10000000)
3126 printf " 0x10000000 - no shared libraries\n"
3127 end
3128 if ($kgm_spi_flag & 0x20000000)
3129 printf " 0x20000000 - force quota for root\n"
3130 end
3131 if ($kgm_spi_flag & 0x40000000)
3132 printf " 0x40000000 - no zombies when children exit\n"
3133 end
3134 if ($kgm_spi_flag & 0x80000000)
3135 printf " 0x80000000 - don't hang on remote FS ops\n"
3136 end
3137 # decode state
3138 set $kgm_spi_state = $kgm_spi_proc->p_stat
3139 printf "State: "
3140 if ($kgm_spi_state == 1)
3141 printf "Idle\n"
3142 end
3143 if ($kgm_spi_state == 2)
3144 printf "Run\n"
3145 end
3146 if ($kgm_spi_state == 3)
3147 printf "Sleep\n"
3148 end
3149 if ($kgm_spi_state == 4)
3150 printf "Stop\n"
3151 end
3152 if ($kgm_spi_state == 5)
3153 printf "Zombie\n"
3154 end
3155 if ($kgm_spi_state == 6)
3156 printf "Reaping\n"
3157 end
3158 if ($kgm_spi_state < 1 || $kgm_spi_state > 6)
3159 printf "(Unknown)\n"
3160 end
3161 end
3162
3163 document showprocinfo
3164 Syntax: (gdb) showprocinfo <proc_t>
3165 | Displays name, pid, parent and task for a proc_t. Decodes cred, flag and p_stat fields.
3166 end
3167
3168 #
3169 # dump the zombprocs
3170 #
3171 define zombproc
3172 set $basep = (struct proc *)zombproc->lh_first
3173 set $pp = $basep
3174 while $pp
3175 showprocinfo $pp
3176 set $pp = $pp->p_list.le_next
3177 end
3178 end
3179
3180 document zombproc
3181 Syntax: (gdb) zombproc
3182 | Routine to print out all procs in the zombie list
3183 end
3184
3185 #
3186 # dump the zombstacks
3187 #
3188 define zombstacks
3189 set $basep = (struct proc *)zombproc->lh_first
3190 set $pp = $basep
3191 while $pp
3192 if $pp->p_stat != 5
3193 showtaskstacks $pp->task
3194 end
3195 set $pp = $pp->p_list.le_next
3196 end
3197 end
3198
3199 document zombstacks
3200 Syntax: (gdb) zombstacks
3201 | Routine to print out all stacks of tasks that are exiting
3202 end
3203
3204
3205 #
3206 # dump the allprocs
3207 #
3208 define allproc
3209 set $basep = (struct proc *)allproc->lh_first
3210 set $pp = $basep
3211 while $pp
3212 showprocinfo $pp
3213 set $pp = $pp->p_list.le_next
3214 end
3215 end
3216
3217 document allproc
3218 Syntax: (gdb) allproc
3219 | Routine to print out all process in the system
3220 | which are not in the zombie list
3221 end
3222
3223
3224
3225 define print_vnode
3226 set $vp = (struct vnode *)$arg0
3227 printf " "
3228 printf " vp 0x%.8x", $vp
3229 printf " use %d", $vp->v_usecount
3230 printf " io %d", $vp->v_iocount
3231 printf " kuse %d", $vp->v_kusecount
3232 printf " type %d", $vp->v_type
3233 printf " flg 0x%.8x", $vp->v_flag
3234 printf " lflg 0x%.8x", $vp->v_lflag
3235 printf " par 0x%.8x", $vp->v_parent
3236 set $_name = (char *)$vp->v_name
3237 if ($_name != 0)
3238 printf " %s", $_name
3239 end
3240 if ($vp->v_type == VREG) && ($vp->v_un.vu_ubcinfo != 0)
3241 printf " mapped %d", ($vp->v_un.vu_ubcinfo.ui_flags & 0x08) ? 1 : 0
3242 end
3243 printf "\n"
3244 end
3245
3246 document print_vnode
3247 Syntax: (gdb) print_vnode <vnode>
3248 | Prints out the fields of a vnode struct
3249 end
3250
3251 define showprocvnodes
3252 set $pp = (struct proc *)$arg0
3253 set $fdp = (struct filedesc *)$pp->p_fd
3254 set $cvp = $fdp->fd_cdir
3255 set $rvp = $fdp->fd_rdir
3256 if $cvp
3257 printf "Current Working Directory \n"
3258 print_vnode $cvp
3259 printf "\n"
3260 end
3261 if $rvp
3262 printf "Current Root Directory \n"
3263 print_vnode $rvp
3264 printf "\n"
3265 end
3266 set $count = 0
3267 set $fpp = (struct fileproc **)($fdp->fd_ofiles)
3268 set $fpo = (char)($fdp->fd_ofileflags[0])
3269 while $count < $fdp->fd_nfiles
3270 #printf"fpp %x ", *$fpp
3271 if *$fpp
3272 set $fg =(struct fileglob *)((**$fpp)->f_fglob)
3273 if $fg && (($fg)->fg_type == 1)
3274 if $fdp->fd_ofileflags[$count] & 4
3275 printf "U: "
3276 else
3277 printf " "
3278 end
3279 printf "fd = %d ", $count
3280 print_vnode $fg->fg_data
3281 end
3282 end
3283 set $fpp = $fpp + 1
3284 set $count = $count + 1
3285 end
3286 end
3287
3288 document showprocvnodes
3289 Syntax: (gdb) showprocvnodes <proc_address>
3290 | Routine to print out all the open fds
3291 | which are vnodes in a process
3292 end
3293
3294 define showallprocvnodes
3295 set $basep = (struct proc *)allproc->lh_first
3296 set $pp = $basep
3297 while $pp
3298 printf "============================================ \n"
3299 showprocinfo $pp
3300 showprocvnodes $pp
3301 set $pp = $pp->p_list.le_next
3302 end
3303 end
3304
3305 document showallprocvnodes
3306 Syntax: (gdb) showallprocvnodes
3307 | Routine to print out all the open fds
3308 | which are vnodes
3309 end
3310
3311
3312 #
3313 # dump the childrent of a proc
3314 #
3315 define showinitchild
3316 set $basep = (struct proc *)initproc->p_children.lh_first
3317 set $pp = $basep
3318 while $pp
3319 showprocinfo $pp
3320 set $pp = $pp->p_sibling.le_next
3321 end
3322 end
3323
3324 document showinitchild
3325 Syntax: (gdb) showinitchild
3326 | Routine to print out all processes in the system
3327 | which are children of init process
3328 end
3329
3330
3331 define showmountallvnodes
3332 set $mp = (struct mount *)$arg0
3333 set $basevp = (struct vnode *)$mp->mnt_vnodelist.tqh_first
3334 set $vp = $basevp
3335 printf "____________________ Vnode list Queue ---------------\n"
3336 while $vp
3337 print_vnode $vp
3338 set $vp = $vp->v_mntvnodes->tqe_next
3339 end
3340 set $basevp = (struct vnode *)$mp->mnt_workerqueue.tqh_first
3341 set $vp = $basevp
3342 printf "____________________ Worker Queue ---------------\n"
3343 while $vp
3344 print_vnode $vp
3345 set $vp = $vp->v_mntvnodes->tqe_next
3346 end
3347 set $basevp = (struct vnode *)$mp->mnt_newvnodes.tqh_first
3348 set $vp = $basevp
3349 printf "____________________ New vnodes Queue ---------------\n"
3350 while $vp
3351 print_vnode $vp
3352 set $vp = $vp->v_mntvnodes->tqe_next
3353 end
3354 end
3355 document showmountallvnodes
3356 Syntax: showmountallvnodes <struct mount *>
3357 | Print the vnode inactive list
3358 end
3359
3360
3361 define showmountvnodes
3362 set $mp = (struct mount *)$arg0
3363 set $basevp = (struct vnode *)$mp->mnt_vnodelist.tqh_first
3364 set $vp = $basevp
3365 printf "____________________ Vnode list Queue ---------------\n"
3366 while $vp
3367 print_vnode $vp
3368 set $vp = $vp->v_mntvnodes->tqe_next
3369 end
3370 end
3371 document showmountvnodes
3372 Syntax: showmountvnodes <struct mount *>
3373 | Print the vnode list
3374 end
3375
3376
3377
3378 define showworkqvnodes
3379 set $mp = (struct mount *)$arg0
3380 set $basevp = (struct vnode *)$mp->mnt_workerqueue.tqh_first
3381 set $vp = $basevp
3382 printf "____________________ Worker Queue ---------------\n"
3383 while $vp
3384 print_vnode $vp
3385 set $vp = $vp->v_mntvnodes->tqe_next
3386 end
3387 end
3388 document showworkqvnodes
3389 Syntax: showworkqvnodes <struct mount *>
3390 | Print the vnode worker list
3391 end
3392
3393
3394 define shownewvnodes
3395 set $mp = (struct mount *)$arg0
3396 set $basevp = (struct vnode *)$mp->mnt_newvnodes.tqh_first
3397 set $vp = $basevp
3398 printf "____________________ New vnodes Queue ---------------\n"
3399 while $vp
3400 print_vnode $vp
3401 set $vp = $vp->v_mntvnodes->tqe_next
3402 end
3403 end
3404
3405 document shownewvnodes
3406 Syntax: shownewvnodes <struct mount *>
3407 | Print the new vnode list
3408 end
3409
3410
3411 #
3412 # print mount point info
3413 define print_mount
3414 set $mp = (struct mount *)$arg0
3415 printf " "
3416 printf " mp 0x%.8x", $mp
3417 printf " flag %x", $mp->mnt_flag
3418 printf " kern_flag %x", $mp->mnt_kern_flag
3419 printf " lflag %x", $mp->mnt_lflag
3420 printf " type: %s", $mp->mnt_vfsstat.f_fstypename
3421 printf " mnton: %s", $mp->mnt_vfsstat.f_mntonname
3422 printf " mntfrom: %s", $mp->mnt_vfsstat.f_mntfromname
3423 printf "\n"
3424 end
3425
3426 define showallmounts
3427 set $mp=(struct mount *)mountlist.tqh_first
3428 while $mp
3429 print_mount $mp
3430 set $mp = $mp->mnt_list.tqe_next
3431 end
3432 end
3433
3434 document showallmounts
3435 Syntax: showallmounts
3436 | Print all mount points
3437 end
3438
3439 define pcprint
3440 set $pc = $arg0
3441 if ((unsigned int)$pc <= (unsigned int) $kgm_fkmodmax) && \
3442 ((unsigned int)$pc >= (unsigned int)$kgm_fkmodmin)
3443 showkmodaddr $pc
3444 else
3445 output/a $pc
3446 end
3447 end
3448
3449 define mbuf_walkpkt
3450 set $mp = (struct mbuf *)$arg0
3451 set $cnt = 1
3452 set $tot = 0
3453 while $mp
3454 printf "%4d: 0x%08x [len %4d, type %2d, ", $cnt, $mp, \
3455 $mp->m_hdr.mh_len, $mp->m_hdr.mh_type
3456 if mclaudit != 0
3457 mbuf_buf2mca $mp
3458 printf ", "
3459 end
3460 set $tot = $tot + $mp->m_hdr.mh_len
3461 printf "total %d]\n", $tot
3462 set $mp = $mp->m_hdr.mh_nextpkt
3463 set $cnt = $cnt + 1
3464 end
3465 end
3466
3467 document mbuf_walkpkt
3468 Syntax: (gdb) mbuf_walkpkt <addr>
3469 | Given an mbuf address, walk its m_nextpkt pointer
3470 end
3471
3472 define mbuf_walk
3473 set $mp = (struct mbuf *)$arg0
3474 set $cnt = 1
3475 set $tot = 0
3476 while $mp
3477 printf "%4d: 0x%08x [len %4d, type %2d, ", $cnt, $mp, \
3478 $mp->m_hdr.mh_len, $mp->m_hdr.mh_type
3479 if mclaudit != 0
3480 mbuf_buf2mca $mp
3481 printf ", "
3482 end
3483 set $tot = $tot + $mp->m_hdr.mh_len
3484 printf "total %d]\n", $tot
3485 set $mp = $mp->m_hdr.mh_next
3486 set $cnt = $cnt + 1
3487 end
3488 end
3489
3490 document mbuf_walk
3491 Syntax: (gdb) mbuf_walk <addr>
3492 | Given an mbuf address, walk its m_next pointer
3493 end
3494
3495 define mbuf_buf2slab
3496 set $addr = $arg0
3497 set $gix = ((char *)$addr - (char *)mbutl) >> 20
3498 set $ix = ((char *)$addr - (char *)mbutl) >> 11
3499 set $slab = &slabstbl[$gix].slg_slab[$ix]
3500 printf "0x%08x", $slab
3501 end
3502
3503 document mbuf_buf2slab
3504 | Given an mbuf object, find its corresponding slab address.
3505 end
3506
3507 define mbuf_buf2mca
3508 set $addr = $arg0
3509 set $ix = ((char *)$addr - (char *)mbutl) >> 11
3510 set $clbase = ((union mcluster *)(mbutl + $ix))
3511 set $mclidx = (((char *)$addr - (char *)$clbase) >> 8)
3512 set $mca = mclaudit[$ix].cl_audit[$mclidx]
3513 printf "mca: 0x%08x", $mca
3514 end
3515
3516 document mbuf_buf2mca
3517 Syntax: (gdb) mbuf_buf2mca <addr>
3518 | Given an mbuf object, find its buffer audit structure address.
3519 | This requires mbuf buffer auditing to be turned on, by setting
3520 | the appropriate flags to the "mbuf_debug" boot-args parameter.
3521 end
3522
3523 define mbuf_showmca
3524 set language c
3525 set $mca = (mcache_audit_t *)$arg0
3526 set $cp = (mcache_t *)$mca->mca_cache
3527 printf "object type:\t\t"
3528 mbuf_mca_ctype $mca 1
3529 printf "\ncontrolling mcache:\t%p (%s)\n", $mca->mca_cache, $cp->mc_name
3530 if $mca->mca_uflags & $MB_SCVALID
3531 set $ix = ((char *)$mca->mca_addr - (char *)mbutl) >> 11
3532 set $clbase = ((union mcluster *)(mbutl + $ix))
3533 set $mclidx = (((char *)$mca->mca_addr - (char *)$clbase) >> 8)
3534 printf "mbuf obj:\t\t%p\n", $mca->mca_addr
3535 printf "mbuf index:\t\t%d (out of 8) in cluster base %p\n", \
3536 $mclidx + 1, $clbase
3537 if $mca->mca_uptr != 0
3538 set $peer_mca = (mcache_audit_t *)$mca->mca_uptr
3539 printf "paired cluster obj:\t%p (mca %p)\n", \
3540 $peer_mca->mca_addr, $peer_mca
3541 end
3542 printf "saved contents:\t\t%p (%d bytes)\n", \
3543 $mca->mca_contents, $mca->mca_contents_size
3544 else
3545 printf "cluster obj:\t\t%p\n", $mca->mca_addr
3546 if $mca->mca_uptr != 0
3547 set $peer_mca = (mcache_audit_t *)$mca->mca_uptr
3548 printf "paired mbuf obj:\t%p (mca %p)\n", \
3549 $peer_mca->mca_addr, $peer_mca
3550 end
3551 end
3552 printf "recent transaction for this buffer (thread %p):\n", \
3553 $mca->mca_thread
3554 set $cnt = 0
3555 while $cnt < $mca->mca_depth
3556 set $pc = $mca->mca_stack[$cnt]
3557 printf "%4d: ", $cnt + 1
3558 pcprint $pc
3559 printf "\n"
3560 set $cnt = $cnt + 1
3561 end
3562 if $mca->mca_pdepth > 0
3563 printf "previous transaction for this buffer (thread %p):\n", \
3564 $mca->mca_pthread
3565 end
3566 set $cnt = 0
3567 while $cnt < $mca->mca_pdepth
3568 set $pc = $mca->mca_pstack[$cnt]
3569 printf "%4d: ", $cnt + 1
3570 pcprint $pc
3571 printf "\n"
3572 set $cnt = $cnt + 1
3573 end
3574 set language auto
3575 end
3576
3577 document mbuf_showmca
3578 Syntax: (gdb) mbuf_showmca <addr>
3579 | Given an mbuf/cluster buffer audit structure address, print the audit
3580 | records including the stack trace of the last buffer transaction.
3581 end
3582
3583 set $MCF_NOCPUCACHE = 0x10
3584
3585 define mcache_stat
3586 set $head = (mcache_t *)mcache_head
3587 set $mc = $head
3588 printf "cache cache cache buf buf backing (# of retries) bufs\n"
3589 printf "name state addr size align zone wait nowait failed incache\n"
3590 printf "------------------------- -------- ---------- ------ ----- ---------- -------------------------- --------\n"
3591 while $mc != 0
3592 set $bktsize = $mc->mc_cpu.cc_bktsize
3593 printf "%-25s ", $mc->mc_name
3594 if ($mc->mc_flags & $MCF_NOCPUCACHE)
3595 printf "disabled"
3596 else
3597 if $mc->mc_purge_cnt > 0
3598 printf " purging"
3599 else
3600 if $bktsize == 0
3601 printf " offline"
3602 else
3603 printf " online"
3604 end
3605 end
3606 end
3607 printf " 0x%08x %6d %5d ",$mc, \
3608 $mc->mc_bufsize, $mc->mc_align
3609 if $mc->mc_slab_zone != 0
3610 printf "0x%08x", $mc->mc_slab_zone
3611 else
3612 printf " custom"
3613 end
3614 set $tot = 0
3615 set $tot += $mc->mc_full.bl_total * $bktsize
3616 set $ccp = (mcache_cpu_t *)$mc->mc_cpu
3617 set $n = 0
3618 while $n < ncpu
3619 if $ccp->cc_objs > 0
3620 set $tot += $ccp->cc_objs
3621 end
3622 if $ccp->cc_pobjs > 0
3623 set $tot += $ccp->cc_pobjs
3624 end
3625 set $n += 1
3626 set $ccp += 1
3627 end
3628 printf " %8d %8d %8d %8d", $mc->mc_wretry_cnt, \
3629 $mc->mc_nwretry_cnt, $mc->mc_nwfail_cnt, $tot
3630 printf "\n"
3631 set $mc = (mcache_t *)$mc->mc_list.le_next
3632 end
3633 end
3634
3635 document mcache_stat
3636 Syntax: (gdb) mcache_stat
3637 | Print all mcaches in the system.
3638 end
3639
3640 define mcache_showzone
3641 set $mc = (mcache_t *)$arg0
3642 if $mc->mc_slab_zone != 0
3643 printf "%p", $mc->mc_slab_zone
3644 else
3645 printf " custom"
3646 end
3647
3648 document mcache_showzone
3649 Syntax: (gdb) mcache_showzone <mcache_addr>
3650 | Print the type of backend (custom or zone) of a mcache.
3651 end
3652
3653 define mcache_walkobj
3654 set $p = (mcache_obj_t *)$arg0
3655 set $cnt = 1
3656 set $tot = 0
3657 while $p
3658 printf "%4d: 0x%08x\n", $cnt, $p,
3659 set $p = $p->obj_next
3660 set $cnt = $cnt + 1
3661 end
3662 end
3663
3664 document mcache_walkobj
3665 Syntax: (gdb) mcache_walkobj <addr>
3666 | Given a mcache object address, walk its obj_next pointer
3667 end
3668
3669 define mcache_showcache
3670 set $cp = (mcache_t *)$arg0
3671 set $ccp = (mcache_cpu_t *)$cp->mc_cpu
3672 set $bktsize = $cp->mc_cpu.cc_bktsize
3673 set $cnt = 0
3674 set $tot = 0
3675 printf "Showing cache '%s':\n\n", $cp->mc_name
3676 printf " CPU cc_objs cc_pobjs total\n"
3677 printf "---- -------- -------- --------\n"
3678 while $cnt < ncpu
3679 set $objs = $ccp->cc_objs
3680 if $objs <= 0
3681 set $objs = 0
3682 end
3683 set $pobjs = $ccp->cc_pobjs
3684 if $pobjs <= 0
3685 set $pobjs = 0
3686 end
3687 set $tot_cpu = $objs + $pobjs
3688 set $tot += $tot_cpu
3689 printf "%4d %8d %8d %8d\n", $cnt, $objs, $pobjs, $tot_cpu
3690 set $ccp += 1
3691 set $cnt += 1
3692 end
3693 printf " ========\n"
3694 printf " %8d\n", $tot
3695 printf "\n"
3696 set $tot += $cp->mc_full.bl_total * $bktsize
3697 printf "Total # of full buckets (%d objs/bkt):\t%-8d\n", \
3698 $bktsize, $cp->mc_full.bl_total
3699 printf "Total # of objects cached:\t\t%-8d\n", $tot
3700 end
3701
3702 document mcache_showcache
3703 | Display the number of objects in the cache
3704 end
3705
3706 set $NSLABSPMB = sizeof(mcl_slabg_t)/sizeof(mcl_slab_t)
3707
3708 define mbuf_slabstbl
3709 set $x = 0
3710
3711 printf "slot addr slabs range\n"
3712 printf "---- ---------- -----------------------\n"
3713 while $x < maxslabgrp
3714 set $slg = slabstbl[$x]
3715 printf "%3d: ", $x
3716 if $slg == 0
3717 printf "-\n"
3718 else
3719 printf "%p [%p-%p]\n", $slg, &$slg->slg_slab[0], \
3720 &$slg->slg_slab[$NSLABSPMB-1]
3721 end
3722 set $x += 1
3723 end
3724 end
3725
3726 document mbuf_slabstbl
3727 | Display the mbuf slabs table
3728 end
3729
3730 set $SLF_MAPPED=0x0001
3731 set $SLF_PARTIAL=0x0002
3732 set $SLF_DETACHED=0x0004
3733
3734 define mbuf_slabs
3735 set $slg = (mcl_slabg_t *)$arg0
3736 set $x = 0
3737
3738 printf "slot addr next base C R N size flags\n"
3739 printf "---- ---------- ---------- ---------- -- -- -- ------ -----\n"
3740 while $x < $NSLABSPMB
3741 set $sl = &$slg->slg_slab[$x]
3742 printf "%3d: 0x%08x 0x%08x 0x%08x %2d %2d %2d %6d 0x%04x ", \
3743 $x + 1, $sl, $sl->sl_next, $sl->sl_base, $sl->sl_class, \
3744 $sl->sl_refcnt, $sl->sl_chunks, $sl->sl_len, \
3745 $sl->sl_flags
3746 if $sl->sl_flags != 0
3747 printf "<"
3748 if $sl->sl_flags & $SLF_MAPPED
3749 printf "mapped"
3750 end
3751 if $sl->sl_flags & $SLF_PARTIAL
3752 printf ",partial"
3753 end
3754 if $sl->sl_flags & $SLF_DETACHED
3755 printf ",detached"
3756 end
3757 printf ">"
3758 end
3759 printf "\n"
3760 set $x += 1
3761 end
3762 end
3763
3764 document mbuf_slabs
3765 | Display all mbuf slabs in the group
3766 end
3767
3768 define mbuf_stat
3769 set $x = 0
3770
3771 printf "class total cached uncached inuse failed waiter notified purge\n"
3772 printf "name objs objs objs / slabs objs alloc count count count count\n"
3773 printf "---------------- -------- -------- ------------------- -------- ---------------- -------- -------- --------\n"
3774 while $x < (sizeof(mbuf_table) / sizeof(mbuf_table[0]))
3775 set $mbt = mbuf_table[$x]
3776 set $mcs = (mb_class_stat_t *)mbuf_table[$x].mtbl_stats
3777 set $tot = 0
3778 set $mc = $mbt->mtbl_cache
3779 set $bktsize = $mc->mc_cpu.cc_bktsize
3780 set $tot += $mc->mc_full.bl_total * $bktsize
3781 set $ccp = (mcache_cpu_t *)$mc->mc_cpu
3782 set $n = 0
3783 while $n < ncpu
3784 if $ccp->cc_objs > 0
3785 set $tot += $ccp->cc_objs
3786 end
3787 if $ccp->cc_pobjs > 0
3788 set $tot += $ccp->cc_pobjs
3789 end
3790 set $n += 1
3791 set $ccp += 1
3792 end
3793
3794 printf "%-16s %8d %8d %8d / %-8d %8d %16llu %8d %8llu %8llu", \
3795 $mcs->mbcl_cname, $mcs->mbcl_total, $tot, \
3796 $mcs->mbcl_infree, $mcs->mbcl_slab_cnt, \
3797 ($mcs->mbcl_total - $tot - $mcs->mbcl_infree), \
3798 $mcs->mbcl_fail_cnt, $mc->mc_waiter_cnt, \
3799 $mcs->mbcl_notified, $mcs->mbcl_purge_cnt
3800 printf "\n"
3801 set $x += 1
3802 end
3803 end
3804
3805 document mbuf_stat
3806 | Print extended mbuf allocator statistics.
3807 end
3808
3809 set $MB_INUSE = 0x1
3810 set $MB_COMP_INUSE = 0x2
3811 set $MB_SCVALID = 0x4
3812
3813 set $MCLBYTES = 2048
3814 set $MSIZE = 256
3815 set $NBPG = 4096
3816 set $M16KCLBYTES = 16384
3817
3818 define mbuf_mca_ctype
3819 set $mca = (mcache_audit_t *)$arg0
3820 set $vopt = $arg1
3821 set $cp = $mca->mca_cache
3822 set $class = (unsigned int)$cp->mc_private
3823 set $csize = mbuf_table[$class].mtbl_stats->mbcl_size
3824 set $done = 0
3825 if $csize == $MSIZE
3826 if $vopt
3827 printf "M (mbuf) "
3828 else
3829 printf "M "
3830 end
3831 set $done = 1
3832 end
3833 if !$done && $csize == $MCLBYTES
3834 if $vopt
3835 printf "CL (2K cluster) "
3836 else
3837 printf "CL "
3838 end
3839 set $done = 1
3840 end
3841 if !$done && $csize == $NBPG
3842 if $vopt
3843 printf "BCL (4K cluster) "
3844 else
3845 printf "BCL "
3846 end
3847 set $done = 1
3848 end
3849 if !$done && $csize == $M16KCLBYTES
3850 if $vopt
3851 printf "JCL (16K cluster) "
3852 else
3853 printf "JCL "
3854 end
3855 set $done = 1
3856 end
3857 if !$done && $csize == ($MSIZE+$MCLBYTES)
3858 if $mca->mca_uflags & $MB_SCVALID
3859 if $mca->mca_uptr
3860 printf "M+CL "
3861 if $vopt
3862 printf "(paired mbuf, 2K cluster)"
3863 end
3864 else
3865 printf "M-CL "
3866 if $vopt
3867 printf "(unpaired mbuf, 2K cluster) "
3868 end
3869 end
3870 else
3871 if $mca->mca_uptr
3872 printf "CL+M "
3873 if $vopt
3874 printf "(paired 2K cluster, mbuf) "
3875 end
3876 else
3877 printf "CL-M "
3878 if $vopt
3879 printf "(paired 2K cluster, mbuf) "
3880 end
3881 end
3882 end
3883 set $done = 1
3884 end
3885 if !$done && $csize == ($MSIZE+$NBPG)
3886 if $mca->mca_uflags & $MB_SCVALID
3887 if $mca->mca_uptr
3888 printf "M+BCL "
3889 if $vopt
3890 printf "(paired mbuf, 4K cluster) "
3891 end
3892 else
3893 printf "M-BCL "
3894 if $vopt
3895 printf "(unpaired mbuf, 4K cluster) "
3896 end
3897 end
3898 else
3899 if $mca->mca_uptr
3900 printf "BCL+M "
3901 if $vopt
3902 printf "(paired 4K cluster, mbuf) "
3903 end
3904 else
3905 printf "BCL-M "
3906 if $vopt
3907 printf "(unpaired 4K cluster, mbuf) "
3908 end
3909 end
3910 end
3911 set $done = 1
3912 end
3913 if !$done && $csize == ($MSIZE+$M16KCLBYTES)
3914 if $mca->mca_uflags & $MB_SCVALID
3915 if $mca->mca_uptr
3916 printf "M+JCL "
3917 if $vopt
3918 printf "(paired mbuf, 16K cluster) "
3919 end
3920 else
3921 printf "M-JCL "
3922 if $vopt
3923 printf "(unpaired mbuf, 16K cluster) "
3924 end
3925 end
3926 else
3927 if $mca->mca_uptr
3928 printf "JCL+M "
3929 if $vopt
3930 printf "(paired 16K cluster, mbuf) "
3931 end
3932 else
3933 printf "JCL-M "
3934 if $vopt
3935 printf "(unpaired 16K cluster, mbuf) "
3936 end
3937 end
3938 end
3939 set $done = 1
3940 end
3941 if !$done
3942 printf "unknown: %s ", $cp->mc_name
3943 end
3944 end
3945
3946 document mbuf_mca_ctype
3947 | This is a helper macro for mbuf_show{active,inactive,all} that prints
3948 | out the mbuf object type represented by a given mcache audit structure.
3949 end
3950
3951 define mbuf_showactive
3952 mbuf_walkallslabs 1 0
3953 end
3954
3955 document mbuf_showactive
3956 Syntax: (gdb) mbuf_showactive
3957 | Walk the mbuf objects pool and print only the active ones; this
3958 | requires mbuf debugging to be turned on, by setting the appropriate flags
3959 | to the "mbuf_debug" boot-args parameter. Active objects are those that
3960 | are outstanding (have not returned to the mbuf slab layer) and in use
3961 | by the client (have not been freed).
3962 end
3963
3964 define mbuf_showinactive
3965 mbuf_walkallslabs 0 1
3966 end
3967
3968 document mbuf_showinactive
3969 Syntax: (gdb) mbuf_showinactive
3970 | Walk the mbuf objects pool and print only the inactive ones; this
3971 | requires mbuf debugging to be turned on, by setting the appropriate flags
3972 | to the "mbuf_debug" boot-args parameter. Inactive objects are those that
3973 | are outstanding (have not returned to the mbuf slab layer) but have been
3974 | freed by the client, i.e. they still reside in the mcache layer ready to
3975 | be used for subsequent allocation requests.
3976 end
3977
3978 define mbuf_showall
3979 mbuf_walkallslabs 1 1
3980 end
3981
3982 document mbuf_showall
3983 Syntax: (gdb) mbuf_showall
3984 | Walk the mbuf objects pool and print them all; this requires
3985 | mbuf debugging to be turned on, by setting the appropriate flags to the
3986 | "mbuf_debug" boot-args parameter.
3987 end
3988
3989 define mbuf_mcaobjs
3990 end
3991
3992 define mbuf_walkallslabs
3993 set $show_a = $arg0
3994 set $show_f = $arg1
3995 set $x = 0
3996 set $total = 0
3997 set $total_a = 0
3998 set $total_f = 0
3999
4000 printf "("
4001 if $show_a && !$show_f
4002 printf "Searching only for active "
4003 end
4004 if !$show_a && $show_f
4005 printf "Searching only for inactive "
4006 end
4007 if $show_a && $show_f
4008 printf "Displaying all "
4009 end
4010 printf "objects; this may take a while ...)\n\n"
4011
4012 printf " slab mca obj allocation\n"
4013 printf "slot idx address address address type state\n"
4014 printf "---- ---- ---------- ---------- ---------- ----- -----------\n"
4015
4016 while $x < slabgrp
4017 set $slg = slabstbl[$x]
4018 set $y = 0
4019 set $stop = 0
4020 while $y < $NSLABSPMB && $stop == 0
4021 set $sl = &$slg->slg_slab[$y]
4022 set $base = (char *)$sl->sl_base
4023 set $ix = ($base - (char *)mbutl) >> 11
4024 set $clbase = ((union mcluster *)(mbutl + $ix))
4025 set $mclidx = ($base - (char *)$clbase) >> 8
4026 set $mca = mclaudit[$ix].cl_audit[$mclidx]
4027 set $first = 1
4028
4029 while $mca != 0 && $mca->mca_addr != 0
4030 set $printmca = 0
4031 if $mca->mca_uflags & ($MB_INUSE|$MB_COMP_INUSE)
4032 set $total_a = $total_a + 1
4033 set $printmca = $show_a
4034 else
4035 set $total_f = $total_f + 1
4036 set $printmca = $show_f
4037 end
4038
4039 if $printmca != 0
4040 if $first == 1
4041 printf "%4d %4d 0x%08x ", $x, $y, $sl
4042 else
4043 printf " "
4044 end
4045
4046 printf "0x%08x 0x%08x ", $mca, $mca->mca_addr
4047 mbuf_mca_ctype $mca 0
4048 if $mca->mca_uflags & ($MB_INUSE|$MB_COMP_INUSE)
4049 printf "active "
4050 else
4051 printf " freed "
4052 end
4053 if $first == 1
4054 set $first = 0
4055 end
4056 printf "\n"
4057 set $total = $total + 1
4058 end
4059 set $mca = $mca->mca_next
4060 end
4061 set $y += 1
4062 if $slg->slg_slab[$y].sl_base == 0
4063 set $stop = 1
4064 end
4065 end
4066 set $x += 1
4067 end
4068 if $total && $show_a && $show_f
4069 printf "\ntotal objects:\t%d\n", $total
4070 printf "active/unfreed:\t%d\n", $total_a
4071 printf "freed/in_cache:\t%d\n", $total_f
4072 end
4073 end
4074
4075 document mbuf_walkallslabs
4076 | Walk the mbuf objects pool; this requires mbuf debugging to be
4077 | turned on, by setting the appropriate flags to the "mbuf_debug" boot-args
4078 | parameter. This is a backend routine for mbuf_show{active,inactive,all}.
4079 end
4080
4081 define rtentry_trash
4082 set $rtd = (struct rtentry_dbg *)rttrash_head.tqh_first
4083 set $cnt = 0
4084 while $rtd != 0
4085 if $cnt == 0
4086 printf " rtentry_dbg ref flags\n"
4087 printf " ------------ --- ----------\n"
4088 end
4089 printf "%4d: %p %3d 0x%08x\n", $cnt + 1, $rtd, \
4090 $rtd->rtd_refhold_cnt - $rtd->rtd_refrele_cnt, \
4091 $rtd->rtd_entry.rt_flags
4092 set $rtd = $rtd->rtd_trash_link.tqe_next
4093 set $cnt = $cnt + 1
4094 end
4095 end
4096
4097 document rtentry_trash
4098 Syntax: (gdb) rtentry_trash
4099 | Walk the list of trash route entries; this requires route entry
4100 | debugging to be turned on, by setting the appropriate flags to the
4101 | "rte_debug" boot-args parameter.
4102 end
4103
4104 set $RTD_TRSTACK_SIZE = 8
4105 set $RTD_REFHIST_SIZE = 4
4106
4107 define rtentry_showdbg
4108 set $rtd = (struct rtentry_dbg *)$arg0
4109 set $cnt = 0
4110
4111 printf "Total holds: %d\n", $rtd->rtd_refhold_cnt
4112 printf "Next hold slot: %d\n", $rtd->rtd_refhold_next
4113 printf "Total releases: %d\n", $rtd->rtd_refrele_cnt
4114 printf "Next release slot: %d\n", $rtd->rtd_refrele_next
4115
4116 set $ix = 0
4117 while $ix < $RTD_TRSTACK_SIZE
4118 set $pc = $rtd->rtd_alloc_stk_pc[$ix]
4119 if $pc != 0
4120 if $ix == 0
4121 printf "\nAlloc (thread %p):\n", \
4122 $rtd->rtd_alloc_thread
4123 end
4124 printf "%4d: ", $ix + 1
4125 pcprint $pc
4126 printf "\n"
4127 end
4128 set $ix = $ix + 1
4129 end
4130 set $ix = 0
4131 while $ix < $RTD_TRSTACK_SIZE
4132 set $pc = $rtd->rtd_free_stk_pc[$ix]
4133 if $pc != 0
4134 if $ix == 0
4135 printf "\nFree: (thread %p)\n", \
4136 $rtd->rtd_free_thread
4137 end
4138 printf "%4d: ", $ix + 1
4139 pcprint $pc
4140 printf "\n"
4141 end
4142 set $ix = $ix + 1
4143 end
4144 while $cnt < $RTD_REFHIST_SIZE
4145 set $ix = 0
4146 while $ix < $RTD_TRSTACK_SIZE
4147 set $pc = $rtd->rtd_refhold[$cnt].pc[$ix]
4148 if $pc != 0
4149 if $ix == 0
4150 printf "\nHold [%d] (thread %p):\n", \
4151 $cnt, $rtd->rtd_refhold[$cnt].th
4152 end
4153 printf "%4d: ", $ix + 1
4154 pcprint $pc
4155 printf "\n"
4156 end
4157 set $ix = $ix + 1
4158 end
4159 set $cnt = $cnt + 1
4160 end
4161 set $cnt = 0
4162 while $cnt < $RTD_REFHIST_SIZE
4163 set $ix = 0
4164 while $ix < $RTD_TRSTACK_SIZE
4165 set $pc = $rtd->rtd_refrele[$cnt].pc[$ix]
4166 if $pc != 0
4167 if $ix == 0
4168 printf "\nRelease [%d] (thread %p):\n",\
4169 $cnt, $rtd->rtd_refrele[$cnt].th
4170 end
4171 printf "%4d: ", $ix + 1
4172 pcprint $pc
4173 printf "\n"
4174 end
4175 set $ix = $ix + 1
4176 end
4177 set $cnt = $cnt + 1
4178 end
4179 end
4180
4181 document rtentry_showdbg
4182 Syntax: (gdb) rtentry_showdbg <addr>
4183 | Given a route entry structure address, print the debug information
4184 | related to it. This requires route entry debugging to be turned
4185 | on, by setting the appropriate flags to the "rte_debug" boot-args
4186 | parameter.
4187 end
4188
4189 #
4190 # print all OSMalloc stats
4191
4192 define ostag_print
4193 set $kgm_tagp = (OSMallocTag)$arg0
4194 printf "0x%08x: ", $kgm_tagp
4195 printf "%8d ",$kgm_tagp->OSMT_refcnt
4196 printf "%8x ",$kgm_tagp->OSMT_state
4197 printf "%8x ",$kgm_tagp->OSMT_attr
4198 printf "%s ",$kgm_tagp->OSMT_name
4199 printf "\n"
4200 end
4201
4202
4203 define showosmalloc
4204 printf "TAG COUNT STATE ATTR NAME\n"
4205 set $kgm_tagheadp = (OSMallocTag)&OSMalloc_tag_list
4206 set $kgm_tagptr = (OSMallocTag )($kgm_tagheadp->OSMT_link.next)
4207 while $kgm_tagptr != $kgm_tagheadp
4208 ostag_print $kgm_tagptr
4209 set $kgm_tagptr = (OSMallocTag)$kgm_tagptr->OSMT_link.next
4210 end
4211 printf "\n"
4212 end
4213 document showosmalloc
4214 Syntax: (gdb) showosmalloc
4215 | Print the outstanding allocation count by OSMallocTags.
4216 end
4217
4218
4219 define systemlog
4220 if msgbufp->msg_bufc[msgbufp->msg_bufx] == 0
4221 # The buffer hasn't wrapped, so take the easy (and fast!) path
4222 printf "%s", msgbufp->msg_bufc
4223 else
4224 set $kgm_msgbuf = *msgbufp
4225 set $kgm_syslog_bufsize = $kgm_msgbuf.msg_size
4226 set $kgm_syslog_bufend = $kgm_msgbuf.msg_bufx
4227 if $kgm_syslog_bufend >= $kgm_syslog_bufsize
4228 set $kgm_syslog_bufend = 0
4229 end
4230
4231 # print older messages from msg_bufx to end of buffer
4232 set $kgm_i = $kgm_syslog_bufend
4233 while $kgm_i < $kgm_syslog_bufsize
4234 set $kgm_syslog_char = $kgm_msgbuf.msg_bufc[$kgm_i]
4235 if $kgm_syslog_char == 0
4236 # break out of loop
4237 set $kgm_i = $kgm_syslog_bufsize
4238 else
4239 printf "%c", $kgm_syslog_char
4240 end
4241 set $kgm_i = $kgm_i + 1
4242 end
4243
4244 # print newer messages from start of buffer to msg_bufx
4245 set $kgm_i = 0
4246 while $kgm_i < $kgm_syslog_bufend
4247 set $kgm_syslog_char = $kgm_msgbuf.msg_bufc[$kgm_i]
4248 printf "%c", $kgm_syslog_char
4249 set $kgm_i = $kgm_i + 1
4250 end
4251 end
4252 printf "\n"
4253 end
4254 document systemlog
4255 | Syntax: systemlog
4256 | Display the kernel's printf ring buffer
4257 end
4258
4259 define printvnodepathint_recur
4260 if $arg0 != 0
4261 if ($arg0->v_flag & 0x000001) && ($arg0->v_mount != 0)
4262 if $arg0->v_mount->mnt_vnodecovered != 0
4263 printvnodepathint_recur $arg0->v_mount->mnt_vnodecovered $arg0->v_mount->mnt_vnodecovered->v_name
4264 end
4265 else
4266 printvnodepathint_recur $arg0->v_parent $arg0->v_parent->v_name
4267 printf "/%s", $arg1
4268 end
4269 end
4270 end
4271
4272 #
4273 # Show the locks held on a vnode by range, type, and holder.
4274 #
4275 define showvnodelocks
4276 if ($argc == 1)
4277 _showvnodelockheader
4278 _showvnodelocks $arg0
4279 else
4280 printf "| Usage:\n|\n"
4281 help showvnodelocks
4282 end
4283 end
4284 document showvnodelocks
4285 | Given a vnodet pointer, display the list of advisory record locks for the
4286 | referenced pvnode.
4287 | The following is the syntax:
4288 | (gdb) showvnodelocks <vnode_t>
4289 end
4290
4291 define _showvnodelockheader
4292 printf "* type W held by lock type start end\n"
4293 printf "- ----- - ------------- --------- ------------------ ------------------\n"
4294 end
4295
4296 #
4297 # Macro to display a single lock; used to display both held locks and
4298 # blocked locks
4299 #
4300 define _showvnodelock
4301 set $kgm_svl_lock = ((struct lockf *)$arg0)
4302
4303 # decode flags
4304 set $kgm_svl_flags = $kgm_svl_lock->lf_flags
4305 set $kgm_svl_type = $kgm_svl_lock->lf_type
4306 if ($kgm_svl_flags & 0x20)
4307 printf "flock"
4308 end
4309 if ($kgm_svl_flags & 0x40)
4310 printf "posix"
4311 end
4312 if ($kgm_svl_flags & 0x80)
4313 printf "prov "
4314 end
4315 if ($kgm_svl_flags & 0x10)
4316 printf " W "
4317 else
4318 printf " . "
4319 end
4320
4321 # POSIX file vs. advisory range locks
4322 if ($kgm_svl_flags & 0x40)
4323 set $kgm_svl_proc = (proc_t)$kgm_svl_lock->lf_id
4324 printf "PID %8d ", $kgm_svl_proc->p_pid
4325 else
4326 printf "ID 0x%08x ", $kgm_svl_lock->lf_id
4327 end
4328
4329 # lock type
4330 if ($kgm_svl_type == 1)
4331 printf "shared "
4332 else
4333 if ($kgm_svl_type == 3)
4334 printf "exclusive "
4335 else
4336 if ($kgm_svl_type == 2)
4337 printf "unlock "
4338 else
4339 printf "unknown "
4340 end
4341 end
4342 end
4343
4344 # start and stop
4345 printf "0x%016x..", $kgm_svl_lock->lf_start
4346 printf "0x%016x ", $kgm_svl_lock->lf_end
4347 printf "\n"
4348 end
4349
4350 # Body of showvnodelocks, not including header
4351 define _showvnodelocks
4352 set $kgm_svl_vnode = ((vnode_t)$arg0)
4353 set $kgm_svl_lockiter = $kgm_svl_vnode->v_lockf
4354 while ($kgm_svl_lockiter != 0)
4355 # locks that are held
4356 printf "H "
4357 _showvnodelock $kgm_svl_lockiter
4358
4359 # and any locks blocked by them
4360 set $kgm_svl_blocker = $kgm_svl_lockiter->lf_blkhd.tqh_first
4361 while ($kgm_svl_blocker != 0)
4362 printf "> "
4363 _showvnodelock $kgm_svl_blocker
4364 set $kgm_svl_blocker = $kgm_svl_blocker->lf_block.tqe_next
4365 end
4366
4367 # and on to the next one...
4368 set $kgm_svl_lockiter = $kgm_svl_lockiter->lf_next
4369 end
4370 end
4371
4372 define showvnodepath
4373 set $vp = (struct vnode *)$arg0
4374 if $vp != 0
4375 if ($vp->v_flag & 0x000001) && ($vp->v_mount != 0) && ($vp->v_mount->mnt_flag & 0x00004000)
4376 printf "/"
4377 else
4378 printvnodepathint_recur $vp $vp->v_name
4379 end
4380 end
4381 printf "\n"
4382 end
4383
4384 document showvnodepath
4385 Syntax: (gdb) showvnodepath <vnode>
4386 | Prints the path for a vnode
4387 end
4388
4389 define printcolonhex
4390 if ($argc == 2)
4391 set $addr = $arg0
4392 set $count = $arg1
4393 set $li = 0
4394 while ($li < $count)
4395 if ($li == 0)
4396 printf "%02x", (u_char)$addr[$li]
4397 end
4398 if ($li != 0)
4399 printf ":%02x", (u_char)$addr[$li]
4400 end
4401 set $li = $li + 1
4402 end
4403 end
4404 end
4405
4406 define showsockaddr_dl
4407 set $sdl = (struct sockaddr_dl *)$arg0
4408 printf "LINK "
4409 if ($sdl == 0)
4410 printf "(null)"
4411 else
4412 set $addr = $sdl->sdl_data + $sdl->sdl_nlen
4413 set $count = $sdl->sdl_alen
4414 printcolonhex $addr $count
4415 end
4416 end
4417
4418 define showsockaddr_unspec
4419 set $sockaddr = (struct sockaddr *)$arg0
4420 set $addr = $sockaddr->sa_data
4421 set $count = $sockaddr->sa_len - 2
4422 printf "UNSP "
4423 printcolonhex $addr $count
4424 end
4425
4426 define showsockaddr_at
4427 set $sockaddr = (struct sockaddr *)$arg0
4428 set $addr = $sockaddr->sa_data
4429 set $count = $sockaddr->sa_len - 2
4430 printf "ATLK "
4431 printcolonhex $addr $count
4432 end
4433
4434 define showsockaddr_in
4435 set $sin = (struct sockaddr_in *)$arg0
4436 set $sa_bytes = (unsigned char *)&($sin->sin_addr)
4437 printf "IPV4 %d.%d.%d.%d", $sa_bytes[0], $sa_bytes[1], $sa_bytes[2], $sa_bytes[3]
4438 end
4439
4440 define showsockaddr_in6
4441 set $sin6 = (struct sockaddr_in6 *)$arg0
4442 set $sa_bytes = $sin6->sin6_addr.__u6_addr.__u6_addr8
4443 printf "IPV6 %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", $sa_bytes[0], $sa_bytes[1], $sa_bytes[2], $sa_bytes[3], $sa_bytes[4], $sa_bytes[5], $sa_bytes[6], $sa_bytes[7], $sa_bytes[8], $sa_bytes[9], $sa_bytes[10], $sa_bytes[11], $sa_bytes[12], $sa_bytes[13], $sa_bytes[14], $sa_bytes[15]
4444 end
4445
4446 define showifmultiaddrs
4447 set $ifp = (struct ifnet *)$arg0
4448 set $if_multi = (struct ifmultiaddr *)$ifp->if_multiaddrs->lh_first
4449 set $mymulti = $if_multi
4450 set $myi = 0
4451 while ($mymulti != 0)
4452 printf "%2d. ", $myi
4453 set $sa_family = $mymulti->ifma_addr.sa_family
4454 if ($sa_family == 2)
4455 if ($mymulti->ifma_ll != 0)
4456 showsockaddr_dl $mymulti->ifma_ll->ifma_addr
4457 printf " "
4458 end
4459 showsockaddr_in $mymulti->ifma_addr
4460 end
4461 if ($sa_family == 30)
4462 if ($mymulti->ifma_ll != 0)
4463 showsockaddr_dl $mymulti->ifma_ll->ifma_addr
4464 printf " "
4465 end
4466 showsockaddr_in6 $mymulti->ifma_addr
4467 end
4468 if ($sa_family == 18)
4469 showsockaddr_dl $mymulti->ifma_addr
4470 end
4471 if ($sa_family == 0)
4472 showsockaddr_unspec $mymulti->ifma_addr 6
4473 end
4474 printf " [%d]", $mymulti->ifma_refcount
4475 printf "\n"
4476 set $mymulti = $mymulti->ifma_link.le_next
4477 set $myi = $myi + 1
4478 end
4479 end
4480
4481 document showifmultiaddrs
4482 Syntax showifmultiaddrs <ifp>
4483 | show the (struct ifnet).if_multiaddrs list of multicast addresses for the given ifp
4484 end
4485
4486 define showsockaddr
4487 set $mysock = (struct sockaddr *)$arg0
4488 set $showsockaddr_handled = 0
4489 if ($mysock == 0)
4490 printf "(null)"
4491 else
4492 if ($mysock->sa_family == 0)
4493 showsockaddr_unspec $mysock
4494 set $showsockaddr_handled = 1
4495 end
4496 if ($mysock->sa_family == 2)
4497 showsockaddr_in $mysock
4498 set $showsockaddr_handled = 1
4499 end
4500 if ($mysock->sa_family == 30)
4501 showsockaddr_in6 $mysock
4502 set $showsockaddr_handled = 1
4503 end
4504 if ($mysock->sa_family == 18)
4505 showsockaddr_dl $mysock
4506 set $showsockaddr_handled = 1
4507 end
4508 if ($mysock->sa_family == 16)
4509 showsockaddr_at $mysock
4510 set $showsockaddr_handled = 1
4511 end
4512 if ($showsockaddr_handled == 0)
4513 printf "%d ", $mysock->sa_family
4514 set $addr = $mysock->sa_data
4515 set $count = $mysock->sa_len
4516 printcolonhex $addr $count
4517 end
4518 end
4519 end
4520
4521 define showifflags
4522 set $flags = (u_short)$arg0
4523 set $first = 1
4524 printf "<"
4525 if ($flags & 0x1)
4526 printf "UP"
4527 set $first = 0
4528 end
4529 if ($flags & 0x2)
4530 if ($first == 1)
4531 set $first = 0
4532 else
4533 printf ","
4534 end
4535 printf "BROADCAST"
4536 end
4537 if ($flags & 0x4)
4538 printf "DEBUG"
4539 end
4540 if ($flags & 0x8)
4541 if ($first == 1)
4542 set $first = 0
4543 else
4544 printf ","
4545 end
4546 printf "LOOPBACK"
4547 end
4548 if ($flags & 0x10)
4549 if ($first == 1)
4550 set $first = 0
4551 else
4552 printf ","
4553 end
4554 printf "POINTTOPOINT"
4555 end
4556 # if ($flags & 0x20)
4557 # if ($first == 1)
4558 # set $first = 0
4559 # else
4560 # printf ","
4561 # end
4562 # printf "NOTRAILERS"
4563 # end
4564 if ($flags & 0x40)
4565 if ($first == 1)
4566 set $first = 0
4567 else
4568 printf ","
4569 end
4570 printf "RUNNING"
4571 end
4572 if ($flags & 0x80)
4573 if ($first == 1)
4574 set $first = 0
4575 else
4576 printf ","
4577 end
4578 printf "NOARP"
4579 end
4580 if ($flags & 0x100)
4581 if ($first == 1)
4582 set $first = 0
4583 else
4584 printf ","
4585 end
4586 printf "PROMISC"
4587 end
4588 if ($flags & 0x200)
4589 if ($first == 1)
4590 set $first = 0
4591 else
4592 printf ","
4593 end
4594 printf "ALLMULTI"
4595 end
4596 if ($flags & 0x400)
4597 if ($first == 1)
4598 set $first = 0
4599 else
4600 printf ","
4601 end
4602 printf "OACTIVE"
4603 end
4604 if ($flags & 0x800)
4605 if ($first == 1)
4606 set $first = 0
4607 else
4608 printf ","
4609 end
4610 printf "SIMPLEX"
4611 end
4612 if ($flags & 0x1000)
4613 if ($first == 1)
4614 set $first = 0
4615 else
4616 printf ","
4617 end
4618 printf "LINK0"
4619 end
4620 if ($flags & 0x2000)
4621 if ($first == 1)
4622 set $first = 0
4623 else
4624 printf ","
4625 end
4626 printf "LINK1"
4627 end
4628 if ($flags & 0x4000)
4629 if ($first == 1)
4630 set $first = 0
4631 else
4632 printf ","
4633 end
4634 printf "LINK2-ALTPHYS"
4635 end
4636 if ($flags & 0x8000)
4637 if ($first == 1)
4638 set $first = 0
4639 else
4640 printf ","
4641 end
4642 printf "MULTICAST"
4643 end
4644 printf ">"
4645 end
4646
4647 define showifaddrs
4648 set $ifp = (struct ifnet *)$arg0
4649 set $myifaddr = (struct ifaddr *)$ifp->if_addrhead->tqh_first
4650 set $myi = 0
4651 while ($myifaddr != 0)
4652 printf "\t%d. ", $myi
4653 showsockaddr $myifaddr->ifa_addr
4654 printf " [%d]\n", $myifaddr->ifa_refcnt
4655 set $myifaddr = $myifaddr->ifa_link->tqe_next
4656 set $myi = $myi + 1
4657 end
4658 end
4659
4660 document showifaddrs
4661 Syntax: showifaddrs <ifp>
4662 | show the (struct ifnet).if_addrhead list of addresses for the given ifp
4663 end
4664
4665 define ifconfig
4666 set $ifconfig_all = 0
4667 if ($argc == 1)
4668 set $ifconfig_all = 1
4669 end
4670 set $ifp = (struct ifnet *)(ifnet->tqh_first)
4671 while ($ifp != 0)
4672 printf "%s%d: flags=%x", $ifp->if_name, $ifp->if_unit, (u_short)$ifp->if_flags
4673 showifflags $ifp->if_flags
4674 printf " mtu %d\n", $ifp->if_data.ifi_mtu
4675 printf "\t(struct ifnet *)0x%x\n", $ifp
4676 if ($ifconfig_all == 1)
4677 showifaddrs $ifp
4678 end
4679 set $ifp = $ifp->if_link->tqe_next
4680 end
4681 end
4682 document ifconfig
4683 Syntax: (gdb) ifconfig
4684 | display ifconfig-like output, and print the (struct ifnet *) pointers for further inspection
4685 end
4686
4687 define showbpfdtab
4688 set $myi = 0
4689 while ($myi < bpf_dtab_size)
4690 if (bpf_dtab[$myi] != 0)
4691 printf "Address 0x%x, bd_next 0x%x\n", bpf_dtab[$myi], bpf_dtab[$myi]->bd_next
4692 print *bpf_dtab[$myi]
4693 end
4694 set $myi = $myi + 1
4695 end
4696 end
4697
4698 define showallvols
4699 printf "volume mnt_data mnt_devvp typename mountpoint\n"
4700 set $kgm_vol = (mount_t) mountlist.tqh_first
4701 while $kgm_vol
4702 printf "0x%08x ", $kgm_vol
4703 printf "0x%08x ", $kgm_vol->mnt_data
4704 printf "0x%08x ", $kgm_vol->mnt_devvp
4705 if ($kgm_vol->mnt_vtable->vfc_name[0] == 'h') && \
4706 ($kgm_vol->mnt_vtable->vfc_name[1] == 'f') && \
4707 ($kgm_vol->mnt_vtable->vfc_name[2] == 's') && \
4708 ($kgm_vol->mnt_vtable->vfc_name[3] == '\0')
4709 set $kgm_hfsmount = \
4710 (struct hfsmount *) $kgm_vol->mnt_data
4711 if $kgm_hfsmount->hfs_freezing_proc != 0
4712 printf "FROZEN hfs "
4713 else
4714 printf "hfs "
4715 end
4716 else
4717 printf "%-10s ", $kgm_vol->mnt_vtable->vfc_name
4718 end
4719 printf "%s\n", $kgm_vol->mnt_vfsstat.f_mntonname
4720
4721 set $kgm_vol = (mount_t) $kgm_vol->mnt_list.tqe_next
4722 end
4723 end
4724
4725 document showallvols
4726 Syntax: (gdb) showallvols
4727 | Display a summary of mounted volumes
4728 end
4729
4730 define showvnodeheader
4731 printf "vnode usecount iocount v_data vtype parent name\n"
4732 end
4733
4734 define showvnodeint
4735 set $kgm_vnode = (vnode_t) $arg0
4736 printf "0x%08x ", $kgm_vnode
4737 printf "%8d ", $kgm_vnode->v_usecount
4738 printf "%7d ", $kgm_vnode->v_iocount
4739 # print information about clean/dirty blocks?
4740 printf "0x%08x ", $kgm_vnode->v_data
4741
4742 # print the vtype, using the enum tag
4743 set $kgm_vtype = $kgm_vnode->v_type
4744 if $kgm_vtype == VNON
4745 printf "VNON "
4746 end
4747 if $kgm_vtype == VREG
4748 printf "VREG "
4749 end
4750 if $kgm_vtype == VDIR
4751 printf "VDIR "
4752 end
4753 if $kgm_vtype == VBLK
4754 printf "VBLK "
4755 end
4756 if $kgm_vtype == VCHR
4757 printf "VCHR "
4758 end
4759 if $kgm_vtype == VLNK
4760 printf "VLNK "
4761 end
4762 if $kgm_vtype == VSOCK
4763 printf "VSOCK "
4764 end
4765 if $kgm_vtype == VFIFO
4766 printf "VFIFO "
4767 end
4768 if $kgm_vtype == VBAD
4769 printf "VBAD "
4770 end
4771 if ($kgm_vtype < VNON) || ($kgm_vtype > VBAD)
4772 printf "%5d ", $kgm_vtype
4773 end
4774
4775 printf "0x%08x ", $kgm_vnode->v_parent
4776 if $kgm_vnode->v_name != 0
4777 printf "%s\n", $kgm_vnode->v_name
4778 else
4779 printf "\n"
4780 end
4781 end
4782
4783 define showvnode
4784 showvnodeheader
4785 showvnodeint $arg0
4786 end
4787
4788 document showvnode
4789 Syntax: (gdb) showvnode <vnode>
4790 | Display info about one vnode
4791 end
4792
4793 define showvolvnodes
4794 showvnodeheader
4795 set $kgm_vol = (mount_t) $arg0
4796 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
4797 while $kgm_vnode
4798 showvnodeint $kgm_vnode
4799 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
4800 end
4801 end
4802
4803 document showvolvnodes
4804 Syntax: (gdb) showvolvnodes <mouont_t>
4805 | Display info about all vnodes of a given mount_t
4806 end
4807
4808 define showvolbusyvnodes
4809 showvnodeheader
4810 set $kgm_vol = (mount_t) $arg0
4811 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
4812 while $kgm_vnode
4813 if $kgm_vnode->v_iocount != 0
4814 showvnodeint $kgm_vnode
4815 end
4816 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
4817 end
4818 end
4819
4820 document showvolbusyvnodes
4821 Syntax: (gdb) showvolbusyvnodes <mount_t>
4822 | Display info about busy (iocount!=0) vnodes of a given mount_t
4823 end
4824
4825 define showallbusyvnodes
4826 showvnodeheader
4827 set $kgm_vol = (mount_t) mountlist.tqh_first
4828 while $kgm_vol
4829 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
4830 while $kgm_vnode
4831 if $kgm_vnode->v_iocount != 0
4832 showvnodeint $kgm_vnode
4833 end
4834 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
4835 end
4836 set $kgm_vol = (mount_t) $kgm_vol->mnt_list.tqe_next
4837 end
4838 end
4839
4840 document showallbusyvnodes
4841 Syntax: (gdb) showallbusyvnodes <vnode>
4842 | Display info about all busy (iocount!=0) vnodes
4843 end
4844
4845 define showallvnodes
4846 showvnodeheader
4847 set $kgm_vol = (mount_t) mountlist.tqh_first
4848 while $kgm_vol
4849 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
4850 while $kgm_vnode
4851 showvnodeint $kgm_vnode
4852 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
4853 end
4854 set $kgm_vol = (mount_t) $kgm_vol->mnt_list.tqe_next
4855 end
4856 end
4857
4858 document showallvnodes
4859 Syntax: (gdb) showallvnodes
4860 | Display info about all vnodes
4861 end
4862
4863 define _showvnodelockheader
4864 printf "* type W held by lock type start end\n"
4865 printf "- ----- - ------------- --------- ------------------ ------------------\n"
4866 end
4867
4868 define _showvnodelock
4869 set $kgm_svl_lock = ((struct lockf *)$arg0)
4870
4871 # decode flags
4872 set $kgm_svl_flags = $kgm_svl_lock->lf_flags
4873 set $kgm_svl_type = $kgm_svl_lock->lf_type
4874 if ($kgm_svl_flags & 0x20)
4875 printf "flock"
4876 end
4877 if ($kgm_svl_flags & 0x40)
4878 printf "posix"
4879 end
4880 if ($kgm_svl_flags & 0x80)
4881 printf "prov "
4882 end
4883 if ($kgm_svl_flags & 0x10)
4884 printf " W "
4885 else
4886 printf " . "
4887 end
4888
4889 # POSIX file vs. advisory range locks
4890 if ($kgm_svl_flags & 0x40)
4891 set $kgm_svl_proc = (proc_t)$kgm_svl_lock->lf_id
4892 printf "PID %8d ", $kgm_svl_proc->p_pid
4893 else
4894 printf "ID 0x%08x ", $kgm_svl_lock->lf_id
4895 end
4896
4897 # lock type
4898 if ($kgm_svl_type == 1)
4899 printf "shared "
4900 else
4901 if ($kgm_svl_type == 3)
4902 printf "exclusive "
4903 else
4904 if ($kgm_svl_type == 2)
4905 printf "unlock "
4906 else
4907 printf "unknown "
4908 end
4909 end
4910 end
4911
4912 # start and stop
4913 printf "0x%016x..", $kgm_svl_lock->lf_start
4914 printf "0x%016x ", $kgm_svl_lock->lf_end
4915 printf "\n"
4916 end
4917 # Body of showvnodelocks, not including header
4918 define _showvnodelocks
4919 set $kgm_svl_vnode = ((vnode_t)$arg0)
4920 set $kgm_svl_lockiter = $kgm_svl_vnode->v_lockf
4921 while ($kgm_svl_lockiter != 0)
4922 # locks that are held
4923 printf "H "
4924 _showvnodelock $kgm_svl_lockiter
4925
4926 # and any locks blocked by them
4927 set $kgm_svl_blocker = $kgm_svl_lockiter->lf_blkhd.tqh_first
4928 while ($kgm_svl_blocker != 0)
4929 printf "> "
4930 _showvnodelock $kgm_svl_blocker
4931 set $kgm_svl_blocker = $kgm_svl_blocker->lf_block.tqe_next
4932 end
4933
4934 # and on to the next one...
4935 set $kgm_svl_lockiter = $kgm_svl_lockiter->lf_next
4936 end
4937 end
4938
4939
4940 define showvnodelocks
4941 if ($argc == 1)
4942 _showvnodelockheader
4943 _showvnodelocks $arg0
4944 else
4945 printf "| Usage:\n|\n"
4946 help showvnodelocks
4947 end
4948 end
4949
4950 document showvnodelocks
4951 Syntax: (gdb) showvnodelocks <vnode_t>
4952 | Given a vnodet pointer, display the list of advisory record locks for the
4953 | referenced pvnodes
4954 end
4955
4956 define showbootargs
4957 printf "%s\n", (char*)((boot_args*)PE_state.bootArgs).CommandLine
4958 end
4959
4960 document showbootargs
4961 Syntax: showbootargs
4962 | Display boot arguments passed to the target kernel
4963 end
4964
4965 define showbootermemorymap
4966 set $kgm_boot_args = kernelBootArgs
4967 set $kgm_msize = kernelBootArgs->MemoryMapDescriptorSize
4968 set $kgm_mcount = kernelBootArgs->MemoryMapSize / $kgm_msize
4969 set $kgm_i = 0
4970
4971 printf "Type Physical Start Number of Pages\n"
4972 while $kgm_i < $kgm_mcount
4973 set $kgm_mptr = (EfiMemoryRange *)((unsigned long)kernelBootArgs->MemoryMap + $kgm_i * $kgm_msize)
4974 # p/x *$kgm_mptr
4975 if $kgm_mptr->Type == 0
4976 printf "reserved "
4977 end
4978 if $kgm_mptr->Type == 1
4979 printf "LoaderCode"
4980 end
4981 if $kgm_mptr->Type == 2
4982 printf "LoaderData"
4983 end
4984 if $kgm_mptr->Type == 3
4985 printf "BS_code "
4986 end
4987 if $kgm_mptr->Type == 4
4988 printf "BS_data "
4989 end
4990 if $kgm_mptr->Type == 5
4991 printf "RT_code "
4992 end
4993 if $kgm_mptr->Type == 6
4994 printf "RT_data "
4995 end
4996 if $kgm_mptr->Type == 7
4997 printf "available "
4998 end
4999 if $kgm_mptr->Type == 8
5000 printf "Unusable "
5001 end
5002 if $kgm_mptr->Type == 9
5003 printf "ACPI_recl "
5004 end
5005 if $kgm_mptr->Type == 10
5006 printf "ACPI_NVS "
5007 end
5008 if $kgm_mptr->Type == 11
5009 printf "MemMapIO "
5010 end
5011 if $kgm_mptr->Type == 12
5012 printf "MemPortIO "
5013 end
5014 if $kgm_mptr->Type == 13
5015 printf "PAL_code "
5016 end
5017 if $kgm_mptr->Type > 13
5018 printf "UNKNOWN "
5019 end
5020
5021 printf " %016llx %016llx\n", $kgm_mptr->PhysicalStart, $kgm_mptr->NumberOfPages
5022 set $kgm_i = $kgm_i + 1
5023 end
5024 end
5025
5026 document showbootermemorymap
5027 Syntax: (gdb) showbootermemorymap
5028 | Prints out the phys memory map from kernelBootArgs
5029 end
5030
5031
5032 define showstacksaftertask
5033 set $kgm_head_taskp = &default_pset.tasks
5034 set $kgm_taskp = (struct task *)$arg0
5035 while $kgm_taskp != $kgm_head_taskp
5036 showtaskheader
5037 showtaskint $kgm_taskp
5038 set $kgm_head_actp = &($kgm_taskp->threads)
5039 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
5040 while $kgm_actp != $kgm_head_actp
5041 showactheader
5042 if ($decode_wait_events > 0)
5043 showactint $kgm_actp 1
5044 else
5045 showactint $kgm_actp 2
5046 end
5047 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
5048 end
5049 printf "\n"
5050 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
5051 end
5052 end
5053 document showstacksaftertask
5054 Syntax: (gdb) showstacksaftertask <task>
5055 | Routine to print out all stacks (as in showallstacks) starting after a given task
5056 | Useful if that gdb refuses to print a certain task's stack.
5057 end
5058
5059 define showpmworkqueueint
5060 set $kgm_pm_wq = (IOPMWorkQueue *)$arg0
5061 set $kgm_pm_node = (IOService *)$kgm_pm_wq->owner
5062 printf "0x%08x 0x%08x ", $kgm_pm_wq, $kgm_pm_node
5063 printf "%02d ", $kgm_pm_node->pwrMgt->CurrentPowerState
5064 printf "%02d ", $kgm_pm_node->pwrMgt->MachineState
5065 printf "%02d ", $kgm_pm_node->pwrMgt->WaitReason
5066 printf "%s\n", $kgm_pm_node->pwrMgt->Name
5067 set $kgm_pm_queue = &($kgm_pm_wq->fWorkQueue)
5068 set $kgm_pm_req = (IOPMRequest *) $kgm_pm_queue->next
5069 while ( (queue_entry_t) $kgm_pm_req != (queue_entry_t) $kgm_pm_queue)
5070 printf " Request 0x%08x [%02x] Args ", $kgm_pm_req, $kgm_pm_req->fType
5071 printf "0x%08x ", $kgm_pm_req->fArg0
5072 printf "0x%08x ", $kgm_pm_req->fArg1
5073 printf "0x%08x\n", $kgm_pm_req->fArg2
5074 set $kgm_pm_req = (IOPMRequest *)$kgm_pm_req->fCommandChain.next
5075 end
5076 end
5077
5078 define showallpmworkqueues
5079 set $kgm_pm_next = gIOPMWorkLoop->eventChain
5080 printf "WorkQueue Owner PS MS WT Name\n"
5081 printf "--------------------------------------\n"
5082 while ( $kgm_pm_next )
5083 set $kgm_vt = *((void **) $kgm_pm_next)
5084 if ($kgm_vt == _ZTV13IOPMWorkQueue)
5085 showpmworkqueueint $kgm_pm_next
5086 end
5087 set $kgm_pm_next = $kgm_pm_next->eventChainNext
5088 end
5089 end
5090
5091 document showallpmworkqueues
5092 Syntax: (gdb) showallpmworkqueues
5093 | Display info about all IOPMWorkQueue objects
5094 end
5095
5096 define showioservicepm
5097 set $kgm_iopmpriv = (IOServicePM *)$arg0
5098 printf "{ this object = %08x", $kgm_iopmpriv->Owner
5099 if ( $kgm_iopmpriv->WeAreRoot )
5100 printf " (root)"
5101 end
5102 printf ", "
5103
5104 printf "MachineState = %d (", $kgm_iopmpriv->MachineState
5105 if ( $kgm_iopmpriv->MachineState == 1 )
5106 printf "kIOPM_OurChangeTellClientsPowerDown"
5107 else
5108 if ( $kgm_iopmpriv->MachineState == 2 )
5109 printf "kIOPM_OurChangeTellPriorityClientsPowerDown"
5110 else
5111 if ( $kgm_iopmpriv->MachineState == 3 )
5112 printf "kIOPM_OurChangeNotifyInterestedDriversWillChange"
5113 else
5114 if ( $kgm_iopmpriv->MachineState == 4 )
5115 printf "kIOPM_OurChangeSetPowerState"
5116 else
5117 if ( $kgm_iopmpriv->MachineState == 5 )
5118 printf "kIOPM_OurChangeWaitForPowerSettle"
5119 else
5120 if ( $kgm_iopmpriv->MachineState == 6 )
5121 printf "kIOPM_OurChangeNotifyInterestedDriversDidChange"
5122 else
5123 if ( $kgm_iopmpriv->MachineState == 7 )
5124 printf "kIOPM_OurChangeFinish"
5125 else
5126 if ( $kgm_iopmpriv->MachineState == 8 )
5127 printf "kIOPM_ParentDownTellPriorityClientsPowerDown"
5128 else
5129 if ( $kgm_iopmpriv->MachineState == 9 )
5130 printf "kIOPM_ParentDownNotifyInterestedDriversWillChange"
5131 else
5132 if ( $kgm_iopmpriv->MachineState == 10 )
5133 printf "Unused_MachineState_10"
5134 else
5135 if ( $kgm_iopmpriv->MachineState == 11 )
5136 printf "kIOPM_ParentDownNotifyDidChangeAndAcknowledgeChange"
5137 else
5138 if ( $kgm_iopmpriv->MachineState == 12 )
5139 printf "kIOPM_ParentDownSetPowerState"
5140 else
5141 if ( $kgm_iopmpriv->MachineState == 13 )
5142 printf "kIOPM_ParentDownWaitForPowerSettle"
5143 else
5144 if ( $kgm_iopmpriv->MachineState == 14 )
5145 printf "kIOPM_ParentDownAcknowledgeChange"
5146 else
5147 if ( $kgm_iopmpriv->MachineState == 15)
5148 printf "kIOPM_ParentUpSetPowerState"
5149 else
5150 if ( $kgm_iopmpriv->MachineState == 16)
5151 printf "Unused_MachineState_16"
5152 else
5153 if ( $kgm_iopmpriv->MachineState == 17)
5154 printf "kIOPM_ParentUpWaitForSettleTime"
5155 else
5156 if ( $kgm_iopmpriv->MachineState == 18)
5157 printf "kIOPM_ParentUpNotifyInterestedDriversDidChange"
5158 else
5159 if ( $kgm_iopmpriv->MachineState == 19)
5160 printf "kIOPM_ParentUpAcknowledgePowerChange"
5161 else
5162 if ( $kgm_iopmpriv->MachineState == 20)
5163 printf "kIOPM_Finished"
5164 else
5165 if ( $kgm_iopmpriv->MachineState == 21)
5166 printf "kIOPM_DriverThreadCallDone"
5167 else
5168 if ( $kgm_iopmpriv->MachineState == 22)
5169 printf "kIOPM_NotifyChildrenDone"
5170 end
5171 end
5172 end
5173 end
5174 end
5175 end
5176 end
5177 end
5178 end
5179 end
5180 end
5181 end
5182 end
5183 end
5184 end
5185 end
5186 end
5187 end
5188 end
5189 end
5190 end
5191 end
5192 printf "), "
5193
5194 if ( $kgm_iopmpriv->MachineState != 20 )
5195 printf "DriverTimer = %d, ",(unsigned int)$kgm_iopmpriv->DriverTimer
5196 printf "SettleTime = %d, ",(unsigned int)$kgm_iopmpriv->SettleTimeUS
5197 printf "HeadNoteFlags = %08x, ",(unsigned int)$kgm_iopmpriv->HeadNoteFlags
5198 printf "HeadNoteState = %d, ",(unsigned int)$kgm_iopmpriv->HeadNoteState
5199 printf "HeadNoteOutputFlags = %08x, ",(unsigned int)$kgm_iopmpriv->HeadNoteOutputFlags
5200 printf "HeadNoteDomainState = %08x, ",(unsigned int)$kgm_iopmpriv->HeadNoteDomainState
5201 printf "HeadNoteCapabilityFlags = %08x, ",(unsigned int)$kgm_iopmpriv->HeadNoteCapabilityFlags
5202 printf "HeadNotePendingAcks = %x, ",(unsigned int)$kgm_iopmpriv->HeadNotePendingAcks
5203 end
5204
5205 if ( $kgm_iopmpriv->DeviceOverrides != 0 )
5206 printf"DeviceOverrides, "
5207 end
5208
5209 printf "DriverDesire = %d, ",(unsigned int)$kgm_iopmpriv->DriverDesire
5210 printf "DeviceDesire = %d, ",(unsigned int)$kgm_iopmpriv->DeviceDesire
5211 printf "DesiredPowerState = %d, ",(unsigned int)$kgm_iopmpriv->DesiredPowerState
5212 printf "PreviousRequest = %d }",(unsigned int)$kgm_iopmpriv->PreviousRequest
5213 end
5214
5215 document showioservicepm
5216 Syntax: (gdb) showioservicepm <IOServicePM pointer>
5217 | Routine to dump the IOServicePM object
5218 end
5219
5220 define showregistryentryrecursepmstate
5221 set $kgm_re = (IOService *)$arg1
5222 set $kgm$arg0_stack = (unsigned long long) $arg2
5223
5224 if ($arg3)
5225 set $kgm$arg0_stack = $kgm$arg0_stack | (1ULL << $kgm_reg_depth)
5226 else
5227 set $kgm$arg0_stack = $kgm$arg0_stack & ~(1ULL << $kgm_reg_depth)
5228 end
5229
5230 dictget $kgm_re->fRegistryTable $kgm_childkey
5231 set $kgm$arg0_child_array = (OSArray *) $kgm_result
5232
5233 if ($kgm$arg0_child_array)
5234 set $kgm$arg0_child_count = $kgm$arg0_child_array->count
5235 else
5236 set $kgm$arg0_child_count = 0
5237 end
5238
5239 if ($kgm$arg0_child_count)
5240 set $kgm$arg0_stack = $kgm$arg0_stack | (2ULL << $kgm_reg_depth)
5241 else
5242 set $kgm$arg0_stack = $kgm$arg0_stack & ~(2ULL << $kgm_reg_depth)
5243 end
5244
5245 indent $kgm_reg_depth $kgm$arg0_stack
5246 printf "+-o "
5247
5248 dictget $kgm_re->fRegistryTable $kgm_namekey
5249 if ($kgm_result == 0)
5250 dictget $kgm_re->fRegistryTable gIONameKey
5251 end
5252 if ($kgm_result == 0)
5253 dictget $kgm_re->fPropertyTable gIOClassKey
5254 end
5255
5256 if ($kgm_result != 0)
5257 printf "%s <%p>", ((OSString *)$kgm_result)->string, $kgm_re
5258 else
5259 if (((IOService*)$kgm_re)->pwrMgt && ((IOService*)$kgm_re)->pwrMgt->Name)
5260 printf "%s <%p>", ((IOService*)$kgm_re)->pwrMgt->Name, $kgm_re
5261 else
5262 printf "?? <%p>", $kgm_re
5263 end
5264 end
5265
5266 if (((IOService*)$kgm_re)->pwrMgt )
5267 printf " Current Power State: %ld ", ((IOService*)$kgm_re)->pwrMgt->CurrentPowerState
5268 #printf " Mach State %ld", ((IOService*)$kgm_re)->pwrMgt->MachineState
5269 showioservicepm ((IOService*)$kgm_re)->pwrMgt
5270 end
5271 printf "\n"
5272
5273
5274 # recurse
5275 if ($kgm$arg0_child_count != 0)
5276
5277 set $kgm_reg_depth = $kgm_reg_depth + 1
5278 set $kgm$arg0_child_idx = 0
5279
5280 while ($kgm$arg0_child_idx < $kgm$arg0_child_count)
5281 set $kgm_re = $kgm$arg0_child_array->array[$kgm$arg0_child_idx++]
5282 set $kgm_more_sib = ($kgm$arg0_child_idx < $kgm$arg0_child_count)
5283 showregistryentryrecursepmstate _$arg0 $kgm_re $kgm$arg0_stack $kgm_more_sib
5284 end
5285
5286 set $kgm_reg_depth = $kgm_reg_depth - 1
5287 end
5288 end
5289
5290 define showregistryentryintpmstate
5291 set $kgm_namekey = (OSSymbol *) $kgm_reg_plane[2]
5292 set $kgm_childkey = (OSSymbol *) $kgm_reg_plane[4]
5293 showregistryentryrecursepmstate _ $arg0 0 0
5294 end
5295
5296 define showregistrypmstate
5297 # setregistryplane gIOPowerPlane
5298 set $kgm_reg_depth = 0
5299 set $kgm_show_props = 1
5300 showregistryentryintpmstate gRegistryRoot
5301 end
5302
5303 document showregistrypmstate
5304 Syntax: (gdb) showregistrypmstate
5305 | Routine to dump the PM state of each IOPower registry entry
5306 end
5307
5308 define showstacksafterthread
5309 set $kgm_head_taskp = &default_pset.tasks
5310 set $kgm_actp = (struct thread *)$arg0
5311 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
5312 set $kgm_taskp = (struct task *)$kgm_actp->task
5313 while $kgm_taskp != $kgm_head_taskp
5314 showtaskheader
5315 showtaskint $kgm_taskp
5316 set $kgm_head_actp = &($kgm_taskp->threads)
5317 while $kgm_actp != $kgm_head_actp
5318 showactheader
5319 if ($decode_wait_events > 0)
5320 showactint $kgm_actp 1
5321 else
5322 showactint $kgm_actp 2
5323 end
5324 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
5325 end
5326 printf "\n"
5327 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
5328 end
5329 end
5330
5331 document showstacksafterthread
5332 Syntax: (gdb) showstacksafterthread <thread>
5333 | Routine to print out all stacks (as in showallstacks) starting after a given thread
5334 | Useful if that gdb refuses to print a certain task's stack.
5335 end
5336
5337 define kdp-reenter
5338 set kdp_reentry_deadline = ((unsigned) $arg0)*1000
5339 continue
5340 end
5341
5342 document kdp-reenter
5343 Syntax: (gdb) kdp-reenter <seconds>
5344 | Schedules reentry into the debugger after <seconds> seconds, and resumes
5345 | the target system.
5346 end
5347
5348 define _if_present
5349 if (!$arg0)
5350 printf " not"
5351 end
5352 printf " present"
5353 end
5354
5355 define showMCAstate
5356 if ($kgm_mtype != 7)
5357 printf "Not available for current architecture.\n"
5358 else
5359 printf "MCA"
5360 _if_present mca_MCA_present
5361 printf ", control MSR"
5362 _if_present mca_control_MSR_present
5363 printf ", threshold status"
5364 _if_present mca_threshold_status_present
5365 printf "\n%d error banks, ", mca_error_bank_count
5366 printf "family code 0x%x, ", mca_family
5367 printf "machine-check dump state: %d\n", mca_dump_state
5368 set $kgm_cpu = 0
5369 while cpu_data_ptr[$kgm_cpu] != 0
5370 set $kgm_mcp = cpu_data_ptr[$kgm_cpu]->cpu_mca_state
5371 if $kgm_mcp
5372 printf "CPU %d:", $kgm_cpu
5373 printf " mca_mcg_ctl: 0x%016llx", $kgm_mcp->mca_mcg_ctl
5374 printf " mca_mcg_status: 0x%016llx\n", $kgm_mcp->mca_mcg_status.u64
5375 printf "bank "
5376 printf "mca_mci_ctl "
5377 printf "mca_mci_status "
5378 printf "mca_mci_addr "
5379 printf "mca_mci_misc\n"
5380 set $kgm_bank = 0
5381 while $kgm_bank < mca_error_bank_count
5382 set $kgm_bp = &$kgm_mcp->mca_error_bank[$kgm_bank]
5383 printf " %2d:", $kgm_bank
5384 printf " 0x%016llx", $kgm_bp->mca_mci_ctl
5385 printf " 0x%016llx", $kgm_bp->mca_mci_status.u64
5386 printf " 0x%016llx", $kgm_bp->mca_mci_addr
5387 printf " 0x%016llx\n", $kgm_bp->mca_mci_misc
5388 set $kgm_bank = $kgm_bank + 1
5389 end
5390 end
5391 set $kgm_cpu = $kgm_cpu + 1
5392 end
5393 end
5394 end
5395
5396 document showMCAstate
5397 Syntax: showMCAstate
5398 | Print machine-check register state after MC exception.
5399 end
5400
5401 define _pt_step
5402 #
5403 # Step to lower-level page table and print attributes
5404 # $kgm_pt_paddr: current page table entry physical address
5405 # $kgm_pt_index: current page table entry index (0..511)
5406 # returns
5407 # $kgm_pt_paddr: next level page table entry physical address
5408 # or null if invalid
5409 # For $kgm_pt_verbose = 0: print nothing
5410 # 1: print basic information
5411 # 2: print basic information and hex table dump
5412 # The trickery with kdp_src_high32 is required for accesses above 4GB.
5413 #
5414 set $kgm_entryp = $kgm_pt_paddr + 8*$kgm_pt_index
5415 set kdp_src_high32 = $kgm_pt_paddr >> 32
5416 set kdp_trans_off = 1
5417 set $entry = *(pt_entry_t *)($kgm_entryp & 0x0ffffffffULL)
5418 if $kgm_pt_verbose == 2
5419 x/512g ($kgm_pt_paddr & 0x0ffffffffULL)
5420 end
5421 set kdp_trans_off = 0
5422 set kdp_src_high32 = 0
5423 set $kgm_paddr_mask = ~((0xffffULL<<48) | 0xfffULL)
5424 if $kgm_pt_verbose == 0
5425 if $entry & (0x1 << 0)
5426 set $kgm_pt_paddr = $entry & $kgm_paddr_mask
5427 else
5428 set $kgm_pt_paddr = 0
5429 end
5430 else
5431 printf "0x%016llx:\n\t0x%016llx\n\t", $kgm_entryp, $entry
5432 if $entry & (0x1 << 0)
5433 printf "valid"
5434 set $kgm_pt_paddr = $entry & $kgm_paddr_mask
5435 else
5436 printf "invalid"
5437 set $kgm_pt_paddr = 0
5438 end
5439 if $entry & (0x1 << 1)
5440 printf " writeable"
5441 else
5442 printf " read-only"
5443 end
5444 if $entry & (0x1 << 2)
5445 printf " user"
5446 else
5447 printf " supervisor"
5448 end
5449 if $entry & (0x1 << 3)
5450 printf " PWT"
5451 end
5452 if $entry & (0x1 << 4)
5453 printf " PCD"
5454 end
5455 if $entry & (0x1 << 5)
5456 printf " accessed"
5457 end
5458 if $entry & (0x1 << 6)
5459 printf " dirty"
5460 end
5461 if $entry & (0x1 << 7)
5462 printf " PAT"
5463 end
5464 if $entry & (0x1 << 8)
5465 printf " global"
5466 end
5467 if $entry & (0x3 << 9)
5468 printf " avail:0x%x", ($entry >> 9) & 0x3
5469 end
5470 if $entry & (0x1 << 63)
5471 printf " noexec"
5472 end
5473 printf "\n"
5474 end
5475 end
5476
5477 define _pmap_walk
5478 set $kgm_pmap = (pmap_t) $arg0
5479 set $kgm_vaddr = $arg1
5480 set $kgm_pt_paddr = $kgm_pmap->pm_cr3
5481 if $kgm_pt_paddr && cpu_64bit
5482 set $kgm_pt_index = ($kgm_vaddr >> 39) & 0x1ffULL
5483 if $kgm_pt_verbose
5484 printf "pml4 (index %d):\n", $kgm_pt_index
5485 end
5486 _pt_step
5487 end
5488 if $kgm_pt_paddr
5489 set $kgm_pt_index = ($kgm_vaddr >> 30) & 0x1ffULL
5490 if $kgm_pt_verbose
5491 printf "pdpt (index %d):\n", $kgm_pt_index
5492 end
5493 _pt_step
5494 end
5495 if $kgm_pt_paddr
5496 set $kgm_pt_index = ($kgm_vaddr >> 21) & 0x1ffULL
5497 if $kgm_pt_verbose
5498 printf "pdt (index %d):\n", $kgm_pt_index
5499 end
5500 _pt_step
5501 end
5502 if $kgm_pt_paddr
5503 set $kgm_pt_index = ($kgm_vaddr >> 12) & 0x1ffULL
5504 if $kgm_pt_verbose
5505 printf "pt (index %d):\n", $kgm_pt_index
5506 end
5507 _pt_step
5508 end
5509 if $kgm_pt_paddr
5510 set $kgm_paddr = $kgm_pt_paddr + ($kgm_vaddr & 0xfffULL)
5511 set kdp_trans_off = 1
5512 set kdp_src_high32 = $kgm_paddr >> 32
5513 set $kgm_value = *($kgm_paddr & 0x0ffffffffULL)
5514 set kdp_trans_off = 0
5515 set kdp_src_high32 = 0
5516 printf "phys 0x%016llx: 0x%08x\n", $kgm_paddr, $kgm_value
5517 else
5518 set $kgm_paddr = 0
5519 printf "(no translation)\n"
5520 end
5521 end
5522
5523 define pmap_walk
5524 if $kgm_mtype != 7
5525 printf "Not available for current architecture.\n"
5526 else
5527 if $argc != 2
5528 printf "pmap_walk <pmap> <vaddr>\n"
5529 else
5530 if !$kgm_pt_verbose
5531 set $kgm_pt_verbose = 1
5532 else
5533 if $kgm_pt_verbose != 2
5534 set $kgm_pt_verbose = 1
5535 end
5536 end
5537 _pmap_walk $arg0 $arg1
5538 end
5539 end
5540 end
5541
5542 document pmap_walk
5543 Syntax: (gdb) pmap_walk <pmap> <virtual_address>
5544 | Perform a page-table walk in <pmap> for <virtual_address>.
5545 | Set $kgm_pt_verbose=2 for full hex dump of page tables.
5546 end
5547
5548 define pmap_vtop
5549 if $kgm_mtype != 7
5550 printf "Not available for current architecture.\n"
5551 else
5552 if $argc != 2
5553 printf "pmap_vtop <pamp> <vaddr>\n"
5554 else
5555 set $kgm_pt_verbose = 0
5556 _pmap_walk $arg0 $arg1
5557 end
5558 end
5559 end
5560
5561 document pmap_vtop
5562 Syntax: (gdb) pmap_vtop <pmap> <virtual_address>
5563 | For page-tables in <pmap> translate <virtual_address> to physical address.
5564 end
5565