]> git.saurik.com Git - apple/xnu.git/blame - kgmacros
xnu-1228.9.59.tar.gz
[apple/xnu.git] / kgmacros
CommitLineData
1c79356b
A
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
0c530ab8
A
8set print asm-demangle on
9set cp-abi gnu-v2
9bccf70c 10
1c79356b
A
11echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n
12
13define kgm
55e303ae
A
14printf ""
15echo These are the gdb macros for kernel debugging. Type "help kgm" for more info.\n
1c79356b
A
16end
17
18document 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:
2d21ac55
A
22| (gdb) target remote-kdp
23| (gdb) attach <name-of-remote-host>
1c79356b
A
24|
25| The following macros are available in this package:
91447636 26| showversion Displays a string describing the remote kernel version
1c79356b 27|
55e303ae
A
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
1c79356b
A
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
0c530ab8
A
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)
1c79356b 45|
55e303ae
A
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
1c79356b 53|
55e303ae
A
54| showact Display info about a thread specified by activation
55| showactstack Display the stack for a thread specified by activation
1c79356b 56|
55e303ae 57| showmap Display info about the specified vm_map
1c79356b
A
58| showmapvme Display a summary list of the specified vm_map's entries
59|
55e303ae 60| showipc Display info about the specified ipc space
1c79356b
A
61| showrights Display a summary list of all the rights in an ipc space
62|
55e303ae
A
63| showpid Display info about the process identified by pid
64| showproc Display info about the process identified by proc struct
2d21ac55
A
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
1c79356b 73|
55e303ae 74| showkmod Display info about a kernel module
1c79356b
A
75| showkmodaddr Given an address, display the kernel module and offset
76|
55e303ae
A
77| dumpcallqueue Dump out all the entries given a queue head
78|
91447636
A
79| showallmtx Display info about mutexes usage
80| showallrwlck Display info about reader/writer locks usage
81|
55e303ae 82| zprint Display info about the memory zones
91447636 83| showioalloc Display info about iokit allocations
55e303ae 84| paniclog Display the panic log info
9bccf70c 85|
55e303ae
A
86| switchtoact Switch to different context specified by activation
87| switchtoctx Switch to different context
91447636
A
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|
9bccf70c 94| resetctx Reset context
55e303ae
A
95| resume_on Resume when detaching from gdb
96| resume_off Don't resume when detaching from gdb
1c79356b 97|
91447636
A
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"
0c530ab8
A
102|
103| readphys Reads the specified untranslated address
104| readphys64 Reads the specified untranslated 64-bit address
105|
2d21ac55
A
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|
1c79356b
A
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.
164end
165
0c530ab8
A
166# This macro should appear before any symbol references, to facilitate
167# a gdb "source" without a loaded symbol file.
168define showversion
169 printf "%s\n", *(char **)0x501C
170end
171
172document showversion
173Syntax: 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.
181end
182
2d21ac55
A
183set $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
189if ($kgm_mtype != 12)
190 set backtrace sanity-checks off
191end
192
0c530ab8
A
193set $kgm_dummy = &proc0
194set $kgm_dummy = &kmod
0c530ab8
A
195
196set $kgm_reg_depth = 0
197set $kgm_reg_plane = (void **) gIOServicePlane
198set $kgm_namekey = (OSSymbol *) 0
199set $kgm_childkey = (OSSymbol *) 0
200
201set $kgm_show_object_addrs = 0
202set $kgm_show_object_retain = 0
203set $kgm_show_props = 0
1c79356b 204
2d21ac55
A
205set $kgm_show_kmod_syms = 0
206
1c79356b
A
207define showkmodheader
208 printf "kmod address size "
209 printf "id refs version name\n"
210end
211
212define 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
221end
222
223set $kgm_kmodmin = 0xffffffff
224set $kgm_fkmodmin = 0x00000000
225set $kgm_kmodmax = 0x00000000
226set $kgm_fkmodmax = 0xffffffff
227set $kgm_pkmod = 0
228set $kgm_pkmodst = 0
229set $kgm_pkmoden = 0
0c530ab8 230define showkmodaddrint
1c79356b
A
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
0c530ab8 244 set $kgm_kmodmax = $kgm_kmod.address + $kgm_kmod.size
1c79356b
A
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
263end
0c530ab8
A
264
265define showkmodaddr
266 showkmodaddrint $arg0
0c530ab8
A
267end
268
1c79356b 269document showkmodaddr
2d21ac55 270Syntax: (gdb) showkmodaddr <addr>
1c79356b 271| Given an address, print the offset and name for the kmod containing it
1c79356b
A
272end
273
274define showkmod
275 showkmodheader
276 showkmodint $arg0
277end
278document showkmod
2d21ac55 279Syntax: (gdb) showkmod <kmod>
1c79356b 280| Routine to print info about a kernel module
1c79356b
A
281end
282
283define 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
290end
291document showallkmods
2d21ac55 292Syntax: (gdb) showallkmods
1c79356b 293| Routine to print a summary listing of all the kernel modules
1c79356b
A
294end
295
296define showactheader
2d21ac55
A
297 printf " thread "
298 printf "processor pri state wait_queue wait_event\n"
1c79356b
A
299end
300
301
302define showactint
91447636
A
303 printf " 0x%08x ", $arg0
304 set $kgm_thread = *(struct thread *)$arg0
2d21ac55 305 printf "0x%08x ", $kgm_thread.last_processor
1c79356b
A
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
0c530ab8 332 if (((unsigned)$kgm_thread.wait_event > (unsigned)sectPRELINKB) \
2d21ac55 333 && ($arg1 != 2) && ($kgm_show_kmod_syms == 0))
0c530ab8
A
334 showkmodaddr $kgm_thread.wait_event
335 else
91447636
A
336 output /a (unsigned) $kgm_thread.wait_event
337 end
2d21ac55
A
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
1c79356b
A
344 end
345 if $arg1 != 0
346 if ($kgm_thread.kernel_stack != 0)
55e303ae
A
347 if ($kgm_thread.reserved_stack != 0)
348 printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
1c79356b
A
349 end
350 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
91447636
A
351 if ($kgm_mtype == 18)
352 set $mysp = $kgm_thread.machine.pcb->save_r1
2d21ac55
A
353 end
354 if ($kgm_mtype == 7)
0c530ab8 355 set $kgm_statep = (struct x86_kernel_state32 *) \
91447636 356 ($kgm_thread->kernel_stack + 0x4000 \
0c530ab8 357 - sizeof(struct x86_kernel_state32))
55e303ae
A
358 set $mysp = $kgm_statep->k_ebp
359 end
2d21ac55
A
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
0c530ab8 368 set $prevsp = $mysp - 16
1c79356b 369 printf "\n\t\tstacktop=0x%08x", $mysp
91447636
A
370 if ($kgm_mtype == 18)
371 set $stkmask = 0xf
91447636
A
372 else
373 set $stkmask = 0x3
91447636 374 end
0c530ab8 375 set $kgm_return = 0
91447636 376 while ($mysp != 0) && (($mysp & $stkmask) == 0) \
0c530ab8
A
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))))
91447636
A
381 printf "\n\t\t0x%08x ", $mysp
382 if ($kgm_mtype == 18)
383 set $kgm_return = *($mysp + 8)
2d21ac55
A
384 end
385 if ($kgm_mtype == 7)
386 set $kgm_return = *($mysp + 4)
387 end
388 if ($kgm_mtype == 12)
91447636
A
389 set $kgm_return = *($mysp + 4)
390 end
2d21ac55
A
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
91447636
A
397 set $prevsp = $mysp
398 set $mysp = * $mysp
1c79356b 399 end
0c530ab8 400 set $kgm_return = 0
1c79356b
A
401 printf "\n\t\tstackbottom=0x%08x", $prevsp
402 else
403 printf "\n\t\t\tcontinuation="
91447636 404 output /a (unsigned) $kgm_thread.continuation
1c79356b
A
405 end
406 printf "\n"
407 else
408 printf "\n"
409 end
1c79356b
A
410end
411
412define showact
413 showactheader
414 showactint $arg0 0
415end
416document showact
2d21ac55 417Syntax: (gdb) showact <activation>
55e303ae 418| Routine to print out the state of a specific thread.
1c79356b
A
419end
420
421
422define showactstack
423 showactheader
424 showactint $arg0 1
425end
426document showactstack
2d21ac55 427Syntax: (gdb) showactstack <activation>
55e303ae 428| Routine to print out the stack of a specific thread.
1c79356b
A
429end
430
431
55e303ae 432define showallthreads
2d21ac55 433 set $kgm_head_taskp = &tasks
9bccf70c 434 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1c79356b
A
435 while $kgm_taskp != $kgm_head_taskp
436 showtaskheader
437 showtaskint $kgm_taskp
438 showactheader
55e303ae
A
439 set $kgm_head_actp = &($kgm_taskp->threads)
440 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1c79356b
A
441 while $kgm_actp != $kgm_head_actp
442 showactint $kgm_actp 0
55e303ae 443 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1c79356b
A
444 end
445 printf "\n"
2d21ac55 446 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1c79356b
A
447 end
448end
55e303ae 449document showallthreads
2d21ac55 450Syntax: (gdb) showallthreads
55e303ae 451| Routine to print out info about all threads in the system.
55e303ae
A
452end
453
454define showcurrentthreads
2d21ac55 455set $kgm_prp = (struct processor *)processor_list
91447636
A
456 while $kgm_prp != 0
457 if ($kgm_prp)->active_thread != 0
458 set $kgm_actp = ($kgm_prp)->active_thread
55e303ae
A
459 showtaskheader
460 showtaskint ($kgm_actp)->task
461 showactheader
462 showactint $kgm_actp 0
463 printf "\n"
464 end
91447636 465 set $kgm_prp = ($kgm_prp)->processor_list
55e303ae
A
466 end
467end
468document showcurrentthreads
2d21ac55 469Syntax: (gdb) showcurrentthreads
55e303ae 470| Routine to print out info about the thread running on each cpu.
1c79356b
A
471end
472
0c530ab8 473set $decode_wait_events = 0
1c79356b 474define showallstacks
2d21ac55 475 set $kgm_head_taskp = &tasks
9bccf70c 476 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1c79356b
A
477 while $kgm_taskp != $kgm_head_taskp
478 showtaskheader
479 showtaskint $kgm_taskp
55e303ae
A
480 set $kgm_head_actp = &($kgm_taskp->threads)
481 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1c79356b
A
482 while $kgm_actp != $kgm_head_actp
483 showactheader
0c530ab8
A
484 if ($decode_wait_events > 0)
485 showactint $kgm_actp 1
486 else
487 showactint $kgm_actp 2
488 end
55e303ae 489 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1c79356b
A
490 end
491 printf "\n"
2d21ac55 492 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1c79356b
A
493 end
494end
0c530ab8 495
1c79356b 496document showallstacks
2d21ac55 497Syntax: (gdb) showallstacks
55e303ae 498| Routine to print out the stack for each thread in the system.
0c530ab8
A
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.
1c79356b
A
502end
503
55e303ae 504define showcurrentstacks
91447636
A
505set $kgm_prp = processor_list
506 while $kgm_prp != 0
507 if ($kgm_prp)->active_thread != 0
508 set $kgm_actp = ($kgm_prp)->active_thread
55e303ae
A
509 showtaskheader
510 showtaskint ($kgm_actp)->task
511 showactheader
512 showactint $kgm_actp 1
513 printf "\n"
514 end
91447636 515 set $kgm_prp = ($kgm_prp)->processor_list
55e303ae
A
516 end
517end
0c530ab8 518
55e303ae 519document showcurrentstacks
2d21ac55 520Syntax: (gdb) showcurrentstacks
55e303ae 521| Routine to print out the thread running on each cpu (incl. its stack)
55e303ae
A
522end
523
9bccf70c
A
524define showwaiterheader
525 printf "waiters activation "
526 printf "thread pri state wait_queue wait_event\n"
527end
528
529define 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
55e303ae 540 set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe
91447636 541 showactint $kgm_w_shuttle 0
9bccf70c
A
542 end
543 set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_wqe->wqe_links.next
544 end
545end
546
547define 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
559end
560
1c79356b 561define showwaitqmembercount
9bccf70c
A
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
1c79356b 569 end
9bccf70c 570 printf "0x%08x ", $kgm_mc_count
1c79356b
A
571end
572
573
9bccf70c
A
574define showwaitqmemberheader
575 printf "set-members wait_queue interlock "
576 printf "pol type member_cnt waiter_cnt\n"
577end
578
1c79356b 579define showwaitqmemberint
9bccf70c
A
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 "
1c79356b 585 else
9bccf70c 586 printf "Prio "
1c79356b 587 end
9bccf70c
A
588 if ($kgm_m_waitqp->wq_type == 0xf1d1)
589 printf "Set "
590 showwaitqmembercount $kgm_m_waitqp
1c79356b 591 else
9bccf70c 592 printf "Que 0x00000000 "
1c79356b 593 end
9bccf70c 594 showwaitqwaitercount $kgm_m_waitqp
1c79356b
A
595 printf "\n"
596end
597
598
9bccf70c
A
599define showwaitqmemberofheader
600 printf "member-of wait_queue interlock "
601 printf "pol type member_cnt waiter_cnt\n"
602end
603
604define 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
621end
622
1c79356b 623define showwaitqmembers
9bccf70c
A
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
1c79356b 631 showwaitqmemberheader
9bccf70c 632 set $kgm_ms_found = 1
1c79356b 633 end
9bccf70c
A
634 showwaitqmemberint $kgm_ms_waitqp
635 set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_wql->wql_setlinks.next
1c79356b
A
636 end
637end
638
9bccf70c
A
639define showwaitqheader
640 printf "wait_queue ref_count interlock "
641 printf "pol type member_cnt waiter_cnt\n"
642end
643
644define 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"
666end
667
1c79356b 668define showwaitq
9bccf70c 669 set $kgm_waitq1p = (wait_queue_t)$arg0
1c79356b 670 showwaitqheader
9bccf70c
A
671 showwaitqint $kgm_waitq1p
672 if ($kgm_waitq1p->wq_type == 0xf1d1)
673 showwaitqmembers $kgm_waitq1p
674 else
675 showwaitqmemberof $kgm_waitq1p
1c79356b 676 end
9bccf70c 677 showwaitqwaiters $kgm_waitq1p
1c79356b
A
678end
679
680define showmapheader
681 printf "vm_map pmap vm_size "
682 printf "#ents rpage hint first_free\n"
683end
684
685define showvmeheader
91447636
A
686 printf " entry start "
687 printf " prot #page object offset\n"
1c79356b
A
688end
689
690define 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
91447636
A
697 if $kgm_map.pmap
698 printf "%5d ", $kgm_map.pmap->stats.resident_count
699 else
700 printf "<n/a> "
701 end
1c79356b
A
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
91447636
A
710 printf " 0x%08x ", $kgm_vmep
711 printf "0x%016llx ", $kgm_vme.links.start
1c79356b
A
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
91447636 737 printf "0x%016llx\n", $kgm_vme.offset
1c79356b
A
738 set $kgm_vmep = $kgm_vme.links.next
739 end
740 end
741 printf "\n"
742end
743
744
745define showmapvme
746 showmapheader
747 showvmint $arg0 1
748end
749document showmapvme
2d21ac55 750Syntax: (gdb) showmapvme <vm_map>
1c79356b 751| Routine to print out a summary listing of all the entries in a vm_map
1c79356b
A
752end
753
754
755define showmap
756 showmapheader
757 showvmint $arg0 0
758end
759document showmap
2d21ac55 760Syntax: (gdb) showmap <vm_map>
55e303ae 761| Routine to print out info about the specified vm_map
1c79356b
A
762end
763
764define showallvm
2d21ac55 765 set $kgm_head_taskp = &tasks
9bccf70c 766 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1c79356b
A
767 while $kgm_taskp != $kgm_head_taskp
768 showtaskheader
769 showmapheader
770 showtaskint $kgm_taskp
771 showvmint $kgm_taskp->map 0
2d21ac55 772 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1c79356b
A
773 end
774end
775document showallvm
2d21ac55 776Syntax: (gdb) showallvm
1c79356b 777| Routine to print a summary listing of all the vm maps
1c79356b
A
778end
779
780
781define showallvme
2d21ac55 782 set $kgm_head_taskp = &tasks
9bccf70c 783 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1c79356b
A
784 while $kgm_taskp != $kgm_head_taskp
785 showtaskheader
786 showmapheader
787 showtaskint $kgm_taskp
788 showvmint $kgm_taskp->map 1
2d21ac55 789 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1c79356b
A
790 end
791end
792document showallvme
2d21ac55 793Syntax: (gdb) showallvme
1c79356b 794| Routine to print a summary listing of all the vm map entries
1c79356b
A
795end
796
797
798define showipcheader
799 printf "ipc_space is_table table_next "
800 printf "flags tsize splaytree splaybase\n"
801end
802
803define showipceheader
804 printf " name object "
805 printf "rite urefs destname destination\n"
806end
807
808define 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
848end
849
850define 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"
893end
894
895
896define showipc
897 set $kgm_isp = (ipc_space_t)$arg0
898 showipcheader
899 showipcint $kgm_isp 0
900end
901document showipc
2d21ac55 902Syntax: (gdb) showipc <ipc_space>
1c79356b 903| Routine to print the status of the specified ipc space
1c79356b
A
904end
905
906define showrights
907 set $kgm_isp = (ipc_space_t)$arg0
908 showipcheader
909 showipcint $kgm_isp 1
910end
911document showrights
2d21ac55 912Syntax: (gdb) showrights <ipc_space>
1c79356b 913| Routine to print a summary list of all the rights in a specified ipc space
1c79356b
A
914end
915
916
917define showtaskipc
918 set $kgm_taskp = (task_t)$arg0
919 showtaskheader
920 showipcheader
921 showtaskint $kgm_taskp
922 showipcint $kgm_taskp->itk_space 0
923end
924document showtaskipc
2d21ac55 925Syntax: (gdb) showtaskipc <task>
55e303ae 926| Routine to print info about the ipc space for a task
1c79356b
A
927end
928
929
930define showtaskrights
931 set $kgm_taskp = (task_t)$arg0
932 showtaskheader
933 showipcheader
934 showtaskint $kgm_taskp
935 showipcint $kgm_taskp->itk_space 1
936end
937document showtaskrights
2d21ac55 938Syntax: (gdb) showtaskrights <task>
55e303ae 939| Routine to print info about the ipc rights for a task
1c79356b
A
940end
941
942define showallipc
2d21ac55 943 set $kgm_head_taskp = &tasks
91447636
A
944 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
945 while $kgm_cur_taskp != $kgm_head_taskp
1c79356b
A
946 showtaskheader
947 showipcheader
91447636
A
948 showtaskint $kgm_cur_taskp
949 showipcint $kgm_cur_taskp->itk_space 0
2d21ac55 950 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
1c79356b
A
951 end
952end
953document showallipc
2d21ac55 954Syntax: (gdb) showallipc
1c79356b 955| Routine to print a summary listing of all the ipc spaces
1c79356b
A
956end
957
958
959define showallrights
2d21ac55 960 set $kgm_head_taskp = &tasks
91447636
A
961 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
962 while $kgm_cur_taskp != $kgm_head_taskp
1c79356b
A
963 showtaskheader
964 showipcheader
91447636
A
965 showtaskint $kgm_cur_taskp
966 showipcint $kgm_cur_taskp->itk_space 1
2d21ac55 967 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
1c79356b
A
968 end
969end
970document showallrights
2d21ac55 971Syntax: (gdb) showallrights
1c79356b 972| Routine to print a summary listing of all the ipc rights
1c79356b
A
973end
974
975
976define showtaskvm
977 set $kgm_taskp = (task_t)$arg0
978 showtaskheader
979 showmapheader
980 showtaskint $kgm_taskp
981 showvmint $kgm_taskp->map 0
982end
983document showtaskvm
2d21ac55 984Syntax: (gdb) showtaskvm <task>
55e303ae 985| Routine to print out info about a task's vm_map
1c79356b
A
986end
987
988define showtaskvme
989 set $kgm_taskp = (task_t)$arg0
990 showtaskheader
991 showmapheader
992 showtaskint $kgm_taskp
993 showvmint $kgm_taskp->map 1
994end
995document showtaskvme
2d21ac55 996Syntax: (gdb) showtaskvme <task>
55e303ae 997| Routine to print out info about a task's vm_map_entries
1c79356b
A
998end
999
1000
1001define showtaskheader
1002 printf "task vm_map ipc_space #acts "
1003 showprocheader
1004end
1005
1006
1007define showtaskint
9bccf70c 1008 set $kgm_task = *(struct task *)$arg0
1c79356b
A
1009 printf "0x%08x ", $arg0
1010 printf "0x%08x ", $kgm_task.map
1011 printf "0x%08x ", $kgm_task.itk_space
55e303ae 1012 printf "%3d ", $kgm_task.thread_count
1c79356b
A
1013 showprocint $kgm_task.bsd_info
1014end
1015
1016define showtask
1017 showtaskheader
1018 showtaskint $arg0
1019end
1020document showtask
2d21ac55 1021Syntax (gdb) showtask <task>
1c79356b 1022| Routine to print out info about a task.
1c79356b
A
1023end
1024
1025
55e303ae 1026define showtaskthreads
1c79356b 1027 showtaskheader
9bccf70c 1028 set $kgm_taskp = (struct task *)$arg0
1c79356b
A
1029 showtaskint $kgm_taskp
1030 showactheader
55e303ae
A
1031 set $kgm_head_actp = &($kgm_taskp->threads)
1032 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1c79356b
A
1033 while $kgm_actp != $kgm_head_actp
1034 showactint $kgm_actp 0
55e303ae 1035 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1c79356b
A
1036 end
1037end
55e303ae 1038document showtaskthreads
2d21ac55 1039Syntax: (gdb) showtaskthreads <task>
55e303ae 1040| Routine to print info about the threads in a task.
1c79356b
A
1041end
1042
1043
1044define showtaskstacks
1045 showtaskheader
9bccf70c 1046 set $kgm_taskp = (struct task *)$arg0
1c79356b 1047 showtaskint $kgm_taskp
55e303ae
A
1048 set $kgm_head_actp = &($kgm_taskp->threads)
1049 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1c79356b
A
1050 while $kgm_actp != $kgm_head_actp
1051 showactheader
1052 showactint $kgm_actp 1
55e303ae 1053 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1c79356b
A
1054 end
1055end
1056document showtaskstacks
2d21ac55 1057Syntax: (gdb) showtaskstacks <task>
55e303ae 1058| Routine to print out the stack for each thread in a task.
1c79356b
A
1059end
1060
1061
1062define showalltasks
1063 showtaskheader
2d21ac55 1064 set $kgm_head_taskp = &tasks
9bccf70c 1065 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1c79356b
A
1066 while $kgm_taskp != $kgm_head_taskp
1067 showtaskint $kgm_taskp
2d21ac55 1068 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1c79356b
A
1069 end
1070end
1071document showalltasks
2d21ac55 1072Syntax: (gdb) showalltasks
1c79356b 1073| Routine to print a summary listing of all the tasks
1c79356b
A
1074end
1075
1076
1077define showprocheader
1078 printf " pid proc command\n"
1079end
1080
1081define 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
1090end
1091
1092define showpid
1093 showtaskheader
2d21ac55 1094 set $kgm_head_taskp = &tasks
9bccf70c 1095 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1c79356b
A
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
2d21ac55 1102 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1c79356b
A
1103 end
1104 end
1105end
1106document showpid
2d21ac55 1107Syntax: (gdb) showpid <pid>
1c79356b 1108| Routine to print a single process by pid
1c79356b
A
1109end
1110
1111define showproc
1112 showtaskheader
1113 set $kgm_procp = (struct proc *)$arg0
1114 showtaskint $kgm_procp->task $arg1 $arg2
1115end
1116
1117
1118define kdb
1119 set switch_debugger=1
1120 continue
1121end
1122document 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.
1128end
1129
1130define showpsetheader
1131 printf "portset waitqueue recvname "
1132 printf "flags refs recvname process\n"
1133end
1134
1135define showportheader
1136 printf "port mqueue recvname "
1137 printf "flags refs recvname process\n"
1138end
1139
1140define showportmemberheader
9bccf70c 1141 printf "members port recvname "
1c79356b
A
1142 printf "flags refs mqueue msgcount\n"
1143end
1144
1145define showkmsgheader
9bccf70c 1146 printf "messages kmsg size "
1c79356b
A
1147 printf "disp msgid remote-port local-port\n"
1148end
1149
1150define 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
9bccf70c 1169 printf "%5d ", $kgm_kmsgh.msgh_id
1c79356b
A
1170 printf "0x%08x ", $kgm_kmsgh.msgh_remote_port
1171 printf "0x%08x\n", $kgm_kmsgh.msgh_local_port
1172end
1173
1174
1175
1176define showkobject
9bccf70c 1177 set $kgm_portp = (struct ipc_port *)$arg0
1c79356b
A
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"
1274end
1275
1276define showportdestproc
9bccf70c 1277 set $kgm_portp = (struct ipc_port *)$arg0
1c79356b
A
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
2d21ac55 1282 set $kgm_head_taskp = &tasks
91447636
A
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
1c79356b 1286 if ($kgm_destspacep == $kgm_spacep)
91447636 1287 set $kgm_destprocp = (struct proc *)$kgm_desttaskp->bsd_info
1c79356b 1288 else
2d21ac55 1289 set $kgm_desttaskp = (struct task *)($kgm_desttaskp->tasks.next)
1c79356b
A
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
91447636 1296 printf "task 0x%08x\n", $kgm_desttaskp
1c79356b
A
1297 end
1298end
1299
1300define showportdest
9bccf70c 1301 set $kgm_portp = (struct ipc_port *)$arg0
1c79356b
A
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
1313end
1314
1315define showportmember
1316 printf " 0x%08x ", $arg0
9bccf70c 1317 set $kgm_portp = (struct ipc_port *)$arg0
1c79356b
A
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
1332end
1333
1334define showportint
1335 printf "0x%08x ", $arg0
9bccf70c 1336 set $kgm_portp = (struct ipc_port *)$arg0
1c79356b
A
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
9bccf70c 1346 set $kgm_destspacep = (struct ipc_space *)0
1c79356b
A
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
1359end
1360
1361define showpsetint
1362 printf "0x%08x ", $arg0
9bccf70c 1363 set $kgm_psetp = (struct ipc_pset *)$arg0
1c79356b
A
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
9bccf70c
A
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
1c79356b 1376 set $kgm_found = 0
9bccf70c
A
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))
1c79356b 1379 if !$kgm_found
9bccf70c
A
1380 set $kgm_destspacep = (struct ipc_space *)0
1381 showportdestproc $kgm_portp
1c79356b
A
1382 showportmemberheader
1383 set $kgm_found = 1
1384 end
1385 showportmember $kgm_portp 0
9bccf70c 1386 set $kgm_wql = (struct wait_queue_link *)$kgm_wql->wql_setlinks.next
1c79356b 1387 end
9bccf70c
A
1388 if !$kgm_found
1389 printf "--n/e--\n"
1c79356b
A
1390 end
1391end
1392
1393define showpset
1394 showpsetheader
1395 showpsetint $arg0 1
1396end
1397
1398define showport
1399 showportheader
1400 showportint $arg0 1
1401end
1402
1403define 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
1410end
1411
1412define showmqueue
9bccf70c
A
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)
1c79356b
A
1417 set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff))
1418 showpsetheader
1419 showpsetint $kgm_pset 1
9bccf70c
A
1420 end
1421 if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d0)
1c79356b
A
1422 showportheader
1423 set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff))
1424 showportint $kgm_port 1
1425 end
1426end
1427
1428define zprint_one
1429set $kgm_zone = (struct zone *)$arg0
1430
1431printf "0x%08x ", $kgm_zone
1432printf "%8d ",$kgm_zone->count
1433printf "%8x ",$kgm_zone->cur_size
1434printf "%8x ",$kgm_zone->max_size
1435printf "%6d ",$kgm_zone->elem_size
1436printf "%8x ",$kgm_zone->alloc_size
1437printf "%s ",$kgm_zone->zone_name
1438
1439if ($kgm_zone->exhaustible)
1440 printf "H"
1441end
1442if ($kgm_zone->collectable)
1443 printf "C"
1444end
1445if ($kgm_zone->expandable)
1446 printf "X"
1447end
1448printf "\n"
1449end
1450
1451
1452define zprint
1453printf "ZONE COUNT TOT_SZ MAX_SZ ELT_SZ ALLOC_SZ NAME\n"
1454set $kgm_zone_ptr = (struct zone *)first_zone
1455while ($kgm_zone_ptr != 0)
1456 zprint_one $kgm_zone_ptr
1457 set $kgm_zone_ptr = $kgm_zone_ptr->next_zone
1458end
1459printf "\n"
1460end
1461document zprint
2d21ac55 1462Syntax: (gdb) zprint
1c79356b 1463| Routine to print a summary listing of all the kernel zones
1c79356b
A
1464end
1465
91447636 1466define showmtxgrp
2d21ac55 1467set $kgm_mtxgrp = (struct _lck_grp_ *)$arg0
91447636
A
1468
1469if ($kgm_mtxgrp->lck_grp_mtxcnt)
1470printf "0x%08x ", $kgm_mtxgrp
1471printf "%8d ",$kgm_mtxgrp->lck_grp_mtxcnt
1472printf "%12u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_util_cnt
1473printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_miss_cnt
1474printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_wait_cnt
1475printf "%s ",&$kgm_mtxgrp->lck_grp_name
1476printf "\n"
1477end
1478end
1479
1480
1481define showallmtx
1482printf "LCK GROUP CNT UTIL MISS WAIT NAME\n"
2d21ac55
A
1483set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)&lck_grp_queue
1484set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)$kgm_mtxgrp_ptr->lck_grp_link.next
1485while ($kgm_mtxgrp_ptr != (struct _lck_grp_ *)&lck_grp_queue)
91447636 1486 showmtxgrp $kgm_mtxgrp_ptr
2d21ac55 1487 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)$kgm_mtxgrp_ptr->lck_grp_link.next
91447636
A
1488end
1489printf "\n"
1490end
1491document showallmtx
2d21ac55 1492Syntax: (gdb) showallmtx
91447636 1493| Routine to print a summary listing of all mutexes
91447636
A
1494end
1495
1496define showrwlckgrp
2d21ac55 1497set $kgm_rwlckgrp = (struct _lck_grp_ *)$arg0
91447636
A
1498
1499if ($kgm_rwlckgrp->lck_grp_rwcnt)
1500printf "0x%08x ", $kgm_rwlckgrp
1501printf "%8d ",$kgm_rwlckgrp->lck_grp_rwcnt
1502printf "%12u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt
1503printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_miss_cnt
1504printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_wait_cnt
1505printf "%s ",&$kgm_rwlckgrp->lck_grp_name
1506printf "\n"
1507end
1508end
1509
1510
1511define showallrwlck
1512printf "LCK GROUP CNT UTIL MISS WAIT NAME\n"
2d21ac55
A
1513set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)&lck_grp_queue
1514set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)$kgm_rwlckgrp_ptr->lck_grp_link.next
1515while ($kgm_rwlckgrp_ptr != (struct _lck_grp_ *)&lck_grp_queue)
91447636 1516 showrwlckgrp $kgm_rwlckgrp_ptr
2d21ac55 1517 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)$kgm_rwlckgrp_ptr->lck_grp_link.next
91447636
A
1518end
1519printf "\n"
1520end
1521document showallrwlck
2d21ac55 1522Syntax: (gdb) showallrwlck
91447636 1523| Routine to print a summary listing of all read/writer locks
91447636
A
1524end
1525
9bccf70c
A
1526set $kdp_act_counter = 0
1527
2d21ac55
A
1528set $r0_save = 0
1529set $r1_save = 0
1530set $r2_save = 0
1531set $r3_save = 0
1532set $r4_save = 0
1533set $r5_save = 0
1534set $r6_save = 0
1535set $r7_save = 0
1536set $r8_save = 0
1537set $r9_save = 0
1538set $r10_save = 0
1539set $r11_save = 0
1540set $r12_save = 0
1541set $sp_save = 0
1542set $lr_save = 0
1543set $pc_save = 0
1544
1545define showcontext_int
1546 echo Context switched, current instruction pointer:
1547 output/a $pc
1548 echo \n
1549end
1550
9bccf70c 1551define switchtoact
0c530ab8 1552 set $newact = (struct thread *) $arg0
2d21ac55 1553 select 0
0c530ab8
A
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
91447636 1560 if ($kgm_mtype == 18)
9bccf70c 1561 if ($kdp_act_counter == 0)
0c530ab8 1562 set $kdpstate = (struct savearea *) kdp.saved_state
9bccf70c
A
1563 end
1564 set $kdp_act_counter = $kdp_act_counter + 1
0c530ab8
A
1565 set (struct savearea *) kdp.saved_state=$newact->machine->pcb
1566 flushregs
1567 flushstack
1568 set $pc=$newact->machine->pcb.save_srr0
1569 update
2d21ac55
A
1570 end
1571 if ($kgm_mtype == 7)
0c530ab8
A
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
2d21ac55
A
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
9bccf70c 1629 end
2d21ac55 1630 showcontext_int
9bccf70c
A
1631end
1632
1633document switchtoact
1634Syntax: 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.
1640end
1641
1642define switchtoctx
2d21ac55 1643 select 0
91447636 1644 if ($kgm_mtype == 18)
9bccf70c
A
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
0c530ab8
A
1650 flushregs
1651 flushstack
9bccf70c
A
1652 set $pc=((struct savearea *) $arg0)->save_srr0
1653 update
2d21ac55
A
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
9bccf70c
A
1692 else
1693 echo switchtoctx not implemented for this architecture.\n
1694 end
1695end
1696
1697document switchtoctx
1698Syntax: 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.
1703end
1704
1705define resetctx
2d21ac55
A
1706 select 0
1707 if ($kdp_act_counter != 0)
91447636 1708 if ($kgm_mtype == 18)
9bccf70c 1709 set (struct savearea *)kdp.saved_state=$kdpstate
0c530ab8
A
1710 flushregs
1711 flushstack
9bccf70c
A
1712 set $pc=((struct savearea *) kdp.saved_state)->save_srr0
1713 update
1714 set $kdp_act_counter = 0
2d21ac55
A
1715 end
1716 if ($kgm_mtype == 7)
0c530ab8
A
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
9bccf70c 1724 end
2d21ac55
A
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
9bccf70c
A
1761end
1762
1763document 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.
1768end
1769
2d21ac55
A
1770# This is a pre-hook for the continue command, to prevent inadvertent attempts
1771# to resume from the context switched to for examination.
1772define hook-continue
1773 resetctx
1774end
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.
1778define hook-detach
1779 resetctx
1780end
1781
55e303ae
A
1782define resume_on
1783 set noresume_on_disconnect = 0
1784end
1785
1786document resume_on
1787| Syntax: resume_on
1788| The target system will resume when detaching or exiting from gdb.
1789| This is the default behavior.
1790end
1791
1792define resume_off
1793 set noresume_on_disconnect = 1
1794end
1795
1796document 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
1800end
1801
9bccf70c
A
1802define paniclog
1803 set $kgm_panic_bufptr = debug_buf
55e303ae
A
1804 set $kgm_panic_bufptr_max = debug_buf_ptr
1805 while $kgm_panic_bufptr < $kgm_panic_bufptr_max
9bccf70c
A
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
1813end
1814
1815document paniclog
1816| Syntax: paniclog
1817| Display the panic log information
1818|
1819end
55e303ae
A
1820
1821define 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
1838end
1839
1840document dumpcallqueue
1841| Syntax: dumpcallqueue <queue head>
1842| Displays the contents of the specified call_entry queue.
1843end
1844
1845define showtaskacts
1846showtaskthreads $arg0
1847end
1848document showtaskacts
1849| See help showtaskthreads.
1850end
1851
1852define showallacts
1853showallthreads
1854end
1855document showallacts
1856| See help showallthreads.
1857end
91447636
A
1858
1859
1860define 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
1869end
1870
1871document resetstacks
1872| Syntax: resetstacks
1873| Internal kgmacro routine used by the "showuserstack" macro
1874| to reset the target pmap to the kernel pmap.
1875end
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.
1880define _kgm_flush_loop
1881 set $kgm_flush_loop_ctr = 0
1882 while ($kgm_flush_loop_ctr < 30)
0c530ab8
A
1883 flushregs
1884 flushstack
91447636
A
1885 set $kgm_flush_loop_ctr = $kgm_flush_loop_ctr + 1
1886 end
1887end
1888
1889define _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
1895end
1896
0c530ab8
A
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
1904set $kgm_cur_ebp = 0
1905set $kgm_cur_eip = 0
1906
1907define 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))
2d21ac55
A
1918 set $kgm_cur_ebp = 0
1919 set $kgm_cur_eip = 0
0c530ab8
A
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
2d21ac55
A
1924 set $kgm_prev_eip = *((uint32_t *) ($kgm_prev_ebp + 4))
1925 set $kgm_prev_ebp = *((uint32_t *) $kgm_prev_ebp)
0c530ab8
A
1926 set $kgm_frameno = $kgm_frameno + 1
1927 end
0c530ab8
A
1928 set kdp_pmap = 0
1929end
1930
91447636 1931define showuserstack
2d21ac55 1932 select 0
91447636
A
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
593a1d5f 1963 if ($kgm_mtype == 7)
0c530ab8 1964 set $newact = (struct thread *) $arg0
2d21ac55
A
1965#This needs to identify 64-bit processes as well
1966 set $newiss = (x86_saved_state32_t) ($newact->machine.pcb->iss.uss.ss_32)
0c530ab8
A
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
593a1d5f
A
1979 else
1980 echo showuserstack not supported on this architecture\n
1981 end
0c530ab8 1982 end
91447636 1983end
91447636
A
1984document showuserstack
1985Syntax: 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.
1994end
1995
1996#Stopgap until gdb can generate the HOSTREBOOT packet
1997define kdp-reboot
2d21ac55 1998#Alternatively, set *(*(unsigned **) 0x2498) = 1 (or 0x5498 on PPC)
91447636
A
1999 set flag_kdp_trigger_reboot = 1
2000 continue
2001end
2002
2003document kdp-reboot
2004Syntax: kdp-reboot
2005|Reboot the remote target machine; not guaranteed to succeed. Requires symbols
2006|until gdb support for the HOSTREBOOT packet is implemented.
2007end
2008
2009define sendcore
2010 set kdp_trigger_core_dump = 1
2011 set kdp_flag |= 0x40
2012 set panicd_ip_str = "$arg0"
2013 set panicd_specified = 1
2d21ac55 2014 set disable_debug_output = 0
91447636
A
2015 set disableConsoleOutput = 0
2016 set logPanicDataToScreen = 1
2017 set reattach_wait = 1
2018 resume_off
2019end
2020
2021document sendcore
2022Syntax: 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.
2030end
2031
2032define disablecore
2033 set kdp_trigger_core_dump = 0
2034 set kdp_flag |= 0x40
2035 set kdp_flag &= ~0x10
2036 set panicd_specified = 0
2037end
2038
2039document disablecore
2040Syntax: 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.
2044end
2045
91447636 2046define switchtocorethread
2d21ac55
A
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
91447636 2055 if ($kgm_mtype == 18)
2d21ac55
A
2056 loadcontext $newact->machine->pcb
2057 flushstack
2058 set $pc = $newact->machine->pcb.save_srr0
91447636 2059 else
593a1d5f 2060 if ($kgm_mtype == 7)
2d21ac55
A
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
593a1d5f
A
2066 else
2067 echo switchtocorethread not supported on this architecture\n
2068 end
2d21ac55
A
2069 end
2070 showcontext_int
91447636
A
2071 end
2072end
2073
2074document switchtocorethread
2075Syntax: 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.
2083end
2084
2085define loadcontext
2d21ac55
A
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
593a1d5f 2127 if ($kgm_mtype == 7)
2d21ac55
A
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
593a1d5f
A
2135 else
2136 echo loadcontext not supported on this architecture\n
2137 end
2d21ac55 2138 end
91447636
A
2139end
2140
2141define resetcorectx
2d21ac55
A
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
593a1d5f
A
2161 else
2162 echo resetcorectx not supported on this architecture\n
2d21ac55
A
2163 end
2164 end
2165 showcontext_int
91447636
A
2166end
2167
2168document resetcorectx
2169Syntax: 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.
2174end
2175
2176#Helper function for "showallgdbstacks"
2177
2178define 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
2d21ac55
A
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
91447636
A
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
2d21ac55
A
2224 end
2225 if ($kgm_mtype == 7)
0c530ab8 2226 set $kgm_statep = (struct x86_kernel_state32 *) \
91447636 2227 ($kgm_thread->kernel_stack + 0x4000 \
0c530ab8 2228 - sizeof(struct x86_kernel_state32))
91447636
A
2229 set $mysp = $kgm_statep->k_ebp
2230 end
2d21ac55
A
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
91447636
A
2239 set $prevsp = 0
2240 printf "\n\t\tstacktop=0x%08x", $mysp
2d21ac55
A
2241 if ($arg2 == 0)
2242 switchtoact $arg0
2243 else
2244 switchtocorethread $arg0
2245 end
91447636
A
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
2255end
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
2263define showallgdbstacks
2d21ac55 2264 set $kgm_head_taskp = &tasks
91447636
A
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
2d21ac55 2273 showgdbthread $kgm_actp 1 0
91447636
A
2274 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
2275 end
2276 printf "\n"
2d21ac55 2277 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
91447636
A
2278 end
2279 resetctx
2280end
2281
2282document showallgdbstacks
2283Syntax: 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.
2293end
2294
2d21ac55
A
2295define 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
2313end
2314
2315
2316document showallgdbcorestacks
2317Syntax: showallgdbcorestacks
2318|Corefile version of "showallgdbstacks"
2319end
2320
2321
91447636 2322define switchtouserthread
2d21ac55 2323 select 0
91447636
A
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
2349end
2350
2351document switchtouserthread
2352Syntax: 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.
2375end
2376
2377define showmetaclass
91447636
A
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
2382end
2383
0c530ab8
A
2384define showstring
2385 printf "\"%s\"", ((OSString *)$arg0)->string
2386end
2387
2388define shownumber
2389 printf "%lld", ((OSNumber *)$arg0)->value
2390end
2391
2392define showboolean
2393 if ($arg0 == gOSBooleanFalse)
2394 printf "No"
2395 else
2396 printf "Yes"
2397 end
2398end
2399
2400define 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 ">"
2459end
2460
2461define 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 "}"
2477end
2478
2479define 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
2488end
2489
2490define 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"
2508end
2509
2510
2511define 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
2522end
2523
2524define showarrayint
2525 printf "("
2526 showarraysetint $arg0 $arg1
2527 printf ")"
2528end
2529
2530define showsetint
2531 set $kgm_array = ((OSSet *)$arg1)->members
2532 printf "["
2533 showarraysetint $arg0 $kgm_array
2534 printf "]"
2535end
2536
2537
2538define 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
2588end
2589
2590define 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"
2598end
2599document showobject
2d21ac55 2600Syntax: (gdb) showobject <object address>
0c530ab8
A
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.
0c530ab8
A
2603end
2604
2605define 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
2616end
2617
2618
2619define 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
2d21ac55
A
2658 if (((IOService*)$kgm_re)->pwrMgt && ((IOService*)$kgm_re)->pwrMgt->Name)
2659 printf "%s", ((IOService*)$kgm_re)->pwrMgt->Name
0c530ab8
A
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
2713end
2714
2715define 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
2720end
2721
2722define showregistry
2723 set $kgm_reg_depth = 0
2724 set $kgm_show_props = 0
2725 showregistryentryint gRegistryRoot
2726end
2727document showregistry
2d21ac55 2728Syntax: (gdb) showregistry
0c530ab8 2729| Show info about all registry entries in the current plane.
0c530ab8
A
2730end
2731
2732define showregistryprops
2733 set $kgm_reg_depth = 0
2734 set $kgm_show_props = 1
2735 showregistryentryint gRegistryRoot
2736end
2737document showregistryprops
2d21ac55 2738Syntax: (gdb) showregistryprops
0c530ab8
A
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
0c530ab8
A
2742end
2743
2744define showregistryentry
2745 set $kgm_reg_depth = 0
2746 set $kgm_show_props = 1
2747 showregistryentryint $arg0
2748end
2749document showregistryentry
2d21ac55 2750Syntax: (gdb) showregistryentry <object address>
0c530ab8 2751| Show info about a registry entry; its properties and descendants in the current plane.
0c530ab8
A
2752end
2753
2754define setregistryplane
2755 if ($arg0)
2756 set $kgm_reg_plane = (void **) $arg0
2757 else
2758 showobjectint _ gIORegistryPlanes
2759 printf "\n"
2760 end
2761end
2762document setregistryplane
2d21ac55 2763Syntax: (gdb) setregistryplane <plane object address>
0c530ab8
A
2764| Set the plane to be used for the iokit registry macros. An argument of zero will
2765| display known planes.
0c530ab8
A
2766end
2767
2768define guessclass
4452a7af 2769 set $kgm_classidx = 0
0c530ab8
A
2770 set $kgm_lookvt = *((void **) $arg0)
2771 set $kgm_bestvt = (void *) 0
2772 set $kgm_bestidx = 0
2773
4452a7af 2774 while $kgm_classidx < sAllClassesDict->count
6601e61a 2775 set $kgm_meta = (OSMetaClass *) sAllClassesDict->dictionary[$kgm_classidx].value
0c530ab8
A
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
6601e61a 2783 set $kgm_classidx = $kgm_classidx + 1
4452a7af 2784 end
0c530ab8 2785 printf "%s", sAllClassesDict->dictionary[$kgm_bestidx].key->string
4452a7af 2786end
0c530ab8
A
2787
2788define 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
2794end
2795
91447636 2796document showallclasses
2d21ac55 2797Syntax: (gdb) showallclasses
91447636 2798| Show the instance counts and ivar size of all OSObject subclasses. See ioclasscount man page for details.
91447636
A
2799end
2800
2801define 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
2806end
2807
2808document showioalloc
2d21ac55 2809Syntax: (gdb) showioalloc
91447636 2810| Show some accounting of memory allocated by IOKit allocators. See ioalloccount man page for details.
2d21ac55
A
2811end
2812
2813define 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
2834end
2835
2836document showosobjecttracking
2837Syntax: (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.
91447636 2841end
0c530ab8
A
2842
2843define readphys
2844 set kdp_trans_off = 1
2845 x/x $arg0
2846 set kdp_trans_off = 0
2847end
2848
2849define 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
2857end
2858
2859document 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.
2863end
2864
2865document 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.
2869end
2d21ac55
A
2870
2871define 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
2875end
2876
2877document 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
2881end
2882
2883define showprocfiles
2884 if ($argc == 1)
2885 _showprocheader
2886 _showprocfiles $arg0
2887 else
2888 printf "| Usage:\n|\n"
2889 help showprocfiles
2890 end
2891end
2892document showprocfiles
2893Syntax: (gdb) showprocfiles <proc_t>
2894| Given a proc_t pointer, display the list of open file descriptors for the
2895| referenced process.
2896end
2897
2898define _showprocheader
2899 printf "fd fileglob fg flags fg type fg data info\n"
2900 printf "----- ---------- ---------- -------- ---------- -------------------\n"
2901end
2902
2903define _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
2960end
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#
2968define showproclocks
2969 if ($argc == 1)
2970 _showproclocks $arg0
2971 else
2972 printf "| Usage:\n|\n"
2973 help showproclocks
2974 end
2975end
2976document showproclocks
2977Syntax: (gdb) showproclocks <proc_t>
2978| Given a proc_t pointer, display the list of advisory file locks held by the
2979| referenced process.
2980end
2981
2982define _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
3019end
3020
3021define 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
3161end
3162
3163document showprocinfo
3164Syntax: (gdb) showprocinfo <proc_t>
3165| Displays name, pid, parent and task for a proc_t. Decodes cred, flag and p_stat fields.
3166end
3167
3168#
3169# dump the zombprocs
3170#
3171define 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
3178end
3179
3180document zombproc
3181Syntax: (gdb) zombproc
3182| Routine to print out all procs in the zombie list
3183end
3184
3185#
3186# dump the zombstacks
3187#
3188define 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
3197end
3198
3199document zombstacks
3200Syntax: (gdb) zombstacks
3201| Routine to print out all stacks of tasks that are exiting
3202end
3203
3204
3205#
3206# dump the allprocs
3207#
3208define 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
3215end
3216
3217document allproc
3218Syntax: (gdb) allproc
3219| Routine to print out all process in the system
3220| which are not in the zombie list
3221end
3222
3223
3224
3225define 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"
3244end
3245
3246document print_vnode
3247Syntax: (gdb) print_vnode <vnode>
3248| Prints out the fields of a vnode struct
3249end
3250
3251define 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
3286end
3287
3288document showprocvnodes
3289Syntax: (gdb) showprocvnodes <proc_address>
3290| Routine to print out all the open fds
3291| which are vnodes in a process
3292end
3293
3294define 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
3303end
3304
3305document showallprocvnodes
3306Syntax: (gdb) showallprocvnodes
3307| Routine to print out all the open fds
3308| which are vnodes
3309end
3310
3311
3312#
3313# dump the childrent of a proc
3314#
3315define 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
3322end
3323
3324document showinitchild
3325Syntax: (gdb) showinitchild
3326| Routine to print out all processes in the system
3327| which are children of init process
3328end
3329
3330
3331define 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
3354end
3355document showmountallvnodes
3356Syntax: showmountallvnodes <struct mount *>
3357| Print the vnode inactive list
3358end
3359
3360
3361define 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
3370end
3371document showmountvnodes
3372Syntax: showmountvnodes <struct mount *>
3373| Print the vnode list
3374end
3375
3376
3377
3378define 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
3387end
3388document showworkqvnodes
3389Syntax: showworkqvnodes <struct mount *>
3390| Print the vnode worker list
3391end
3392
3393
3394define 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
3403end
3404
3405document shownewvnodes
3406Syntax: shownewvnodes <struct mount *>
3407| Print the new vnode list
3408end
3409
3410
3411#
3412# print mount point info
3413define 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"
3424end
3425
3426define 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
3432end
3433
3434document showallmounts
3435Syntax: showallmounts
3436| Print all mount points
3437end
3438
3439define 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
3447end
3448
3449define 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
3465end
3466
3467document mbuf_walkpkt
3468Syntax: (gdb) mbuf_walkpkt <addr>
3469| Given an mbuf address, walk its m_nextpkt pointer
3470end
3471
3472define 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
3488end
3489
3490document mbuf_walk
3491Syntax: (gdb) mbuf_walk <addr>
3492| Given an mbuf address, walk its m_next pointer
3493end
3494
3495define 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
3501end
3502
3503document mbuf_buf2slab
3504| Given an mbuf object, find its corresponding slab address.
3505end
3506
3507define 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
3514end
3515
3516document mbuf_buf2mca
3517Syntax: (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.
3521end
3522
3523define 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
3575end
3576
3577document mbuf_showmca
3578Syntax: (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.
3581end
3582
3583set $MCF_NOCPUCACHE = 0x10
3584
3585define 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
3633end
3634
3635document mcache_stat
3636Syntax: (gdb) mcache_stat
3637| Print all mcaches in the system.
3638end
3639
3640define 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"
3646end
3647
3648document mcache_showzone
3649Syntax: (gdb) mcache_showzone <mcache_addr>
3650| Print the type of backend (custom or zone) of a mcache.
3651end
3652
3653define 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
3662end
3663
3664document mcache_walkobj
3665Syntax: (gdb) mcache_walkobj <addr>
3666| Given a mcache object address, walk its obj_next pointer
3667end
3668
3669define 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
3700end
3701
3702document mcache_showcache
3703| Display the number of objects in the cache
3704end
3705
3706set $NSLABSPMB = sizeof(mcl_slabg_t)/sizeof(mcl_slab_t)
3707
3708define 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
3724end
3725
3726document mbuf_slabstbl
3727| Display the mbuf slabs table
3728end
3729
3730set $SLF_MAPPED=0x0001
3731set $SLF_PARTIAL=0x0002
3732set $SLF_DETACHED=0x0004
3733
3734define 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
3762end
3763
3764document mbuf_slabs
3765| Display all mbuf slabs in the group
3766end
3767
3768define 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
3803end
3804
3805document mbuf_stat
3806| Print extended mbuf allocator statistics.
3807end
3808
3809set $MB_INUSE = 0x1
3810set $MB_COMP_INUSE = 0x2
3811set $MB_SCVALID = 0x4
3812
3813set $MCLBYTES = 2048
3814set $MSIZE = 256
3815set $NBPG = 4096
3816set $M16KCLBYTES = 16384
3817
3818define 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
3944end
3945
3946document 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.
3949end
3950
3951define mbuf_showactive
3952 mbuf_walkallslabs 1 0
3953end
3954
3955document mbuf_showactive
3956Syntax: (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).
3962end
3963
3964define mbuf_showinactive
3965 mbuf_walkallslabs 0 1
3966end
3967
3968document mbuf_showinactive
3969Syntax: (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.
3976end
3977
3978define mbuf_showall
3979 mbuf_walkallslabs 1 1
3980end
3981
3982document mbuf_showall
3983Syntax: (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.
3987end
3988
3989define mbuf_mcaobjs
3990end
3991
3992define 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
4073end
4074
4075document 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}.
4079end
4080
4081define 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
4095end
4096
4097document rtentry_trash
4098Syntax: (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.
4102end
4103
4104set $RTD_TRSTACK_SIZE = 8
4105set $RTD_REFHIST_SIZE = 4
4106
4107define 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
4179end
4180
4181document rtentry_showdbg
4182Syntax: (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.
4187end
4188
4189#
4190# print all OSMalloc stats
4191
4192define ostag_print
4193set $kgm_tagp = (OSMallocTag)$arg0
4194printf "0x%08x: ", $kgm_tagp
4195printf "%8d ",$kgm_tagp->OSMT_refcnt
4196printf "%8x ",$kgm_tagp->OSMT_state
4197printf "%8x ",$kgm_tagp->OSMT_attr
4198printf "%s ",$kgm_tagp->OSMT_name
4199printf "\n"
4200end
4201
4202
4203define showosmalloc
4204printf "TAG COUNT STATE ATTR NAME\n"
4205set $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"
4212end
4213document showosmalloc
4214Syntax: (gdb) showosmalloc
4215| Print the outstanding allocation count by OSMallocTags.
4216end
4217
4218
4219define 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"
4253end
4254document systemlog
4255| Syntax: systemlog
4256| Display the kernel's printf ring buffer
4257end
4258
4259define 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
4270end
4271
4272#
4273# Show the locks held on a vnode by range, type, and holder.
4274#
4275define showvnodelocks
4276 if ($argc == 1)
4277 _showvnodelockheader
4278 _showvnodelocks $arg0
4279 else
4280 printf "| Usage:\n|\n"
4281 help showvnodelocks
4282 end
4283end
4284document 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>
4289end
4290
4291define _showvnodelockheader
4292 printf "* type W held by lock type start end\n"
4293 printf "- ----- - ------------- --------- ------------------ ------------------\n"
4294end
4295
4296#
4297# Macro to display a single lock; used to display both held locks and
4298# blocked locks
4299#
4300define _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"
4348end
4349
4350# Body of showvnodelocks, not including header
4351define _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
4370end
4371
4372define 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"
4382end
4383
4384document showvnodepath
4385Syntax: (gdb) showvnodepath <vnode>
4386| Prints the path for a vnode
4387end
4388
4389define 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
4404end
4405
4406define 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
4416end
4417
4418define 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
4424end
4425
4426define 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
4432end
4433
4434define 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]
4438end
4439
4440define 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]
4444end
4445
4446define 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
4479end
4480
4481document showifmultiaddrs
4482Syntax showifmultiaddrs <ifp>
4483| show the (struct ifnet).if_multiaddrs list of multicast addresses for the given ifp
4484end
4485
4486define 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
4519end
4520
4521define 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 ">"
4645end
4646
4647define 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
4658end
4659
4660document showifaddrs
4661Syntax: showifaddrs <ifp>
4662| show the (struct ifnet).if_addrhead list of addresses for the given ifp
4663end
4664
4665define 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
4681end
4682document ifconfig
4683Syntax: (gdb) ifconfig
4684| display ifconfig-like output, and print the (struct ifnet *) pointers for further inspection
4685end
4686
4687define 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
4696end
4697
4698define 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
4723end
4724
4725document showallvols
4726Syntax: (gdb) showallvols
4727| Display a summary of mounted volumes
4728end
4729
4730define showvnodeheader
4731 printf "vnode usecount iocount v_data vtype parent name\n"
4732end
4733
4734define 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
4781end
4782
4783define showvnode
4784 showvnodeheader
4785 showvnodeint $arg0
4786end
4787
4788document showvnode
4789Syntax: (gdb) showvnode <vnode>
4790| Display info about one vnode
4791end
4792
4793define 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
4801end
4802
4803document showvolvnodes
4804Syntax: (gdb) showvolvnodes <mouont_t>
4805| Display info about all vnodes of a given mount_t
4806end
4807
4808define 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
4818end
4819
4820document showvolbusyvnodes
4821Syntax: (gdb) showvolbusyvnodes <mount_t>
4822| Display info about busy (iocount!=0) vnodes of a given mount_t
4823end
4824
4825define 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
4838end
4839
4840document showallbusyvnodes
4841Syntax: (gdb) showallbusyvnodes <vnode>
4842| Display info about all busy (iocount!=0) vnodes
4843end
4844
4845define 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
4856end
4857
4858document showallvnodes
4859Syntax: (gdb) showallvnodes
4860| Display info about all vnodes
4861end
4862
4863define _showvnodelockheader
4864 printf "* type W held by lock type start end\n"
4865 printf "- ----- - ------------- --------- ------------------ ------------------\n"
4866end
4867
4868define _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"
4916end
4917# Body of showvnodelocks, not including header
4918define _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
4937end
4938
4939
4940define showvnodelocks
4941 if ($argc == 1)
4942 _showvnodelockheader
4943 _showvnodelocks $arg0
4944 else
4945 printf "| Usage:\n|\n"
4946 help showvnodelocks
4947 end
4948end
4949
4950document showvnodelocks
4951Syntax: (gdb) showvnodelocks <vnode_t>
4952| Given a vnodet pointer, display the list of advisory record locks for the
4953| referenced pvnodes
4954end
4955
4956define showbootargs
4957 printf "%s\n", (char*)((boot_args*)PE_state.bootArgs).CommandLine
4958end
4959
4960document showbootargs
4961Syntax: showbootargs
4962| Display boot arguments passed to the target kernel
4963end
4964
4965define 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
5024end
5025
5026document showbootermemorymap
5027Syntax: (gdb) showbootermemorymap
5028| Prints out the phys memory map from kernelBootArgs
5029end
5030
5031
5032define 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
5052end
5053document showstacksaftertask
5054Syntax: (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.
5057end
5058
5059define 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
5076end
5077
5078define 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
5089end
5090
5091document showallpmworkqueues
5092Syntax: (gdb) showallpmworkqueues
5093| Display info about all IOPMWorkQueue objects
5094end
5095
5096define 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
5213end
5214
5215document showioservicepm
5216Syntax: (gdb) showioservicepm <IOServicePM pointer>
5217| Routine to dump the IOServicePM object
5218end
5219
5220define 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
5288end
5289
5290define showregistryentryintpmstate
5291 set $kgm_namekey = (OSSymbol *) $kgm_reg_plane[2]
5292 set $kgm_childkey = (OSSymbol *) $kgm_reg_plane[4]
5293 showregistryentryrecursepmstate _ $arg0 0 0
5294end
5295
5296define showregistrypmstate
5297# setregistryplane gIOPowerPlane
5298 set $kgm_reg_depth = 0
5299 set $kgm_show_props = 1
5300 showregistryentryintpmstate gRegistryRoot
5301end
5302
5303document showregistrypmstate
5304Syntax: (gdb) showregistrypmstate
5305| Routine to dump the PM state of each IOPower registry entry
5306end
5307
5308define 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
5329end
5330
5331document showstacksafterthread
5332Syntax: (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.
5335end
5336
5337define kdp-reenter
5338 set kdp_reentry_deadline = ((unsigned) $arg0)*1000
5339 continue
5340end
5341
5342document kdp-reenter
5343Syntax: (gdb) kdp-reenter <seconds>
5344| Schedules reentry into the debugger after <seconds> seconds, and resumes
5345| the target system.
5346end
5347
5348define _if_present
5349 if (!$arg0)
5350 printf " not"
5351 end
5352 printf " present"
5353end
5354
5355define 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
593a1d5f 5367 printf "machine-check dump state: %d\n", mca_dump_state
2d21ac55
A
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
5394end
5395
5396document showMCAstate
5397Syntax: showMCAstate
5398| Print machine-check register state after MC exception.
5399end
4a3eedf9
A
5400
5401define _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
5475end
5476
5477define _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
5521end
5522
5523define 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
5540end
5541
5542document pmap_walk
5543Syntax: (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.
5546end
5547
5548define 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
5559end
5560
5561document pmap_vtop
5562Syntax: (gdb) pmap_vtop <pmap> <virtual_address>
5563| For page-tables in <pmap> translate <virtual_address> to physical address.
5564end
5565