3 # These gdb macros should be useful during kernel development in
4 # determining what's going on in the kernel.
6 # All the convenience variables used by these macros begin with $kgm_
8 set print asm-demangle on
11 # This option tells gdb to relax its stack tracing heuristics
12 # Useful for debugging across stack switches
13 # (to the interrupt stack, for instance). Requires gdb-675 or greater.
14 set backtrace sanity-checks off
16 echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n
20 echo These are the gdb macros for kernel debugging. Type "help kgm" for more info.\n
24 | These are the kernel gdb macros. These gdb macros are intended to be
25 | used when debugging a remote kernel via the kdp protocol. Typically, you
26 | would connect to your remote target like so:
27 | (gdb) target remote-kdp
28 | (gdb) attach <name-of-remote-host>
30 | The following macros are available in this package:
31 | showversion Displays a string describing the remote kernel version
33 | showalltasks Display a summary listing of all tasks
34 | showallthreads Display info about all threads in the system
35 | showallstacks Display the stack for each thread in the system
36 | showcurrentthreads Display info about the thread running on each cpu
37 | showcurrentstacks Display the stack for the thread running on each cpu
38 | showallvm Display a summary listing of all the vm maps
39 | showallvme Display a summary listing of all the vm map entries
40 | showallipc Display a summary listing of all the ipc spaces
41 | showallrights Display a summary listing of all the ipc rights
42 | showallkmods Display a summary listing of all the kernel modules
43 | showallbusyports Display a listing of all ports with unread messages
45 | showallclasses Display info about all OSObject subclasses in the system
46 | showobject Show info about an OSObject - its vtable ptr and retain count, & more info for simple container classes.
47 | showregistry Show info about all registry entries in the current plane
48 | showregistryprops Show info about all registry entries in the current plane, and their properties
49 | showregistryentry Show info about a registry entry; its properties and descendants in the current plane
50 | setregistryplane Set the plane to be used for the iokit registry macros (pass zero for list)
52 | setfindregistrystr Set the encoded string for matching with
53 | findregistryentry or findregistryprop (created from
55 | findregistryentry Find a registry entry that matches the encoded string
56 | findregistryentries Find all the registry entries that match the encoded string
57 | findregistryprop Search the registry entry for a property that matches
60 | showtask Display info about the specified task
61 | showtaskthreads Display info about the threads in the task
62 | showtaskstacks Display the stack for each thread in the task
63 | showtaskvm Display info about the specified task's vm_map
64 | showtaskvme Display info about the task's vm_map entries
65 | showtaskipc Display info about the specified task's ipc space
66 | showtaskrights Display info about the task's ipc space entries
67 | showtaskrightsbt Display info about the task's ipc space entries with back traces
68 | showtaskbusyports Display all of the task's ports with unread messages
70 | showact Display info about a thread specified by activation
71 | showactstack Display the stack for a thread specified by activation
73 | showmap Display info about the specified vm_map
74 | showmapvme Display a summary list of the specified vm_map's entries
76 | showipc Display info about the specified ipc space
77 | showrights Display a summary list of all the rights in an ipc space
79 | showpid Display info about the process identified by pid
80 | showproc Display info about the process identified by proc struct
81 | showprocinfo Display detailed info about the process identified by proc struct
82 | showprocfiles Given a proc_t pointer, display the list of open file descriptors
83 | showproclocks Given a proc_t pointer, display the list of advisory file locks
84 | zombproc Print out all procs in the zombie list
85 | allproc Print out all process in the system not in the zombie list
86 | zombstacks Print out all stacks of tasks that are exiting
88 | showinitchild Print out all processes in the system which are children of init process
90 | showkmod Display info about a kernel module
91 | showkmodaddr Given an address, display the kernel module and offset
93 | dumpcallqueue Dump out all the entries given a queue head
95 | showallmtx Display info about mutexes usage
96 | showallrwlck Display info about reader/writer locks usage
98 | zprint Display info about the memory zones
99 | showioalloc Display info about iokit allocations
100 | paniclog Display the panic log info
102 | switchtoact Switch to different context specified by activation
103 | switchtoctx Switch to different context
104 | showuserstack Display numeric backtrace of the user stack for an
107 | switchtouserthread Switch to the user context of the specified thread
108 | resetstacks Return to the original kernel context
110 | resetctx Reset context
111 | resume_on Resume when detaching from gdb
112 | resume_off Don't resume when detaching from gdb
114 | sendcore Configure kernel to send a coredump to the specified IP
115 | sendsyslog Configure kernel to send a system log to the specified IP
116 | sendpaniclog Configure kernel to send a panic log to the specified IP
117 | disablecore Configure the kernel to disable coredump transmission
118 | getdumpinfo Retrieve the current remote dump parameters
119 | setdumpinfo Configure the remote dump parameters
121 | switchtocorethread Corefile version of "switchtoact"
122 | resetcorectx Corefile version of "resetctx"
124 | readphys8 Reads the specified untranslated address (8-bit read)
125 | readphys16 Reads the specified untranslated address (16-bit read)
126 | readphys32 Reads the specified untranslated address (32-bit read)
127 | readphys64 Reads the specified untranslated address (64-bit read)
128 | writephys8 Writes to the specified untranslated address (8-bit write)
129 | writephys16 Writes to the specified untranslated address (16-bit write)
130 | writephys32 Writes to the specified untranslated address (32-bit write)
131 | writephys64 Writes to the specified untranslated address (64-bit write)
133 | readioport8 Read 8-bits from the specified I/O Port
134 | readioport16 Read 16-bits from the specified I/O Port
135 | readioport32 Read 32-bits from the specified I/O Port
136 | writeioport8 Write 8-bits into the specified I/O Port
137 | writeioport16 Write 16-bits into the specified I/O Port
138 | writeioport32 Write 32-bits into the specified I/O Port
140 | readmsr64 Read 64-bits from the specified MSR
141 | writemsr64 Write 64-bits into the specified MSR
143 | rtentry_showdbg Print the debug information of a route entry
144 | rtentry_trash Walk the list of trash route entries
146 | inifa_showdbg Print the debug information of an IPv4 interface address
147 | in6ifa_showdbg Print the debug information of an IPv6 interface address
149 | mbuf_walkpkt Walk the mbuf packet chain (m_nextpkt)
150 | mbuf_walk Walk the mbuf chain (m_next)
151 | mbuf_buf2slab Find the slab structure of the corresponding buffer
152 | mbuf_buf2mca Find the mcache audit structure of the corresponding mbuf
153 | mbuf_showmca Print the contents of an mbuf mcache audit structure
154 | mbuf_showactive Print all active/in-use mbuf objects
155 | mbuf_showinactive Print all freed/in-cache mbuf objects
156 | mbuf_showall Print all mbuf objects
157 | mbuf_slabs Print all slabs in the group
158 | mbuf_slabstbl Print slabs table
159 | mbuf_stat Print extended mbuf allocator statistics
161 | mcache_walkobj Walk the mcache object chain (obj_next)
162 | mcache_stat Print all mcaches in the system
163 | mcache_showcache Display the number of objects in the cache
165 | showbootargs Display boot arguments passed to the target kernel
166 | showbootermemorymap Dump phys memory map from EFI
168 | systemlog Display the kernel's printf ring buffer
170 | hexdump Show the contents of memory as a hex/ASCII dump
172 | showvnodepath Print the path for a vnode
173 | showvnodelocks Display list of advisory locks held/blocked on a vnode
174 | showvnodedev Display information about a device vnode
175 | showtty Display information about a struct tty
176 | showallvols Display a summary of mounted volumes
177 | showvnode Display info about one vnode
178 | showvolvnodes Display info about all vnodes of a given volume
179 | showvolbusyvnodes Display info about busy (iocount!=0) vnodes of a given volume
180 | showallbusyvnodes Display info about all busy (iocount!=0) vnodes
181 | showallvnodes Display info about all vnodes
182 | print_vnode Print out the fields of a vnode struct
183 | showprocvnodes Print out all the open fds which are vnodes in a process
184 | showallprocvnodes Print out all the open fds which are vnodes in any process
185 | showmountvnodes Print the vnode list
186 | showmountallvnodes Print the vnode inactive list
187 | showworkqvnodes Print the vnode worker list
188 | shownewvnodes Print the new vnode list
190 | ifconfig display ifconfig-like output
191 | showifaddrs show the list of addresses for the given ifp
192 | showifmultiaddrs show the list of multicast addresses for the given ifp
194 | showsocket Display information about a socket
195 | showprocsockets Given a proc_t pointer, display information about its sockets
196 | showallprocsockets Display information about the sockets of all the processes
198 | show_tcp_pcbinfo Display the list of the TCP protocol control blocks
199 | show_tcp_timewaitslots Display the list of the TCP protocol control blocks in TIMEWAIT
200 | show_udp_pcbinfo Display the list of UDP protocol control blocks
202 | show_rt_inet Display the IPv4 routing table
203 | show_rt_inet6 Display the IPv6 routing table
205 | showallpmworkqueues Display info about all IOPMWorkQueue objects
206 | showregistrypmstate Display power management state for all IOPower registry entries
207 | showioservicepm Display the IOServicePM object
208 | showstacksaftertask showallstacks starting after a given task
209 | showstacksafterthread showallstacks starting after a given thread
211 | showMCAstate Print machine-check register state after MC exception.
213 | showallgdbstacks Cause GDB to trace all thread stacks
214 | showallgdbcorestacks Corefile equivalent of "showallgdbstacks"
215 | kdp-reenter Schedule reentry into the debugger and continue.
216 | kdp-reboot Restart remote target
217 | kdp-version Get KDP version number
218 | kdp-connect "shorthand" connection macro
220 | zstack Print zalloc caller stack (zone leak debugging)
221 | findoldest Find oldest zone leak debugging record
222 | countpcs Print how often a pc occurs in the zone leak log
224 | pmap_walk Perform a page-table walk
225 | pmap_vtop Translate a virtual address to physical address
227 | showuserlibraries Show binary images known by dyld in the target task
229 | showthreadfortid Displays the address of the thread structure for a given thread_id value.
231 | strcmp_nomalloc A version of strcmp that avoids the use of malloc
232 | through the use of encoded strings created via
234 | strcmp_arg_pack64 Pack a string into a 64-bit quantity for use by
237 | pci_cfg_read8 Read 8-bits from a PCI config space register
238 | pci_cfg_read16 Read 16-bits from a PCI config space register
239 | pci_cfg_read32 Read 32-bits from a PCI config space register
240 | pci_cfg_write8 Write 8-bits into a PCI config space register
241 | pci_cfg_write16 Write 16-bits into a PCI config space register
242 | pci_cfg_write32 Write 32-bits into a PCI config space register
243 | pci_cfg_dump Dump entire config space for a PCI device
244 | pci_cfg_scan Perform a scan for PCI devices
245 | pci_cfg_dump_all Dump config spaces for all detected PCI devices
247 | lapic_read32 Read APIC entry
248 | lapic_write32 Write APIC entry
249 | lapic_dump Dump APIC entries
251 | ioapic_read32 Read IOAPIC entry
252 | ioapic_write32 Write IOAPIC entry
253 | ioapic_dump Dump IOAPIC entries
255 | Type "help <macro>" for more specific help on a particular macro.
256 | Type "show user <macro>" to see what the macro is really doing.
259 # This macro should appear before any symbol references, to facilitate
260 # a gdb "source" without a loaded symbol file.
267 | Read the kernel version string from a fixed address in low
268 | memory. Useful if you don't know which kernel is on the other end,
269 | and need to find the appropriate symbols. Beware that if you've
270 | loaded a symbol file, but aren't connected to a remote target,
271 | the version string from the symbol file will be displayed instead.
272 | This macro expects to be connected to the remote kernel to function
276 set $kgm_mtype_ppc = 0x00000012
277 set $kgm_mtype_arm = 0x0000000C
279 set $kgm_mtype_i386 = 0x00000007
280 set $kgm_mtype_x86_64 = 0x01000007
281 set $kgm_mtype_x86_any = $kgm_mtype_i386
282 set $kgm_mtype_x86_mask = 0xFEFFFFFF
284 set $kgm_mtype = ((unsigned int *)&_mh_execute_header)[1]
285 set $kgm_lp64 = $kgm_mtype & 0x01000000
287 set $kgm_manual_pkt_ppc = 0x549C
288 set $kgm_manual_pkt_i386 = 0x249C
289 set $kgm_manual_pkt_x86_64 = 0xFFFFFF8000002930
290 set $kgm_manual_pkt_arm = 0xFFFF04A0
292 set $kgm_kdp_pkt_data_len = 128
294 # part of data packet
295 set $kgm_kdp_pkt_hdr_req_off = 0
296 set $kgm_kdp_pkt_hdr_seq_off = 1
297 set $kgm_kdp_pkt_hdr_len_off = 2
298 set $kgm_kdp_pkt_hdr_key_off = 4
301 set $kgm_kdp_pkt_len_off = $kgm_kdp_pkt_data_len
302 set $kgm_kdp_pkt_input_off = $kgm_kdp_pkt_data_len + 4
304 set $kgm_kdp_pkt_hostreboot = 0x13
305 set $kgm_kdp_pkt_hdr_size = 8
307 set $kgm_lcpu_self = 0xFFFE
309 set $kgm_reg_depth = 0
310 set $kgm_reg_depth_max = 0xFFFF
311 set $kgm_reg_plane = (IORegistryPlane *) gIOServicePlane
312 set $kgm_namekey = (OSSymbol *) 0
313 set $kgm_childkey = (OSSymbol *) 0
315 set $kgm_show_object_addrs = 0
316 set $kgm_show_object_retain = 0
317 set $kgm_show_props = 0
318 set $kgm_show_data_alwaysbytes = 0
320 set $kgm_show_kmod_syms = 0
322 # send a manual packet header that doesn't require knowing the location
327 set $hdrp = (uint32_t *) $kgm_manual_pkt_i386
328 if ($kgm_mtype == $kgm_mtype_ppc)
329 set $hdrp = (uint32_t *) $kgm_manual_pkt_ppc
330 set $req = $req << 1 # shift to deal with endiannness
332 if ($kgm_mtype == $kgm_mtype_x86_64)
333 set $hdrp = (uint64_t *) $kgm_manual_pkt_x86_64
335 if ($kgm_mtype == $kgm_mtype_arm)
336 set $hdrp = (uint32_t *) $kgm_manual_pkt_arm
339 set $pkt_hdr = *$hdrp
340 set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_input_off)) = 0
341 set *((uint32_t *) ($pkt_hdr + $kgm_kdp_pkt_len_off)) = $kgm_kdp_pkt_hdr_size
343 set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_req_off)) = $req
344 set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_seq_off)) = 0
345 set *((uint16_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_len_off)) = $kgm_kdp_pkt_hdr_size
346 set *((uint32_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_key_off)) = 0
347 set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_input_off)) = 1
349 # dummy to make sure manual packet is executed
350 set $kgm_dummy = &_mh_execute_header
356 printf "0x%016llx", $arg0
358 printf "0x%08x", $arg0
362 # for headers, leave 8 chars for LP64 pointers
369 define showkmodheader
376 printf " id refs version name\n"
380 set $kgm_kmodp = (struct kmod_info *)$arg0
383 showptr $kgm_kmodp->address
385 showptr $kgm_kmodp->size
387 printf "%3d ", $kgm_kmodp->id
388 printf "%5d ", $kgm_kmodp->reference_count
389 printf "%10s ", $kgm_kmodp->version
390 printf "%s\n", $kgm_kmodp->name
393 # cached info of the last kext found, to speed up subsequent lookups
398 define showkmodaddrint
400 if ((unsigned long)$arg0 >= (unsigned long)$kgm_pkmodst) && ((unsigned long)$arg0 < (unsigned long)$kgm_pkmoden)
401 set $kgm_off = ((unsigned long)$arg0 - (unsigned long)$kgm_pkmodst)
402 printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off
404 set $kgm_kmodp = (struct kmod_info *)kmod
405 if ($kgm_mtype == $kgm_mtype_x86_64) && ($arg0 >= (unsigned long)&_mh_execute_header)
406 # kexts are loaded below the kernel for x86_64
410 set $kgm_off = ((unsigned long)$arg0 - (unsigned long)$kgm_kmodp->address)
411 if ($kgm_kmodp->address <= $arg0) && ($kgm_off < $kgm_kmodp->size)
412 printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off
413 set $kgm_pkmod = $kgm_kmodp
414 set $kgm_pkmodst = $kgm_kmodp->address
415 set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmodp->size
418 set $kgm_kmodp = $kgm_kmodp->next
425 showkmodaddrint $arg0
428 document showkmodaddr
429 Syntax: (gdb) showkmodaddr <addr>
430 | Given an address, print the offset and name for the kmod containing it
438 Syntax: (gdb) showkmod <kmod>
439 | Routine to print info about a kernel module
444 set $kgm_kmodp = (struct kmod_info *)kmod
446 showkmodint $kgm_kmodp
447 set $kgm_kmodp = $kgm_kmodp->next
450 document showallkmods
451 Syntax: (gdb) showallkmods
452 | Routine to print a summary listing of all the kernel modules
464 printf " pri io_policy state wait_queue"
466 printf " wait_event\n"
473 set $kgm_thread = *(struct thread *)$arg0
475 if ($kgm_thread.static_param)
480 printf " %7ld ", $kgm_thread.thread_id
481 showptr $kgm_thread.last_processor
482 printf " %3d ", $kgm_thread.sched_pri
483 if ($kgm_thread.uthread != 0)
485 set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
486 if ($kgm_uthread->uu_flag & 0x400)
491 if ($kgm_uthread->uu_iopol_disk == 1)
495 if ($kgm_uthread->uu_iopol_disk == 2)
499 if ($kgm_uthread->uu_iopol_disk == 3)
503 if ($kgm_printed == 0)
507 set $kgm_state = $kgm_thread.state
532 showptr $kgm_thread.wait_queue
534 if (((unsigned long)$kgm_thread.wait_event > (unsigned long)&last_kernel_symbol) \
535 && ($arg1 != 2) && ($kgm_show_kmod_syms == 0))
536 showkmodaddr $kgm_thread.wait_event
538 output /a $kgm_thread.wait_event
540 if ($kgm_thread.uthread != 0)
541 set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
542 if ($kgm_uthread->uu_wmesg != 0)
543 printf "\t \"%s\"", $kgm_uthread->uu_wmesg
548 if ($kgm_thread.kernel_stack != 0)
549 if ($kgm_thread.reserved_stack != 0)
552 printf " reserved_stack="
553 showptr $kgm_thread.reserved_stack
557 printf " kernel_stack="
558 showptr $kgm_thread.kernel_stack
559 if ($kgm_mtype == $kgm_mtype_ppc)
560 set $mysp = $kgm_thread.machine.pcb->save_r1
562 if (($kgm_mtype & $kgm_mtype_x86_mask) == $kgm_mtype_x86_any)
563 set $kgm_statep = (struct x86_kernel_state *) \
564 ($kgm_thread->kernel_stack + kernel_stack_size \
565 - sizeof(struct x86_kernel_state))
566 if ($kgm_mtype == $kgm_mtype_i386)
567 set $mysp = $kgm_statep->k_ebp
569 set $mysp = $kgm_statep->k_rbp
572 if ($kgm_mtype == $kgm_mtype_arm)
573 if (((unsigned long)$r7 < ((unsigned long) ($kgm_thread->kernel_stack+kernel_stack_size))) \
574 && ((unsigned long)$r7 > (unsigned long) ($kgm_thread->kernel_stack)))
577 set $kgm_statep = (struct arm_saved_state *)$kgm_thread.machine.kstackptr
578 set $mysp = $kgm_statep->r[7]
581 set $prevsp = $mysp - 16
586 if ($kgm_mtype == $kgm_mtype_ppc)
592 set $kgm_actint_framecount = 0
593 while ($mysp != 0) && (($mysp & $stkmask) == 0) \
594 && ($mysp != $prevsp) \
595 && ((((unsigned long) $mysp ^ (unsigned long) $prevsp) < 0x2000) \
596 || (((unsigned long)$mysp < ((unsigned long) ($kgm_thread->kernel_stack+kernel_stack_size))) \
597 && ((unsigned long)$mysp > (unsigned long) ($kgm_thread->kernel_stack)))) \
598 && ($kgm_actint_framecount < 128)
600 set $kgm_actint_framecount = $kgm_actint_framecount + 1
605 if ($kgm_mtype == $kgm_mtype_ppc)
606 set $kgm_return = *($mysp + 8)
608 if ($kgm_mtype == $kgm_mtype_i386)
609 set $kgm_return = *($mysp + 4)
611 if ($kgm_mtype == $kgm_mtype_x86_64)
612 set $kgm_return = *(unsigned long *)($mysp + 8)
614 if ($kgm_mtype == $kgm_mtype_arm)
615 set $kgm_return = *($mysp + 4)
617 if (((unsigned long) $kgm_return < (unsigned long) &_mh_execute_header || \
618 (unsigned long) $kgm_return >= (unsigned long) &last_kernel_symbol ) \
619 && ($kgm_show_kmod_syms == 0))
620 showkmodaddr $kgm_return
622 output /a $kgm_return
625 set $mysp = *(unsigned long *)$mysp
630 printf " stackbottom="
635 printf " continuation="
636 output /a $kgm_thread.continuation
649 Syntax: (gdb) showact <activation>
650 | Routine to print out the state of a specific thread.
658 document showactstack
659 Syntax: (gdb) showactstack <activation>
660 | Routine to print out the stack of a specific thread.
664 define showallthreads
665 set $kgm_head_taskp = &tasks
666 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
667 while $kgm_taskp != $kgm_head_taskp
669 showtaskint $kgm_taskp
671 set $kgm_head_actp = &($kgm_taskp->threads)
672 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
673 while $kgm_actp != $kgm_head_actp
674 showactint $kgm_actp 0
675 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
678 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
681 document showallthreads
682 Syntax: (gdb) showallthreads
683 | Routine to print out info about all threads in the system.
686 define showcurrentthreads
687 set $kgm_prp = (struct processor *)processor_list
689 printf "Processor 0x%08x State %d (cpu_id %x)\n", $kgm_prp, ($kgm_prp)->state, ($kgm_prp)->cpu_id
690 if ($kgm_prp)->active_thread != 0
691 set $kgm_actp = ($kgm_prp)->active_thread
693 showtaskint ($kgm_actp)->task
695 showactint $kgm_actp 0
698 set $kgm_prp = ($kgm_prp)->processor_list
701 document showcurrentthreads
702 Syntax: (gdb) showcurrentthreads
703 | Routine to print out info about the thread running on each cpu.
706 set $decode_wait_events = 0
708 set $kgm_head_taskp = &tasks
709 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
710 while $kgm_taskp != $kgm_head_taskp
712 showtaskint $kgm_taskp
713 set $kgm_head_actp = &($kgm_taskp->threads)
714 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
715 while $kgm_actp != $kgm_head_actp
717 if ($decode_wait_events > 0)
718 showactint $kgm_actp 1
720 showactint $kgm_actp 2
722 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
725 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
729 document showallstacks
730 Syntax: (gdb) showallstacks
731 | Routine to print out the stack for each thread in the system.
732 | If the variable $decode_wait_events is non-zero, the routine attempts to
733 | interpret thread wait_events as kernel module offsets, which can add to
737 define showcurrentstacks
738 set $kgm_prp = processor_list
740 printf "Processor 0x%08x State %d (cpu_id %x)\n", $kgm_prp, ($kgm_prp)->state, ($kgm_prp)->cpu_id
741 if ($kgm_prp)->active_thread != 0
742 set $kgm_actp = ($kgm_prp)->active_thread
744 showtaskint ($kgm_actp)->task
746 showactint $kgm_actp 1
749 set $kgm_prp = ($kgm_prp)->processor_list
753 document showcurrentstacks
754 Syntax: (gdb) showcurrentstacks
755 | Routine to print out the thread running on each cpu (incl. its stack)
758 define showwaiterheader
759 printf "waiters thread "
760 printf "processor pri state wait_queue wait_event\n"
763 define showwaitqwaiters
764 set $kgm_w_waitqp = (WaitQueue*)$arg0
765 set $kgm_w_linksp = &($kgm_w_waitqp->wq_queue)
766 set $kgm_w_wqe = (WaitQueueElement *)$kgm_w_linksp->next
768 while ( (queue_entry_t)$kgm_w_wqe != (queue_entry_t)$kgm_w_linksp)
769 if ($kgm_w_wqe->wqe_type != &_wait_queue_link)
774 set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe
775 showactint $kgm_w_shuttle 0
777 set $kgm_w_wqe = (WaitQueueElement *)$kgm_w_wqe->wqe_links.next
781 define showwaitqwaitercount
782 set $kgm_wc_waitqp = (WaitQueue*)$arg0
783 set $kgm_wc_linksp = &($kgm_wc_waitqp->wq_queue)
784 set $kgm_wc_wqe = (WaitQueueElement *)$kgm_wc_linksp->next
785 set $kgm_wc_count = 0
786 while ( (queue_entry_t)$kgm_wc_wqe != (queue_entry_t)$kgm_wc_linksp)
787 if ($kgm_wc_wqe->wqe_type != &_wait_queue_link) && ($kgm_wc_wqe->wqe_type != &_wait_queue_link_noalloc)
788 set $kgm_wc_count = $kgm_wc_count + 1
790 set $kgm_wc_wqe = (WaitQueueElement *)$kgm_wc_wqe->wqe_links.next
792 printf "0x%08x ", $kgm_wc_count
795 define showwaitqmembercount
796 set $kgm_mc_waitqsetp = (struct wait_queue_set *)$arg0
797 set $kgm_mc_setlinksp = &($kgm_mc_waitqsetp->wqs_setlinks)
798 set $kgm_mc_wql = (WaitQueueLink *)$kgm_mc_setlinksp->next
799 set $kgm_mc_count = 0
800 while ( (queue_entry_t)$kgm_mc_wql != (queue_entry_t)$kgm_mc_setlinksp)
801 set $kgm_mc_count = $kgm_mc_count + 1
802 set $kgm_mc_wql = (WaitQueueLink *)$kgm_mc_wql->wql_setlinks.next
804 printf "0x%08x ", $kgm_mc_count
808 define showwaitqmemberheader
809 printf "set-members wait_queue interlock "
810 printf "pol type member_cnt waiter_cnt\n"
813 define showwaitqmemberint
814 set $kgm_m_waitqp = (WaitQueue*)$arg0
815 printf " 0x%08x ", $kgm_m_waitqp
816 printf "0x%08x ", $kgm_m_waitqp->wq_interlock.lock_data
817 if ($kgm_m_waitqp->wq_fifo)
822 if ($kgm_m_waitqp->wq_type == 0xf1d1)
824 showwaitqmembercount $kgm_m_waitqp
826 printf "Que 0x00000000 "
828 showwaitqwaitercount $kgm_m_waitqp
833 define showwaitqmemberofheader
834 printf "member-of wait_queue interlock "
835 printf "pol type member_cnt waiter_cnt\n"
838 define showwaitqmemberof
839 set $kgm_mo_waitqp = (WaitQueue*)$arg0
840 set $kgm_mo_linksp = &($kgm_mo_waitqp->wq_queue)
841 set $kgm_mo_wqe = (WaitQueueElement *)$kgm_mo_linksp->next
842 set $kgm_mo_found = 0
843 while ( (queue_entry_t)$kgm_mo_wqe != (queue_entry_t)$kgm_mo_linksp)
844 if ($kgm_mo_wqe->wqe_type == &_wait_queue_link)
846 set $kgm_mo_found = 1
847 showwaitqmemberofheader
849 set $kgm_mo_wqlp = (WaitQueueLink *)$kgm_mo_wqe
850 set $kgm_mo_wqsetp = (WaitQueue*)($kgm_mo_wqlp->wql_setqueue)
851 showwaitqmemberint $kgm_mo_wqsetp
853 set $kgm_mo_wqe = (WaitQueueElement *)$kgm_mo_wqe->wqe_links.next
857 define showwaitqmembers
858 set $kgm_ms_waitqsetp = (struct wait_queue_set *)$arg0
859 set $kgm_ms_setlinksp = &($kgm_ms_waitqsetp->wqs_setlinks)
860 set $kgm_ms_wql = (WaitQueueLink *)$kgm_ms_setlinksp->next
861 set $kgm_ms_found = 0
862 while ( (queue_entry_t)$kgm_ms_wql != (queue_entry_t)$kgm_ms_setlinksp)
863 set $kgm_ms_waitqp = $kgm_ms_wql->wql_element.wqe_queue
865 showwaitqmemberheader
866 set $kgm_ms_found = 1
868 showwaitqmemberint $kgm_ms_waitqp
869 set $kgm_ms_wql = (WaitQueueLink *)$kgm_ms_wql->wql_setlinks.next
873 define showwaitqheader
874 printf "wait_queue prepostq interlock "
875 printf "pol type member_cnt waiter_cnt\n"
879 set $kgm_waitqp = (WaitQueue *)$arg0
880 printf "0x%08x ", $kgm_waitqp
881 if ($kgm_waitqp->wq_type == 0xf1d1)
882 printf "0x%08x ", &((struct wait_queue_set *)$kgm_waitqp)->wqs_preposts
886 printf "0x%08x ", $kgm_waitqp->wq_interlock.lock_data
887 if ($kgm_waitqp->wq_fifo)
892 if ($kgm_waitqp->wq_type == 0xf1d1)
894 showwaitqmembercount $kgm_waitqp
896 printf "Que 0x00000000 "
898 showwaitqwaitercount $kgm_waitqp
903 set $kgm_waitq1p = (WaitQueue*)$arg0
905 showwaitqint $kgm_waitq1p
906 if ($kgm_waitq1p->wq_type == 0xf1d1)
907 showwaitqmembers $kgm_waitq1p
909 showwaitqmemberof $kgm_waitq1p
911 showwaitqwaiters $kgm_waitq1p
921 printf " #ents rpage hint "
923 printf " first_free\n"
929 printf " start prot #page object "
935 set $kgm_mapp = (vm_map_t)$arg0
936 set $kgm_map = *$kgm_mapp
939 showptr $kgm_map.pmap
941 showptr $kgm_map.size
942 printf " %3d ", $kgm_map.hdr.nentries
944 printf "%5d ", $kgm_map.pmap->stats.resident_count
948 showptr $kgm_map.hint
950 showptr $kgm_map.first_free
954 set $kgm_head_vmep = &($kgm_mapp->hdr.links)
955 set $kgm_vmep = $kgm_map.hdr.links.next
956 while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
957 set $kgm_vme = *$kgm_vmep
960 printf " 0x%016llx ", $kgm_vme.links.start
961 printf "%1x", $kgm_vme.protection
962 printf "%1x", $kgm_vme.max_protection
963 if $kgm_vme.inheritance == 0x0
966 if $kgm_vme.inheritance == 0x1
969 if $kgm_vme.inheritance == 0x2
972 if $kgm_vme.inheritance == 0x3
975 if $kgm_vme.is_sub_map
978 if $kgm_vme.needs_copy
984 printf "%6d ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
985 showptr $kgm_vme.object.vm_object
986 printf " 0x%016llx\n", $kgm_vme.offset
987 set $kgm_vmep = $kgm_vme.links.next
995 set $kgm_mapp = (vm_map_t)$arg0
996 set $kgm_map = *$kgm_mapp
997 set $kgm_head_vmep = &($kgm_mapp->hdr.links)
998 set $kgm_vmep = $kgm_map.hdr.links.next
999 set $kgm_objp_prev = (struct vm_object *)0
1001 set $kgm_saw_kernel_obj = 0
1002 set $kgm_wired_count = 0
1003 set $kgm_objp_print_space = 1
1005 set $kgm_objp_print_space = 0
1007 while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
1008 set $kgm_vme = *$kgm_vmep
1009 set $kgm_objp = $kgm_vme.object.vm_object
1010 if $kgm_vme.is_sub_map
1012 set $kgm_mapp_orig = $kgm_mapp
1013 set $kgm_vmep_orig = $kgm_vmep
1014 set $kgm_vme_orig = $kgm_vme
1015 set $kgm_head_vmep_orig = $kgm_head_vmep
1018 showmapwiredp $kgm_objp 1
1019 set $kgm_vme = $kgm_vme_orig
1020 set $kgm_vmep = $kgm_vmep_orig
1021 set $kgm_mapp = $kgm_mapp_orig
1022 set $kgm_head_vmep = $kgm_head_vmep_orig
1023 set $kgm_objp = (struct vm_object *)0
1029 set $kgm_objp = (struct vm_object *)0
1033 if ($kgm_objp == $kgm_objp_prev)
1034 set $kgm_objp = (struct vm_object *)0
1036 if $kgm_objp == kernel_object
1037 if $kgm_saw_kernel_obj
1038 set $kgm_objp = (struct vm_object *)0
1040 set $kgm_saw_kernel_obj = 1
1042 if $kgm_objp && $kgm_objp->wired_page_count
1043 if $kgm_objp_print_space == 1
1047 set $kgm_objp_print_space = 1
1050 printf " 0x%016llx ", $kgm_vme.links.start
1051 printf "%5d", $kgm_vme.alias
1052 printf "%6d ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
1054 printf "[%3d]", $kgm_objp->ref_count
1055 printf "%7d\n", $kgm_objp->wired_page_count
1056 set $kgm_wired_count = $kgm_wired_count + $kgm_objp->wired_page_count
1057 set $kgm_objp_prev = $kgm_objp
1059 set $kgm_vmep = $kgm_vme.links.next
1062 printf "total wired count = %d\n", $kgm_wired_count
1071 printf " start alias #page object "
1074 showmapwiredp $arg0 0
1076 document showmapwired
1077 Syntax: (gdb) showmapwired <vm_map>
1078 | Routine to print out a summary listing of all the entries with wired pages in a vm_map
1086 Syntax: (gdb) showmapvme <vm_map>
1087 | Routine to print out a summary listing of all the entries in a vm_map
1096 Syntax: (gdb) showmap <vm_map>
1097 | Routine to print out info about the specified vm_map
1101 set $kgm_head_taskp = &tasks
1102 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1103 while $kgm_taskp != $kgm_head_taskp
1106 showtaskint $kgm_taskp
1107 showvmint $kgm_taskp->map 0
1108 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1112 Syntax: (gdb) showallvm
1113 | Routine to print a summary listing of all the vm maps
1118 set $kgm_head_taskp = &tasks
1119 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1120 while $kgm_taskp != $kgm_head_taskp
1123 showtaskint $kgm_taskp
1124 showvmint $kgm_taskp->map 1
1125 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1129 Syntax: (gdb) showallvme
1130 | Routine to print a summary listing of all the vm map entries
1134 define showipcheader
1139 printf " table_next"
1141 printf " flags tsize splaytree splaybase\n"
1144 define showipceheader
1145 printf " name object "
1147 printf " rite urefs destname destination\n"
1151 set $kgm_ie = *(ipc_entry_t)$arg0
1152 printf " 0x%08x ", $arg1
1153 showptr $kgm_ie.ie_object
1155 if $kgm_ie.ie_bits & 0x00100000
1157 printf "%5d\n", $kgm_ie.ie_bits & 0xffff
1159 if $kgm_ie.ie_bits & 0x00080000
1161 printf "%5d\n", $kgm_ie.ie_bits & 0xffff
1163 if $kgm_ie.ie_bits & 0x00010000
1164 if $kgm_ie.ie_bits & 0x00020000
1170 if $kgm_ie.ie_bits & 0x00020000
1174 if $kgm_ie.ie_bits & 0x00040000
1177 if $kgm_ie.index.request
1182 if $kgm_ie.ie_bits & 0x00800000
1187 printf "%5d ", $kgm_ie.ie_bits & 0xffff
1188 showportdest $kgm_ie.ie_object
1194 set $kgm_isp = (ipc_space_t)$arg0
1195 set $kgm_is = *$kgm_isp
1198 showptr $kgm_is.is_table
1200 showptr $kgm_is.is_table_next
1202 if $kgm_is.is_growing != 0
1207 if $kgm_is.is_fast != 0
1212 if $kgm_is.is_active != 0
1217 printf "%5d ", $kgm_is.is_table_size
1218 printf "0x%08x ", $kgm_is.is_tree_total
1219 showptr &$kgm_isp->is_tree
1224 set $kgm_iep = $kgm_is.is_table
1225 set $kgm_destspacep = (ipc_space_t)0
1226 while ( $kgm_iindex < $kgm_is.is_table_size )
1227 set $kgm_ie = *$kgm_iep
1228 if $kgm_ie.ie_bits & 0x001f0000
1229 set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
1230 showipceint $kgm_iep $kgm_name
1231 if $arg2 != 0 && ipc_portbt != 0
1232 if $kgm_ie.ie_object != 0 && ($kgm_ie.ie_bits & 0x00070000) && ((ipc_port_t) $kgm_ie.ie_object)->ip_callstack[0] != 0
1234 showportbt $kgm_ie.ie_object $kgm_is.is_task
1238 set $kgm_iindex = $kgm_iindex + 1
1239 set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
1241 if $kgm_is.is_tree_total
1242 printf "Still need to write tree traversal\n"
1250 set $kgm_isp = (ipc_space_t)$arg0
1252 showipcint $kgm_isp 0 0
1255 Syntax: (gdb) showipc <ipc_space>
1256 | Routine to print the status of the specified ipc space
1260 set $kgm_isp = (ipc_space_t)$arg0
1262 showipcint $kgm_isp 1 0
1265 Syntax: (gdb) showrights <ipc_space>
1266 | Routine to print a summary list of all the rights in a specified ipc space
1271 set $kgm_taskp = (task_t)$arg0
1274 showtaskint $kgm_taskp
1275 showipcint $kgm_taskp->itk_space 0 0
1277 document showtaskipc
1278 Syntax: (gdb) showtaskipc <task>
1279 | Routine to print info about the ipc space for a task
1283 define showtaskrights
1284 set $kgm_taskp = (task_t)$arg0
1287 showtaskint $kgm_taskp
1288 showipcint $kgm_taskp->itk_space 1 0
1290 document showtaskrights
1291 Syntax: (gdb) showtaskrights <task>
1292 | Routine to print info about the ipc rights for a task
1295 define showtaskrightsbt
1296 set $kgm_taskp = (task_t)$arg0
1299 showtaskint $kgm_taskp
1300 showipcint $kgm_taskp->itk_space 1 1
1302 document showtaskrightsbt
1303 Syntax: (gdb) showtaskrightsbt <task>
1304 | Routine to print info about the ipc rights for a task with backtraces
1308 set $kgm_head_taskp = &tasks
1309 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
1310 while $kgm_cur_taskp != $kgm_head_taskp
1313 showtaskint $kgm_cur_taskp
1314 showipcint $kgm_cur_taskp->itk_space 0 0
1315 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
1319 Syntax: (gdb) showallipc
1320 | Routine to print a summary listing of all the ipc spaces
1324 define showallrights
1325 set $kgm_head_taskp = &tasks
1326 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
1327 while $kgm_cur_taskp != $kgm_head_taskp
1330 showtaskint $kgm_cur_taskp
1331 showipcint $kgm_cur_taskp->itk_space 1 0
1332 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
1335 document showallrights
1336 Syntax: (gdb) showallrights
1337 | Routine to print a summary listing of all the ipc rights
1342 set $kgm_taskp = (task_t)$arg0
1345 showtaskint $kgm_taskp
1346 showvmint $kgm_taskp->map 0
1349 Syntax: (gdb) showtaskvm <task>
1350 | Routine to print out info about a task's vm_map
1354 set $kgm_taskp = (task_t)$arg0
1357 showtaskint $kgm_taskp
1358 showvmint $kgm_taskp->map 1
1360 document showtaskvme
1361 Syntax: (gdb) showtaskvme <task>
1362 | Routine to print out info about a task's vm_map_entries
1366 define showtaskheader
1371 printf " ipc_space "
1379 set $kgm_taskp = (struct task *)$arg0
1382 showptr $kgm_taskp->map
1384 showptr $kgm_taskp->itk_space
1385 printf " %5d ", $kgm_taskp->thread_count
1386 showprocint $kgm_taskp->bsd_info
1394 Syntax (gdb) showtask <task>
1395 | Routine to print out info about a task.
1399 define showtaskthreads
1401 set $kgm_taskp = (struct task *)$arg0
1402 showtaskint $kgm_taskp
1404 set $kgm_head_actp = &($kgm_taskp->threads)
1405 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1406 while $kgm_actp != $kgm_head_actp
1407 showactint $kgm_actp 0
1408 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1411 document showtaskthreads
1412 Syntax: (gdb) showtaskthreads <task>
1413 | Routine to print info about the threads in a task.
1417 define showtaskstacks
1419 set $kgm_taskp = (struct task *)$arg0
1420 showtaskint $kgm_taskp
1421 set $kgm_head_actp = &($kgm_taskp->threads)
1422 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
1423 while $kgm_actp != $kgm_head_actp
1425 showactint $kgm_actp 1
1426 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
1429 document showtaskstacks
1430 Syntax: (gdb) showtaskstacks <task>
1431 | Routine to print out the stack for each thread in a task.
1437 set $kgm_head_taskp = &tasks
1438 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1439 while $kgm_taskp != $kgm_head_taskp
1440 showtaskint $kgm_taskp
1441 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1444 document showalltasks
1445 Syntax: (gdb) showalltasks
1446 | Routine to print a summary listing of all the tasks
1447 | wq_state -> reports "number of workq threads", "number of scheduled workq threads", "number of pending work items"
1448 | if "number of pending work items" seems stuck at non-zero, it may indicate that the workqueue mechanism is hung
1449 | io_policy -> RAGE - rapid aging of vnodes requested
1450 | NORM - normal I/O explicitly requested (this is the default)
1451 | PASS - passive I/O requested (i.e. I/Os do not affect throttling decisions)
1452 | THROT - throttled I/O requested (i.e. thread/task may be throttled after each I/O completes)
1455 define showprocheader
1456 printf " pid process io_policy wq_state"
1462 set $kgm_procp = (struct proc *)$arg0
1464 set $kgm_printed = 0
1465 printf "%5d ", $kgm_procp->p_pid
1467 if ($kgm_procp->p_lflag & 0x400000)
1472 if ($kgm_procp->p_iopol_disk == 1)
1474 set $kgm_printed = 1
1476 if ($kgm_procp->p_iopol_disk == 2)
1478 set $kgm_printed = 1
1480 if ($kgm_procp->p_iopol_disk == 3)
1482 set $kgm_printed = 1
1484 if ($kgm_printed == 0)
1487 set $kgm_wqp = (struct workqueue *)$kgm_procp->p_wqptr
1489 printf " %2d %2d %2d ", $kgm_wqp->wq_nthreads, $kgm_wqp->wq_thidlecount, $kgm_wqp->wq_itemcount
1493 printf " %s\n", $kgm_procp->p_comm
1503 set $kgm_head_taskp = &tasks
1504 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
1505 while $kgm_taskp != $kgm_head_taskp
1506 set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info
1507 if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0))
1508 showtaskint $kgm_taskp
1509 set $kgm_taskp = $kgm_head_taskp
1511 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
1516 Syntax: (gdb) showpid <pid>
1517 | Routine to print a single process by pid
1522 set $kgm_procp = (struct proc *)$arg0
1523 showtaskint $kgm_procp->task
1528 set switch_debugger=1
1532 | kdb - Switch to the inline kernel debugger
1536 | The kdb macro allows you to invoke the inline kernel debugger.
1539 define showpsetheader
1540 printf "portset waitqueue recvname "
1541 printf "flags refs recvname process\n"
1544 define showportheader
1545 printf "port mqueue recvname "
1546 printf "flags refs recvname process\n"
1549 define showportmemberheader
1550 printf "members port recvname "
1551 printf "flags refs mqueue msgcount\n"
1554 define showkmsgheader
1555 printf "messages kmsg size "
1556 printf "disp msgid remote-port local-port\n"
1560 printf " 0x%08x ", $arg0
1561 set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header
1562 printf "0x%08x ", $kgm_kmsgh.msgh_size
1563 if (($kgm_kmsgh.msgh_bits & 0xff) == 19)
1568 if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 << 8))
1573 if ($kgm_kmsgh.msgh_bits & 0xf0000000)
1578 printf "%5d ", $kgm_kmsgh.msgh_id
1579 printf "0x%08x ", $kgm_kmsgh.msgh_remote_port
1580 printf "0x%08x\n", $kgm_kmsgh.msgh_local_port
1586 set $kgm_portp = (struct ipc_port *)$arg0
1587 showptr $kgm_portp->ip_kobject
1589 set $kgm_kotype = ($kgm_portp->ip_object.io_bits & 0x00000fff)
1590 if ($kgm_kotype == 1)
1593 if ($kgm_kotype == 2)
1596 if ($kgm_kotype == 3)
1599 if ($kgm_kotype == 4)
1602 if ($kgm_kotype == 5)
1605 if ($kgm_kotype == 6)
1608 if ($kgm_kotype == 7)
1611 if ($kgm_kotype == 8)
1614 if ($kgm_kotype == 9)
1617 if ($kgm_kotype == 10)
1620 if ($kgm_kotype == 11)
1623 if ($kgm_kotype == 12)
1626 if ($kgm_kotype == 13)
1629 if ($kgm_kotype == 14)
1632 if ($kgm_kotype == 15)
1635 if ($kgm_kotype == 16)
1638 if ($kgm_kotype == 17)
1641 if ($kgm_kotype == 18)
1644 if ($kgm_kotype == 19)
1647 if ($kgm_kotype == 20)
1650 if ($kgm_kotype == 21)
1653 if ($kgm_kotype == 22)
1654 printf "IO_DONE_QUE"
1656 if ($kgm_kotype == 23)
1659 if ($kgm_kotype == 24)
1662 if ($kgm_kotype == 25)
1665 if ($kgm_kotype == 26)
1668 if ($kgm_kotype == 27)
1669 printf "IOKIT_SPARE"
1671 if ($kgm_kotype == 28)
1674 if ($kgm_kotype == 29)
1677 if ($kgm_kotype == 30)
1680 if ($kgm_kotype == 31)
1683 if ($kgm_kotype == 34)
1689 define showportdestproc
1690 set $kgm_portp = (struct ipc_port *)$arg0
1691 set $kgm_spacep = $kgm_portp->data.receiver
1692 # check against the previous cached value - this is slow
1693 if ($kgm_spacep != $kgm_destspacep)
1694 set $kgm_destprocp = (struct proc *)0
1695 set $kgm_head_taskp = &tasks
1696 set $kgm_desttaskp = (struct task *)($kgm_head_taskp->next)
1697 while (($kgm_destprocp == 0) && ($kgm_desttaskp != $kgm_head_taskp))
1698 set $kgm_destspacep = $kgm_desttaskp->itk_space
1699 if ($kgm_destspacep == $kgm_spacep)
1700 set $kgm_destprocp = (struct proc *)$kgm_desttaskp->bsd_info
1702 set $kgm_desttaskp = (struct task *)($kgm_desttaskp->tasks.next)
1706 if $kgm_destprocp != 0
1707 printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid
1710 showptr $kgm_desttaskp
1716 set $kgm_portp = (struct ipc_port *)$arg0
1717 set $kgm_spacep = $kgm_portp->data.receiver
1718 if ($kgm_spacep == ipc_space_kernel)
1719 showkobject $kgm_portp
1721 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1722 showptr $kgm_portp->ip_messages.data.port.receiver_name
1724 showportdestproc $kgm_portp
1727 printf " inactive-port\n"
1732 define showportmember
1733 printf " 0x%08x ", $arg0
1734 set $kgm_portp = (struct ipc_port *)$arg0
1735 printf "0x%08x ", $kgm_portp->ip_messages.data.port.receiver_name
1736 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1742 printf "%5d ", $kgm_portp->ip_object.io_references
1743 printf "0x%08x ", &($kgm_portp->ip_messages)
1744 printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount
1748 set $kgm_iebt = ((ipc_port_t) $arg0)->ip_callstack
1749 set $kgm_iepid = ((ipc_port_t) $arg0)->ip_spares[0]
1750 set $kgm_procpid = ((proc_t) (((task_t) $arg1)->bsd_info))->p_pid
1751 if $kgm_iebt[0] != 0
1752 showptr $kgm_iebt[0]
1753 set $kgm_iebt_loop_ctr = 1
1754 while ($kgm_iebt_loop_ctr < 16 && $kgm_iebt[$kgm_iebt_loop_ctr])
1756 showptr $kgm_iebt[$kgm_iebt_loop_ctr]
1757 set $kgm_iebt_loop_ctr = $kgm_iebt_loop_ctr + 1
1759 if $kgm_iepid != $kgm_procpid
1760 printf " (%d)", $kgm_iepid
1767 printf "0x%08x ", $arg0
1768 set $kgm_portp = (struct ipc_port *)$arg0
1769 printf "0x%08x ", &($kgm_portp->ip_messages)
1770 printf "0x%08x ", $kgm_portp->ip_messages.data.port.receiver_name
1771 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1777 printf "%5d ", $kgm_portp->ip_object.io_references
1778 set $kgm_destspacep = (struct ipc_space *)0
1779 showportdest $kgm_portp
1780 set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base
1781 if $arg1 && $kgm_kmsgp
1783 showkmsgint $kgm_kmsgp
1784 set $kgm_kmsgheadp = $kgm_kmsgp
1785 set $kgm_kmsgp = $kgm_kmsgp->ikm_next
1786 while $kgm_kmsgp != $kgm_kmsgheadp
1787 showkmsgint $kgm_kmsgp
1788 set $kgm_kmsgp = $kgm_kmsgp->ikm_next
1794 printf "0x%08x ", $arg0
1795 set $kgm_psetp = (struct ipc_pset *)$arg0
1796 printf "0x%08x ", &($kgm_psetp->ips_messages)
1797 printf "0x%08x ", $kgm_psetp->ips_messages.data.pset.local_name
1798 if ($kgm_psetp->ips_object.io_bits & 0x80000000)
1804 printf "%5d ", $kgm_psetp->ips_object.io_references
1805 printf "0x%08x ", $kgm_psetp->ips_messages.data.pset.local_name
1806 set $kgm_setlinksp = &($kgm_psetp->ips_messages.data.pset.set_queue.wqs_setlinks)
1807 set $kgm_wql = (WaitQueueLink *)$kgm_setlinksp->next
1809 while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_setlinksp)
1810 set $kgm_portp = (struct ipc_port *)((uintptr_t)$kgm_wql->wql_element.wqe_queue - $kgm_portoff)
1812 set $kgm_destspacep = (struct ipc_space *)0
1813 showportdestproc $kgm_portp
1814 showportmemberheader
1817 showportmember $kgm_portp 0
1818 set $kgm_wql = (WaitQueueLink *)$kgm_wql->wql_setlinks.next
1835 define showipcobject
1836 set $kgm_object = (ipc_object_t)$arg0
1837 if ($kgm_objectp->io_bits & 0x7fff0000)
1838 showpset $kgm_objectp
1840 showport $kgm_objectp
1845 set $kgm_mqueue = *(struct ipc_mqueue *)$arg0
1846 set $kgm_psetoff = (uintptr_t)&(((struct ipc_pset *)0)->ips_messages)
1847 set $kgm_portoff = (uintptr_t)&(((struct ipc_port *)0)->ip_messages)
1848 if ($kgm_mqueue.data.pset.set_queue.wqs_wait_queue.wq_type == 0xf1d1)
1849 set $kgm_psetp = (struct ipc_pset *)(((uintptr_t)$arg0) - $kgm_psetoff)
1851 showpsetint $kgm_psetp 1
1853 if ($kgm_mqueue.data.pset.set_queue.wqs_wait_queue.wq_type == 0xf1d0)
1854 set $kgm_portp = (struct ipc_port *)(((uintptr_t)$arg0) - $kgm_portoff)
1856 showportint $kgm_portp 1
1861 set $kgm_zone = (struct zone *)$arg0
1864 printf " %6d ",$kgm_zone->count
1865 printf "%8x ",$kgm_zone->cur_size
1866 printf "%8x ",$kgm_zone->max_size
1867 printf "%6d ",$kgm_zone->elem_size
1868 printf "%8x ",$kgm_zone->alloc_size
1869 printf "%s ",$kgm_zone->zone_name
1871 if ($kgm_zone->exhaustible)
1874 if ($kgm_zone->collectable)
1877 if ($kgm_zone->expandable)
1880 if ($kgm_zone->noencrypt)
1890 printf " COUNT TOT_SZ MAX_SZ ELT_SZ ALLOC_SZ NAME\n"
1891 set $kgm_zone_ptr = (struct zone *)first_zone
1892 while ($kgm_zone_ptr != 0)
1893 zprint_one $kgm_zone_ptr
1894 set $kgm_zone_ptr = $kgm_zone_ptr->next_zone
1899 Syntax: (gdb) zprint
1900 | Routine to print a summary listing of all the kernel zones
1904 set $kgm_mtxgrp = (struct _lck_grp_ *)$arg0
1906 if ($kgm_mtxgrp->lck_grp_mtxcnt)
1908 printf " %8d ",$kgm_mtxgrp->lck_grp_mtxcnt
1909 printf "%12u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_util_cnt
1910 printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_miss_cnt
1911 printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_wait_cnt
1912 printf "%s ",&$kgm_mtxgrp->lck_grp_name
1921 printf " CNT UTIL MISS WAIT NAME\n"
1922 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)&lck_grp_queue
1923 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)$kgm_mtxgrp_ptr->lck_grp_link.next
1924 while ($kgm_mtxgrp_ptr != (struct _lck_grp_ *)&lck_grp_queue)
1925 showmtxgrp $kgm_mtxgrp_ptr
1926 set $kgm_mtxgrp_ptr = (struct _lck_grp_ *)$kgm_mtxgrp_ptr->lck_grp_link.next
1931 Syntax: (gdb) showallmtx
1932 | Routine to print a summary listing of all mutexes
1936 set $kgm_rwlckgrp = (struct _lck_grp_ *)$arg0
1938 if ($kgm_rwlckgrp->lck_grp_rwcnt)
1939 showptr $kgm_rwlckgrp
1940 printf " %8d ",$kgm_rwlckgrp->lck_grp_rwcnt
1941 printf "%12u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt
1942 printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_miss_cnt
1943 printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_wait_cnt
1944 printf "%s ",&$kgm_rwlckgrp->lck_grp_name
1953 printf " CNT UTIL MISS WAIT NAME\n"
1954 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)&lck_grp_queue
1955 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)$kgm_rwlckgrp_ptr->lck_grp_link.next
1956 while ($kgm_rwlckgrp_ptr != (struct _lck_grp_ *)&lck_grp_queue)
1957 showrwlckgrp $kgm_rwlckgrp_ptr
1958 set $kgm_rwlckgrp_ptr = (struct _lck_grp_ *)$kgm_rwlckgrp_ptr->lck_grp_link.next
1962 document showallrwlck
1963 Syntax: (gdb) showallrwlck
1964 | Routine to print a summary listing of all read/writer locks
1967 set $kdp_act_counter = 0
1986 define showcontext_int
1987 echo Context switched, current instruction pointer:
1993 set $newact = (struct thread *) $arg0
1995 if ($newact->kernel_stack == 0)
1996 echo This activation does not have a stack.\n
1998 output/a (unsigned) $newact.continuation
2001 if ($kgm_mtype == $kgm_mtype_ppc)
2002 if ($kdp_act_counter == 0)
2003 set $kdpstate = (struct savearea *) kdp.saved_state
2005 set $kdp_act_counter = $kdp_act_counter + 1
2006 set (struct savearea *) kdp.saved_state=$newact->machine->pcb
2009 set $pc=$newact->machine->pcb.save_srr0
2012 if ($kgm_mtype == $kgm_mtype_i386)
2013 set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
2014 if ($kdp_act_counter == 0)
2015 set $kdpstate = *($kdpstatep)
2017 set $kdp_act_counter = $kdp_act_counter + 1
2019 set $kgm_statep = (struct x86_kernel_state *) \
2020 ($newact->kernel_stack + kernel_stack_size \
2021 - sizeof(struct x86_kernel_state))
2022 set $kdpstatep->ebx = $kgm_statep->k_ebx
2023 set $kdpstatep->ebp = $kgm_statep->k_ebp
2024 set $kdpstatep->edi = $kgm_statep->k_edi
2025 set $kdpstatep->esi = $kgm_statep->k_esi
2026 set $kdpstatep->eip = $kgm_statep->k_eip
2029 set $pc = $kgm_statep->k_eip
2032 if ($kgm_mtype == $kgm_mtype_x86_64)
2033 set $kdpstatep = (struct x86_saved_state64 *) kdp.saved_state
2034 if ($kdp_act_counter == 0)
2035 set $kdpstate = *($kdpstatep)
2037 set $kdp_act_counter = $kdp_act_counter + 1
2039 set $kgm_statep = (struct x86_kernel_state *) \
2040 ($newact->kernel_stack + kernel_stack_size \
2041 - sizeof(struct x86_kernel_state))
2042 set $kdpstatep->rbx = $kgm_statep->k_rbx
2043 set $kdpstatep->rbp = $kgm_statep->k_rbp
2044 set $kdpstatep->r12 = $kgm_statep->k_r12
2045 set $kdpstatep->r13 = $kgm_statep->k_r13
2046 set $kdpstatep->r14 = $kgm_statep->k_r14
2047 set $kdpstatep->r15 = $kgm_statep->k_r15
2048 set $kdpstatep->isf.rsp = $kgm_statep->k_rsp
2051 set $pc = $kgm_statep->k_rip
2054 if ($kgm_mtype == $kgm_mtype_arm)
2065 set $r10_save = $r10
2066 set $r11_save = $r11
2067 set $r12_save = $r12
2071 set $pc_ctx = load_reg+8
2072 set $kgm_statep = (struct arm_saved_state *)((struct thread*)$arg0)->machine.kstackptr
2073 set $r0 = $kgm_statep->r[0]
2074 set $r1 = $kgm_statep->r[1]
2075 set $r2 = $kgm_statep->r[2]
2076 set $r3 = $kgm_statep->r[3]
2077 set $r4 = $kgm_statep->r[4]
2078 set $r5 = $kgm_statep->r[5]
2079 set $r6 = $kgm_statep->r[6]
2080 set $r8 = $kgm_statep->r[8]
2081 set $r9 = $kgm_statep->r[9]
2082 set $r10 = $kgm_statep->r[10]
2083 set $r11 = $kgm_statep->r[11]
2084 set $r12 = $kgm_statep->r[12]
2085 set $sp = $kgm_statep->sp
2086 set $lr = $kgm_statep->lr
2088 set $r7 = $kgm_statep->r[7]
2096 document switchtoact
2097 Syntax: switchtoact <address of activation>
2098 | This command allows gdb to examine the execution context and call
2099 | stack for the specified activation. For example, to view the backtrace
2100 | for an activation issue "switchtoact <address>", followed by "bt".
2101 | Before resuming execution, issue a "resetctx" command, to
2102 | return to the original execution context.
2107 if ($kgm_mtype == $kgm_mtype_ppc)
2108 if ($kdp_act_counter == 0)
2109 set $kdpstate = (struct savearea *) kdp.saved_state
2111 set $kdp_act_counter = $kdp_act_counter + 1
2112 set (struct savearea *) kdp.saved_state=(struct savearea *) $arg0
2115 set $pc=((struct savearea *) $arg0)->save_srr0
2118 if ($kgm_mtype == $kgm_mtype_arm)
2119 set arm disassembler std
2131 set $r10_save = $r10
2132 set $r11_save = $r11
2133 set $r12_save = $r12
2137 set $kgm_statep = (struct arm_saved_state *)$arg0
2138 set $r0 = $kgm_statep->r[0]
2139 set $r1 = $kgm_statep->r[1]
2140 set $r2 = $kgm_statep->r[2]
2141 set $r3 = $kgm_statep->r[3]
2142 set $r4 = $kgm_statep->r[4]
2143 set $r5 = $kgm_statep->r[5]
2144 set $r6 = $kgm_statep->r[6]
2145 set $r8 = $kgm_statep->r[8]
2146 set $r9 = $kgm_statep->r[9]
2147 set $r10 = $kgm_statep->r[10]
2148 set $r11 = $kgm_statep->r[11]
2149 set $r12 = $kgm_statep->r[12]
2150 set $sp = $kgm_statep->sp
2151 set $lr = $kgm_statep->lr
2152 set $r7 = $kgm_statep->r[7]
2153 set $pc = $kgm_statep->pc
2158 echo switchtoctx not implemented for this architecture.\n
2162 document switchtoctx
2163 Syntax: switchtoctx <address of pcb>
2164 | This command allows gdb to examine an execution context and dump the
2165 | backtrace for this execution context.
2166 | Before resuming execution, issue a "resetctx" command, to
2167 | return to the original execution context.
2172 if ($kdp_act_counter != 0)
2173 if ($kgm_mtype == $kgm_mtype_ppc)
2174 set (struct savearea *)kdp.saved_state=$kdpstate
2177 set $pc=((struct savearea *) kdp.saved_state)->save_srr0
2179 set $kdp_act_counter = 0
2181 if ($kgm_mtype == $kgm_mtype_i386)
2182 set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
2183 set *($kdpstatep)=$kdpstate
2186 set $pc=$kdpstatep->eip
2188 set $kdp_act_counter = 0
2190 if ($kgm_mtype == $kgm_mtype_x86_64)
2191 set $kdpstatep = (struct x86_saved_state64 *) kdp.saved_state
2192 set *($kdpstatep)=$kdpstate
2195 set $pc=$kdpstatep->isf.rip
2197 set $kdp_act_counter = 0
2199 if ($kgm_mtype == $kgm_mtype_arm)
2218 set $r10 = $r10_save
2220 set $r11 = $r11_save
2222 set $r12 = $r12_save
2239 | Returns to the original execution context. This command should be
2240 | issued if you wish to resume execution after using the "switchtoact"
2241 | or "switchtoctx" commands.
2244 # This is a pre-hook for the continue command, to prevent inadvertent attempts
2245 # to resume from the context switched to for examination.
2246 define hook-continue
2250 # This is a pre-hook for the detach command, to prevent inadvertent attempts
2251 # to resume from the context switched to for examination.
2257 set $resume = KDP_DUMPINFO_SETINFO | KDP_DUMPINFO_RESUME
2263 | The target system will resume when detaching or exiting from gdb.
2264 | This is the default behavior.
2268 set $noresume = KDP_DUMPINFO_SETINFO | KDP_DUMPINFO_NORESUME
2269 dumpinfoint $noresume
2273 | Syntax: resume_off
2274 | The target system won't resume after detaching from gdb and
2275 | can be attached with a new gdb session
2279 set $kgm_panic_bufptr = debug_buf
2280 set $kgm_panic_bufptr_max = debug_buf_ptr
2281 while $kgm_panic_bufptr < $kgm_panic_bufptr_max
2282 if *(char *)$kgm_panic_bufptr == 10
2285 printf "%c", *(char *)$kgm_panic_bufptr
2287 set $kgm_panic_bufptr= (char *)$kgm_panic_bufptr + 1
2293 | Display the panic log information
2297 define dumpcallqueue
2298 set $kgm_callhead = $arg0
2299 set $kgm_callentry = $kgm_callhead->next
2301 while $kgm_callentry != $kgm_callhead
2302 set $kgm_call = (struct call_entry *)$kgm_callentry
2303 printf "0x%08x ", $kgm_call
2304 printf "0x%08x 0x%08x ", $kgm_call->param0, $kgm_call->param1
2305 output $kgm_call->deadline
2307 output $kgm_call->func
2309 set $kgm_i = $kgm_i + 1
2310 set $kgm_callentry = $kgm_callentry->next
2312 printf "%d entries\n", $kgm_i
2315 document dumpcallqueue
2316 | Syntax: dumpcallqueue <queue head>
2317 | Displays the contents of the specified call_entry queue.
2321 showtaskthreads $arg0
2323 document showtaskacts
2324 | See help showtaskthreads.
2330 document showallacts
2331 | See help showallthreads.
2346 document resetstacks
2347 | Syntax: resetstacks
2348 | Internal kgmacro routine used by the "showuserstack" macro
2349 | to reset the target pmap to the kernel pmap.
2352 #Barely effective hacks to work around bugs in the "flush" and "update"
2353 #gdb commands in Tiger (up to 219); these aren't necessary with Panther
2354 #gdb, but do no harm.
2355 define _kgm_flush_loop
2356 set $kgm_flush_loop_ctr = 0
2357 while ($kgm_flush_loop_ctr < 30)
2360 set $kgm_flush_loop_ctr = $kgm_flush_loop_ctr + 1
2364 define _kgm_update_loop
2365 set $kgm_update_loop_ctr = 0
2366 while ($kgm_update_loop_ctr < 30)
2368 set $kgm_update_loop_ctr = $kgm_update_loop_ctr + 1
2371 # Internal routine used by "_loadfrom" to read from 64-bit addresses
2374 # set up the manual KDP packet
2375 set manual_pkt.input = 0
2376 set manual_pkt.len = sizeof(kdp_readmem64_req_t)
2377 set $kgm_pkt = (kdp_readmem64_req_t *)&manual_pkt.data
2378 set $kgm_pkt->hdr.request = KDP_READMEM64
2379 set $kgm_pkt->hdr.len = sizeof(kdp_readmem64_req_t)
2380 set $kgm_pkt->hdr.is_reply = 0
2381 set $kgm_pkt->hdr.seq = 0
2382 set $kgm_pkt->hdr.key = 0
2383 set $kgm_pkt->address = (uint64_t)$arg0
2384 set $kgm_pkt->nbytes = sizeof(uint64_t)
2385 set manual_pkt.input = 1
2386 # dummy to make sure manual packet is executed
2387 set $kgm_dummy = &_mh_execute_header
2388 set $kgm_pkt = (kdp_readmem64_reply_t *)&manual_pkt.data
2389 if ($kgm_pkt->error == 0)
2390 set $kgm_k32read64 = *(uint64_t *)$kgm_pkt->data
2392 set $kgm_k32read64 = 0
2396 # Internal routine used by "showx86backtrace" to abstract possible loads from
2400 set $kgm_loadval = *(uintptr_t *)$arg0
2402 if ($kgm_x86_abi == 0xe)
2403 set $kgm_loadval = *(uint32_t *)$arg0
2405 if ($kgm_x86_abi == 0xf)
2406 if ($kgm_mtype == $kgm_mtype_i386)
2408 set $kgm_loadval = $kgm_k32read64
2410 set $kgm_loadval = *(uint64_t *)$arg0
2418 #This is necessary since gdb often doesn't do backtraces on x86 correctly
2419 #in the absence of symbols.The code below in showuserstack and
2420 #showx86backtrace also contains several workarouds for the gdb bug where
2421 #gdb stops macro evaluation because of spurious "Cannot read memory"
2422 #errors on x86. These errors appear on ppc as well, but they don't
2423 #always stop macro evaluation.
2425 set $kgm_cur_frame = 0
2427 set $kgm_x86_abi = 0
2428 define showx86backtrace
2429 if ($kgm_mtype == $kgm_mtype_i386)
2430 set $kgm_frame_reg = $ebp
2432 set $kgm_ret_off = 4
2434 if ($kgm_mtype == $kgm_mtype_x86_64)
2435 set $kgm_frame_reg = $rbp
2437 set $kgm_ret_off = 8
2440 if ($kgm_x86_abi == 0xe)
2441 set $kgm_ret_off = 4
2443 if ($kgm_x86_abi == 0xf)
2444 set $kgm_ret_off = 8
2447 if ($kgm_cur_frame == 0)
2448 set $kgm_cur_frame = $kgm_frame_reg
2450 if ($kgm_cur_pc == 0)
2451 set $kgm_cur_pc = $kgm_pc
2453 printf "0: Frame: 0x%016llx PC: 0x%016llx\n", $kgm_cur_frame, $kgm_cur_pc
2454 if (!(($kgm_x86_abi == 0xf) && ($kgm_mtype == $kgm_mtype_i386)))
2457 set $kgm_tmp_frame = $kgm_cur_frame
2458 set $kgm_cur_frame = 0
2460 _loadfrom ($kgm_tmp_frame)
2461 set $kgm_prev_frame = $kgm_loadval
2462 _loadfrom ($kgm_tmp_frame+$kgm_ret_off)
2463 set $kgm_prev_pc = $kgm_loadval
2464 set $kgm_frameno = 1
2465 while $kgm_prev_frame != 0
2466 printf "%d: Saved frame: 0x%016llx Saved PC: 0x%016llx\n", $kgm_frameno, $kgm_prev_frame, $kgm_prev_pc
2467 if (!(($kgm_x86_abi == 0xf) && ($kgm_mtype == $kgm_mtype_i386)))
2470 _loadfrom ($kgm_prev_frame+$kgm_ret_off)
2471 set $kgm_prev_pc = $kgm_loadval
2472 _loadfrom ($kgm_prev_frame)
2473 set $kgm_prev_frame = $kgm_loadval
2474 set $kgm_frameno = $kgm_frameno + 1
2477 set $kgm_x86_abi = 0
2480 define showx86backtrace2
2481 set $kgm_cur_frame = $arg0
2482 set $kgm_cur_pc = $arg1
2486 define showuserstack
2488 if ($kgm_mtype == $kgm_mtype_ppc)
2489 if ($kdp_act_counter == 0)
2490 set $kdpstate = (struct savearea *) kdp.saved_state
2492 set $kdp_act_counter = $kdp_act_counter + 1
2493 set $newact = (struct thread *) $arg0
2495 set $checkpc = $newact->machine->upcb.save_srr0
2497 echo This activation does not appear to have
2498 echo \20 a valid user context.\n
2500 set (struct savearea *) kdp.saved_state=$newact->machine->upcb
2502 #flush and update seem to be executed lazily by gdb on Tiger, hence the
2503 #repeated invocations - see 3743135
2505 # This works because the new pmap is used only for reads
2506 set kdp_pmap = $newact->task->map->pmap
2518 if (($kgm_mtype & $kgm_mtype_x86_mask) == $kgm_mtype_x86_any)
2519 set $newact = (struct thread *) $arg0
2520 set $newiss = (x86_saved_state_t *) ($newact->machine.pcb->iss)
2521 set $kgm_x86_abi = $newiss.flavor
2522 if ($newiss.flavor == 0xf)
2523 set $checkpc = $newiss.uss.ss_64.isf.rip
2524 set $checkframe = $newiss.uss.ss_64.rbp
2527 set $checkpc = $newiss.uss.ss_32.eip
2528 set $checkframe = $newiss.uss.ss_32.ebp
2532 echo This activation does not appear to have
2533 echo \20 a valid user context.\n
2535 set $kgm_cur_frame = $checkframe
2536 set $kgm_cur_pc = $checkpc
2537 printf "You may now issue the showx86backtrace command to see the user space backtrace for this thread ("
2539 printf "); you can also examine memory locations in this address space (pmap "
2540 showptr $newact->task->map->pmap
2541 printf ") 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"
2542 set kdp_pmap = $newact->task->map->pmap
2547 echo showuserstack not supported on this architecture\n
2551 document showuserstack
2552 Syntax: showuserstack <address of thread activation>
2553 |This command displays a numeric backtrace for the user space stack of
2554 |the given thread activation. It may, of course, fail to display a
2555 |complete backtrace if portions of the user stack are not mapped in.
2556 |Symbolic backtraces can be obtained either by running gdb on the
2557 |user space binary, or a tool such as "symbolicate".
2558 |Note that while this command works on Panther's gdb, an issue
2559 |with Tiger gdb (3743135) appears to hamper the evaluation of this
2560 |macro in some cases.
2564 # Alternatively, set *(*(unsigned **) 0x2498) = 1
2565 # (or 0x5498 on PPC, 0xffffff8000002928 on x86_64, 0xffff049c on arm)
2566 manualhdrint $kgm_kdp_pkt_hostreboot
2572 |Reboot the remote target machine; not guaranteed to succeed.
2575 define kdpversionint
2576 # set up the manual KDP packet
2577 set manual_pkt.input = 0
2578 set manual_pkt.len = sizeof(kdp_version_req_t)
2579 set $kgm_pkt = (kdp_version_req_t *)&manual_pkt.data
2580 set $kgm_pkt->hdr.request = KDP_VERSION
2581 set $kgm_pkt->hdr.len = sizeof(kdp_version_req_t)
2582 set $kgm_pkt->hdr.is_reply = 0
2583 set $kgm_pkt->hdr.seq = 0
2584 set $kgm_pkt->hdr.key = 0
2585 set manual_pkt.input = 1
2586 # dummy to make sure manual packet is executed
2587 set $kgm_dummy = &_mh_execute_header
2588 set $kgm_pkt = (kdp_version_reply_t *)&manual_pkt.data
2589 set $kgm_kdp_version = $kgm_pkt->version
2590 set $kgm_kdp_feature = $kgm_pkt->feature
2595 printf "KDP VERSION = %d, FEATURE = 0x%x\n", $kgm_kdp_version, $kgm_kdp_feature
2598 document kdp-version
2600 |Get the KDP protocol version being used by the kernel.
2604 # set up the manual KDP packet
2605 set manual_pkt.input = 0
2607 set manual_pkt.len = sizeof(kdp_dumpinfo_req_t)
2608 set $kgm_pkt = (kdp_dumpinfo_req_t *)manual_pkt.data
2609 set $kgm_pkt->hdr.request = KDP_DUMPINFO
2610 set $kgm_pkt->hdr.len = sizeof(kdp_dumpinfo_req_t)
2611 set $kgm_pkt->hdr.is_reply = 0
2612 set $kgm_pkt->hdr.seq = 0
2613 set $kgm_pkt->hdr.key = 0
2614 set $kgm_pkt->type = $arg0
2615 set $kgm_pkt->name = ""
2616 set $kgm_pkt->destip = ""
2617 set $kgm_pkt->routerip = ""
2618 set $kgm_pkt->port = 0
2621 set $kgm_pkt->name = "$arg1"
2624 set $kgm_pkt->destip = "$arg2"
2627 set $kgm_pkt->routerip = "$arg3"
2630 set $kgm_pkt->port = $arg4
2633 set manual_pkt.input = 1
2634 # dummy to make sure manual packet is executed
2635 set $kgm_dummy = &_mh_execute_header
2640 dumpinfoint KDP_DUMPINFO_CORE $arg1 $arg0
2642 dumpinfoint KDP_DUMPINFO_CORE \0 $arg0
2647 Syntax: sendcore <IP address> [filename]
2648 |Configure the kernel to transmit a kernel coredump to a server (kdumpd)
2649 |at the specified IP address. This is useful when the remote target has
2650 |not been previously configured to transmit coredumps, and you wish to
2651 |preserve kernel state for later examination. NOTE: You must issue a "continue"
2652 |command after using this macro to trigger the kernel coredump. The kernel
2653 |will resume waiting in the debugger after completion of the coredump. You
2654 |may disable coredumps by executing the "disablecore" macro. You can
2655 |optionally specify the filename to be used for the generated core file.
2660 dumpinfoint KDP_DUMPINFO_SYSTEMLOG $arg1 $arg0
2662 dumpinfoint KDP_DUMPINFO_SYSTEMLOG \0 $arg0
2667 Syntax: sendsyslog <IP address> [filename]
2668 |Configure the kernel to transmit a kernel system log to a server (kdumpd)
2669 |at the specified IP address. NOTE: You must issue a "continue"
2670 |command after using this macro to trigger the kernel system log. The kernel
2671 |will resume waiting in the debugger after completion. You can optionally
2672 |specify the name to be used for the generated system log.
2678 dumpinfoint KDP_DUMPINFO_PANICLOG $arg1 $arg0
2680 dumpinfoint KDP_DUMPINFO_PANICLOG \0 $arg0
2683 printf "No panic log available.\n"
2687 document sendpaniclog
2688 Syntax: sendpaniclog <IP address> [filename]
2689 |Configure the kernel to transmit a kernel paniclog to a server (kdumpd)
2690 |at the specified IP address. NOTE: You must issue a "continue"
2691 |command after using this macro to trigger the kernel panic log. The kernel
2692 |will resume waiting in the debugger after completion. You can optionally
2693 |specify the name to be used for the generated panic log.
2697 dumpinfoint KDP_DUMPINFO_GETINFO
2698 set $kgm_dumpinfo = (kdp_dumpinfo_reply_t *) manual_pkt.data
2699 if $kgm_dumpinfo->type & KDP_DUMPINFO_REBOOT
2700 printf "System will reboot after kernel info gets dumped.\n"
2702 printf "Sysem will not reboot after kernel info gets dumped.\n"
2704 if $kgm_dumpinfo->type & KDP_DUMPINFO_NORESUME
2705 printf "System will allow a re-attach after a KDP disconnect.\n"
2707 printf "System will resume after a KDP disconnect.\n"
2709 set $kgm_dumpinfo_type = $kgm_dumpinfo->type & KDP_DUMPINFO_MASK
2710 if $kgm_dumpinfo_type == KDP_DUMPINFO_DISABLE
2711 printf "Kernel not setup for remote dumps.\n"
2713 printf "Remote dump type: "
2714 if $kgm_dumpinfo_type == KDP_DUMPINFO_CORE
2715 printf "Core file\n"
2717 if $kgm_dumpinfo_type == KDP_DUMPINFO_PANICLOG
2718 printf "Panic log\n"
2720 if $kgm_dumpinfo_type == KDP_DUMPINFO_SYSTEMLOG
2721 printf "System log\n"
2725 if $kgm_dumpinfo->name[0] == '\0'
2726 printf "(autogenerated)\n"
2728 printf "%s\n", $kgm_dumpinfo->name
2731 printf "Network Info: %s[%d] ", $kgm_dumpinfo->destip, $kgm_dumpinfo->port
2732 if $kgm_dumpinfo->routerip[0] == '\0'
2735 printf "Router: %s\n", $kgm_dumpinfo->routerip
2740 document getdumpinfo
2742 |Retrieve the current remote dump settings.
2746 dumpinfoint KDP_DUMPINFO_SETINFO $arg0 $arg1 $arg2 $arg3
2749 document setdumpinfo
2750 Syntax: setdumpinfo <filename> <ip> <router> <port>
2751 |Configure the current remote dump settings. Specify \0 if you
2752 |want to use the defaults (filename) or previously configured
2753 |settings (ip/router). Specify 0 for the port if you wish to
2754 |use the previously configured/default setting for that.
2758 dumpinfoint KDP_DUMPINFO_DISABLE
2761 document disablecore
2763 |Reconfigures the kernel so that it no longer transmits kernel coredumps. This
2764 |complements the "sendcore" macro, but it may be used if the kernel has been
2765 |configured to transmit coredumps through boot-args as well.
2768 define switchtocorethread
2769 set $newact = (struct thread *) $arg0
2771 if ($newact->kernel_stack == 0)
2772 echo This thread does not have a stack.\n
2774 output/a (unsigned) $newact.continuation
2777 if ($kgm_mtype == $kgm_mtype_ppc)
2778 loadcontext $newact->machine->pcb
2780 set $pc = $newact->machine->pcb.save_srr0
2782 if (($kgm_mtype & $kgm_mtype_x86_mask) == $kgm_mtype_x86_any)
2783 set $kgm_cstatep = (struct x86_kernel_state *) \
2784 ($newact->kernel_stack + kernel_stack_size \
2785 - sizeof(struct x86_kernel_state))
2786 loadcontext $kgm_cstatep
2789 echo switchtocorethread not supported on this architecture\n
2796 document switchtocorethread
2797 Syntax: switchtocorethread <address of activation>
2798 | The corefile equivalent of "switchtoact". When debugging a kernel coredump
2799 | file, this command can be used to examine the execution context and stack
2800 | trace for a given thread activation. For example, to view the backtrace
2801 | for a thread issue "switchtocorethread <address>", followed by "bt".
2802 | Before resuming execution, issue a "resetcorectx" command, to
2803 | return to the original execution context. Note that this command
2804 | requires gdb support, as documented in Radar 3401283.
2809 if ($kgm_mtype == $kgm_mtype_ppc)
2810 set $kgm_contextp = (struct savearea *) $arg0
2811 set $pc = $kgm_contextp.save_srr0
2812 set $r1 = $kgm_contextp.save_r1
2813 set $lr = $kgm_contextp.save_lr
2815 set $r2 = $kgm_contextp.save_r2
2816 set $r3 = $kgm_contextp.save_r3
2817 set $r4 = $kgm_contextp.save_r4
2818 set $r5 = $kgm_contextp.save_r5
2819 set $r6 = $kgm_contextp.save_r6
2820 set $r7 = $kgm_contextp.save_r7
2821 set $r8 = $kgm_contextp.save_r8
2822 set $r9 = $kgm_contextp.save_r9
2823 set $r10 = $kgm_contextp.save_r10
2824 set $r11 = $kgm_contextp.save_r11
2825 set $r12 = $kgm_contextp.save_r12
2826 set $r13 = $kgm_contextp.save_r13
2827 set $r14 = $kgm_contextp.save_r14
2828 set $r15 = $kgm_contextp.save_r15
2829 set $r16 = $kgm_contextp.save_r16
2830 set $r17 = $kgm_contextp.save_r17
2831 set $r18 = $kgm_contextp.save_r18
2832 set $r19 = $kgm_contextp.save_r19
2833 set $r20 = $kgm_contextp.save_r20
2834 set $r21 = $kgm_contextp.save_r21
2835 set $r22 = $kgm_contextp.save_r22
2836 set $r23 = $kgm_contextp.save_r23
2837 set $r24 = $kgm_contextp.save_r24
2838 set $r25 = $kgm_contextp.save_r25
2839 set $r26 = $kgm_contextp.save_r26
2840 set $r27 = $kgm_contextp.save_r27
2841 set $r28 = $kgm_contextp.save_r28
2842 set $r29 = $kgm_contextp.save_r29
2843 set $r30 = $kgm_contextp.save_r30
2844 set $r31 = $kgm_contextp.save_r31
2846 set $cr = $kgm_contextp.save_cr
2847 set $ctr = $kgm_contextp.save_ctr
2849 if ($kgm_mtype == $kgm_mtype_i386)
2850 set $kgm_contextp = (struct x86_kernel_state *) $arg0
2851 set $ebx = $kgm_contextp->k_ebx
2852 set $ebp = $kgm_contextp->k_ebp
2853 set $edi = $kgm_contextp->k_edi
2854 set $esi = $kgm_contextp->k_esi
2855 set $eip = $kgm_contextp->k_eip
2856 set $pc = $kgm_contextp->k_eip
2858 if ($kgm_mtype == $kgm_mtype_x86_64)
2859 set $kgm_contextp = (struct x86_kernel_state *) $arg0
2860 set $rbx = $kgm_contextp->k_rbx
2861 set $rbp = $kgm_contextp->k_rbp
2862 set $r12 = $kgm_contextp->k_r12
2863 set $r13 = $kgm_contextp->k_r13
2864 set $r14 = $kgm_contextp->k_r14
2865 set $r15 = $kgm_contextp->k_r15
2866 set $rip = $kgm_contextp->k_rip
2867 set $pc = $kgm_contextp->k_rip
2869 echo loadcontext not supported on this architecture\n
2877 if ($kgm_mtype == $kgm_mtype_ppc)
2878 set $kgm_corecontext = (struct savearea *) kdp.saved_state
2879 loadcontext $kgm_corecontext
2881 if ($kgm_mtype == $kgm_mtype_i386)
2882 set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
2883 set $ebx = $kdpstatep->ebx
2884 set $ebp = $kdpstatep->ebp
2885 set $edi = $kdpstatep->edi
2886 set $esi = $kdpstatep->esi
2887 set $eip = $kdpstatep->eip
2888 set $eax = $kdpstatep->eax
2889 set $ecx = $kdpstatep->ecx
2890 set $edx = $kdpstatep->edx
2893 set $pc = $kdpstatep->eip
2896 echo resetcorectx not supported on this architecture\n
2902 document resetcorectx
2903 Syntax: resetcorectx
2904 | The corefile equivalent of "resetctx". Returns to the original
2905 | execution context (that of the active thread at the time of the NMI or
2906 | panic). This command should be issued if you wish to resume
2907 | execution after using the "switchtocorethread" command.
2910 #Helper function for "showallgdbstacks"
2912 define showgdbthread
2913 printf " 0x%08x ", $arg0
2914 set $kgm_thread = *(struct thread *)$arg0
2915 printf "0x%08x ", $arg0
2916 printf "%3d ", $kgm_thread.sched_pri
2917 set $kgm_state = $kgm_thread.state
2918 if $kgm_state & 0x80
2921 if $kgm_state & 0x40
2924 if $kgm_state & 0x20
2927 if $kgm_state & 0x10
2930 if $kgm_state & 0x08
2933 if $kgm_state & 0x04
2936 if $kgm_state & 0x02
2939 if $kgm_state & 0x01
2941 printf "0x%08x ", $kgm_thread.wait_queue
2942 output /a (unsigned) $kgm_thread.wait_event
2943 if ($kgm_thread.uthread != 0)
2944 set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
2945 if ($kgm_uthread->uu_wmesg != 0)
2946 printf " \"%s\"", $kgm_uthread->uu_wmesg
2951 if ($kgm_thread.kernel_stack != 0)
2952 if ($kgm_thread.reserved_stack != 0)
2953 printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
2955 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
2956 if ($kgm_mtype == $kgm_mtype_ppc)
2957 set $mysp = $kgm_thread.machine.pcb->save_r1
2959 if ($kgm_mtype == $kgm_mtype_i386)
2960 set $kgm_statep = (struct x86_kernel_state *) \
2961 ($kgm_thread->kernel_stack + kernel_stack_size \
2962 - sizeof(struct x86_kernel_state))
2963 set $mysp = $kgm_statep->k_ebp
2965 if ($kgm_mtype == $kgm_mtype_arm)
2966 if (((unsigned long)$r7 < ((unsigned long) ($kgm_thread->kernel_stack+kernel_stack_size))) \
2967 && ((unsigned long)$r7 > (unsigned long) ($kgm_thread->kernel_stack)))
2970 set $kgm_statep = (struct arm_saved_state *)$kgm_thread.machine.kstackptr
2971 set $mysp = $kgm_statep->r[7]
2975 printf "\n\t\tstacktop=0x%08x", $mysp
2979 switchtocorethread $arg0
2983 printf "\n\t\t\tcontinuation="
2984 output /a (unsigned) $kgm_thread.continuation
2992 #Use of this macro is currently (8/04) blocked by the fact that gdb
2993 #stops evaluating macros when encountering an error, such as a failure
2994 #to read memory from a certain location. Until this issue (described in
2995 #3758949) is addressed, evaluation of this macro may stop upon
2996 #encountering such an error.
2998 define showallgdbstacks
2999 set $kgm_head_taskp = &tasks
3000 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
3001 while $kgm_taskp != $kgm_head_taskp
3003 showtaskint $kgm_taskp
3004 set $kgm_head_actp = &($kgm_taskp->threads)
3005 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
3006 while $kgm_actp != $kgm_head_actp
3008 showgdbthread $kgm_actp 1 0
3009 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
3012 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
3017 document showallgdbstacks
3018 Syntax: showallgdbstacks
3019 | An alternative to "showallstacks". Iterates through the task list and
3020 | displays a gdb generated backtrace for each kernel thread. It is
3021 | advantageous in that it is much faster than "showallstacks", and
3022 | decodes function call arguments and displays source level traces, but
3023 | it has the drawback that it doesn't determine if frames belong to
3024 | functions from kernel extensions, as with "showallstacks".
3025 | This command may terminate prematurely because of a gdb bug
3026 | (Radar 3758949), which stops macro evaluation on memory read
3030 define showallgdbcorestacks
3032 set $kgm_head_taskp = &tasks
3033 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
3034 while $kgm_taskp != $kgm_head_taskp
3036 showtaskint $kgm_taskp
3037 set $kgm_head_actp = &($kgm_taskp->threads)
3038 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
3039 while $kgm_actp != $kgm_head_actp
3041 showgdbthread $kgm_actp 1 1
3042 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
3045 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
3051 document showallgdbcorestacks
3052 Syntax: showallgdbcorestacks
3053 |Corefile version of "showallgdbstacks"
3057 define switchtouserthread
3059 if ($kgm_mtype == $kgm_mtype_ppc)
3060 if ($kdp_act_counter == 0)
3061 set $kdpstate = (struct savearea *) kdp.saved_state
3063 set $kdp_act_counter = $kdp_act_counter + 1
3064 set $newact = (struct thread *) $arg0
3066 set $checkpc = $newact->machine->upcb.save_srr0
3068 echo This activation does not appear to have
3069 echo \20 a valid user context.\n
3071 set (struct savearea *) kdp.saved_state=$newact->machine->upcb
3073 #flush and update seem to be executed lazily by gdb on Tiger, hence the
3074 #repeated invocations - see 3743135
3076 # This works because the new pmap is used only for reads
3077 set kdp_pmap = $newact->task->map->pmap
3082 echo switchtouserthread not implemented for this architecture.\n
3086 document switchtouserthread
3087 Syntax: switchtouserthread <address of thread>
3088 | Analogous to switchtoact, but switches to the user context of a
3089 | specified thread address. Similar to the "showuserstack"
3090 | command, but this command does not return gdb to the kernel context
3091 | immediately. This is to assist with the following (rather risky)
3092 | manoeuvre - upon switching to the user context and virtual address
3093 | space, the user may choose to call remove-symbol-file on the
3094 | mach_kernel symbol file, and then add-symbol-file on the user space
3095 | binary's symfile. gdb can then generate symbolic backtraces
3096 | for the user space thread. To return to the
3097 | kernel context and virtual address space, the process must be
3098 | reversed, i.e. call remove-symbol-file on the user space symbols, and
3099 | then add-symbol-file on the appropriate mach_kernel, and issue the
3100 | "resetstacks" command. Note that gdb may not react kindly to all these
3101 | symbol file switches. The same restrictions that apply to "showuserstack"
3102 | apply here - pages that have been paged out cannot be read while in the
3103 | debugger context, so backtraces may terminate early.
3104 | If the virtual addresses in the stack trace do not conflict with those
3105 | of symbols in the kernel's address space, it may be sufficient to
3106 | just do an add-symbol-file on the user space binary's symbol file.
3107 | Note that while this command works on Panther's gdb, an issue
3108 | with Tiger gdb (3743135) appears to hamper the evaluation of this
3109 | macro in some cases.
3112 define showmetaclass
3113 set $kgm_metaclassp = (OSMetaClass *)$arg0
3114 printf "%-5d", $kgm_metaclassp->instanceCount
3115 printf "x %5d bytes", $kgm_metaclassp->classSize
3116 printf " %s\n", $kgm_metaclassp->className->string
3120 printf "\"%s\"", ((OSString *)$arg0)->string
3124 printf "%lld", ((OSNumber *)$arg0)->value
3128 if ($arg0 == gOSBooleanFalse)
3135 define showdatabytes
3136 set $kgm_data = (OSData *)$arg0
3139 set $kgm_datap = (const unsigned char *) $kgm_data->data
3141 while ( $kgm_idx < $kgm_data->length )
3142 printf "%02X", *$kgm_datap
3143 set $kgm_datap = $kgm_datap + 1
3144 set $kgm_idx = $kgm_idx + 1
3150 set $kgm_data = (OSData *)$arg0
3153 set $kgm_datap = (const unsigned char *) $kgm_data->data
3155 set $kgm_printstr = 0
3156 if (0 == (3 & (unsigned int)$kgm_datap) && ($kgm_data->length >= 3))
3157 set $kgm_bytes = *(unsigned int *) $kgm_datap
3158 if (0xffff0000 & $kgm_bytes)
3160 set $kgm_printstr = 1
3161 while ($kgm_idx++ < 4)
3162 set $kgm_bytes = $kgm_bytes >> 8
3163 set $kgm_char = 0xff & $kgm_bytes
3164 if ($kgm_char && (($kgm_char < 0x20) || ($kgm_char > 0x7e)))
3165 set $kgm_printstr = 0
3174 while ($kgm_idx < $kgm_data->length)
3175 set $kgm_char = $kgm_datap[$kgm_idx++]
3177 if (0 == $kgm_quoted)
3185 printf "%c", $kgm_char
3197 if (0 == (3 & (unsigned int)$kgm_datap))
3198 while (($kgm_idx + 3) <= $kgm_data->length)
3199 printf "%08x", *(unsigned int *) &$kgm_datap[$kgm_idx]
3200 set $kgm_idx = $kgm_idx + 4
3203 while ($kgm_idx < $kgm_data->length)
3204 printf "%02x", $kgm_datap[$kgm_idx++]
3210 define showdictionaryint
3211 set $kgm$arg0_dict = (OSDictionary *)$arg1
3214 set $kgm$arg0_idx = 0
3215 while ($kgm$arg0_idx < $kgm$arg0_dict->count)
3216 set $kgm_obj = $kgm$arg0_dict->dictionary[$kgm$arg0_idx].key
3217 showobjectint _$arg0 $kgm_obj
3219 set $kgm_obj = $kgm$arg0_dict->dictionary[$kgm$arg0_idx++].value
3220 showobjectint _$arg0 $kgm_obj
3221 if ($kgm$arg0_idx < $kgm$arg0_dict->count)
3230 while ($kgm_idx < $arg0)
3231 if ($arg1 & (1 << $kgm_idx++))
3239 define showregdictionary
3240 indent $kgm_reg_depth+2 $arg1
3243 set $kgm_reg_idx = 0
3244 while ($kgm_reg_idx < $arg0->count)
3245 indent $kgm_reg_depth+2 $arg1
3247 set $kgm_obj = $arg0->dictionary[$kgm_reg_idx].key
3248 showobjectint _ $kgm_obj
3251 set $kgm_obj = $arg0->dictionary[$kgm_reg_idx++].value
3252 showobjectint _ $kgm_obj
3255 indent $kgm_reg_depth+2 $arg1
3260 define showarraysetint
3261 set $kgm$arg0_array = (OSArray *)$arg1
3263 set $kgm$arg0_idx = 0
3264 while ($kgm$arg0_idx < $kgm$arg0_array->count)
3265 set $kgm_obj = $kgm$arg0_array->array[$kgm$arg0_idx++]
3266 showobjectint _$arg0 $kgm_obj
3267 if ($kgm$arg0_idx < $kgm$arg0_array->count)
3275 showarraysetint $arg0 $arg1
3280 set $kgm_array = ((OSSet *)$arg1)->members
3282 showarraysetint $arg0 $kgm_array
3287 define showobjectint
3288 set $kgm_obj = (OSObject *) $arg1
3289 set $kgm_vt = *((void **) $arg1)
3291 if ($kgm_lp64 || $kgm_mtype == $kgm_mtype_arm)
3292 set $kgm_vt = $kgm_vt - 2 * sizeof(void *)
3295 if ($kgm_show_object_addrs)
3299 output /a (unsigned long) $kgm_vt
3300 if ($kgm_show_object_retain)
3301 printf ", retain count %d, container retain %d", (0xffff & $kgm_obj->retainCount), $kgm_obj->retainCount >> 16
3306 # No multiple-inheritance
3308 if ($kgm_vt == &_ZTV8OSString)
3312 if ($kgm_vt == &_ZTV8OSSymbol)
3316 if ($kgm_vt == &_ZTV8OSNumber)
3320 if ($kgm_vt == &_ZTV6OSData)
3321 if $kgm_show_data_alwaysbytes == 1
3328 if ($kgm_vt == &_ZTV9OSBoolean)
3332 if ($kgm_vt == &_ZTV12OSDictionary)
3333 showdictionaryint _$arg0 $arg1
3336 if ($kgm_vt == &_ZTV7OSArray)
3337 showarrayint _$arg0 $arg1
3340 if ($kgm_vt == &_ZTV5OSSet)
3341 showsetint _$arg0 $arg1
3345 if ($kgm_shown != 1)
3346 if ($kgm_show_object_addrs == 0)
3350 output /a (unsigned long) $kgm_vt
3357 set $kgm_save = $kgm_show_object_addrs
3358 set $kgm_show_object_addrs = 1
3359 set $kgm_show_object_retain = 1
3360 showobjectint _ $arg0
3361 set $kgm_show_object_addrs = $kgm_save
3362 set $kgm_show_object_retain = 0
3366 Syntax: (gdb) showobject <object address>
3367 | Show info about an OSObject - its vtable ptr and retain count.
3368 | If the object is a simple container class, more info will be shown.
3372 set $kgm_dictp = (OSDictionary *)$arg0
3373 set $kgm_keyp = (const OSSymbol *)$arg1
3376 while (($kgm_idx < $kgm_dictp->count) && ($kgm_result == 0))
3377 if ($kgm_keyp == $kgm_dictp->dictionary[$kgm_idx].key)
3378 set $kgm_result = $kgm_dictp->dictionary[$kgm_idx].value
3380 set $kgm_idx = $kgm_idx + 1
3385 define _registryentryrecurseinit
3386 set $kgm_re = (IOService *)$arg1
3387 set $kgm$arg0_stack = (unsigned long long) $arg2
3390 set $kgm$arg0_stack = $kgm$arg0_stack | (1ULL << $kgm_reg_depth)
3392 set $kgm$arg0_stack = $kgm$arg0_stack & ~(1ULL << $kgm_reg_depth)
3395 dictget $kgm_re->fRegistryTable $kgm_childkey
3396 set $kgm$arg0_child_array = (OSArray *) $kgm_result
3398 if ($kgm$arg0_child_array)
3399 set $kgm$arg0_child_count = $kgm$arg0_child_array->count
3401 set $kgm$arg0_child_count = 0
3404 if ($kgm$arg0_child_count)
3405 set $kgm$arg0_stack = $kgm$arg0_stack | (2ULL << $kgm_reg_depth)
3407 set $kgm$arg0_stack = $kgm$arg0_stack & ~(2ULL << $kgm_reg_depth)
3411 define findregistryentryrecurse
3412 set $kgm_registry_entry = 0
3413 _registryentryrecurseinit $arg0 $arg1 $arg2 $arg3
3415 dictget $kgm_re->fRegistryTable $kgm_namekey
3416 if ($kgm_result == 0)
3417 dictget $kgm_re->fRegistryTable gIONameKey
3419 if ($kgm_result == 0)
3420 dictget $kgm_re->fPropertyTable gIOClassKey
3423 if ($kgm_result != 0)
3424 set $str = ((OSString *) $kgm_result)->string
3425 strcmp_nomalloc $str $kgm_reg_find_str0 $kgm_reg_find_str1 $kgm_reg_find_str2 $kgm_reg_find_str3 $kgm_reg_find_str4 $kgm_reg_find_str5 $kgm_reg_find_str6 $kgm_reg_find_str7 $kgm_reg_find_str8
3426 if $kgm_findregistry_verbose
3430 if $kgm_strcmp_result == 0
3431 if $kgm_findregistry_verbose
3432 printf "\n%s:\n | ", ((OSString *) $kgm_result)->string
3438 # if we want to show everything, then don't populate $kgm_registry_entry
3439 if !$kgm_findregistry_continue
3440 set $kgm_registry_entry = $kgm_re
3446 if (!$kgm_registry_entry && ($kgm$arg0_child_count != 0))
3447 set $kgm_reg_depth = $kgm_reg_depth + 1
3448 set $kgm$arg0_child_idx = 0
3450 while ($kgm$arg0_child_idx < $kgm$arg0_child_count)
3451 set $kgm_re = $kgm$arg0_child_array->array[$kgm$arg0_child_idx++]
3452 set $kgm_more_sib = ($kgm$arg0_child_idx < $kgm$arg0_child_count)
3453 if $kgm_reg_depth >= $kgm_reg_depth_max + 1
3456 findregistryentryrecurse _$arg0 $kgm_re $kgm$arg0_stack $kgm_more_sib
3457 if $kgm_registry_entry
3461 set $kgm_reg_depth = $kgm_reg_depth - 1
3465 define findregdictvalue
3466 set $kgm_registry_value = 0
3467 set $kgm_reg_idx = 0
3468 while ($kgm_reg_idx < $arg0->count)
3469 set $kgm_obj = $arg0->dictionary + $kgm_reg_idx
3470 set $str = ((OSString *)$kgm_obj->key)->string
3471 strcmp_nomalloc $str $kgm_reg_find_str0 $kgm_reg_find_str1 $kgm_reg_find_str2 $kgm_reg_find_str3 $kgm_reg_find_str4 $kgm_reg_find_str5 $kgm_reg_find_str6 $kgm_reg_find_str7 $kgm_reg_find_str8
3473 if $kgm_strcmp_result == 0
3474 set $kgm_registry_value = $kgm_obj->value
3475 if $kgm_findregistry_verbose
3476 showobject $kgm_registry_value
3477 print $kgm_registry_value
3481 set $kgm_reg_idx = $kgm_reg_idx + 1
3485 define setfindregistrystr
3486 set $kgm_reg_find_str0 = 0
3487 set $kgm_reg_find_str1 = 0
3488 set $kgm_reg_find_str2 = 0
3489 set $kgm_reg_find_str3 = 0
3490 set $kgm_reg_find_str4 = 0
3491 set $kgm_reg_find_str5 = 0
3492 set $kgm_reg_find_str6 = 0
3493 set $kgm_reg_find_str7 = 0
3494 set $kgm_reg_find_str8 = 0
3497 set $kgm_reg_find_str0 = $arg0
3500 set $kgm_reg_find_str1 = $arg1
3503 set $kgm_reg_find_str2 = $arg2
3506 set $kgm_reg_find_str3 = $arg3
3509 set $kgm_reg_find_str4 = $arg4
3512 set $kgm_reg_find_str5 = $arg5
3515 set $kgm_reg_find_str6 = $arg6
3518 set $kgm_reg_find_str7 = $arg7
3521 set $kgm_reg_find_str8 = $arg8
3525 document setfindregistrystr
3526 Syntax: (gdb) setfindregistrystr [a] [b] [c] [d] [e] [f] [g] [h] [i]
3527 | Store an encoded string into up to 9 arguments for use by
3528 | findregistryprop or findregistryentry. The arguments are created
3529 | through calls to strcmp_arg_pack64
3532 define _findregistryprop
3533 set $reg = (IOService *) $arg0
3534 set $kgm_props = $reg->fPropertyTable
3535 set $kgm_findregistry_verbose = 0
3537 findregdictvalue $kgm_props
3540 define findregistryprop
3541 set $reg = (IOService *) $arg0
3542 set $kgm_props = $reg->fPropertyTable
3544 set $kgm_findregistry_verbose = 1
3545 findregdictvalue $kgm_props
3548 document findregistryprop
3549 Syntax: (gdb) findregistryprop <entry>
3550 | Given a registry entry, print out the contents for the property that matches
3551 | the encoded string specified via setfindregistrystr.
3553 | For example, the following will print out the "intel-pic" property stored in
3554 | the AppleACPIPlatformExpert registry entry $pe_entry:
3555 | strcmp_arg_pack64 'i' 'n' 't' 'e' 'l' '-' 'p' 'i'
3556 | set $intel_pi = $kgm_strcmp_arg
3557 | strcmp_arg_pack64 'c' 0 0 0 0 0 0 0
3558 | set $c = $kgm_strcmp_arg
3559 | setfindregistrystr $intel_pi $c
3560 | findregistryprop $pe_entry
3563 define findregistryentryint
3565 set $kgm_reg_plane = (IORegistryPlane *) gIOServicePlane
3569 printf "Please load kgmacros after KDP attaching to the target.\n"
3571 set $kgm_namekey = (OSSymbol *) $kgm_reg_plane->nameKey
3572 set $kgm_childkey = (OSSymbol *) $kgm_reg_plane->keys[1]
3573 if $kgm_findregistry_verbose
3576 findregistryentryrecurse _ $arg0 0 0
3580 define _findregistryentry
3581 set $kgm_findregistry_verbose = 0
3582 set $kgm_findregistry_continue = 0
3583 set $kgm_reg_depth = 0
3585 findregistryentryint gRegistryRoot
3588 define findregistryentry
3589 set $kgm_findregistry_verbose = 1
3590 set $kgm_findregistry_continue = 0
3591 set $kgm_reg_depth = 0
3593 findregistryentryint gRegistryRoot
3596 define findregistryentries
3597 set $kgm_findregistry_verbose = 1
3598 set $kgm_findregistry_continue = 1
3599 set $kgm_reg_depth = 0
3601 findregistryentryint gRegistryRoot
3604 document findregistryentry
3605 Syntax: (gdb) findregistryentry
3606 | Search for a registry entry that matches the encoded string specified through
3607 | setfindregistrystr. You can alter the search depth through use of
3608 | $kgm_reg_depth_max.
3610 | For example, the following will pull out the AppleACPIPlatformExpert registry
3612 | strcmp_arg_pack64 'A' 'p' 'p' 'l' 'e' 'A' 'C' 'P'
3613 | set $AppleACP = $kgm_strcmp_arg
3614 | strcmp_arg_pack64 'I' 'P' 'l' 'a' 't' 'f' 'o' 'r'
3615 | set $IPlatfor = $kgm_strcmp_arg
3616 | strcmp_arg_pack64 'm' 'E' 'x' 'p' 'e' 'r' 't' 0
3617 | set $mExpert = $kgm_strcmp_arg
3618 | setfindregistrystr $AppleACP $IPlatfor $mExpert
3622 document findregistryentries
3623 Syntax: (gdb) findregistryentries
3624 | Search for all registry entries that match the encoded string specified through
3625 | setfindregistrystr. You can alter the search depth through use of
3626 | $kgm_reg_depth_max. See findregistryentry for an example of how to encode a string.
3630 define showregistryentryrecurse
3631 _registryentryrecurseinit $arg0 $arg1 $arg2 $arg3
3633 indent $kgm_reg_depth $kgm$arg0_stack
3636 dictget $kgm_re->fRegistryTable $kgm_namekey
3637 if ($kgm_result == 0)
3638 dictget $kgm_re->fRegistryTable gIONameKey
3640 if ($kgm_result == 0)
3641 dictget $kgm_re->fPropertyTable gIOClassKey
3644 if ($kgm_result != 0)
3645 printf "%s", ((OSString *)$kgm_result)->string
3647 if (((IOService*)$kgm_re)->pwrMgt && ((IOService*)$kgm_re)->pwrMgt->Name)
3648 printf "%s", ((IOService*)$kgm_re)->pwrMgt->Name
3650 # printf ", guessclass "
3651 # guessclass $kgm_re
3659 printf ", id 0x%llx, ", $kgm_re->IORegistryEntry::reserved->fRegistryEntryID
3661 set $kgm_vt = (unsigned long) *(void**) $kgm_re
3662 if ($kgm_lp64 || $kgm_mtype == $kgm_mtype_arm)
3663 set $kgm_vt = $kgm_vt - 2 * sizeof(void *)
3667 if ($kgm_vt != &_ZTV15IORegistryEntry)
3669 set $kgm_state = $kgm_re->__state[0]
3670 # kIOServiceRegisteredState
3671 if (0 == ($kgm_state & 2))
3674 printf "registered, "
3675 # kIOServiceMatchedState
3676 if (0 == ($kgm_state & 4))
3680 # kIOServiceInactiveState
3684 printf "active, busy %d, retain count %d", (0xff & $kgm_re->__state[1]), (0xffff & $kgm_re->retainCount)
3688 if ($kgm_show_props)
3689 set $kgm_props = $kgm_re->fPropertyTable
3690 showregdictionary $kgm_props $kgm$arg0_stack
3694 if ($kgm$arg0_child_count != 0)
3696 set $kgm_reg_depth = $kgm_reg_depth + 1
3697 set $kgm$arg0_child_idx = 0
3699 while ($kgm$arg0_child_idx < $kgm$arg0_child_count)
3700 set $kgm_re = $kgm$arg0_child_array->array[$kgm$arg0_child_idx++]
3701 set $kgm_more_sib = ($kgm$arg0_child_idx < $kgm$arg0_child_count)
3702 if $kgm_reg_depth >= $kgm_reg_depth_max + 1
3705 showregistryentryrecurse _$arg0 $kgm_re $kgm$arg0_stack $kgm_more_sib
3708 set $kgm_reg_depth = $kgm_reg_depth - 1
3712 define showregistryentryint
3714 set $kgm_reg_plane = (IORegistryPlane *) gIOServicePlane
3718 printf "Please load kgmacros after KDP attaching to the target.\n"
3720 set $kgm_namekey = (OSSymbol *) $kgm_reg_plane->nameKey
3721 set $kgm_childkey = (OSSymbol *) $kgm_reg_plane->keys[1]
3722 showregistryentryrecurse _ $arg0 0 0
3727 set $kgm_reg_depth = 0
3728 set $kgm_show_props = 0
3729 showregistryentryint gRegistryRoot
3731 document showregistry
3732 Syntax: (gdb) showregistry
3733 | Show info about all registry entries in the current plane. You can specify the maximum
3734 | display depth with $kgm_reg_depth_max.
3737 define showregistryprops
3738 set $kgm_reg_depth = 0
3739 set $kgm_show_props = 1
3740 showregistryentryint gRegistryRoot
3742 document showregistryprops
3743 Syntax: (gdb) showregistryprops
3744 | Show info about all registry entries in the current plane, and their properties.
3745 | set $kgm_show_object_addrs = 1 and/or set $kgm_show_object_retain = 1 will display
3746 | more verbose information
3749 define showregistryentry
3750 set $kgm_reg_depth = 0
3751 set $kgm_show_props = 1
3752 showregistryentryint $arg0
3754 document showregistryentry
3755 Syntax: (gdb) showregistryentry <object address>
3756 | Show info about a registry entry; its properties and descendants in the current plane.
3759 define setregistryplane
3761 set $kgm_reg_plane = (IORegistryPlane *) $arg0
3763 showobjectint _ gIORegistryPlanes
3767 document setregistryplane
3768 Syntax: (gdb) setregistryplane <plane object address>
3769 | Set the plane to be used for the iokit registry macros. An argument of zero will
3770 | display known planes.
3774 set $kgm_classidx = 0
3775 set $kgm_lookvt = *((void **) $arg0)
3776 set $kgm_bestvt = (void *) 0
3777 set $kgm_bestidx = 0
3779 while $kgm_classidx < sAllClassesDict->count
3780 set $kgm_meta = (OSMetaClass *) sAllClassesDict->dictionary[$kgm_classidx].value
3782 set $kgm_vt = *((void **) $kgm_meta)
3784 if (($kgm_vt > $kgm_bestvt) && ($kgm_vt < $kgm_lookvt))
3785 set $kgm_bestvt = $kgm_vt
3786 set $kgm_bestidx = $kgm_classidx
3788 set $kgm_classidx = $kgm_classidx + 1
3790 printf "%s", sAllClassesDict->dictionary[$kgm_bestidx].key->string
3793 define showallclasses
3794 set $kgm_classidx = 0
3795 while $kgm_classidx < sAllClassesDict->count
3796 set $kgm_meta = (OSMetaClass *) sAllClassesDict->dictionary[$kgm_classidx++].value
3797 showmetaclass $kgm_meta
3801 document showallclasses
3802 Syntax: (gdb) showallclasses
3803 | Show the instance counts and ivar size of all OSObject subclasses. See ioclasscount man page for details.
3807 printf " Instance allocation = 0x%08lx = %4ld K\n", (int) debug_ivars_size, ((int) debug_ivars_size) / 1024
3808 printf "Container allocation = 0x%08lx = %4ld K\n", (int) debug_container_malloc_size, ((int) debug_container_malloc_size) / 1024
3809 printf " IOMalloc allocation = 0x%08lx = %4ld K\n", (int) debug_iomalloc_size, ((int) debug_iomalloc_size) / 1024
3810 printf " Pageable allocation = 0x%08lx = %4ld K\n", (vm_size_t) debug_iomallocpageable_size, ((vm_size_t) debug_iomallocpageable_size) / 1024
3813 document showioalloc
3814 Syntax: (gdb) showioalloc
3815 | Show some accounting of memory allocated by IOKit allocators. See ioalloccount man page for details.
3818 define showosobjecttracking
3819 set $kgm_next = (OSObjectTracking *) gOSObjectTrackList.next
3820 while $kgm_next != &gOSObjectTrackList
3821 set $obj = (OSObject *) ($kgm_next+1)
3824 while $kgm_idx < (sizeof($kgm_next->bt) / sizeof($kgm_next->bt[0]))
3825 if ((unsigned long) $kgm_next->bt[$kgm_idx] > (unsigned long) &last_kernel_symbol)
3826 showkmodaddr $kgm_next->bt[$kgm_idx]
3829 if ((unsigned long) $kgm_next->bt[$kgm_idx] > 0)
3830 output /a $kgm_next->bt[$kgm_idx]
3834 set $kgm_idx = $kgm_idx + 1
3837 set $kgm_next = (OSObjectTracking *) $kgm_next->link.next
3841 document showosobjecttracking
3842 Syntax: (gdb) showosobjecttracking
3843 | Show the list of tracked OSObject allocations with backtraces.
3844 | Boot with the kOSTraceObjectAlloc (0x00400000) io debug flag set.
3845 | Set gOSObjectTrackThread to 1 or a thread_t to capture new OSObjects allocated by a thread or all threads.
3849 set $kgm_readphysint_result = 0xBAD10AD
3850 # set up the manual KDP packet
3851 set manual_pkt.input = 0
3852 set manual_pkt.len = sizeof(kdp_readphysmem64_req_t)
3853 set $kgm_pkt = (kdp_readphysmem64_req_t *)&manual_pkt.data
3854 set $kgm_pkt->hdr.request = KDP_READPHYSMEM64
3855 set $kgm_pkt->hdr.len = sizeof(kdp_readphysmem64_req_t)
3856 set $kgm_pkt->hdr.is_reply = 0
3857 set $kgm_pkt->hdr.seq = 0
3858 set $kgm_pkt->hdr.key = 0
3859 set $kgm_pkt->address = (uint64_t)$arg0
3860 set $kgm_pkt->nbytes = $arg1 >> 3
3861 set $kgm_pkt->lcpu = $arg2
3862 set manual_pkt.input = 1
3863 # dummy to make sure manual packet is executed
3864 set $kgm_dummy = &_mh_execute_header
3865 set $kgm_pkt = (kdp_readphysmem64_reply_t *)&manual_pkt.data
3866 if ($kgm_pkt->error == 0)
3868 set $kgm_readphysint_result = *((uint8_t *)$kgm_pkt->data)
3871 set $kgm_readphysint_result = *((uint16_t *)$kgm_pkt->data)
3874 set $kgm_readphysint_result = *((uint32_t *)$kgm_pkt->data)
3877 set $kgm_readphysint_result = *((uint64_t *)$kgm_pkt->data)
3883 readphysint $arg0 8 $kgm_lcpu_self
3885 printf ":\t0x%02hhx\n", $kgm_readphysint_result
3886 set $kgm_readphys_result = (uint64_t)$kgm_readphysint_result
3890 readphysint $arg0 16 $kgm_lcpu_self
3892 printf ":\t0x%04hx\n", $kgm_readphysint_result
3893 set $kgm_readphys_result = (uint64_t)$kgm_readphysint_result
3897 readphysint $arg0 32 $kgm_lcpu_self
3899 printf ":\t0x%08x\n", $kgm_readphysint_result
3900 set $kgm_readphys_result = (uint64_t)$kgm_readphysint_result
3904 readphysint $arg0 64 $kgm_lcpu_self
3906 printf ":\t0x%016llx\n", $kgm_readphysint_result
3907 set $kgm_readphys_result = (uint64_t)$kgm_readphysint_result
3927 | The argument is interpreted as a physical address, and the 64-bit word
3928 | addressed is displayed. Saves 64-bit result in $kgm_readphys_result.
3932 # set up the manual KDP packet
3933 set manual_pkt.input = 0
3934 set manual_pkt.len = sizeof(kdp_writephysmem64_req_t)
3935 set $kgm_pkt = (kdp_writephysmem64_req_t *)&manual_pkt.data
3936 set $kgm_pkt->hdr.request = KDP_WRITEPHYSMEM64
3937 set $kgm_pkt->hdr.len = sizeof(kdp_writephysmem64_req_t)
3938 set $kgm_pkt->hdr.is_reply = 0
3939 set $kgm_pkt->hdr.seq = 0
3940 set $kgm_pkt->hdr.key = 0
3941 set $kgm_pkt->address = (uint64_t)$arg0
3942 set $kgm_pkt->nbytes = $arg1 >> 3
3943 set $kgm_pkt->lcpu = $arg3
3945 set *(uint8_t *)$kgm_pkt->data = (uint8_t)$arg2
3948 set *(uint16_t *)$kgm_pkt->data = (uint16_t)$arg2
3951 set *(uint32_t *)$kgm_pkt->data = (uint32_t)$arg2
3954 set *(uint64_t *)$kgm_pkt->data = (uint64_t)$arg2
3956 set manual_pkt.input = 1
3957 # dummy to make sure manual packet is executed
3958 set $kgm_dummy = &_mh_execute_header
3959 set $kgm_pkt = (kdp_writephysmem64_reply_t *)&manual_pkt.data
3960 set $kgm_writephysint_result = $kgm_pkt->error
3964 writephysint $arg0 8 $arg1 $kgm_lcpu_self
3968 writephysint $arg0 16 $arg1 $kgm_lcpu_self
3972 writephysint $arg0 32 $arg1 $kgm_lcpu_self
3976 writephysint $arg0 64 $arg1 $kgm_lcpu_self
3983 document writephys16
3987 document writephys32
3991 document writephys64
3992 | The argument is interpreted as a physical address, and the second argument is
3993 | written to that address as a 64-bit word.
3997 shell ls $arg0/* | xargs -n 1 echo add-symbol-file > /tmp/gdb-syms
3998 source /tmp/gdb-syms
3999 set $kgm_show_kmod_syms = 1
4002 document addkextsyms
4003 | Takes a directory of symbols for kexts generated with kextcache -y and loads them
4005 | (gdb) addkextsyms /path/to/symboldir
4008 define showprocfiles
4011 _showprocfiles $arg0
4013 printf "| Usage:\n|\n"
4017 document showprocfiles
4018 Syntax: (gdb) showprocfiles <proc_t>
4019 | Given a proc_t pointer, display the list of open file descriptors for the
4020 | referenced process.
4023 define _showprocheader
4024 printf "fd fileglob "
4026 printf " fg flags fg type fg data "
4029 printf "----- ----------"
4033 printf " ---------- -------- ----------"
4037 printf " -------------------\n"
4040 define _showprocfiles
4041 set $kgm_spf_filedesc = ((proc_t)$arg0)->p_fd
4042 set $kgm_spf_last = $kgm_spf_filedesc->fd_lastfile
4043 set $kgm_spf_ofiles = $kgm_spf_filedesc->fd_ofiles
4044 set $kgm_spf_count = 0
4045 while ($kgm_spf_count <= $kgm_spf_last)
4046 if ($kgm_spf_ofiles[$kgm_spf_count] == 0)
4047 # DEBUG: For files that were open, but are now closed
4048 # printf "%-5d FILEPROC_NULL\n", $kgm_spf_count
4050 # display fd #, fileglob address, fileglob flags
4051 set $kgm_spf_flags = $kgm_spf_ofiles[$kgm_spf_count].f_flags
4052 set $kgm_spf_fg = $kgm_spf_ofiles[$kgm_spf_count].f_fglob
4053 printf "%-5d ", $kgm_spf_count
4055 printf " 0x%08x ", $kgm_spf_flags
4056 # decode fileglob type
4057 set $kgm_spf_fgt = $kgm_spf_fg->fg_type
4058 if ($kgm_spf_fgt == 1)
4061 if ($kgm_spf_fgt == 2)
4064 if ($kgm_spf_fgt == 3)
4067 if ($kgm_spf_fgt == 4)
4070 if ($kgm_spf_fgt == 5)
4073 if ($kgm_spf_fgt == 6)
4076 if ($kgm_spf_fgt == 7)
4079 if ($kgm_spf_fgt < 1 || $kgm_spf_fgt > 7)
4080 printf "?: %-5d", $kgm_spf_fgt
4083 # display fileglob data address and decode interesting fact(s)
4084 # about data, if we know any
4085 set $kgm_spf_fgd = $kgm_spf_fg->fg_data
4087 showptr $kgm_spf_fgd
4089 if ($kgm_spf_fgt == 1)
4090 set $kgm_spf_name = ((struct vnode *)$kgm_spf_fgd)->v_name
4091 if ($kgm_spf_name == 0)
4094 printf "%s", $kgm_spf_name
4099 set $kgm_spf_count = $kgm_spf_count + 1
4104 # Show all the advisory file locks held by a process for each of the vnode
4105 # type files that it has open; do this by walking the per process open file
4106 # table and looking at any vnode type fileglob that has a non-NULL lock list
4107 # associated with it.
4109 define showproclocks
4111 _showproclocks $arg0
4113 printf "| Usage:\n|\n"
4117 document showproclocks
4118 Syntax: (gdb) showproclocks <proc_t>
4119 | Given a proc_t pointer, display the list of advisory file locks held by the
4120 | referenced process.
4123 define _showproclocks
4124 set $kgm_spl_filedesc = ((proc_t)$arg0)->p_fd
4125 set $kgm_spl_last = $kgm_spl_filedesc->fd_lastfile
4126 set $kgm_spl_ofiles = $kgm_spl_filedesc->fd_ofiles
4127 set $kgm_spl_count = 0
4128 set $kgm_spl_seen = 0
4129 while ($kgm_spl_count <= $kgm_spl_last)
4130 if ($kgm_spl_ofiles[$kgm_spl_count] == 0)
4131 # DEBUG: For files that were open, but are now closed
4132 # printf "%-5d FILEPROC_NULL\n", $kgm_spl_count
4134 set $kgm_spl_fg = $kgm_spl_ofiles[$kgm_spl_count].f_fglob
4135 # decode fileglob type
4136 set $kgm_spl_fgt = $kgm_spl_fg->fg_type
4137 if ($kgm_spl_fgt == 1)
4138 set $kgm_spl_fgd = $kgm_spl_fg->fg_data
4139 set $kgm_spl_name = ((struct vnode *)$kgm_spl_fgd)->v_name
4140 set $kgm_spl_vnode = ((vnode_t)$kgm_spl_fgd)
4141 set $kgm_spl_lockiter = $kgm_spl_vnode->v_lockf
4142 if ($kgm_spl_lockiter != 0)
4143 if ($kgm_spl_seen == 0)
4144 _showvnodelockheader
4146 set $kgm_spl_seen = $kgm_spl_seen + 1
4147 printf "( fd %d, name ", $kgm_spl_count
4148 if ($kgm_spl_name == 0)
4151 printf "%s )\n", $kgm_spl_name
4153 _showvnodelocks $kgm_spl_fgd
4157 set $kgm_spl_count = $kgm_spf_count + 1
4159 printf "%d total locks for ", $kgm_spl_seen
4165 set $kgm_spi_proc = (proc_t)$arg0
4167 showptr $kgm_spi_proc
4169 printf " name %s\n", $kgm_spi_proc->p_comm
4170 printf " pid:%.8d", $kgm_spi_proc->p_pid
4172 showptr $kgm_spi_proc->task
4173 printf " p_stat:%.1d", $kgm_spi_proc->p_stat
4174 printf " parent pid:%.8d", $kgm_spi_proc->p_ppid
4176 # decode part of credential
4177 set $kgm_spi_cred = $kgm_spi_proc->p_ucred
4178 if ($kgm_spi_cred != 0)
4179 printf "Cred: euid %d ruid %d svuid %d\n", $kgm_spi_cred->cr_uid, $kgm_spi_cred->cr_ruid, $kgm_spi_cred->cr_svuid
4181 printf "Cred: (null)\n"
4184 set $kgm_spi_flag = $kgm_spi_proc->p_flag
4185 printf "Flags: 0x%08x\n", $kgm_spi_flag
4186 if ($kgm_spi_flag & 0x00000001)
4187 printf " 0x00000001 - may hold advisory locks\n"
4189 if ($kgm_spi_flag & 0x00000002)
4190 printf " 0x00000002 - has a controlling tty\n"
4192 if ($kgm_spi_flag & 0x00000004)
4193 printf " 0x00000004 - process is 64 bit\n"
4195 printf " !0x00000004 - process is 32 bit\n"
4197 if ($kgm_spi_flag & 0x00000008)
4198 printf " 0x00000008 - no SIGCHLD on child stop\n"
4200 if ($kgm_spi_flag & 0x00000010)
4201 printf " 0x00000010 - waiting for child exec/exit\n"
4203 if ($kgm_spi_flag & 0x00000020)
4204 printf " 0x00000020 - has started profiling\n"
4206 if ($kgm_spi_flag & 0x00000040)
4207 printf " 0x00000040 - in select; wakeup/waiting danger\n"
4209 if ($kgm_spi_flag & 0x00000080)
4210 printf " 0x00000080 - was stopped and continued\n"
4212 if ($kgm_spi_flag & 0x00000100)
4213 printf " 0x00000100 - has set privileges since exec\n"
4215 if ($kgm_spi_flag & 0x00000200)
4216 printf " 0x00000200 - system process: no signals, stats, or swap\n"
4218 if ($kgm_spi_flag & 0x00000400)
4219 printf " 0x00000400 - timing out during a sleep\n"
4221 if ($kgm_spi_flag & 0x00000800)
4222 printf " 0x00000800 - debugged process being traced\n"
4224 if ($kgm_spi_flag & 0x00001000)
4225 printf " 0x00001000 - debugging process has waited for child\n"
4227 if ($kgm_spi_flag & 0x00002000)
4228 printf " 0x00002000 - exit in progress\n"
4230 if ($kgm_spi_flag & 0x00004000)
4231 printf " 0x00004000 - process has called exec\n"
4233 if ($kgm_spi_flag & 0x00008000)
4234 printf " 0x00008000 - owe process an addupc() XXX\n"
4236 if ($kgm_spi_flag & 0x00010000)
4237 printf " 0x00010000 - affinity for Rosetta children\n"
4239 if ($kgm_spi_flag & 0x00020000)
4240 printf " 0x00020000 - wants to run Rosetta\n"
4242 if ($kgm_spi_flag & 0x00040000)
4243 printf " 0x00040000 - has wait() in progress\n"
4245 if ($kgm_spi_flag & 0x00080000)
4246 printf " 0x00080000 - kdebug tracing on for this process\n"
4248 if ($kgm_spi_flag & 0x00100000)
4249 printf " 0x00100000 - blocked due to SIGTTOU or SIGTTIN\n"
4251 if ($kgm_spi_flag & 0x00200000)
4252 printf " 0x00200000 - has called reboot()\n"
4254 if ($kgm_spi_flag & 0x00400000)
4255 printf " 0x00400000 - is TBE state\n"
4257 if ($kgm_spi_flag & 0x00800000)
4258 printf " 0x00800000 - signal exceptions\n"
4260 if ($kgm_spi_flag & 0x01000000)
4261 printf " 0x01000000 - has thread cwd\n"
4263 if ($kgm_spi_flag & 0x02000000)
4264 printf " 0x02000000 - has vfork() children\n"
4266 if ($kgm_spi_flag & 0x04000000)
4267 printf " 0x04000000 - not allowed to attach\n"
4269 if ($kgm_spi_flag & 0x08000000)
4270 printf " 0x08000000 - vfork() in progress\n"
4272 if ($kgm_spi_flag & 0x10000000)
4273 printf " 0x10000000 - no shared libraries\n"
4275 if ($kgm_spi_flag & 0x20000000)
4276 printf " 0x20000000 - force quota for root\n"
4278 if ($kgm_spi_flag & 0x40000000)
4279 printf " 0x40000000 - no zombies when children exit\n"
4281 if ($kgm_spi_flag & 0x80000000)
4282 printf " 0x80000000 - don't hang on remote FS ops\n"
4285 set $kgm_spi_state = $kgm_spi_proc->p_stat
4287 if ($kgm_spi_state == 1)
4290 if ($kgm_spi_state == 2)
4293 if ($kgm_spi_state == 3)
4296 if ($kgm_spi_state == 4)
4299 if ($kgm_spi_state == 5)
4302 if ($kgm_spi_state == 6)
4305 if ($kgm_spi_state < 1 || $kgm_spi_state > 6)
4306 printf "(Unknown)\n"
4310 document showprocinfo
4311 Syntax: (gdb) showprocinfo <proc_t>
4312 | Displays name, pid, parent and task for a proc_t. Decodes cred, flag and p_stat fields.
4316 # dump the zombprocs
4319 set $basep = (struct proc *)zombproc->lh_first
4323 set $pp = $pp->p_list.le_next
4328 Syntax: (gdb) zombproc
4329 | Routine to print out all procs in the zombie list
4333 # dump the zombstacks
4336 set $basep = (struct proc *)zombproc->lh_first
4340 showtaskstacks $pp->task
4342 set $pp = $pp->p_list.le_next
4347 Syntax: (gdb) zombstacks
4348 | Routine to print out all stacks of tasks that are exiting
4356 set $basep = (struct proc *)allproc->lh_first
4360 set $pp = $pp->p_list.le_next
4365 Syntax: (gdb) allproc
4366 | Routine to print out all process in the system
4367 | which are not in the zombie list
4373 set $vp = (struct vnode *)$arg0
4377 printf " use %d", $vp->v_usecount
4378 printf " io %d", $vp->v_iocount
4379 printf " kuse %d", $vp->v_kusecount
4380 printf " type %d", $vp->v_type
4381 printf " flg 0x%.8x", $vp->v_flag
4382 printf " lflg 0x%.8x", $vp->v_lflag
4384 showptr $vp->v_parent
4385 set $_name = (char *)$vp->v_name
4387 printf " %s", $_name
4389 if ($vp->v_type == VREG) && ($vp->v_un.vu_ubcinfo != 0)
4390 printf " mapped %d", ($vp->v_un.vu_ubcinfo.ui_flags & 0x08) ? 1 : 0
4395 document print_vnode
4396 Syntax: (gdb) print_vnode <vnode>
4397 | Prints out the fields of a vnode struct
4400 define showprocvnodes
4401 set $pp = (struct proc *)$arg0
4402 set $fdp = (struct filedesc *)$pp->p_fd
4403 set $cvp = $fdp->fd_cdir
4404 set $rvp = $fdp->fd_rdir
4406 printf "Current Working Directory \n"
4411 printf "Current Root Directory \n"
4416 set $fpp = (struct fileproc **)($fdp->fd_ofiles)
4417 set $fpo = (char)($fdp->fd_ofileflags[0])
4418 while $count < $fdp->fd_nfiles
4419 #printf"fpp %x ", *$fpp
4421 set $fg =(struct fileglob *)((**$fpp)->f_fglob)
4422 if $fg && (($fg)->fg_type == 1)
4423 if $fdp->fd_ofileflags[$count] & 4
4428 printf "fd = %d ", $count
4429 print_vnode $fg->fg_data
4433 set $count = $count + 1
4437 document showprocvnodes
4438 Syntax: (gdb) showprocvnodes <proc_address>
4439 | Routine to print out all the open fds
4440 | which are vnodes in a process
4443 define showallprocvnodes
4444 set $basep = (struct proc *)allproc->lh_first
4447 printf "============================================ \n"
4450 set $pp = $pp->p_list.le_next
4454 document showallprocvnodes
4455 Syntax: (gdb) showallprocvnodes
4456 | Routine to print out all the open fds
4462 # dump the childrent of a proc
4464 define showinitchild
4465 set $basep = (struct proc *)initproc->p_children.lh_first
4469 set $pp = $pp->p_sibling.le_next
4473 document showinitchild
4474 Syntax: (gdb) showinitchild
4475 | Routine to print out all processes in the system
4476 | which are children of init process
4480 define showmountallvnodes
4481 set $mp = (struct mount *)$arg0
4482 set $basevp = (struct vnode *)$mp->mnt_vnodelist.tqh_first
4484 printf "____________________ Vnode list Queue ---------------\n"
4487 set $vp = $vp->v_mntvnodes->tqe_next
4489 set $basevp = (struct vnode *)$mp->mnt_workerqueue.tqh_first
4491 printf "____________________ Worker Queue ---------------\n"
4494 set $vp = $vp->v_mntvnodes->tqe_next
4496 set $basevp = (struct vnode *)$mp->mnt_newvnodes.tqh_first
4498 printf "____________________ New vnodes Queue ---------------\n"
4501 set $vp = $vp->v_mntvnodes->tqe_next
4504 document showmountallvnodes
4505 Syntax: showmountallvnodes <struct mount *>
4506 | Print the vnode inactive list
4510 define showmountvnodes
4511 set $mp = (struct mount *)$arg0
4512 set $basevp = (struct vnode *)$mp->mnt_vnodelist.tqh_first
4514 printf "____________________ Vnode list Queue ---------------\n"
4517 set $vp = $vp->v_mntvnodes->tqe_next
4520 document showmountvnodes
4521 Syntax: showmountvnodes <struct mount *>
4522 | Print the vnode list
4527 define showworkqvnodes
4528 set $mp = (struct mount *)$arg0
4529 set $basevp = (struct vnode *)$mp->mnt_workerqueue.tqh_first
4531 printf "____________________ Worker Queue ---------------\n"
4534 set $vp = $vp->v_mntvnodes->tqe_next
4537 document showworkqvnodes
4538 Syntax: showworkqvnodes <struct mount *>
4539 | Print the vnode worker list
4543 define shownewvnodes
4544 set $mp = (struct mount *)$arg0
4545 set $basevp = (struct vnode *)$mp->mnt_newvnodes.tqh_first
4547 printf "____________________ New vnodes Queue ---------------\n"
4550 set $vp = $vp->v_mntvnodes->tqe_next
4554 document shownewvnodes
4555 Syntax: shownewvnodes <struct mount *>
4556 | Print the new vnode list
4561 # print mount point info
4563 set $mp = (struct mount *)$arg0
4567 printf " flag %x", $mp->mnt_flag
4568 printf " kern_flag %x", $mp->mnt_kern_flag
4569 printf " lflag %x", $mp->mnt_lflag
4570 printf " type: %s", $mp->mnt_vfsstat.f_fstypename
4571 printf " mnton: %s", $mp->mnt_vfsstat.f_mntonname
4572 printf " mntfrom: %s", $mp->mnt_vfsstat.f_mntfromname
4576 define showallmounts
4577 set $mp=(struct mount *)mountlist.tqh_first
4580 set $mp = $mp->mnt_list.tqe_next
4584 document showallmounts
4585 Syntax: showallmounts
4586 | Print all mount points
4590 if (((unsigned long) $arg0 < (unsigned long) &_mh_execute_header || \
4591 (unsigned long) $arg0 >= (unsigned long) &last_kernel_symbol ))
4599 set $mp = (struct mbuf *)$arg0
4603 printf "%4d: %p [len %4d, type %2d, ", $cnt, $mp, \
4604 $mp->m_hdr.mh_len, $mp->m_hdr.mh_type
4609 set $tot = $tot + $mp->m_hdr.mh_len
4610 printf "total %d]\n", $tot
4611 set $mp = $mp->m_hdr.mh_nextpkt
4616 document mbuf_walkpkt
4617 Syntax: (gdb) mbuf_walkpkt <addr>
4618 | Given an mbuf address, walk its m_nextpkt pointer
4622 set $mp = (struct mbuf *)$arg0
4626 printf "%4d: %p [len %4d, type %2d, ", $cnt, $mp, \
4627 $mp->m_hdr.mh_len, $mp->m_hdr.mh_type
4632 set $tot = $tot + $mp->m_hdr.mh_len
4633 printf "total %d]\n", $tot
4634 set $mp = $mp->m_hdr.mh_next
4640 Syntax: (gdb) mbuf_walk <addr>
4641 | Given an mbuf address, walk its m_next pointer
4644 define mbuf_buf2slab
4646 set $gix = ((char *)$addr - (char *)mbutl) >> 20
4647 set $ix = ((char *)$addr - (char *)mbutl) >> 11
4648 set $slab = &slabstbl[$gix].slg_slab[$ix]
4652 document mbuf_buf2slab
4653 | Given an mbuf object, find its corresponding slab address.
4658 set $ix = ((char *)$addr - (char *)mbutl) >> 11
4659 set $clbase = ((union mcluster *)(mbutl + $ix))
4660 set $mclidx = (((char *)$addr - (char *)$clbase) >> 8)
4661 set $mca = mclaudit[$ix].cl_audit[$mclidx]
4662 printf "mca: %p", $mca
4665 document mbuf_buf2mca
4666 Syntax: (gdb) mbuf_buf2mca <addr>
4667 | Given an mbuf object, find its buffer audit structure address.
4668 | This requires mbuf buffer auditing to be turned on, by setting
4669 | the appropriate flags to the "mbuf_debug" boot-args parameter.
4674 set $mca = (mcache_audit_t *)$arg0
4675 set $cp = (mcache_t *)$mca->mca_cache
4676 printf "object type:\t\t"
4677 mbuf_mca_ctype $mca 1
4678 printf "\ncontrolling mcache:\t%p (%s)\n", $mca->mca_cache, $cp->mc_name
4679 if $mca->mca_uflags & $MB_SCVALID
4680 set $ix = ((char *)$mca->mca_addr - (char *)mbutl) >> 11
4681 set $clbase = ((union mcluster *)(mbutl + $ix))
4682 set $mclidx = (((char *)$mca->mca_addr - (char *)$clbase) >> 8)
4683 printf "mbuf obj:\t\t%p\n", $mca->mca_addr
4684 printf "mbuf index:\t\t%d (out of 8) in cluster base %p\n", \
4685 $mclidx + 1, $clbase
4686 if $mca->mca_uptr != 0
4687 set $peer_mca = (mcache_audit_t *)$mca->mca_uptr
4688 printf "paired cluster obj:\t%p (mca %p)\n", \
4689 $peer_mca->mca_addr, $peer_mca
4691 printf "saved contents:\t\t%p (%d bytes)\n", \
4692 $mca->mca_contents, $mca->mca_contents_size
4694 printf "cluster obj:\t\t%p\n", $mca->mca_addr
4695 if $mca->mca_uptr != 0
4696 set $peer_mca = (mcache_audit_t *)$mca->mca_uptr
4697 printf "paired mbuf obj:\t%p (mca %p)\n", \
4698 $peer_mca->mca_addr, $peer_mca
4701 printf "recent transaction for this buffer (thread %p):\n", \
4704 while $cnt < $mca->mca_depth
4705 set $kgm_pc = $mca->mca_stack[$cnt]
4706 printf "%4d: ", $cnt + 1
4711 if $mca->mca_pdepth > 0
4712 printf "previous transaction for this buffer (thread %p):\n", \
4716 while $cnt < $mca->mca_pdepth
4717 set $kgm_pc = $mca->mca_pstack[$cnt]
4718 printf "%4d: ", $cnt + 1
4726 document mbuf_showmca
4727 Syntax: (gdb) mbuf_showmca <addr>
4728 | Given an mbuf/cluster buffer audit structure address, print the audit
4729 | records including the stack trace of the last buffer transaction.
4732 set $MCF_NOCPUCACHE = 0x10
4735 set $head = (mcache_t *)mcache_head
4739 printf "cache cache cache buf buf backing (# of retries) bufs\n"
4740 printf "name state addr size align zone wait nowait failed incache\n"
4741 printf "------------------------- -------- ------------------ ------ ----- ------------------ -------------------------- --------\n"
4743 printf "cache cache cache buf buf backing (# of retries) bufs\n"
4744 printf "name state addr size align zone wait nowait failed incache\n"
4745 printf "------------------------- -------- ---------- ------ ----- ---------- -------------------------- --------\n"
4748 set $bktsize = $mc->mc_cpu.cc_bktsize
4749 printf "%-25s ", $mc->mc_name
4750 if ($mc->mc_flags & $MCF_NOCPUCACHE)
4753 if $mc->mc_purge_cnt > 0
4763 printf " %p %6d %5d ",$mc, \
4764 $mc->mc_bufsize, $mc->mc_align
4765 if $mc->mc_slab_zone != 0
4766 printf "%p", $mc->mc_slab_zone
4775 set $tot += $mc->mc_full.bl_total * $bktsize
4776 set $ccp = (mcache_cpu_t *)$mc->mc_cpu
4779 if $ccp->cc_objs > 0
4780 set $tot += $ccp->cc_objs
4782 if $ccp->cc_pobjs > 0
4783 set $tot += $ccp->cc_pobjs
4788 printf " %8d %8d %8d %8d", $mc->mc_wretry_cnt, \
4789 $mc->mc_nwretry_cnt, $mc->mc_nwfail_cnt, $tot
4791 set $mc = (mcache_t *)$mc->mc_list.le_next
4795 document mcache_stat
4796 Syntax: (gdb) mcache_stat
4797 | Print all mcaches in the system.
4800 define mcache_showzone
4801 set $mc = (mcache_t *)$arg0
4802 if $mc->mc_slab_zone != 0
4803 printf "%p", $mc->mc_slab_zone
4808 document mcache_showzone
4809 Syntax: (gdb) mcache_showzone <mcache_addr>
4810 | Print the type of backend (custom or zone) of a mcache.
4813 define mcache_walkobj
4814 set $p = (mcache_obj_t *)$arg0
4818 printf "%4d: %p\n", $cnt, $p,
4819 set $p = $p->obj_next
4824 document mcache_walkobj
4825 Syntax: (gdb) mcache_walkobj <addr>
4826 | Given a mcache object address, walk its obj_next pointer
4829 define mcache_showcache
4830 set $cp = (mcache_t *)$arg0
4831 set $ccp = (mcache_cpu_t *)$cp->mc_cpu
4832 set $bktsize = $cp->mc_cpu.cc_bktsize
4835 printf "Showing cache '%s':\n\n", $cp->mc_name
4836 printf " CPU cc_objs cc_pobjs total\n"
4837 printf "---- -------- -------- --------\n"
4839 set $objs = $ccp->cc_objs
4843 set $pobjs = $ccp->cc_pobjs
4847 set $tot_cpu = $objs + $pobjs
4848 set $tot += $tot_cpu
4849 printf "%4d %8d %8d %8d\n", $cnt, $objs, $pobjs, $tot_cpu
4853 printf " ========\n"
4854 printf " %8d\n", $tot
4856 set $tot += $cp->mc_full.bl_total * $bktsize
4857 printf "Total # of full buckets (%d objs/bkt):\t%-8d\n", \
4858 $bktsize, $cp->mc_full.bl_total
4859 printf "Total # of objects cached:\t\t%-8d\n", $tot
4862 document mcache_showcache
4863 | Display the number of objects in the cache
4866 set $NSLABSPMB = sizeof(mcl_slabg_t)/sizeof(mcl_slab_t)
4868 define mbuf_slabstbl
4871 printf "slot addr slabs range\n"
4872 printf "---- ---------- -----------------------\n"
4873 while $x < maxslabgrp
4874 set $slg = slabstbl[$x]
4879 printf "%p [%p-%p]\n", $slg, &$slg->slg_slab[0], \
4880 &$slg->slg_slab[$NSLABSPMB-1]
4886 document mbuf_slabstbl
4887 | Display the mbuf slabs table
4890 set $SLF_MAPPED=0x0001
4891 set $SLF_PARTIAL=0x0002
4892 set $SLF_DETACHED=0x0004
4895 set $slg = (mcl_slabg_t *)$arg0
4899 printf "slot addr next base C R N size flags\n"
4900 printf "---- ------------------ ------------------ ------------------ -- -- -- ------ -----\n"
4902 printf "slot addr next base C R N size flags\n"
4903 printf "---- ---------- ---------- ---------- -- -- -- ------ -----\n"
4905 while $x < $NSLABSPMB
4906 set $sl = &$slg->slg_slab[$x]
4907 printf "%3d: %p %p %p %2d %2d %2d %6d 0x%04x ", \
4908 $x + 1, $sl, $sl->sl_next, $sl->sl_base, $sl->sl_class, \
4909 $sl->sl_refcnt, $sl->sl_chunks, $sl->sl_len, \
4911 if $sl->sl_flags != 0
4913 if $sl->sl_flags & $SLF_MAPPED
4916 if $sl->sl_flags & $SLF_PARTIAL
4919 if $sl->sl_flags & $SLF_DETACHED
4930 | Display all mbuf slabs in the group
4936 printf "class total cached uncached inuse failed waiter notified purge\n"
4937 printf "name objs objs objs / slabs objs alloc count count count count\n"
4938 printf "---------------- -------- -------- ------------------- -------- ---------------- -------- -------- --------\n"
4939 while $x < (sizeof(mbuf_table) / sizeof(mbuf_table[0]))
4940 set $mbt = mbuf_table[$x]
4941 set $mcs = (mb_class_stat_t *)mbuf_table[$x].mtbl_stats
4943 set $mc = $mbt->mtbl_cache
4944 set $bktsize = $mc->mc_cpu.cc_bktsize
4945 set $tot += $mc->mc_full.bl_total * $bktsize
4946 set $ccp = (mcache_cpu_t *)$mc->mc_cpu
4949 if $ccp->cc_objs > 0
4950 set $tot += $ccp->cc_objs
4952 if $ccp->cc_pobjs > 0
4953 set $tot += $ccp->cc_pobjs
4959 printf "%-16s %8d %8d %8d / %-8d %8d %16llu %8d %8llu %8llu", \
4960 $mcs->mbcl_cname, $mcs->mbcl_total, $tot, \
4961 $mcs->mbcl_infree, $mcs->mbcl_slab_cnt, \
4962 ($mcs->mbcl_total - $tot - $mcs->mbcl_infree), \
4963 $mcs->mbcl_fail_cnt, $mc->mc_waiter_cnt, \
4964 $mcs->mbcl_notified, $mcs->mbcl_purge_cnt
4971 | Print extended mbuf allocator statistics.
4975 set $MB_COMP_INUSE = 0x2
4976 set $MB_SCVALID = 0x4
4978 set $MCLBYTES = 2048
4981 set $M16KCLBYTES = 16384
4983 define mbuf_mca_ctype
4984 set $mca = (mcache_audit_t *)$arg0
4986 set $cp = $mca->mca_cache
4987 set $class = (unsigned int)$cp->mc_private
4988 set $csize = mbuf_table[$class].mtbl_stats->mbcl_size
4998 if !$done && $csize == $MCLBYTES
5000 printf "CL (2K cluster) "
5006 if !$done && $csize == $NBPG
5008 printf "BCL (4K cluster) "
5014 if !$done && $csize == $M16KCLBYTES
5016 printf "JCL (16K cluster) "
5022 if !$done && $csize == ($MSIZE+$MCLBYTES)
5023 if $mca->mca_uflags & $MB_SCVALID
5027 printf "(paired mbuf, 2K cluster)"
5032 printf "(unpaired mbuf, 2K cluster) "
5039 printf "(paired 2K cluster, mbuf) "
5044 printf "(paired 2K cluster, mbuf) "
5050 if !$done && $csize == ($MSIZE+$NBPG)
5051 if $mca->mca_uflags & $MB_SCVALID
5055 printf "(paired mbuf, 4K cluster) "
5060 printf "(unpaired mbuf, 4K cluster) "
5067 printf "(paired 4K cluster, mbuf) "
5072 printf "(unpaired 4K cluster, mbuf) "
5078 if !$done && $csize == ($MSIZE+$M16KCLBYTES)
5079 if $mca->mca_uflags & $MB_SCVALID
5083 printf "(paired mbuf, 16K cluster) "
5088 printf "(unpaired mbuf, 16K cluster) "
5095 printf "(paired 16K cluster, mbuf) "
5100 printf "(unpaired 16K cluster, mbuf) "
5107 printf "unknown: %s ", $cp->mc_name
5111 document mbuf_mca_ctype
5112 | This is a helper macro for mbuf_show{active,inactive,all} that prints
5113 | out the mbuf object type represented by a given mcache audit structure.
5116 define mbuf_showactive
5118 mbuf_walkallslabs 1 0
5120 mbuf_walkallslabs 1 0 $arg0
5124 document mbuf_showactive
5125 Syntax: (gdb) mbuf_showactive
5126 | Walk the mbuf objects pool and print only the active ones; this
5127 | requires mbuf debugging to be turned on, by setting the appropriate flags
5128 | to the "mbuf_debug" boot-args parameter. Active objects are those that
5129 | are outstanding (have not returned to the mbuf slab layer) and in use
5130 | by the client (have not been freed).
5133 define mbuf_showinactive
5134 mbuf_walkallslabs 0 1
5137 document mbuf_showinactive
5138 Syntax: (gdb) mbuf_showinactive
5139 | Walk the mbuf objects pool and print only the inactive ones; this
5140 | requires mbuf debugging to be turned on, by setting the appropriate flags
5141 | to the "mbuf_debug" boot-args parameter. Inactive objects are those that
5142 | are outstanding (have not returned to the mbuf slab layer) but have been
5143 | freed by the client, i.e. they still reside in the mcache layer ready to
5144 | be used for subsequent allocation requests.
5148 mbuf_walkallslabs 1 1
5151 document mbuf_showall
5152 Syntax: (gdb) mbuf_showall
5153 | Walk the mbuf objects pool and print them all; this requires
5154 | mbuf debugging to be turned on, by setting the appropriate flags to the
5155 | "mbuf_debug" boot-args parameter.
5161 define mbuf_walkallslabs
5165 set $show_tr = $arg2
5175 if $show_a && !$show_f
5176 printf "Searching only for active "
5178 if !$show_a && $show_f
5179 printf "Searching only for inactive "
5181 if $show_a && $show_f
5182 printf "Displaying all "
5184 printf "objects; this may take a while ...)\n\n"
5187 printf " slab mca obj allocation\n"
5188 printf "slot idx address address address type state\n"
5189 printf "---- ---- ------------------ ------------------ ------------------ ----- -----------\n"
5191 printf " slab mca obj allocation\n"
5192 printf "slot idx address address address type state\n"
5193 printf "---- ---- ---------- ---------- ---------- ----- -----------\n"
5197 set $slg = slabstbl[$x]
5200 while $y < $NSLABSPMB && $stop == 0
5201 set $sl = &$slg->slg_slab[$y]
5202 set $base = (char *)$sl->sl_base
5203 set $ix = ($base - (char *)mbutl) >> 11
5204 set $clbase = ((union mcluster *)(mbutl + $ix))
5205 set $mclidx = ($base - (char *)$clbase) >> 8
5206 set $mca = mclaudit[$ix].cl_audit[$mclidx]
5209 while $mca != 0 && $mca->mca_addr != 0
5211 if $mca->mca_uflags & ($MB_INUSE|$MB_COMP_INUSE)
5212 set $total_a = $total_a + 1
5213 set $printmca = $show_a
5215 set $total_f = $total_f + 1
5216 set $printmca = $show_f
5221 printf "%4d %4d %p ", $x, $y, $sl
5230 printf "%p %p ", $mca, $mca->mca_addr
5231 mbuf_mca_ctype $mca 0
5232 if $mca->mca_uflags & ($MB_INUSE|$MB_COMP_INUSE)
5241 set $total = $total + 1
5244 printf "recent transaction for this buffer (thread %p):\n", \
5247 while $cnt < $mca->mca_depth
5248 set $kgm_pc = $mca->mca_stack[$cnt]
5249 printf "%4d: ", $cnt + 1
5257 set $mca = $mca->mca_next
5260 if $slg->slg_slab[$y].sl_base == 0
5266 if $total && $show_a && $show_f
5267 printf "\ntotal objects:\t%d\n", $total
5268 printf "active/unfreed:\t%d\n", $total_a
5269 printf "freed/in_cache:\t%d\n", $total_f
5273 document mbuf_walkallslabs
5274 | Walk the mbuf objects pool; this requires mbuf debugging to be
5275 | turned on, by setting the appropriate flags to the "mbuf_debug" boot-args
5276 | parameter. This is a backend routine for mbuf_show{active,inactive,all}.
5280 set $RTF_GATEWAY = 0x2
5282 set $RTF_REJECT = 0x8
5283 set $RTF_DYNAMIC = 0x10
5284 set $RTF_MODIFIED = 0x20
5285 set $RTF_DONE = 0x40
5286 set $RTF_DELCLONE = 0x80
5287 set $RTF_CLONING = 0x100
5288 set $RTF_XRESOLVE = 0x200
5289 set $RTF_LLINFO = 0x400
5290 set $RTF_STATIC = 0x800
5291 set $RTF_BLACKHOLE = 0x1000
5292 set $RTF_PROTO2 = 0x4000
5293 set $RTF_PROTO1 = 0x8000
5294 set $RTF_PRCLONING = 0x10000
5295 set $RTF_WASCLONED = 0x20000
5296 set $RTF_PROTO3 = 0x40000
5297 set $RTF_PINNED = 0x100000
5298 set $RTF_LOCAL = 0x200000
5299 set $RTF_BROADCAST = 0x400000
5300 set $RTF_MULTICAST = 0x800000
5301 set $RTF_IFSCOPE = 0x1000000
5302 set $RTF_CONDEMNED = 0x2000000
5308 define rtentry_prdetails
5309 set $rt = (struct rtentry *)$arg0
5312 set $dst = (struct sockaddr *)$rt->rt_nodes->rn_u.rn_leaf.rn_Key
5313 if $dst->sa_family == $AF_INET
5314 showsockaddr_in $dst
5317 if $dst->sa_family == $AF_INET6
5318 showsockaddr_in6 $dst
5322 if $dst->sa_family == $AF_LINK
5323 showsockaddr_dl $dst
5326 showsockaddr_unspec $dst
5331 set $dst = (struct sockaddr *)$rt->rt_gateway
5332 if $dst->sa_family == $AF_INET
5333 showsockaddr_in $dst
5336 if $dst->sa_family == $AF_INET6
5338 showsockaddr_in6 $dst
5341 if $dst->sa_family == $AF_LINK
5342 showsockaddr_dl $dst
5349 showsockaddr_unspec $dst
5354 if $rt->rt_flags & $RTF_WASCLONED
5356 printf "%18p ", $rt->rt_parent
5358 printf "%10p ", $rt->rt_parent
5368 printf "%6u %8u ", $rt->rt_refcnt, $rt->rt_rmx.rmx_pksent
5370 if $rt->rt_flags & $RTF_UP
5373 if $rt->rt_flags & $RTF_GATEWAY
5376 if $rt->rt_flags & $RTF_HOST
5379 if $rt->rt_flags & $RTF_REJECT
5382 if $rt->rt_flags & $RTF_DYNAMIC
5385 if $rt->rt_flags & $RTF_MODIFIED
5388 if $rt->rt_flags & $RTF_CLONING
5391 if $rt->rt_flags & $RTF_PRCLONING
5394 if $rt->rt_flags & $RTF_LLINFO
5397 if $rt->rt_flags & $RTF_STATIC
5400 if $rt->rt_flags & $RTF_PROTO1
5403 if $rt->rt_flags & $RTF_PROTO2
5406 if $rt->rt_flags & $RTF_PROTO3
5409 if $rt->rt_flags & $RTF_WASCLONED
5412 if $rt->rt_flags & $RTF_BROADCAST
5415 if $rt->rt_flags & $RTF_MULTICAST
5418 if $rt->rt_flags & $RTF_XRESOLVE
5421 if $rt->rt_flags & $RTF_BLACKHOLE
5424 if $rt->rt_flags & $RTF_IFSCOPE
5428 printf "/%s%d", $rt->rt_ifp->if_name, $rt->rt_ifp->if_unit
5433 define _rttable_dump
5435 set $rn = (struct radix_node *)$rnh->rnh_treetop
5436 set $rnh_cnt = $rnh->rnh_cnt
5438 while $rn->rn_bit >= 0
5439 set $rn = $rn->rn_u.rn_node.rn_L
5443 set $base = (struct radix_node *)$rn
5444 while ($rn->rn_parent->rn_u.rn_node.rn_R == $rn) && ($rn->rn_flags & $RNF_ROOT) == 0
5445 set $rn = $rn->rn_parent
5447 set $rn = $rn->rn_parent->rn_u.rn_node.rn_R
5448 while $rn->rn_bit >= 0
5449 set $rn = $rn->rn_u.rn_node.rn_L
5454 set $base = $rn->rn_u.rn_leaf.rn_Dupedkey
5455 if ($rn->rn_flags & $RNF_ROOT) == 0
5457 set $rt = (struct rtentry *)$rn
5464 rtentry_prdetails $rt
5470 if ($rn->rn_flags & $RNF_ROOT) != 0
5479 printf " rtentry dst gw parent Refs Use flags/if\n"
5480 printf " ----------------- --------------- ----------------- ------------------ ------ -------- -----------\n"
5482 printf " rtentry dst gw parent Refs Use flags/if\n"
5483 printf " --------- --------------- ----------------- ---------- ------ -------- -----------\n"
5485 _rttable_dump rt_tables[2]
5488 document show_rt_inet
5489 Syntax: (gdb) show_rt_inet
5490 | Show the entries of the IPv4 routing table.
5493 define show_rt_inet6
5495 printf " rtentry dst gw parent Refs Use flags/if\n"
5496 printf " ----------------- --------------------------------------- --------------------------------------- ------------------ ------ -------- -----------\n"
5498 printf " rtentry dst gw parent Refs Use flags/if\n"
5499 printf " --------- --------------------------------------- --------------------------------------- ---------- ------ -------- -----------\n"
5501 _rttable_dump rt_tables[30]
5504 document show_rt_inet6
5505 Syntax: (gdb) show_rt_inet6
5506 | Show the entries of the IPv6 routing table.
5509 define rtentry_trash
5510 set $rtd = (struct rtentry_dbg *)rttrash_head.tqh_first
5515 printf " rtentry ref hold rele dst gw parent flags/if\n"
5516 printf " ----------------- --- ------ ------ --------------- ----- ------------------ -----------\n"
5518 printf " rtentry ref hold rele dst gw parent flags/if\n"
5519 printf " --------- --- ------ ------ --------------- ----- ---------- -----------\n"
5522 printf "%4d: %p %3d %6d %6d ", $cnt + 1, $rtd, \
5523 $rtd->rtd_refhold_cnt - $rtd->rtd_refrele_cnt, \
5524 $rtd->rtd_refhold_cnt, $rtd->rtd_refrele_cnt
5525 rtentry_prdetails $rtd
5527 set $rtd = $rtd->rtd_trash_link.tqe_next
5532 document rtentry_trash
5533 Syntax: (gdb) rtentry_trash
5534 | Walk the list of trash route entries; this requires route entry
5535 | debugging to be turned on, by setting the appropriate flags to the
5536 | "rte_debug" boot-args parameter.
5539 set $CTRACE_STACK_SIZE = ctrace_stack_size
5540 set $CTRACE_HIST_SIZE = ctrace_hist_size
5542 define rtentry_showdbg
5543 set $rtd = (struct rtentry_dbg *)$arg0
5546 printf "Total holds:\t%d\n", $rtd->rtd_refhold_cnt
5547 printf "Total releases:\t%d\n", $rtd->rtd_refrele_cnt
5550 while $ix < $CTRACE_STACK_SIZE
5551 set $kgm_pc = $rtd->rtd_alloc.pc[$ix]
5554 printf "\nAlloc (thread %p):\n", \
5557 printf "%4d: ", $ix + 1
5564 while $ix < $CTRACE_STACK_SIZE
5565 set $kgm_pc = $rtd->rtd_free.pc[$ix]
5568 printf "\nFree: (thread %p)\n", \
5571 printf "%4d: ", $ix + 1
5577 while $cnt < $CTRACE_HIST_SIZE
5579 while $ix < $CTRACE_STACK_SIZE
5580 set $kgm_pc = $rtd->rtd_refhold[$cnt].pc[$ix]
5583 printf "\nHold [%d] (thread %p):\n", \
5584 $cnt, $rtd->rtd_refhold[$cnt].th
5586 printf "%4d: ", $ix + 1
5595 while $cnt < $CTRACE_HIST_SIZE
5597 while $ix < $CTRACE_STACK_SIZE
5598 set $kgm_pc = $rtd->rtd_refrele[$cnt].pc[$ix]
5601 printf "\nRelease [%d] (thread %p):\n",\
5602 $cnt, $rtd->rtd_refrele[$cnt].th
5604 printf "%4d: ", $ix + 1
5613 printf "\nTotal locks:\t%d\n", $rtd->rtd_lock_cnt
5614 printf "Total unlocks:\t%d\n", $rtd->rtd_unlock_cnt
5617 while $cnt < $CTRACE_HIST_SIZE
5619 while $ix < $CTRACE_STACK_SIZE
5620 set $kgm_pc = $rtd->rtd_lock[$cnt].pc[$ix]
5623 printf "\nLock [%d] (thread %p):\n",\
5624 $cnt, $rtd->rtd_lock[$cnt].th
5626 printf "%4d: ", $ix + 1
5635 while $cnt < $CTRACE_HIST_SIZE
5637 while $ix < $CTRACE_STACK_SIZE
5638 set $kgm_pc = $rtd->rtd_unlock[$cnt].pc[$ix]
5641 printf "\nUnlock [%d] (thread %p):\n",\
5642 $cnt, $rtd->rtd_unlock[$cnt].th
5644 printf "%4d: ", $ix + 1
5654 document rtentry_showdbg
5655 Syntax: (gdb) rtentry_showdbg <addr>
5656 | Given a route entry structure address, print the debug information
5657 | related to it. This requires route entry debugging to be turned
5658 | on, by setting the appropriate flags to the "rte_debug" boot-args
5662 define inifa_showdbg
5663 set $inifa = (struct in_ifaddr_dbg *)$arg0
5666 printf "Total holds:\t%d\n", $inifa->inifa_refhold_cnt
5667 printf "Total releases:\t%d\n", $inifa->inifa_refrele_cnt
5670 while $ix < $CTRACE_STACK_SIZE
5671 set $kgm_pc = $inifa->inifa_alloc.pc[$ix]
5674 printf "\nAlloc (thread %p):\n", \
5675 $inifa->inifa_alloc.th
5677 printf "%4d: ", $ix + 1
5684 while $ix < $CTRACE_STACK_SIZE
5685 set $kgm_pc = $inifa->inifa_free.pc[$ix]
5688 printf "\nFree: (thread %p)\n", \
5689 $inifa->inifa_free.th
5691 printf "%4d: ", $ix + 1
5697 while $cnt < $CTRACE_HIST_SIZE
5699 while $ix < $CTRACE_STACK_SIZE
5700 set $kgm_pc = $inifa->inifa_refhold[$cnt].pc[$ix]
5703 printf "\nHold [%d] (thread %p):\n", \
5704 $cnt, $inifa->inifa_refhold[$cnt].th
5706 printf "%4d: ", $ix + 1
5715 while $cnt < $CTRACE_HIST_SIZE
5717 while $ix < $CTRACE_STACK_SIZE
5718 set $kgm_pc = $inifa->inifa_refrele[$cnt].pc[$ix]
5721 printf "\nRelease [%d] (thread %p):\n",\
5722 $cnt, $inifa->inifa_refrele[$cnt].th
5724 printf "%4d: ", $ix + 1
5734 document inifa_showdbg
5735 Syntax: (gdb) inifa_showdbg <addr>
5736 | Given an IPv4 interface structure address, print the debug information
5737 | related to it. This requires interface address debugging to be turned
5738 | on, by setting the appropriate flags to the "ifa_debug" boot-args
5742 define in6ifa_showdbg
5743 set $in6ifa = (struct in6_ifaddr_dbg *)$arg0
5746 printf "Total holds:\t%d\n", $in6ifa->in6ifa_refhold_cnt
5747 printf "Total releases:\t%d\n", $in6ifa->in6ifa_refrele_cnt
5750 while $ix < $CTRACE_STACK_SIZE
5751 set $kgm_pc = $in6ifa->in6ifa_alloc.pc[$ix]
5754 printf "\nAlloc (thread %p):\n", \
5755 $in6ifa->in6ifa_alloc.th
5757 printf "%4d: ", $ix + 1
5764 while $ix < $CTRACE_STACK_SIZE
5765 set $kgm_pc = $in6ifa->in6ifa_free.pc[$ix]
5768 printf "\nFree: (thread %p)\n", \
5769 $in6ifa->in6ifa_free.th
5771 printf "%4d: ", $ix + 1
5777 while $cnt < $CTRACE_HIST_SIZE
5779 while $ix < $CTRACE_STACK_SIZE
5780 set $kgm_pc = $in6ifa->in6ifa_refhold[$cnt].pc[$ix]
5783 printf "\nHold [%d] (thread %p):\n", \
5784 $cnt, $in6ifa->in6ifa_refhold[$cnt].th
5786 printf "%4d: ", $ix + 1
5795 while $cnt < $CTRACE_HIST_SIZE
5797 while $ix < $CTRACE_STACK_SIZE
5798 set $kgm_pc = $in6ifa->in6ifa_refrele[$cnt].pc[$ix]
5801 printf "\nRelease [%d] (thread %p):\n",\
5802 $cnt, $in6ifa->in6ifa_refrele[$cnt].th
5804 printf "%4d: ", $ix + 1
5814 document in6ifa_showdbg
5815 Syntax: (gdb) in6ifa_showdbg <addr>
5816 | Given an IPv6 interface structure address, print the debug information
5817 | related to it. This requires interface address debugging to be turned
5818 | on, by setting the appropriate flags to the "ifa_debug" boot-args
5823 # print all OSMalloc stats
5826 set $kgm_tagp = (OSMallocTag)$arg0
5827 printf "0x%08x: ", $kgm_tagp
5828 printf "%8d ",$kgm_tagp->OSMT_refcnt
5829 printf "%8x ",$kgm_tagp->OSMT_state
5830 printf "%8x ",$kgm_tagp->OSMT_attr
5831 printf "%s ",$kgm_tagp->OSMT_name
5837 printf "TAG COUNT STATE ATTR NAME\n"
5838 set $kgm_tagheadp = (OSMallocTag)&OSMalloc_tag_list
5839 set $kgm_tagptr = (OSMallocTag )($kgm_tagheadp->OSMT_link.next)
5840 while $kgm_tagptr != $kgm_tagheadp
5841 ostag_print $kgm_tagptr
5842 set $kgm_tagptr = (OSMallocTag)$kgm_tagptr->OSMT_link.next
5846 document showosmalloc
5847 Syntax: (gdb) showosmalloc
5848 | Print the outstanding allocation count by OSMallocTags.
5853 if msgbufp->msg_bufc[msgbufp->msg_bufx] == 0
5854 # The buffer hasn't wrapped, so take the easy (and fast!) path
5855 printf "%s", msgbufp->msg_bufc
5857 set $kgm_msgbuf = *msgbufp
5858 set $kgm_syslog_bufsize = $kgm_msgbuf.msg_size
5859 set $kgm_syslog_bufend = $kgm_msgbuf.msg_bufx
5860 if $kgm_syslog_bufend >= $kgm_syslog_bufsize
5861 set $kgm_syslog_bufend = 0
5864 # print older messages from msg_bufx to end of buffer
5865 set $kgm_i = $kgm_syslog_bufend
5866 while $kgm_i < $kgm_syslog_bufsize
5867 set $kgm_syslog_char = $kgm_msgbuf.msg_bufc[$kgm_i]
5868 if $kgm_syslog_char == 0
5870 set $kgm_i = $kgm_syslog_bufsize
5872 printf "%c", $kgm_syslog_char
5874 set $kgm_i = $kgm_i + 1
5877 # print newer messages from start of buffer to msg_bufx
5879 while $kgm_i < $kgm_syslog_bufend
5880 set $kgm_syslog_char = $kgm_msgbuf.msg_bufc[$kgm_i]
5881 printf "%c", $kgm_syslog_char
5882 set $kgm_i = $kgm_i + 1
5889 | Display the kernel's printf ring buffer
5894 set $kgm_addr = (unsigned char *)$arg0
5895 set $kgm_len = $arg1
5901 printf "%02x ", *($kgm_addr+$kgm_i)
5907 set $kgm_temp = *($kgm_addr+$kgm_i)
5908 if $kgm_temp < 32 || $kgm_temp >= 127
5911 printf "%c", $kgm_temp
5921 | Show the contents of memory as a hex/ASCII dump
5922 | The following is the syntax:
5923 | (gdb) hexdump <address> <length>
5927 define printcolonhex
5932 while ($li < $count)
5934 printf "%02x", (u_char)$addr[$li]
5937 printf ":%02x", (u_char)$addr[$li]
5944 define showsockaddr_dl
5945 set $sdl = (struct sockaddr_dl *)$arg0
5949 if $sdl->sdl_nlen == 0 && $sdl->sdl_alen == 0 && $sdl->sdl_slen == 0
5950 printf "link#%3d ", $sdl->sdl_index
5952 set $addr = $sdl->sdl_data + $sdl->sdl_nlen
5953 set $count = $sdl->sdl_alen
5954 printcolonhex $addr $count
5959 define showsockaddr_unspec
5960 set $sockaddr = (struct sockaddr *)$arg0
5961 set $addr = $sockaddr->sa_data
5962 set $count = $sockaddr->sa_len - 2
5963 printcolonhex $addr $count
5966 define showsockaddr_at
5967 set $sockaddr = (struct sockaddr *)$arg0
5968 set $addr = $sockaddr->sa_data
5969 set $count = $sockaddr->sa_len - 2
5970 printcolonhex $addr $count
5973 define showsockaddr_in
5974 set $sin = (struct sockaddr_in *)$arg0
5975 set $sa_bytes = (unsigned char *)&($sin->sin_addr)
5976 printf "%3u.%03u.%03u.%03u", $sa_bytes[0], $sa_bytes[1], $sa_bytes[2], $sa_bytes[3]
5979 define showsockaddr_in6
5980 set $sin6 = (struct sockaddr_in6 *)$arg0
5981 set $sa_bytes = $sin6->sin6_addr.__u6_addr.__u6_addr8
5982 printf "%2x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", \
5983 $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]
5986 define showsockaddr_un
5987 set $sun = (struct sockaddr_un *)$arg0
5991 if $sun->sun_path[0] == 0
5994 printf "%s", $sun->sun_path
5999 define showifmultiaddrs
6000 set $ifp = (struct ifnet *)$arg0
6001 set $if_multi = (struct ifmultiaddr *)$ifp->if_multiaddrs->lh_first
6002 set $mymulti = $if_multi
6004 while ($mymulti != 0)
6005 printf "%2d. ", $myi
6006 set $sa_family = $mymulti->ifma_addr.sa_family
6007 if ($sa_family == 2)
6008 if ($mymulti->ifma_ll != 0)
6009 showsockaddr_dl $mymulti->ifma_ll->ifma_addr
6012 showsockaddr_in $mymulti->ifma_addr
6014 if ($sa_family == 30)
6015 if ($mymulti->ifma_ll != 0)
6016 showsockaddr_dl $mymulti->ifma_ll->ifma_addr
6019 showsockaddr_in6 $mymulti->ifma_addr
6021 if ($sa_family == 18)
6022 showsockaddr_dl $mymulti->ifma_addr
6024 if ($sa_family == 0)
6025 showsockaddr_unspec $mymulti->ifma_addr 6
6027 printf " [%d]", $mymulti->ifma_refcount
6029 set $mymulti = $mymulti->ifma_link.le_next
6034 document showifmultiaddrs
6035 Syntax showifmultiaddrs <ifp>
6036 | show the (struct ifnet).if_multiaddrs list of multicast addresses for the given ifp
6040 set $mysock = (struct sockaddr *)$arg0
6041 set $showsockaddr_handled = 0
6045 if ($mysock->sa_family == 0)
6047 showsockaddr_unspec $mysock
6048 set $showsockaddr_handled = 1
6050 if ($mysock->sa_family == 1)
6052 showsockaddr_un $mysock
6053 set $showsockaddr_handled = 1
6055 if ($mysock->sa_family == 2)
6057 showsockaddr_in $mysock
6058 set $showsockaddr_handled = 1
6060 if ($mysock->sa_family == 30)
6062 showsockaddr_in6 $mysock
6063 set $showsockaddr_handled = 1
6065 if ($mysock->sa_family == 18)
6067 showsockaddr_dl $mysock
6068 set $showsockaddr_handled = 1
6070 if ($mysock->sa_family == 16)
6072 showsockaddr_at $mysock
6073 set $showsockaddr_handled = 1
6075 if ($showsockaddr_handled == 0)
6076 printf "FAM %d ", $mysock->sa_family
6077 set $addr = $mysock->sa_data
6078 set $count = $mysock->sa_len
6079 printcolonhex $addr $count
6085 set $flags = (u_short)$arg0
6117 printf "POINTTOPOINT"
6119 # if ($flags & 0x20)
6125 # printf "NOTRAILERS"
6175 if ($flags & 0x1000)
6183 if ($flags & 0x2000)
6191 if ($flags & 0x4000)
6197 printf "LINK2-ALTPHYS"
6199 if ($flags & 0x8000)
6211 set $ifp = (struct ifnet *)$arg0
6212 set $myifaddr = (struct ifaddr *)$ifp->if_addrhead->tqh_first
6214 while ($myifaddr != 0)
6215 printf "\t%d. ", $myi
6216 showsockaddr $myifaddr->ifa_addr
6217 printf " [%d]\n", $myifaddr->ifa_refcnt
6218 set $myifaddr = $myifaddr->ifa_link->tqe_next
6223 document showifaddrs
6224 Syntax: showifaddrs <ifp>
6225 | show the (struct ifnet).if_addrhead list of addresses for the given ifp
6229 set $ifconfig_all = 0
6231 set $ifconfig_all = 1
6233 set $ifp = (struct ifnet *)(ifnet->tqh_first)
6235 printf "%s%d: flags=%hx", $ifp->if_name, $ifp->if_unit, (u_short)$ifp->if_flags
6236 showifflags $ifp->if_flags
6237 printf " index %d", $ifp->if_index
6238 printf " mtu %d\n", $ifp->if_data.ifi_mtu
6239 printf "\t(struct ifnet *)"
6242 if ($ifconfig_all == 1)
6245 set $ifp = $ifp->if_link->tqe_next
6249 Syntax: (gdb) ifconfig
6250 | display ifconfig-like output, and print the (struct ifnet *) pointers for further inspection
6253 define _show_unix_domain_socket
6254 set $so = (struct socket *)$arg0
6255 set $pcb = (struct unpcb *)$so->so_pcb
6257 printf "unpcb: (null) "
6259 printf "unpcb: %p ", $pcb
6260 printf "unp_vnode: %p ", $pcb->unp_vnode
6261 printf "unp_conn: %p ", $pcb->unp_conn
6263 showsockaddr_un $pcb->unp_addr
6267 define _show_in_port
6268 set $str = (unsigned char *)$arg0
6269 set $port = *(unsigned short *)$arg0
6271 if (((($port & 0xff00) >> 8) == $str[0])) && ((($port & 0x00ff) == $str[1]))
6272 #printf "big endian "
6273 printf ":%d ", $port
6275 #printf "little endian "
6276 printf ":%d ", (($port & 0xff00) >> 8) | (($port & 0x00ff) << 8)
6280 define _show_in_addr_4in6
6281 set $ia = (unsigned char *)$arg0
6283 printf "%3u.%03u.%03u.%03u", $ia[0], $ia[1], $ia[2], $ia[3]
6287 define _show_in6_addr
6288 set $ia = (unsigned char *)$arg0
6290 printf "%2x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", \
6291 $ia[0], $ia[1], $ia[2], $ia[3], $ia[4], $ia[5], $ia[6], $ia[7], \
6292 $ia[8], $ia[9], $ia[10], $ia[11], $ia[12], $ia[13], $ia[14], $ia[15]
6296 define _showtcpstate
6297 set $tp = (struct tcpcb *)$arg0
6299 if $tp->t_state == 0
6302 if $tp->t_state == 1
6305 if $tp->t_state == 2
6308 if $tp->t_state == 3
6311 if $tp->t_state == 4
6312 printf "ESTABLISHED "
6314 if $tp->t_state == 5
6315 printf "CLOSE_WAIT "
6317 if $tp->t_state == 6
6318 printf "FIN_WAIT_1 "
6320 if $tp->t_state == 7
6323 if $tp->t_state == 8
6326 if $tp->t_state == 9
6327 printf "FIN_WAIT_2 "
6329 if $tp->t_state == 10
6335 define _showsockprotocol
6336 set $so = (struct socket *)$arg0
6337 set $inpcb = (struct inpcb *)$so->so_pcb
6339 if $so->so_proto->pr_protocol == 6
6341 _showtcpstate $inpcb->inp_ppcb
6343 if $so->so_proto->pr_protocol == 17
6346 if $so->so_proto->pr_protocol == 1
6349 if $so->so_proto->pr_protocol == 254
6352 if $so->so_proto->pr_protocol == 255
6357 define _show_ipv4_socket
6358 set $so = (struct socket *)$arg0
6359 set $inpcb = (struct inpcb *)$so->so_pcb
6361 printf "inpcb: (null) "
6363 printf "inpcb: %p ", $inpcb
6365 _showsockprotocol $so
6367 _show_in_addr_4in6 &$inpcb->inp_dependladdr.inp46_local
6368 _show_in_port &$inpcb->inp_lport
6370 _show_in_addr_4in6 &$inpcb->inp_dependfaddr.inp46_foreign
6371 _show_in_port &$inpcb->inp_fport
6375 define _show_ipv6_socket
6376 set $so = (struct socket *)$arg0
6377 set $pcb = (struct inpcb *)$so->so_pcb
6379 printf "inpcb: (null) "
6381 printf "inpcb: %p ", $pcb
6383 _showsockprotocol $so
6385 _show_in6_addr &$pcb->inp_dependladdr.inp6_local
6386 _show_in_port &$pcb->inp_lport
6388 _show_in6_addr &$pcb->inp_dependfaddr.inp6_foreign
6389 _show_in_port &$pcb->inp_fport
6395 set $so = (struct socket *)$arg0
6397 printf "so: (null) "
6399 printf "so: %p ", $so
6400 if $so && $so->so_proto && $so->so_proto->pr_domain
6401 set $domain = (struct domain *) $so->so_proto->pr_domain
6403 printf "%s ", $domain->dom_name
6404 if $domain->dom_family == 1
6405 _show_unix_domain_socket $so
6407 if $domain->dom_family == 2
6408 _show_ipv4_socket $so
6410 if $domain->dom_family == 30
6411 _show_ipv6_socket $so
6418 Syntax: (gdb) showsocket <socket_address>
6419 | Routine to print out a socket
6422 define showprocsockets
6423 set $pp = (struct proc *)$arg0
6424 set $fdp = (struct filedesc *)$pp->p_fd
6427 set $fpp = (struct fileproc **)($fdp->fd_ofiles)
6428 set $fpo = (char)($fdp->fd_ofileflags[0])
6429 while $count < $fdp->fd_nfiles
6431 set $fg =(struct fileglob *)((**$fpp)->f_fglob)
6432 if $fg && (($fg)->fg_type == 2)
6433 if $fdp->fd_ofileflags[$count] & 4
6438 printf "fd = %d ", $count
6440 showsocket $fg->fg_data
6447 set $count = $count + 1
6450 document showprocsockets
6451 Syntax: (gdb) showprocsockets <proc_address>
6452 | Routine to print out all the open fds
6453 | which are sockets in a process
6456 define showallprocsockets
6457 set $basep = (struct proc *)allproc->lh_first
6460 printf "============================================ \n"
6463 set $pp = $pp->p_list.le_next
6466 document showallprocsockets
6467 Syntax: (gdb) showallprocsockets
6468 | Routine to print out all the open fds
6473 set $port = (unsigned short)$arg0
6474 set $port = (unsigned short)((($arg0 & 0xff00) >> 8) & 0xff)
6475 set $port |= (unsigned short)(($arg0 & 0xff) << 8)
6479 set $INPCB_STATE_INUSE=0x1
6480 set $INPCB_STATE_CACHED=0x2
6481 set $INPCB_STATE_DEAD=0x3
6483 set $INP_RECVOPTS=0x01
6484 set $INP_RECVRETOPTS=0x02
6485 set $INP_RECVDSTADDR=0x04
6486 set $INP_HDRINCL=0x08
6487 set $INP_HIGHPORT=0x10
6488 set $INP_LOWPORT=0x20
6489 set $INP_ANONPORT=0x40
6490 set $INP_RECVIF=0x80
6491 set $INP_MTUDISC=0x100
6492 set $INP_STRIPHDR=0x200
6493 set $INP_FAITH=0x400
6494 set $INP_INADDR_ANY=0x800
6495 set $INP_RECVTTL=0x1000
6496 set $INP_UDP_NOCKSUM=0x2000
6497 set $IN6P_IPV6_V6ONLY=0x008000
6498 set $IN6P_PKTINFO=0x010000
6499 set $IN6P_HOPLIMIT=0x020000
6500 set $IN6P_HOPOPTS=0x040000
6501 set $IN6P_DSTOPTS=0x080000
6502 set $IN6P_RTHDR=0x100000
6503 set $IN6P_RTHDRDSTOPTS=0x200000
6504 set $IN6P_AUTOFLOWLABEL=0x800000
6505 set $IN6P_BINDV6ONLY=0x10000000
6514 set $pcb = (struct inpcb *)$arg0
6518 printf "%10p ", $pcb
6520 if $arg1 == $IPPROTO_TCP
6523 if $arg1 == $IPPROTO_UDP
6526 printf "%2d.", $arg1
6529 if ($pcb->inp_vflag & $INP_IPV4)
6532 if ($pcb->inp_vflag & $INP_IPV6)
6536 if ($pcb->inp_vflag & $INP_IPV4)
6538 _show_in_addr &$pcb->inp_dependladdr.inp46_local.ia46_addr4
6540 _show_in6_addr &$pcb->inp_dependladdr.inp6_local
6543 _print_ntohs $pcb->inp_lport
6545 if ($pcb->inp_vflag & $INP_IPV4)
6547 _show_in_addr &($pcb->inp_dependfaddr.inp46_foreign.ia46_addr4)
6549 _show_in6_addr &($pcb->inp_dependfaddr.inp6_foreign)
6552 _print_ntohs $pcb->inp_fport
6555 if $arg1 == $IPPROTO_TCP
6556 _showtcpstate $pcb->inp_ppcb
6560 # set $phd = $pcb->inp_phd
6563 # _print_ntohs $phd->phd_port
6564 # set $phd = $phd->phd_hash.le_next
6567 if ($pcb->inp_flags & $INP_RECVOPTS)
6570 if ($pcb->inp_flags & $INP_RECVRETOPTS)
6571 printf "recvretopts "
6573 if ($pcb->inp_flags & $INP_RECVDSTADDR)
6574 printf "recvdstaddr "
6576 if ($pcb->inp_flags & $INP_HDRINCL)
6579 if ($pcb->inp_flags & $INP_HIGHPORT)
6582 if ($pcb->inp_flags & $INP_LOWPORT)
6585 if ($pcb->inp_flags & $INP_ANONPORT)
6588 if ($pcb->inp_flags & $INP_RECVIF)
6591 if ($pcb->inp_flags & $INP_MTUDISC)
6594 if ($pcb->inp_flags & $INP_STRIPHDR)
6597 if ($pcb->inp_flags & $INP_FAITH)
6600 if ($pcb->inp_flags & $INP_INADDR_ANY)
6601 printf "inaddr_any "
6603 if ($pcb->inp_flags & $INP_RECVTTL)
6606 if ($pcb->inp_flags & $INP_UDP_NOCKSUM)
6609 if ($pcb->inp_flags & $IN6P_IPV6_V6ONLY)
6612 if ($pcb->inp_flags & $IN6P_PKTINFO)
6615 if ($pcb->inp_flags & $IN6P_HOPLIMIT)
6618 if ($pcb->inp_flags & $IN6P_HOPOPTS)
6621 if ($pcb->inp_flags & $IN6P_DSTOPTS)
6624 if ($pcb->inp_flags & $IN6P_RTHDR)
6627 if ($pcb->inp_flags & $IN6P_RTHDRDSTOPTS)
6628 printf "rthdrdstopts "
6630 if ($pcb->inp_flags & $IN6P_AUTOFLOWLABEL)
6631 printf "autoflowlabel "
6633 if ($pcb->inp_flags & $IN6P_BINDV6ONLY)
6634 printf "bindv6only "
6636 set $so = (struct socket *)$pcb->inp_socket
6638 printf "[so=%p s=%ld r=%ld usecnt=%ld] ", $so, $so->so_snd.sb_cc, \
6639 $so->so_rcv.sb_cc, $so->so_usecount
6641 if ($pcb->inp_state == 0 || $pcb->inp_state == $INPCB_STATE_INUSE)
6644 if ($pcb->inp_state == $INPCB_STATE_CACHED)
6647 if ($pcb->inp_state == $INPCB_STATE_DEAD)
6650 printf "unknown (%d), ", $pcb->inp_state
6656 define _dump_inpcbport
6657 set $ppcb = (struct inpcbport *)$arg0
6658 printf "%p: lport ", $ppcb
6659 _print_ntohs $ppcb->phd_port
6664 define _dump_pcbinfo
6668 set $pcbi = (struct inpcbinfo *)$arg0
6669 printf "lastport %d lastlow %d lasthi %d\n", \
6670 $pcbi->lastport, $pcbi->lastlow, $pcbi->lasthi
6671 printf "active pcb count is %d\n", $pcbi->ipi_count
6672 set $hashsize = $pcbi->hashmask + 1
6673 printf "hash size is %d\n", $hashsize
6674 printf "hash base %p has the following inpcb(s):\n", $pcbi->hashbase
6676 printf "pcb prot source address port destination address port\n"
6677 printf "------------------ ---- --------------------------------------- ----- --------------------------------------- -----\n"
6679 printf "pcb prot source address port destination address port\n"
6680 printf "---------- ---- --------------------------------------- ----- --------------------------------------- -----\n"
6683 set $hashbase = $pcbi->hashbase
6684 set $head = *(uintptr_t *)$hashbase
6685 while $i < $hashsize
6687 set $pcb0 = (struct inpcb *)$head
6690 _dump_inpcb $pcb0 $arg1
6691 set $so = (struct socket *)$pcb->inp_socket
6693 set $snd_cc += $so->so_snd.sb_cc
6694 set $rcv_cc += $so-> so_rcv.sb_cc
6696 set $pcb0 = $pcb0->inp_hash.le_next
6702 set $head = *(uintptr_t *)$hashbase
6704 printf "total seen %ld snd_cc %ld rcv_cc %ld\n", $pcbseen, $snd_cc, $rcv_cc
6705 printf "port hash base is %p\n", $pcbi->porthashbase
6707 set $hashbase = $pcbi->porthashbase
6708 set $head = *(uintptr_t *)$hashbase
6709 while $i < $hashsize
6711 set $pcb0 = (struct inpcbport *)$head
6714 _dump_inpcbport $pcb0
6716 set $pcb0 = $pcb0->phd_hash.le_next
6721 set $head = *(uintptr_t *)$hashbase
6725 set $N_TIME_WAIT_SLOTS=128
6727 define show_tcp_timewaitslots
6734 set $slot = (int)$arg0
6737 printf "time wait slot size %d cur_tw_slot %ld\n", $N_TIME_WAIT_SLOTS, cur_tw_slot
6739 while $i < $N_TIME_WAIT_SLOTS
6741 set $head = (uintptr_t *)time_wait_slots[$i]
6742 if $i == $slot || $slot == -1
6744 set $pcb0 = (struct inpcb *)$head
6747 set $pcb0 = $pcb0->inp_list.le_next
6750 printf " slot %ld count %ld\n", $i, $perslot
6752 if $all || $i == $slot
6754 set $pcb0 = (struct inpcb *)$head
6757 _dump_inpcb $pcb0 $IPPROTO_TCP
6759 set $pcb0 = $pcb0->inp_list.le_next
6766 document show_tcp_timewaitslots
6767 Syntax: (gdb) show_tcp_timewaitslots
6768 | Print the list of TCP protocol control block in the TIMEWAIT state
6769 | Pass -1 to see the list of PCB for each slot
6770 | Pass a slot number to see information for that slot with the list of PCB
6773 define show_tcp_pcbinfo
6774 _dump_pcbinfo &tcbinfo $IPPROTO_TCP
6776 document show_tcp_pcbinfo
6777 Syntax: (gdb) show_tcp_pcbinfo
6778 | Print the list of TCP protocol control block information
6782 define show_udp_pcbinfo
6783 _dump_pcbinfo &udbinfo $IPPROTO_UDP
6785 document show_udp_pcbinfo
6786 Syntax: (gdb) show_udp_pcbinfo
6787 | Print the list of UDP protocol control block information
6792 while ($myi < bpf_dtab_size)
6793 if (bpf_dtab[$myi] != 0)
6794 printf "Address 0x%x, bd_next 0x%x\n", bpf_dtab[$myi], bpf_dtab[$myi]->bd_next
6795 print *bpf_dtab[$myi]
6801 define printvnodepathint_recur
6803 if ($arg0->v_flag & 0x000001) && ($arg0->v_mount != 0)
6804 if $arg0->v_mount->mnt_vnodecovered != 0
6805 printvnodepathint_recur $arg0->v_mount->mnt_vnodecovered $arg0->v_mount->mnt_vnodecovered->v_name
6808 printvnodepathint_recur $arg0->v_parent $arg0->v_parent->v_name
6814 define showvnodepath
6815 set $vp = (struct vnode *)$arg0
6817 if ($vp->v_flag & 0x000001) && ($vp->v_mount != 0) && ($vp->v_mount->mnt_flag & 0x00004000)
6820 printvnodepathint_recur $vp $vp->v_name
6826 document showvnodepath
6827 Syntax: (gdb) showvnodepath <vnode>
6828 | Prints the path for a vnode
6836 printf " mnt_devvp "
6838 printf " typename mountpoint\n"
6839 set $kgm_vol = (mount_t) mountlist.tqh_first
6843 showptr $kgm_vol->mnt_data
6845 showptr $kgm_vol->mnt_devvp
6847 if ($kgm_vol->mnt_vtable->vfc_name[0] == 'h') && \
6848 ($kgm_vol->mnt_vtable->vfc_name[1] == 'f') && \
6849 ($kgm_vol->mnt_vtable->vfc_name[2] == 's') && \
6850 ($kgm_vol->mnt_vtable->vfc_name[3] == '\0')
6851 set $kgm_hfsmount = \
6852 (struct hfsmount *) $kgm_vol->mnt_data
6853 if $kgm_hfsmount->hfs_freezing_proc != 0
6854 printf "FROZEN hfs "
6859 printf "%-10s ", $kgm_vol->mnt_vtable->vfc_name
6861 printf "%s\n", $kgm_vol->mnt_vfsstat.f_mntonname
6863 set $kgm_vol = (mount_t) $kgm_vol->mnt_list.tqe_next
6867 document showallvols
6868 Syntax: (gdb) showallvols
6869 | Display a summary of mounted volumes
6872 define showvnodeheader
6875 printf " usecount iocount v_data "
6877 printf " vtype parent "
6883 set $kgm_vnode = (vnode_t) $arg0
6885 printf " %8d ", $kgm_vnode->v_usecount
6886 printf "%7d ", $kgm_vnode->v_iocount
6887 # print information about clean/dirty blocks?
6888 showptr $kgm_vnode->v_data
6890 # print the vtype, using the enum tag
6891 set $kgm_vtype = $kgm_vnode->v_type
6892 if $kgm_vtype == VNON
6895 if $kgm_vtype == VREG
6898 if $kgm_vtype == VDIR
6901 if $kgm_vtype == VBLK
6904 if $kgm_vtype == VCHR
6907 if $kgm_vtype == VLNK
6910 if $kgm_vtype == VSOCK
6913 if $kgm_vtype == VFIFO
6916 if $kgm_vtype == VBAD
6919 if ($kgm_vtype < VNON) || ($kgm_vtype > VBAD)
6920 printf "%5d ", $kgm_vtype
6923 showptr $kgm_vnode->v_parent
6925 if $kgm_vnode->v_name != 0
6926 printf "%s\n", $kgm_vnode->v_name
6938 Syntax: (gdb) showvnode <vnode>
6939 | Display info about one vnode
6942 define showvolvnodes
6944 set $kgm_vol = (mount_t) $arg0
6945 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
6947 showvnodeint $kgm_vnode
6948 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
6952 document showvolvnodes
6953 Syntax: (gdb) showvolvnodes <mouont_t>
6954 | Display info about all vnodes of a given mount_t
6957 define showvolbusyvnodes
6959 set $kgm_vol = (mount_t) $arg0
6960 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
6962 if $kgm_vnode->v_iocount != 0
6963 showvnodeint $kgm_vnode
6965 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
6969 document showvolbusyvnodes
6970 Syntax: (gdb) showvolbusyvnodes <mount_t>
6971 | Display info about busy (iocount!=0) vnodes of a given mount_t
6974 define showallbusyvnodes
6976 set $kgm_vol = (mount_t) mountlist.tqh_first
6978 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
6980 if $kgm_vnode->v_iocount != 0
6981 showvnodeint $kgm_vnode
6983 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
6985 set $kgm_vol = (mount_t) $kgm_vol->mnt_list.tqe_next
6989 document showallbusyvnodes
6990 Syntax: (gdb) showallbusyvnodes <vnode>
6991 | Display info about all busy (iocount!=0) vnodes
6994 define showallvnodes
6996 set $kgm_vol = (mount_t) mountlist.tqh_first
6998 set $kgm_vnode = (vnode_t) $kgm_vol.mnt_vnodelist.tqh_first
7000 showvnodeint $kgm_vnode
7001 set $kgm_vnode = (vnode_t) $kgm_vnode->v_mntvnodes.tqe_next
7003 set $kgm_vol = (mount_t) $kgm_vol->mnt_list.tqe_next
7007 document showallvnodes
7008 Syntax: (gdb) showallvnodes
7009 | Display info about all vnodes
7012 define _showvnodelockheader
7013 printf "* type W held by lock type start end\n"
7014 printf "- ----- - ------------- --------- ------------------ ------------------\n"
7017 define _showvnodelock
7018 set $kgm_svl_lock = ((struct lockf *)$arg0)
7021 set $kgm_svl_flags = $kgm_svl_lock->lf_flags
7022 set $kgm_svl_type = $kgm_svl_lock->lf_type
7023 if ($kgm_svl_flags & 0x20)
7026 if ($kgm_svl_flags & 0x40)
7029 if ($kgm_svl_flags & 0x80)
7032 if ($kgm_svl_flags & 0x10)
7038 # POSIX file vs. advisory range locks
7039 if ($kgm_svl_flags & 0x40)
7040 set $kgm_svl_proc = (proc_t)$kgm_svl_lock->lf_id
7041 printf "PID %8d ", $kgm_svl_proc->p_pid
7043 printf "ID 0x%08x ", $kgm_svl_lock->lf_id
7047 if ($kgm_svl_type == 1)
7050 if ($kgm_svl_type == 3)
7053 if ($kgm_svl_type == 2)
7062 printf "0x%016x..", $kgm_svl_lock->lf_start
7063 printf "0x%016x ", $kgm_svl_lock->lf_end
7066 # Body of showvnodelocks, not including header
7067 define _showvnodelocks
7068 set $kgm_svl_vnode = ((vnode_t)$arg0)
7069 set $kgm_svl_lockiter = $kgm_svl_vnode->v_lockf
7070 while ($kgm_svl_lockiter != 0)
7071 # locks that are held
7073 _showvnodelock $kgm_svl_lockiter
7075 # and any locks blocked by them
7076 set $kgm_svl_blocker = $kgm_svl_lockiter->lf_blkhd.tqh_first
7077 while ($kgm_svl_blocker != 0)
7079 _showvnodelock $kgm_svl_blocker
7080 set $kgm_svl_blocker = $kgm_svl_blocker->lf_block.tqe_next
7083 # and on to the next one...
7084 set $kgm_svl_lockiter = $kgm_svl_lockiter->lf_next
7089 define showvnodelocks
7091 _showvnodelockheader
7092 _showvnodelocks $arg0
7094 printf "| Usage:\n|\n"
7099 document showvnodelocks
7100 Syntax: (gdb) showvnodelocks <vnode_t>
7101 | Given a vnodet pointer, display the list of advisory record locks for the
7102 | referenced pvnodes
7106 printf "%s\n", (char*)((boot_args*)PE_state.bootArgs).CommandLine
7109 document showbootargs
7110 Syntax: showbootargs
7111 | Display boot arguments passed to the target kernel
7114 define showbootermemorymap
7115 if ($kgm_mtype == $kgm_mtype_i386)
7116 set $kgm_voffset = 0
7118 if ($kgm_mtype == $kgm_mtype_x86_64)
7119 set $kgm_voffset = 0xFFFFFF8000000000ULL
7121 echo showbootermemorymap not supported on this architecture
7125 set $kgm_boot_args = kernelBootArgs
7126 set $kgm_msize = kernelBootArgs->MemoryMapDescriptorSize
7127 set $kgm_mcount = kernelBootArgs->MemoryMapSize / $kgm_msize
7130 printf "Type Physical Start Number of Pages Virtual Start Attributes\n"
7131 while $kgm_i < $kgm_mcount
7132 set $kgm_mptr = (EfiMemoryRange *)((unsigned long)kernelBootArgs->MemoryMap + $kgm_voffset + $kgm_i * $kgm_msize)
7134 if $kgm_mptr->Type == 0
7137 if $kgm_mptr->Type == 1
7140 if $kgm_mptr->Type == 2
7143 if $kgm_mptr->Type == 3
7146 if $kgm_mptr->Type == 4
7149 if $kgm_mptr->Type == 5
7152 if $kgm_mptr->Type == 6
7155 if $kgm_mptr->Type == 7
7158 if $kgm_mptr->Type == 8
7161 if $kgm_mptr->Type == 9
7164 if $kgm_mptr->Type == 10
7167 if $kgm_mptr->Type == 11
7170 if $kgm_mptr->Type == 12
7173 if $kgm_mptr->Type == 13
7176 if $kgm_mptr->Type > 13
7180 printf " %016llx %016llx", $kgm_mptr->PhysicalStart, $kgm_mptr->NumberOfPages
7181 if $kgm_mptr->VirtualStart != 0
7182 printf " %016llx", $kgm_mptr->VirtualStart
7186 printf " %016llx\n", $kgm_mptr->Attribute
7187 set $kgm_i = $kgm_i + 1
7191 document showbootermemorymap
7192 Syntax: (gdb) showbootermemorymap
7193 | Prints out the phys memory map from kernelBootArgs
7197 define showstacksaftertask
7198 set $kgm_head_taskp = &default_pset.tasks
7199 set $kgm_taskp = (struct task *)$arg0
7200 while $kgm_taskp != $kgm_head_taskp
7202 showtaskint $kgm_taskp
7203 set $kgm_head_actp = &($kgm_taskp->threads)
7204 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
7205 while $kgm_actp != $kgm_head_actp
7207 if ($decode_wait_events > 0)
7208 showactint $kgm_actp 1
7210 showactint $kgm_actp 2
7212 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
7215 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
7218 document showstacksaftertask
7219 Syntax: (gdb) showstacksaftertask <task>
7220 | Routine to print out all stacks (as in showallstacks) starting after a given task
7221 | Useful if that gdb refuses to print a certain task's stack.
7224 define showpmworkqueueint
7225 set $kgm_pm_wq = (IOPMWorkQueue *)$arg0
7226 set $kgm_pm_node = (IOService *)$kgm_pm_wq->owner
7229 showptr $kgm_pm_node
7231 printf "%02d ", $kgm_pm_node->pwrMgt->CurrentPowerState
7232 printf "%02d ", $kgm_pm_node->pwrMgt->MachineState
7233 printf "%02d ", $kgm_pm_node->pwrMgt->WaitReason
7234 printf "%s\n", $kgm_pm_node->pwrMgt->Name
7235 set $kgm_pm_queue = &($kgm_pm_wq->fWorkQueue)
7236 set $kgm_pm_req = (IOPMRequest *)$kgm_pm_queue->next
7237 if ((queue_entry_t) $kgm_pm_req != (queue_entry_t) $kgm_pm_queue)
7241 printf " type next "
7245 printf " work_wait free_wait\n"
7246 while ((queue_entry_t) $kgm_pm_req != (queue_entry_t) $kgm_pm_queue)
7248 printf " 0x%02x ", $kgm_pm_req->fType
7249 showptr $kgm_pm_req->fRequestNext
7251 showptr $kgm_pm_req->fRequestRoot
7252 printf " 0x%08x 0x%08x\n", $kgm_pm_req->fWorkWaitCount, $kgm_pm_req->fFreeWaitCount
7255 showptr $kgm_pm_req->fArg0
7257 showptr $kgm_pm_req->fArg1
7259 showptr $kgm_pm_req->fArg2
7261 set $kgm_pm_req = (IOPMRequest *)$kgm_pm_req->fCommandChain.next
7267 define showallpmworkqueues
7268 set $kgm_pm_next = gIOPMWorkLoop->eventChain
7273 printf " ps ms wr name\n"
7274 while ( $kgm_pm_next )
7275 set $kgm_vt = *((void **) $kgm_pm_next)
7276 if ($kgm_lp64 || $kgm_mtype == $kgm_mtype_arm)
7277 set $kgm_vt = $kgm_vt - 2 * sizeof(void *)
7279 if ($kgm_vt == &_ZTV13IOPMWorkQueue)
7280 showpmworkqueueint $kgm_pm_next
7282 set $kgm_pm_next = $kgm_pm_next->eventChainNext
7286 document showallpmworkqueues
7287 Syntax: (gdb) showallpmworkqueues
7288 | Display info about all IOPMWorkQueue objects
7291 define showioservicepm
7292 set $kgm_iopmpriv = (IOServicePM *)$arg0
7294 printf "MachineState = %d (", $kgm_iopmpriv->MachineState
7295 if ( $kgm_iopmpriv->MachineState == 1 )
7296 printf "kIOPM_OurChangeTellClientsPowerDown"
7298 if ( $kgm_iopmpriv->MachineState == 2 )
7299 printf "kIOPM_OurChangeTellPriorityClientsPowerDown"
7301 if ( $kgm_iopmpriv->MachineState == 3 )
7302 printf "kIOPM_OurChangeNotifyInterestedDriversWillChange"
7304 if ( $kgm_iopmpriv->MachineState == 4 )
7305 printf "kIOPM_OurChangeSetPowerState"
7307 if ( $kgm_iopmpriv->MachineState == 5 )
7308 printf "kIOPM_OurChangeWaitForPowerSettle"
7310 if ( $kgm_iopmpriv->MachineState == 6 )
7311 printf "kIOPM_OurChangeNotifyInterestedDriversDidChange"
7313 if ( $kgm_iopmpriv->MachineState == 7 )
7314 printf "kIOPM_OurChangeFinish"
7316 if ( $kgm_iopmpriv->MachineState == 8 )
7317 printf "kIOPM_ParentDownTellPriorityClientsPowerDown"
7319 if ( $kgm_iopmpriv->MachineState == 9 )
7320 printf "kIOPM_ParentDownNotifyInterestedDriversWillChange"
7322 if ( $kgm_iopmpriv->MachineState == 10 )
7323 printf "Unused_MachineState_10"
7325 if ( $kgm_iopmpriv->MachineState == 11 )
7326 printf "kIOPM_ParentDownNotifyDidChangeAndAcknowledgeChange"
7328 if ( $kgm_iopmpriv->MachineState == 12 )
7329 printf "kIOPM_ParentDownSetPowerState"
7331 if ( $kgm_iopmpriv->MachineState == 13 )
7332 printf "kIOPM_ParentDownWaitForPowerSettle"
7334 if ( $kgm_iopmpriv->MachineState == 14 )
7335 printf "kIOPM_ParentDownAcknowledgeChange"
7337 if ( $kgm_iopmpriv->MachineState == 15)
7338 printf "kIOPM_ParentUpSetPowerState"
7340 if ( $kgm_iopmpriv->MachineState == 16)
7341 printf "Unused_MachineState_16"
7343 if ( $kgm_iopmpriv->MachineState == 17)
7344 printf "kIOPM_ParentUpWaitForSettleTime"
7346 if ( $kgm_iopmpriv->MachineState == 18)
7347 printf "kIOPM_ParentUpNotifyInterestedDriversDidChange"
7349 if ( $kgm_iopmpriv->MachineState == 19)
7350 printf "kIOPM_ParentUpAcknowledgePowerChange"
7352 if ( $kgm_iopmpriv->MachineState == 20)
7353 printf "kIOPM_Finished"
7355 if ( $kgm_iopmpriv->MachineState == 21)
7356 printf "kIOPM_DriverThreadCallDone"
7358 if ( $kgm_iopmpriv->MachineState == 22)
7359 printf "kIOPM_NotifyChildrenDone"
7384 if ( $kgm_iopmpriv->MachineState != 20 )
7385 printf "DriverTimer = %d, ",(unsigned int)$kgm_iopmpriv->DriverTimer
7386 printf "SettleTime = %d, ",(unsigned int)$kgm_iopmpriv->SettleTimeUS
7387 printf "HeadNoteFlags = %08x, ",(unsigned int)$kgm_iopmpriv->HeadNoteFlags
7388 printf "HeadNotePendingAcks = %x, ",(unsigned int)$kgm_iopmpriv->HeadNotePendingAcks
7391 if ( $kgm_iopmpriv->DeviceOverrides != 0 )
7392 printf"DeviceOverrides, "
7395 printf "DeviceDesire = %d, ",(unsigned int)$kgm_iopmpriv->DeviceDesire
7396 printf "DesiredPowerState = %d, ",(unsigned int)$kgm_iopmpriv->DesiredPowerState
7397 printf "PreviousRequest = %d }\n",(unsigned int)$kgm_iopmpriv->PreviousRequest
7400 document showioservicepm
7401 Syntax: (gdb) showioservicepm <IOServicePM pointer>
7402 | Routine to dump the IOServicePM object
7405 define showregistryentryrecursepmstate
7406 set $kgm_re = (IOService *)$arg1
7407 set $kgm$arg0_stack = (unsigned long long) $arg2
7410 set $kgm$arg0_stack = $kgm$arg0_stack | (1ULL << $kgm_reg_depth)
7412 set $kgm$arg0_stack = $kgm$arg0_stack & ~(1ULL << $kgm_reg_depth)
7415 dictget $kgm_re->fRegistryTable $kgm_childkey
7416 set $kgm$arg0_child_array = (OSArray *) $kgm_result
7418 if ($kgm$arg0_child_array)
7419 set $kgm$arg0_child_count = $kgm$arg0_child_array->count
7421 set $kgm$arg0_child_count = 0
7424 if ($kgm$arg0_child_count)
7425 set $kgm$arg0_stack = $kgm$arg0_stack | (2ULL << $kgm_reg_depth)
7427 set $kgm$arg0_stack = $kgm$arg0_stack & ~(2ULL << $kgm_reg_depth)
7430 indent $kgm_reg_depth $kgm$arg0_stack
7433 dictget $kgm_re->fRegistryTable $kgm_namekey
7434 if ($kgm_result == 0)
7435 dictget $kgm_re->fRegistryTable gIONameKey
7437 if ($kgm_result == 0)
7438 dictget $kgm_re->fPropertyTable gIOClassKey
7441 if ($kgm_result != 0)
7442 printf "%s <%p>", ((OSString *)$kgm_result)->string, $kgm_re
7444 if (((IOService*)$kgm_re)->pwrMgt && ((IOService*)$kgm_re)->pwrMgt->Name)
7445 printf "%s <", ((IOService*)$kgm_re)->pwrMgt->Name
7455 if (((IOService*)$kgm_re)->pwrMgt )
7456 printf " Current Power State: %ld ", ((IOService*)$kgm_re)->pwrMgt->CurrentPowerState
7457 #printf " Mach State %ld", ((IOService*)$kgm_re)->pwrMgt->MachineState
7458 showioservicepm ((IOService*)$kgm_re)->pwrMgt
7464 if ($kgm$arg0_child_count != 0)
7466 set $kgm_reg_depth = $kgm_reg_depth + 1
7467 set $kgm$arg0_child_idx = 0
7469 while ($kgm$arg0_child_idx < $kgm$arg0_child_count)
7470 set $kgm_re = $kgm$arg0_child_array->array[$kgm$arg0_child_idx++]
7471 set $kgm_more_sib = ($kgm$arg0_child_idx < $kgm$arg0_child_count)
7472 if $kgm_reg_depth >= $kgm_reg_depth_max + 1
7475 showregistryentryrecursepmstate _$arg0 $kgm_re $kgm$arg0_stack $kgm_more_sib
7478 set $kgm_reg_depth = $kgm_reg_depth - 1
7482 define showregistryentryintpmstate
7484 set $kgm_reg_plane = (IORegistryPlane *) gIOServicePlane
7488 printf "Please load kgmacros after KDP attaching to the target.\n"
7490 set $kgm_namekey = (OSSymbol *) $kgm_reg_plane->nameKey
7491 set $kgm_childkey = (OSSymbol *) $kgm_reg_plane->keys[1]
7492 showregistryentryrecursepmstate _ $arg0 0 0
7496 define showregistrypmstate
7497 # setregistryplane gIOPowerPlane
7498 set $kgm_reg_depth = 0
7499 set $kgm_show_props = 1
7500 showregistryentryintpmstate gRegistryRoot
7503 document showregistrypmstate
7504 Syntax: (gdb) showregistrypmstate
7505 | Routine to dump the PM state of each IOPower registry entry
7508 define showstacksafterthread
7509 set $kgm_head_taskp = &default_pset.tasks
7510 set $kgm_actp = (struct thread *)$arg0
7511 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
7512 set $kgm_taskp = (struct task *)$kgm_actp->task
7513 while $kgm_taskp != $kgm_head_taskp
7515 showtaskint $kgm_taskp
7516 set $kgm_head_actp = &($kgm_taskp->threads)
7517 while $kgm_actp != $kgm_head_actp
7519 if ($decode_wait_events > 0)
7520 showactint $kgm_actp 1
7522 showactint $kgm_actp 2
7524 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
7527 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
7531 document showstacksafterthread
7532 Syntax: (gdb) showstacksafterthread <thread>
7533 | Routine to print out all stacks (as in showallstacks) starting after a given thread
7534 | Useful if that gdb refuses to print a certain task's stack.
7538 set kdp_reentry_deadline = ((unsigned) $arg0)*1000
7542 document kdp-reenter
7543 Syntax: (gdb) kdp-reenter <seconds>
7544 | Schedules reentry into the debugger after <seconds> seconds, and resumes
7545 | the target system.
7556 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
7557 printf "Not available for current architecture.\n"
7560 _if_present mca_MCA_present
7561 printf ", control MSR"
7562 _if_present mca_control_MSR_present
7563 printf ", threshold status"
7564 _if_present mca_threshold_status_present
7565 printf "\n%d error banks, ", mca_error_bank_count
7566 printf "family code 0x%x, ", mca_family
7567 printf "machine-check dump state: %d\n", mca_dump_state
7569 while cpu_data_ptr[$kgm_cpu] != 0
7570 set $kgm_mcp = cpu_data_ptr[$kgm_cpu]->cpu_mca_state
7572 printf "CPU %d:", $kgm_cpu
7573 printf " mca_mcg_ctl: 0x%016llx", $kgm_mcp->mca_mcg_ctl
7574 printf " mca_mcg_status: 0x%016llx\n", $kgm_mcp->mca_mcg_status.u64
7576 printf "mca_mci_ctl "
7577 printf "mca_mci_status "
7578 printf "mca_mci_addr "
7579 printf "mca_mci_misc\n"
7581 while $kgm_bank < mca_error_bank_count
7582 set $kgm_bp = &$kgm_mcp->mca_error_bank[$kgm_bank]
7583 printf " %2d:", $kgm_bank
7584 printf " 0x%016llx", $kgm_bp->mca_mci_ctl
7585 printf " 0x%016llx", $kgm_bp->mca_mci_status.u64
7586 printf " 0x%016llx", $kgm_bp->mca_mci_addr
7587 printf " 0x%016llx\n", $kgm_bp->mca_mci_misc
7588 set $kgm_bank = $kgm_bank + 1
7591 set $kgm_cpu = $kgm_cpu + 1
7596 document showMCAstate
7597 Syntax: showMCAstate
7598 | Print machine-check register state after MC exception.
7603 # Step to lower-level page table and print attributes
7604 # $kgm_pt_paddr: current page table entry physical address
7605 # $kgm_pt_index: current page table entry index (0..511)
7607 # $kgm_pt_paddr: next level page table entry physical address
7608 # or null if invalid
7609 # $kgm_pt_valid: 1 if $kgm_pt_paddr is valid, 0 if the walk
7611 # $kgm_pt_large: 1 if kgm_pt_paddr is a page frame address
7612 # of a large page and not another page table entry
7613 # For $kgm_pt_verbose = 0: print nothing
7614 # 1: print basic information
7615 # 2: print basic information and hex table dump
7617 set $kgm_entryp = $kgm_pt_paddr + 8*$kgm_pt_index
7618 readphysint $kgm_entryp 64 $kgm_lcpu_self
7619 set $entry = $kgm_readphysint_result
7620 if $kgm_pt_verbose == 2
7621 set $kgm_pte_loop = 0
7622 while $kgm_pte_loop < 512
7623 set $kgm_pt_paddr_tmp = $kgm_pt_paddr + $kgm_pte_loop*8
7624 readphys64 $kgm_pt_paddr_tmp
7625 set $kgm_pte_loop = $kgm_pte_loop + 1
7628 set $kgm_paddr_mask = ~((0xfffULL<<52) | 0xfffULL)
7629 set $kgm_paddr_largemask = ~((0xfffULL<<52) | 0x1fffffULL)
7630 if $kgm_pt_verbose == 0
7631 if $entry & (0x1 << 0)
7632 set $kgm_pt_valid = 1
7633 if $entry & (0x1 << 7)
7634 set $kgm_pt_large = 1
7635 set $kgm_pt_paddr = $entry & $kgm_paddr_largemask
7637 set $kgm_pt_large = 0
7638 set $kgm_pt_paddr = $entry & $kgm_paddr_mask
7641 set $kgm_pt_valid = 0
7642 set $kgm_pt_large = 0
7643 set $kgm_pt_paddr = 0
7646 printf "0x%016llx:\n\t0x%016llx\n\t", $kgm_entryp, $entry
7647 if $entry & (0x1 << 0)
7649 set $kgm_pt_paddr = $entry & $kgm_paddr_mask
7650 set $kgm_pt_valid = 1
7653 set $kgm_pt_paddr = 0
7654 set $kgm_pt_valid = 0
7655 # stop decoding other bits
7658 if $entry & (0x1 << 1)
7663 if $entry & (0x1 << 2)
7666 printf " supervisor"
7668 if $entry & (0x1 << 3)
7671 if $entry & (0x1 << 4)
7674 if $entry & (0x1 << 5)
7677 if $entry & (0x1 << 6)
7680 if $entry & (0x1 << 7)
7682 set $kgm_pt_large = 1
7684 set $kgm_pt_large = 0
7686 if $entry & (0x1 << 8)
7689 if $entry & (0x3 << 9)
7690 printf " avail:0x%x", ($entry >> 9) & 0x3
7692 if $entry & (0x1 << 63)
7700 set $kgm_pmap = (pmap_t) $arg0
7701 set $kgm_vaddr = $arg1
7702 set $kgm_pt_paddr = $kgm_pmap->pm_cr3
7703 set $kgm_pt_valid = $kgm_pt_paddr != 0
7704 set $kgm_pt_large = 0
7705 set $kgm_pframe_offset = 0
7706 if $kgm_pt_valid && cpu_64bit
7707 # Look up bits 47:39 of the linear address in PML4T
7708 set $kgm_pt_index = ($kgm_vaddr >> 39) & 0x1ffULL
7709 set $kgm_pframe_offset = $kgm_vaddr & 0x7fffffffffULL
7711 printf "pml4 (index %d):\n", $kgm_pt_index
7716 # Look up bits 38:30 of the linear address in PDPT
7717 set $kgm_pt_index = ($kgm_vaddr >> 30) & 0x1ffULL
7718 set $kgm_pframe_offset = $kgm_vaddr & 0x3fffffffULL
7720 printf "pdpt (index %d):\n", $kgm_pt_index
7724 if $kgm_pt_valid && !$kgm_pt_large
7725 # Look up bits 29:21 of the linear address in PDT
7726 set $kgm_pt_index = ($kgm_vaddr >> 21) & 0x1ffULL
7727 set $kgm_pframe_offset = $kgm_vaddr & 0x1fffffULL
7729 printf "pdt (index %d):\n", $kgm_pt_index
7733 if $kgm_pt_valid && !$kgm_pt_large
7734 # Look up bits 20:21 of the linear address in PT
7735 set $kgm_pt_index = ($kgm_vaddr >> 12) & 0x1ffULL
7736 set $kgm_pframe_offset = $kgm_vaddr & 0xfffULL
7738 printf "pt (index %d):\n", $kgm_pt_index
7743 set $kgm_paddr = $kgm_pt_paddr + $kgm_pframe_offset
7744 readphysint $kgm_paddr 32 $kgm_lcpu_self
7745 set $kgm_value = $kgm_readphysint_result
7746 printf "phys 0x%016llx: 0x%08x\n", $kgm_paddr, $kgm_value
7749 printf "(no translation)\n"
7754 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
7755 printf "Not available for current architecture.\n"
7758 printf "pmap_walk <pmap> <vaddr>\n"
7761 set $kgm_pt_verbose = 1
7763 if $kgm_pt_verbose != 2
7764 set $kgm_pt_verbose = 1
7767 _pmap_walk $arg0 $arg1
7773 Syntax: (gdb) pmap_walk <pmap> <virtual_address>
7774 | Perform a page-table walk in <pmap> for <virtual_address>.
7775 | Set $kgm_pt_verbose=2 for full hex dump of page tables.
7779 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
7780 printf "Not available for current architecture.\n"
7783 printf "pmap_vtop <pamp> <vaddr>\n"
7785 set $kgm_pt_verbose = 0
7786 _pmap_walk $arg0 $arg1
7792 Syntax: (gdb) pmap_vtop <pmap> <virtual_address>
7793 | For page-tables in <pmap> translate <virtual_address> to physical address.
7799 if (log_records == 0)
7801 printf "Zone logging not enabled. Add 'zlog=<zone name>' to boot-args.\n"
7811 printf "\n--------------- "
7813 if (zrecords[$index].z_opcode == 1)
7819 printf " 0x%x : index %d : ztime %d -------------\n", zrecords[$index].z_element, $index, zrecords[$index].z_time
7824 set $frame_pc = zrecords[$index].z_pc[$frame]
7831 set $frame = $frame + 1
7834 set $index = $index + 1
7835 set $count = $count - 1
7840 Syntax: (gdb) zstack <index> [<count>]
7841 | Zone leak debugging: print the stack trace of log element at <index>.
7842 | If a <count> is supplied, it prints <count> log elements starting at <index>.
7844 | The suggested usage is to look at indexes below zcurrent and look for common stack traces.
7845 | The stack trace that occurs the most is probably the cause of the leak. Find the pc of the
7846 | function calling into zalloc and use the countpcs kgmacro to find out how often that pc occurs in the log.
7847 | The pc occuring in a high percentage of records is most likely the source of the leak.
7849 | The findoldest kgmacro is also useful for leak debugging since it identifies the oldest record
7850 | in the log, which may indicate the leaker.
7855 set $count = log_records
7856 set $cur_min = 2000000000
7859 if (log_records == 0)
7860 printf "Zone logging not enabled. Add 'zlog=<zone name>' to boot-args.\n"
7864 if (zrecords[$index].z_element && zrecords[$index].z_time < $cur_min)
7865 set $cur_index = $index
7866 set $cur_min = zrecords[$index].z_time
7869 set $count = $count - 1
7870 set $index = $index + 1
7873 printf "oldest record is at log index %d:\n", $cur_index
7879 Syntax: (gdb) findoldest
7880 | Zone leak debugging: find and print the oldest record in the log. Note that this command
7881 | can take several minutes to run since it uses linear search.
7883 | Once it prints a stack trace, find the pc of the caller above all the zalloc, kalloc and
7884 | IOKit layers. Then use the countpcs kgmacro to see how often this caller has allocated
7885 | memory. A caller with a high percentage of records in the log is probably the leaker.
7889 set $target_pc = $arg0
7891 set $count = log_records
7894 if (log_records == 0)
7895 printf "Zone logging not enabled. Add 'zlog=<zone name>' to boot-args.\n"
7901 if (zrecords[$index].z_element != 0)
7903 if (zrecords[$index].z_pc[$frame] == $target_pc)
7904 set $found = $found + 1
7908 set $frame = $frame + 1
7912 set $index = $index + 1
7913 set $count = $count - 1
7916 printf "occurred %d times in log (%d%c of records)\n", $found, ($found * 100) / zrecorded, '%'
7921 Syntax: (gdb) countpcs <pc>
7922 | Zone leak debugging: search the log and print a count of all log entries that contain the given <pc>
7923 | in the stack trace. This is useful for verifying a suspected <pc> as being the source of
7924 | the leak. If a high percentage of the log entries contain the given <pc>, then it's most
7925 | likely the source of the leak. Note that this command can take several minutes to run.
7929 set $fe_index = zcurrent
7930 set $fe_count = log_records
7931 set $fe_elem = $arg0
7932 set $fe_prev_op = -1
7934 if (log_records == 0)
7935 printf "Zone logging not enabled. Add 'zlog=<zone name>' to boot-args.\n"
7939 if (zrecords[$fe_index].z_element == $fe_elem)
7942 if (zrecords[$fe_index].z_opcode == $fe_prev_op)
7943 printf "*************** DOUBLE OP! *********************\n
7946 set $fe_prev_op = zrecords[$fe_index].z_opcode
7949 set $fe_count = $fe_count - 1
7950 set $fe_index = $fe_index + 1
7952 if ($fe_index >= log_records)
7959 Syntax: (gdb) findelem <elem addr>
7960 | Zone corruption debugging: search the log and print out the stack traces for all log entries that
7961 | refer to the given zone element. When the kernel panics due to a corrupted zone element, get the
7962 | element address and use this macro. This will show you the stack traces of all logged zalloc and
7963 | zfree operations which tells you who touched the element in the recent past. This also makes
7964 | double-frees readily apparent.
7968 # This implements a shadowing scheme in kgmacros. If the
7969 # current user data can be accessed by simply changing kdp_pmap,
7970 # that is used. Otherwise, we copy data into a temporary buffer
7971 # in the kernel's address space and use that instead. Don't rely on
7972 # kdp_pmap between invocations of map/unmap. Since the shadow
7973 # codepath uses a manual KDP packet, request no more than 128 bytes.
7974 # Uses $kgm_lp64 for kernel address space size
7975 define _map_user_data_from_task
7976 set $kgm_map_user_taskp = (task_t)$arg0
7977 set $kgm_map_user_map = $kgm_map_user_taskp->map
7978 set $kgm_map_user_pmap = $kgm_map_user_map->pmap
7979 set $kgm_map_user_task_64 = ( $kgm_map_user_taskp->taskFeatures[0] & 0x80000000)
7980 set $kgm_map_user_window = 0
7981 set $kgm_map_switch_map = 0
7984 set $kgm_map_switch_map = 1
7986 if !$kgm_map_user_task_64
7987 set $kgm_map_switch_map = 1
7991 if ($kgm_map_switch_map)
7992 # switch the map safely
7993 set $kgm_map_user_window = $arg1
7994 set kdp_pmap = $kgm_map_user_pmap
7996 # requires shadowing/copying
7998 # set up the manual KDP packet
7999 set manual_pkt.input = 0
8000 set manual_pkt.len = sizeof(kdp_readmem64_req_t)
8001 set $kgm_pkt = (kdp_readmem64_req_t *)&manual_pkt.data
8002 set $kgm_pkt->hdr.request = KDP_READMEM64
8003 set $kgm_pkt->hdr.len = sizeof(kdp_readmem64_req_t)
8004 set $kgm_pkt->hdr.is_reply = 0
8005 set $kgm_pkt->hdr.seq = 0
8006 set $kgm_pkt->hdr.key = 0
8007 set $kgm_pkt->address = (uint64_t)$arg1
8008 set $kgm_pkt->nbytes = (uint32_t)$arg2
8010 set kdp_pmap = $kgm_map_user_pmap
8011 set manual_pkt.input = 1
8012 # dummy to make sure manual packet is executed
8013 set $kgm_dummy = &_mh_execute_header
8014 # Go back to kernel map so that we can access buffer directly
8017 set $kgm_pkt = (kdp_readmem64_reply_t *)&manual_pkt.data
8018 if ($kgm_pkt->error == 0)
8019 set $kgm_map_user_window = $kgm_pkt->data
8021 set $kgm_map_user_window = 0
8027 define _unmap_user_data_from_task
8031 # uses $kgm_taskp. Maps 32 bytes at a time and prints it
8032 define _print_path_for_image
8033 set $kgm_print_path_address = (unsigned long long)$arg0
8034 set $kgm_path_str_notdone = 1
8036 while $kgm_path_str_notdone
8037 _map_user_data_from_task $kgm_taskp $kgm_print_path_address 32
8039 set $kgm_print_path_ptr = (char *)$kgm_map_user_window
8041 while ($kgm_path_i < 32 && $kgm_print_path_ptr[$kgm_path_i] != '\0')
8042 set $kgm_path_i = $kgm_path_i + 1
8044 printf "%.32s", $kgm_print_path_ptr
8046 _unmap_user_data_from_task $kgm_taskp
8048 # if we terminated on NUL, break out
8050 set $kgm_path_str_notdone = 0
8052 set $kgm_print_path_address = $kgm_print_path_address + 32
8057 # uses $kgm_taskp and $kgm_task_64
8058 define _print_image_info
8059 set $kgm_mh_image_address = (unsigned long long)$arg0
8060 set $kgm_mh_path_address = (unsigned long long)$arg1
8062 # 32 bytes enough for mach_header/mach_header_64
8063 _map_user_data_from_task $kgm_taskp $kgm_mh_image_address 32
8065 set $kgm_mh_ptr = (unsigned int*)$kgm_map_user_window
8066 set $kgm_mh_magic = $kgm_mh_ptr[0]
8067 set $kgm_mh_cputype = $kgm_mh_ptr[1]
8068 set $kgm_mh_cpusubtype = $kgm_mh_ptr[2]
8069 set $kgm_mh_filetype = $kgm_mh_ptr[3]
8070 set $kgm_mh_ncmds = $kgm_mh_ptr[4]
8071 set $kgm_mh_sizeofcmds = $kgm_mh_ptr[5]
8072 set $kgm_mh_flags = $kgm_mh_ptr[6]
8074 _unmap_user_data_from_task $kgm_taskp
8076 if $kgm_mh_magic == 0xfeedfacf
8078 set $kgm_lc_address = $kgm_mh_image_address + 32
8081 set $kgm_lc_address = $kgm_mh_image_address + 28
8085 set $kgm_uuid_data = 0
8086 while $kgm_lc_idx < $kgm_mh_ncmds
8088 # 24 bytes is size of uuid_command
8089 _map_user_data_from_task $kgm_taskp $kgm_lc_address 24
8091 set $kgm_lc_ptr = (unsigned int *)$kgm_map_user_window
8092 set $kgm_lc_cmd = $kgm_lc_ptr[0]
8093 set $kgm_lc_cmd_size = $kgm_lc_ptr[1]
8094 set $kgm_lc_data = (unsigned char *)$kgm_lc_ptr + 8
8096 if $kgm_lc_cmd == 0x1b
8097 set $kgm_uuid_data = $kgm_lc_data
8099 printf "0x%016llx ", $kgm_mh_image_address
8101 printf "0x%08x ", $kgm_mh_image_address
8104 set $kgm_printed_type = 0
8105 if $kgm_mh_filetype == 0x2
8106 printf "MH_EXECUTE "
8107 set $kgm_printed_type = 1
8109 if $kgm_mh_filetype == 0x6
8111 set $kgm_printed_type = 1
8113 if $kgm_mh_filetype == 0x7
8114 printf "MH_DYLINKER "
8115 set $kgm_printed_type = 1
8117 if $kgm_mh_filetype == 0x8
8119 set $kgm_printed_type = 1
8121 if !$kgm_printed_type
8124 printf "%02.2X%02.2X%02.2X%02.2X-", $kgm_uuid_data[0], $kgm_uuid_data[1], $kgm_uuid_data[2], $kgm_uuid_data[3]
8125 printf "%02.2X%02.2X-", $kgm_uuid_data[4], $kgm_uuid_data[5]
8126 printf "%02.2X%02.2X-", $kgm_uuid_data[6], $kgm_uuid_data[7]
8127 printf "%02.2X%02.2X-", $kgm_uuid_data[8], $kgm_uuid_data[9]
8128 printf "%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X", $kgm_uuid_data[10], $kgm_uuid_data[11], $kgm_uuid_data[12], $kgm_uuid_data[13], $kgm_uuid_data[14], $kgm_uuid_data[15]
8130 _unmap_user_data_from_task $kgm_taskp
8133 _print_path_for_image $kgm_mh_path_address
8138 _unmap_user_data_from_task $kgm_taskp
8141 set $kgm_lc_address = $kgm_lc_address + $kgm_lc_cmd_size
8142 set $kgm_lc_idx = $kgm_lc_idx + 1
8145 if (!$kgm_uuid_data)
8146 # didn't find LC_UUID, for a dylib, just print out basic info
8148 printf "0x%016llx ", $kgm_mh_image_address
8150 printf "0x%08x ", $kgm_mh_image_address
8152 set $kgm_printed_type = 0
8153 if $kgm_mh_filetype == 0x2
8154 printf "MH_EXECUTE "
8155 set $kgm_printed_type = 1
8157 if $kgm_mh_filetype == 0x6
8159 set $kgm_printed_type = 1
8161 if $kgm_mh_filetype == 0x7
8162 printf "MH_DYLINKER "
8163 set $kgm_printed_type = 1
8165 if $kgm_mh_filetype == 0x8
8167 set $kgm_printed_type = 1
8169 if !$kgm_printed_type
8175 _print_path_for_image $kgm_mh_path_address
8182 define _print_images_for_dyld_image_info
8183 set $kgm_taskp = $arg0
8184 set $kgm_task_64 = $arg1
8185 set $kgm_dyld_all_image_infos_address = (unsigned long long)$arg2
8187 _map_user_data_from_task $kgm_taskp $kgm_dyld_all_image_infos_address 16
8189 set $kgm_dyld_all_image_infos = (unsigned int *)$kgm_map_user_window
8190 if ($kgm_dyld_all_image_infos[0] != 6)
8191 printf "Invalid version number %d\n", $kgm_dyld_all_image_infos[0]
8193 set $kgm_image_info_count = $kgm_dyld_all_image_infos[1]
8196 set $kgm_image_info_size = 24
8197 set $kgm_image_info_array_address = ((unsigned long long *)$kgm_dyld_all_image_infos)[1]
8199 set $kgm_image_info_size = 12
8200 set $kgm_image_info_array_address = ((unsigned int *)$kgm_dyld_all_image_infos)[2]
8203 _unmap_user_data_from_task $kgm_taskp
8205 set $kgm_image_info_i = 0
8206 while $kgm_image_info_i < $kgm_image_info_count
8208 set $kgm_image_info_address = $kgm_image_info_array_address + $kgm_image_info_size*$kgm_image_info_i
8210 _map_user_data_from_task $kgm_taskp $kgm_image_info_address $kgm_image_info_size
8212 set $kgm_image_info_addr = ((unsigned long long *)$kgm_map_user_window)[0]
8213 set $kgm_image_info_path = ((unsigned long long *)$kgm_map_user_window)[1]
8215 set $kgm_image_info_addr = ((unsigned int *)$kgm_map_user_window)[0]
8216 set $kgm_image_info_path = ((unsigned int *)$kgm_map_user_window)[1]
8218 _unmap_user_data_from_task $kgm_taskp
8220 # printf "[%d] = image address %llx path address %llx\n", $kgm_image_info_i, $kgm_image_info_addr, $kgm_image_info_path
8221 _print_image_info $kgm_image_info_addr $kgm_image_info_path
8223 set $kgm_image_info_i = $kgm_image_info_i + 1
8227 define showuserlibraries
8228 set $kgm_taskp = (task_t)$arg0
8229 set $kgm_dyld_image_info = $kgm_taskp->all_image_info_addr
8231 set $kgm_map = $kgm_taskp->map
8232 set $kgm_task_64 = ( $kgm_taskp->taskFeatures[0] & 0x80000000)
8234 if ($kgm_dyld_image_info != 0)
8243 _print_images_for_dyld_image_info $kgm_taskp $kgm_task_64 $kgm_dyld_image_info
8245 printf "No dyld shared library information available for task\n"
8248 document showuserlibraries
8249 Syntax: (gdb) showuserlibraries <task_t>
8250 | For a given user task, inspect the dyld shared library state and print
8251 | information about all Mach-O images.
8254 define showkerneldebugheader
8257 printf "CPU Thread "
8259 printf "Timestamp S/E Class Sub Code Code Specific Info\n"
8262 define _printevflags
8283 printf "EV_RCLOSED "
8289 printf "EV_WCLOSED "
8304 printf "EV_TIMEOUT "
8308 define showkerneldebugbufferentry
8309 set $kgm_kdebug_entry = (kd_buf *) $arg0
8311 set $kgm_debugid = $kgm_kdebug_entry->debugid
8312 set $kgm_kdebug_arg1 = $kgm_kdebug_entry->arg1
8313 set $kgm_kdebug_arg2 = $kgm_kdebug_entry->arg2
8314 set $kgm_kdebug_arg3 = $kgm_kdebug_entry->arg3
8315 set $kgm_kdebug_arg4 = $kgm_kdebug_entry->arg4
8318 set $kgm_kdebug_cpu = $kgm_kdebug_entry->cpuid
8319 set $kgm_ts_hi = ($kgm_kdebug_entry->timestamp >> 32) & 0xFFFFFFFF
8320 set $kgm_ts_lo = $kgm_kdebug_entry->timestamp & 0xFFFFFFFF
8322 set $kgm_kdebug_cpu = ($kgm_kdebug_entry->timestamp >> 56)
8323 set $kgm_ts_hi = ($kgm_kdebug_entry->timestamp >> 32) & 0x00FFFFFF
8324 set $kgm_ts_lo = $kgm_kdebug_entry->timestamp & 0xFFFFFFFF
8327 set $kgm_kdebug_class = ($kgm_debugid >> 24) & 0x000FF
8328 set $kgm_kdebug_subclass = ($kgm_debugid >> 16) & 0x000FF
8329 set $kgm_kdebug_code = ($kgm_debugid >> 2) & 0x03FFF
8330 set $kgm_kdebug_qual = ($kgm_debugid ) & 0x00003
8332 if $kgm_kdebug_qual == 0
8333 set $kgm_kdebug_qual = '-'
8335 if $kgm_kdebug_qual == 1
8336 set $kgm_kdebug_qual = 'S'
8338 if $kgm_kdebug_qual == 2
8339 set $kgm_kdebug_qual = 'E'
8341 if $kgm_kdebug_qual == 3
8342 set $kgm_kdebug_qual = '?'
8350 showptr $kgm_kdebug_entry
8351 printf " %d ", $kgm_kdebug_cpu
8352 showptr $kgm_kdebug_entry->arg5
8353 printf " 0x%08X%08X %c ", $kgm_ts_hi, $kgm_ts_lo, $kgm_kdebug_qual
8357 if $kgm_kdebug_class == 1
8360 if $kgm_kdebug_class == 2
8363 if $kgm_kdebug_class == 3
8366 if $kgm_kdebug_class == 4
8369 if $kgm_kdebug_class == 5
8372 if $kgm_kdebug_class == 6
8375 if $kgm_kdebug_class == 7
8378 if $kgm_kdebug_class == 8
8381 if $kgm_kdebug_class == 8
8384 if $kgm_kdebug_class == 20
8387 if $kgm_kdebug_class == 31
8390 if $kgm_kdebug_class == 32
8393 if $kgm_kdebug_class == 33
8396 if $kgm_kdebug_class == 255
8399 printf "0x%02X", $kgm_kdebug_class
8417 printf " 0x%02X %5d ", $kgm_kdebug_subclass, $kgm_kdebug_code
8419 # space for debugid-specific processing
8421 # EVPROC from bsd/kern/sys_generic.c
8423 # MISCDBG_CODE(DBG_EVENT,DBG_WAIT)
8424 if $kgm_debugid == 0x14100048
8426 if $kgm_kdebug_arg1 == 1
8427 printf "before sleep"
8429 if $kgm_kdebug_arg1 == 2
8430 printf "after sleep"
8432 printf "????????????"
8435 printf " chan=0x%08X ", $kgm_kdebug_arg2
8437 # MISCDBG_CODE(DBG_EVENT,DBG_WAIT|DBG_FUNC_START)
8438 if $kgm_debugid == 0x14100049
8441 # MISCDBG_CODE(DBG_EVENT,DBG_WAIT|DBG_FUNC_END)
8442 if $kgm_debugid == 0x1410004a
8443 printf "waitevent error=%d ", $kgm_kdebug_arg1
8444 printf "eqp=0x%08X ", $kgm_kdebug_arg4
8445 _printevflags $kgm_kdebug_arg3
8446 printf "er_handle=%d ", $kgm_kdebug_arg2
8448 # MISCDBG_CODE(DBG_EVENT,DBG_DEQUEUE|DBG_FUNC_START)
8449 if $kgm_debugid == 0x14100059
8450 printf "evprocdeque proc=0x%08X ", $kgm_kdebug_arg1
8451 if $kgm_kdebug_arg2 == 0
8452 printf "remove first "
8454 printf "remove 0x%08X ", $kgm_kdebug_arg2
8457 # MISCDBG_CODE(DBG_EVENT,DBG_DEQUEUE|DBG_FUNC_END)
8458 if $kgm_debugid == 0x1410005a
8459 printf "evprocdeque "
8460 if $kgm_kdebug_arg1 == 0
8461 printf "result=NULL "
8463 printf "result=0x%08X ", $kgm_kdebug_arg1
8466 # MISCDBG_CODE(DBG_EVENT,DBG_POST|DBG_FUNC_START)
8467 if $kgm_debugid == 0x14100041
8469 _printevflags $kgm_kdebug_arg1
8471 # MISCDBG_CODE(DBG_EVENT,DBG_POST)
8472 if $kgm_debugid == 0x14100040
8474 printf "evq=0x%08X ", $kgm_kdebug_arg1
8475 printf "er_eventbits="
8476 _printevflags $kgm_kdebug_arg2
8478 _printevflags $kgm_kdebug_arg3
8480 # MISCDBG_CODE(DBG_EVENT,DBG_POST|DBG_FUNC_END)
8481 if $kgm_debugid == 0x14100042
8484 # MISCDBG_CODE(DBG_EVENT,DBG_ENQUEUE|DBG_FUNC_START)
8485 if $kgm_debugid == 0x14100055
8486 printf "evprocenque eqp=0x%08d ", $kgm_kdebug_arg1
8487 if $kgm_kdebug_arg2 & 1
8490 _printevflags $kgm_kdebug_arg3
8493 # MISCDBG_CODE(DBG_EVENT,DBG_EWAKEUP)
8494 if $kgm_debugid == 0x14100050
8495 printf "evprocenque before wakeup eqp=0x%08d ", $kgm_kdebug_arg4
8497 # MISCDBG_CODE(DBG_EVENT,DBG_ENQUEUE|DBG_FUNC_END)
8498 if $kgm_debugid == 0x14100056
8499 printf "evprocenque "
8501 # MISCDBG_CODE(DBG_EVENT,DBG_MOD|DBG_FUNC_START)
8502 if $kgm_debugid == 0x1410004d
8505 # MISCDBG_CODE(DBG_EVENT,DBG_MOD)
8506 if $kgm_debugid == 0x1410004c
8507 printf "modwatch er_handle=%d ", $kgm_kdebug_arg1
8508 _printevflags $kgm_kdebug_arg2
8509 printf "evq=0x%08X ", $kgm_kdebug_arg3
8511 # MISCDBG_CODE(DBG_EVENT,DBG_MOD|DBG_FUNC_END)
8512 if $kgm_debugid == 0x1410004e
8513 printf "modwatch er_handle=%d ", $kgm_kdebug_arg1
8514 printf "ee_eventmask="
8515 _printevflags $kgm_kdebug_arg2
8516 printf "sp=0x%08X ", $kgm_kdebug_arg3
8518 _printevflags $kgm_kdebug_arg4
8520 printf "arg1=0x%08X ", $kgm_kdebug_arg1
8521 printf "arg2=0x%08X ", $kgm_kdebug_arg2
8522 printf "arg3=0x%08X ", $kgm_kdebug_arg3
8523 printf "arg4=0x%08X ", $kgm_kdebug_arg4
8544 define showkerneldebugbuffercpu
8545 set $kgm_cpu_number = (int) $arg0
8546 set $kgm_entry_count = (int) $arg1
8547 set $kgm_debugentriesfound = 0
8549 #if kdebug_flags & KDBG_BFINIT
8550 if (kdebug_flags & 0x80000000)
8551 showkerneldebugheader
8553 if $kgm_entry_count == 0
8554 printf "<count> is 0, dumping 50 entries\n"
8555 set $kgm_entry_count = 50
8558 if $kgm_cpu_number >= kd_cpus
8559 printf "cpu number too big\n"
8561 set $kgm_kdbp = &kdbip[$kgm_cpu_number]
8562 set $kgm_kdsp = $kgm_kdbp->kd_list_head
8563 while (($kgm_kdsp != 0) && ($kgm_entry_count > 0))
8564 if $kgm_kdsp->kds_readlast != $kgm_kdsp->kds_bufptr
8565 set $kgm_kds_bufptr = $kgm_kdsp->kds_bufptr
8566 while (($kgm_kds_bufptr > $kgm_kdsp->kds_readlast) && ($kgm_entry_count > 0))
8567 set $kgm_kds_bufptr = $kgm_kds_bufptr - 1
8568 set $kgm_entry_count = $kgm_entry_count - 1
8569 showkerneldebugbufferentry $kgm_kds_bufptr
8572 set $kgm_kdsp = $kgm_kdsp->kds_next
8576 printf "Trace buffer not enabled\n"
8580 document showkerneldebugbuffercpu
8581 Syntax: showkerneldebugbuffercpu <cpu> <count>
8582 | Prints the last N entries in the kernel debug buffer for CPU x.
8585 define showkerneldebugbuffer
8587 #if kdebug_flags & KDBG_BFINIT
8588 if (kdebug_flags & 0x80000000)
8590 set $kgm_entrycount = (int) $arg0
8592 if $kgm_entrycount == 0
8593 printf "<count> is 0, dumping 50 entries per cpu\n"
8594 set $kgm_entrycount = 50
8597 set $kgm_cpu = (int) 0
8599 while $kgm_cpu < kd_cpus
8600 showkerneldebugbuffercpu $kgm_cpu $kgm_entrycount
8601 set $kgm_cpu = $kgm_cpu + 1
8604 printf "Trace buffer not enabled\n"
8608 document showkerneldebugbuffer
8609 Syntax: showkerneldebugbuffer <count>
8610 | Prints the last N entries in the kernel debug buffer per cpu. i.e. showkerneldebugbuffer 50 will
8611 | display the last 50 entries in each CPU's debug buffer.
8614 define showallvmstats
8615 printf " pid command #ents wired vsize rsize max rsize\n"
8616 printf " (pages) (pages) (pages) (pages)\n"
8617 set $kgm_head_taskp = &tasks
8618 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
8619 while $kgm_taskp != $kgm_head_taskp
8620 set $kgm_procp = (struct proc *)($kgm_taskp->bsd_info)
8621 set $kgm_mapp = (struct _vm_map *)($kgm_taskp->map)
8622 printf "%8d %17s %8d %15d %15d %15d %15d\n", $kgm_procp->p_pid, $kgm_procp->p_comm, $kgm_mapp->hdr.nentries, $kgm_mapp->pmap->stats.wired_count, $kgm_mapp->size >> 12, $kgm_mapp->pmap->stats.resident_count, $kgm_mapp->pmap->stats.resident_max
8623 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
8627 document showallvmstats
8628 Syntax: showallvmstats
8629 | prints a summary of vm statistics in a table format
8632 define show_user_registers
8633 if (($kgm_mtype & $kgm_mtype_x86_mask) == $kgm_mtype_x86_any)
8634 set $kgm_thread = (thread_t)$arg0
8635 if ((*(thread_t)$kgm_thread)->machine.xxx_pcb.iss.flavor == 15)
8636 p/x ($kgm_thread)->machine.xxx_pcb.iss->uss.ss_64
8638 p/x ($kgm_thread)->machine.xxx_pcb.iss->uss.ss_32
8641 if ($kgm_mtype == $kgm_mtype_ppc)
8642 set $kgm_thread = (thread_t)$arg0
8643 p/x *($kgm_thread)->machine.pcb
8647 document show_user_registers
8648 Syntax: show_user_registers <thread_address>
8649 | Display user registers associated with a kernel thread
8650 | properly displays the 32 bit or 64 bit registers for intel architecture
8657 # check for end of string. cmp0 can be longer than cmp1. it
8660 set $kgm_strcmp_result = 0
8661 set $kgm_strcmp_done = 1
8664 if !$kgm_strcmp_done && $cmp0 == '\0'
8665 set $kgm_strcmp_result = -1
8666 set $kgm_strcmp_done = 1
8670 if !$kgm_strcmp_done
8671 set $kgm_strcmp_result = (uint8_t) $cmp0 - (uint8_t) $cmp1
8672 if $kgm_strcmp_result != 0
8673 set $kgm_strcmp_done = 1
8680 set $masked = $cmp & 0xFF
8681 _cmp $arg0[0] $masked
8683 if !$kgm_strcmp_done
8684 set $cmp = $cmp >> 8
8685 set $masked = $cmp & 0xFF
8686 _cmp $arg0[1] $masked
8688 if !$kgm_strcmp_done
8689 set $cmp = $cmp >> 8
8690 set $masked = $cmp & 0xFF
8691 _cmp $arg0[2] $masked
8693 if !$kgm_strcmp_done
8694 set $cmp = $cmp >> 8
8695 set $masked = $cmp & 0xFF
8696 _cmp $arg0[3] $masked
8698 if !$kgm_strcmp_done
8699 set $cmp = $cmp >> 8
8700 set $masked = $cmp & 0xFF
8701 _cmp $arg0[4] $masked
8703 if !$kgm_strcmp_done
8704 set $cmp = $cmp >> 8
8705 set $masked = $cmp & 0xFF
8706 _cmp $arg0[5] $masked
8708 if !$kgm_strcmp_done
8709 set $cmp = $cmp >> 8
8710 set $masked = $cmp & 0xFF
8711 _cmp $arg0[6] $masked
8713 if !$kgm_strcmp_done
8714 set $cmp = $cmp >> 8
8715 set $masked = $cmp & 0xFF
8716 _cmp $arg0[7] $masked
8720 define strcmp_arg_pack64
8721 set $kgm_strcmp_arg = ((((((((((((((uint64_t) $arg7 << 8) | $arg6) << 8) | $arg5) << 8) | $arg4) << 8) | $arg3) << 8) | $arg2) << 8) | $arg1) << 8) | $arg0
8724 document strcmp_arg_pack64
8725 Syntax: strcmp_arg_pack64 <a> <b> <c> <d> <e <f> <g> <h>
8726 | Packs a string given as 8 character arguments into a 64-bit int stored in
8727 | $kgm_strcmp_arg. Use 0 or '\0' for unused arguments. The encoded string
8728 | is suitable for use by strcmp_nomalloc and setfindregistrystr.
8729 | e.g., strcmp_arg_pack64 'H' 'e' 'l' 'l' 'o' 0 0 0
8730 | packs "Hello" into $kgm_strcmp_arg.
8734 define strcmp_nomalloc
8736 set $count = $argc - 1
8738 set $kgm_strcmp_result = 0
8739 set $kgm_strcmp_done = 0
8742 _cmp_arg64 $str $arg1
8744 if !$kgm_strcmp_done && $count > 1
8746 _cmp_arg64 $str $arg2
8748 if !$kgm_strcmp_done && $count > 2
8750 _cmp_arg64 $str $arg3
8752 if !$kgm_strcmp_done && $count > 3
8754 _cmp_arg64 $str $arg4
8756 if !$kgm_strcmp_done && $count > 4
8758 _cmp_arg64 $str $arg5
8760 if !$kgm_strcmp_done && $count > 5
8762 _cmp_arg64 $str $arg6
8764 if !$kgm_strcmp_done && $count > 6
8766 _cmp_arg64 $str $arg7
8768 if !$kgm_strcmp_done && $count > 7
8770 _cmp_arg64 $str $arg8
8772 if !$kgm_strcmp_done && $count > 8
8774 _cmp_arg64 $str $arg9
8778 document strcmp_nomalloc
8779 Syntax: strcmp_nomalloc <string> <a> [b] [c] [d] [e] [f] [g] [h] [i]
8780 | Given a pre-allocated <string>, perform a string compare with the
8781 | encoded string stored in arguments a - i. The result is stored in
8782 | $kgm_strcmp_result.
8784 | For example, the following will result in $kgm_strcmp_result == 0:
8785 | strcmp_arg_pack64 'D' 'a' 'r' 'w' 'i' 'n' ' ' 'K'
8786 | strcmp_nomalloc version $kgm_strcmp_arg
8789 # _pci_cfg_addr_value $addr $size
8790 define _pci_cfg_addr_value
8791 readphysint $arg0 $arg1 $kgm_lcpu_self
8792 set $kgm_pci_cfg_value = $kgm_readphysint_result
8796 set $kgm_pci_cfg_init = 0
8797 define _pci_cfg_init
8798 # get this from the registry if it exists there
8799 if $kgm_pci_cfg_init == 0
8800 strcmp_arg_pack64 'A' 'p' 'p' 'l' 'e' 'A' 'C' 'P'
8801 set $AppleACP = $kgm_strcmp_arg
8802 strcmp_arg_pack64 'I' 'P' 'l' 'a' 't' 'f' 'o' 'r'
8803 set $IPlatfor = $kgm_strcmp_arg
8804 strcmp_arg_pack64 'm' 'E' 'x' 'p' 'e' 'r' 't' 0
8805 set $mExpert = $kgm_strcmp_arg
8806 setfindregistrystr $AppleACP $IPlatfor $mExpert
8808 set $olddepth = $kgm_reg_depth_max
8809 set $kgm_reg_depth_max = 2
8811 set $kgm_reg_depth_max = $olddepth
8813 if $kgm_registry_entry
8814 strcmp_arg_pack64 'a' 'c' 'p' 'i' '-' 'm' 'm' 'c'
8815 set $acpi_mmc = $kgm_strcmp_arg
8816 strcmp_arg_pack64 'f' 'g' '-' 's' 'e' 'g' '0' 0
8817 set $fg_seg0 = $kgm_strcmp_arg
8818 setfindregistrystr $acpi_mmc $fg_seg0
8820 _findregistryprop $kgm_registry_entry
8821 if $kgm_registry_value
8822 set $kgm_pci_cfg_base = ((OSNumber *) $kgm_registry_value)->value
8823 set $kgm_pci_cfg_init = 1
8828 # if the above fails, search for 0:0:0 in likely places.
8829 if $kgm_pci_cfg_init == 0
8830 set $kgm_pci_cfg_base = 0xF0000000
8831 while $kgm_pci_cfg_init == 0 && $kgm_pci_cfg_base > 0xA0000000
8832 _pci_cfg_addr_value $kgm_pci_cfg_base 8
8833 if $kgm_pci_cfg_value > 0x0 && $kgm_pci_cfg_value < 0xFF
8834 set $kgm_pci_cfg_init = 1
8836 set $kgm_pci_cfg_base = $kgm_pci_cfg_base - 0x10000000
8842 # _pci_cfg_addr $bus $dev $fcn $off
8843 define _pci_cfg_addr
8850 set $kgm_pci_cfg_addr = $kgm_pci_cfg_base | ($bus << 20) | ($dev << 15) | ($fcn << 12) | $off
8853 define _pci_cfg_value
8854 _pci_cfg_addr $arg0 $arg1 $arg2 $arg3
8855 _pci_cfg_addr_value $kgm_pci_cfg_addr $arg4
8858 define pci_cfg_read8
8859 _pci_cfg_value $arg0 $arg1 $arg2 $arg3 8
8860 printf "%08X: %02X\n", $kgm_pci_cfg_addr, $kgm_pci_cfg_value
8863 define pci_cfg_read16
8864 _pci_cfg_value $arg0 $arg1 $arg2 $arg3 16
8865 printf "%08X: %04X\n", $kgm_pci_cfg_addr, $kgm_pci_cfg_value
8868 define pci_cfg_read32
8869 _pci_cfg_value $arg0 $arg1 $arg2 $arg3 32
8870 printf "%08X: %08X\n", $kgm_pci_cfg_addr, $kgm_pci_cfg_value
8873 document pci_cfg_read8
8874 Syntax: (gdb) pci_cfg_read8 <bus> <dev> <fcn> <off>
8875 | read 8 bits for the given <off> of the pci device located at
8876 | <bus>:<dev>:<fcn>.
8879 document pci_cfg_read16
8880 Syntax: (gdb) pci_cfg_read <bus> <dev> <fcn> <off>
8881 | read 16 bits for the given <off> of the pci device located at
8882 | <bus>:<dev>:<fcn>.
8885 document pci_cfg_read32
8886 Syntax: (gdb) pci_cfg_read <bus> <dev> <fcn> <off>
8887 | read 32 bits for the given <off> of the pci device located at
8888 | <bus>:<dev>:<fcn>.
8891 define pci_cfg_write8
8892 _pci_cfg_addr $arg0 $arg1 $arg2 $arg3
8893 writephysint $kgm_pci_cfg_addr 8 $arg4 $kgm_lcpu_self
8896 define pci_cfg_write16
8897 _pci_cfg_addr $arg0 $arg1 $arg2 $arg3
8898 writephysint $kgm_pci_cfg_addr 16 $arg4 $kgm_lcpu_self
8901 define pci_cfg_write32
8902 _pci_cfg_addr $arg0 $arg1 $arg2 $arg3
8903 writephysint $kgm_pci_cfg_addr 32 $arg4 $kgm_lcpu_self
8906 document pci_cfg_write8
8907 Syntax: (gdb) pci_cfg_write8 <bus> <dev> <fcn> <off> <value>
8908 | write an 8-bit <value> into the given <off> of the pci device located at
8909 | <bus>:<dev>:<fcn>.
8912 document pci_cfg_write16
8913 Syntax: (gdb) pci_cfg_write16 <bus> <dev> <fcn> <off> <value>
8914 | write a 16-bit <value> into the given <off> of the pci device located at
8915 | <bus>:<dev>:<fcn>.
8918 document pci_cfg_write32
8919 Syntax: (gdb) pci_cfg_write32 <bus> <dev> <fcn> <off> <value>
8920 | write a 32-bit <value> into the given <off> of the pci device located at
8921 | <bus>:<dev>:<fcn>.
8931 # check for a valid pci device
8932 _pci_cfg_value $bus $dev $fcn $off 8
8933 if $kgm_pci_cfg_value > 0x0 && $kgm_pci_cfg_value < 0xff
8934 printf " address: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n"
8935 printf "---------------------------------------------------------"
8938 _pci_cfg_value $bus $dev $fcn $off 32
8939 if ($off & 0xF) == 0
8940 printf "\n%08X: ", $kgm_pci_cfg_addr
8942 printf "%02X %02X %02X %02X ", $kgm_pci_cfg_value & 0xFF, ($kgm_pci_cfg_value >> 8) & 0xFF, ($kgm_pci_cfg_value >> 16) & 0xFF, ($kgm_pci_cfg_value >> 24) & 0xFF
8947 # check for pcie extended capability config space
8948 _pci_cfg_value $bus $dev $fcn $off 8
8949 if $kgm_pci_cfg_value < 0xff
8951 _pci_cfg_value $bus $dev $fcn $off 32
8952 if ($off & 0xF) == 0
8953 printf "\n%08X: ", $kgm_pci_cfg_addr
8955 printf "%02X %02X %02X %02X ", $kgm_pci_cfg_value & 0xFF, ($kgm_pci_cfg_value >> 8) & 0xFF, ($kgm_pci_cfg_value >> 16) & 0xFF, ($kgm_pci_cfg_value >> 24) & 0xFF
8963 document pci_cfg_dump
8964 Syntax: (gdb) pci_cfg_dump <bus> <dev> <fcn>
8965 | dump config space for the pci device located at <bus>:<dev>:<fcn>
8966 | if you specify an invalid/inaccessible pci device, nothing will be
8970 set $kgm_pci_cfg_bus_start = 0
8971 set $kgm_pci_cfg_bus_max = 8
8972 set $kgm_pci_cfg_device_max = 32
8973 set $kgm_pci_cfg_function_max = 8
8974 define _pci_cfg_scan
8977 set $bus = $kgm_pci_cfg_bus_start
8978 while $bus < $kgm_pci_cfg_bus_max
8979 # check for bus:0:0 to see if we should
8980 # probe this bus further
8981 _pci_cfg_value $bus 0x0 0x0 0x0 32
8982 if $kgm_pci_cfg_value > 0 && $kgm_pci_cfg_value < 0xFFFFFFFF
8985 while $dev < $kgm_pci_cfg_device_max
8988 while $fcn < $kgm_pci_cfg_function_max
8989 _pci_cfg_value $bus $dev $fcn 0x0 32
8990 if $kgm_pci_cfg_value > 0 && $kgm_pci_cfg_value < 0xFFFFFFFF
8992 printf "%03X:%03X:%03X: %02X%02X %02X%02X", $bus, $dev, $fcn, ($kgm_pci_cfg_value >> 8) & 0xFF, $kgm_pci_cfg_value & 0xFF, ($kgm_pci_cfg_value >> 24) & 0xFF, ($kgm_pci_cfg_value >> 16) & 0xFF
8993 _pci_cfg_value $bus $dev $fcn 0x8 32
8994 printf " %02X | %02X%02X%02X\n", $kgm_pci_cfg_value & 0xFF, ($kgm_pci_cfg_value >> 24) & 0xFF, ($kgm_pci_cfg_value >> 16) & 0xFF, ($kgm_pci_cfg_value >> 8) & 0xFF
8996 printf " device: %03X:%03X:%03X\n", $bus, $dev, $fcn
8997 pci_cfg_dump $bus $dev $fcn
9010 define pci_cfg_dump_all
9014 document pci_cfg_dump_all
9015 Syntax: (gdb) pci_cfg_dump_all
9016 | dump config spaces for scanned pci devices. the number of busses to scan
9017 | is stored in $kgm_pci_cfg_bus_max. the default for that is 8. you can also
9018 | specify the starting bus with $kgm_pci_cfg_bus_start.
9022 printf "bus:dev:fcn: vendor device rev | class\n"
9023 printf "---------------------------------------\n"
9027 document pci_cfg_scan
9028 Syntax: (gdb) pci_cfg_scan
9029 | scan for pci devices. the number of busses to scan is stored in
9030 | $kgm_pci_cfg_bus_max. the default for that is 8. you can also specify the
9031 | starting bus with $kgm_pci_cfg_bus_start.
9034 define readioportint
9035 set $kgm_readioportint_result = 0xBAD10AD
9036 # set up the manual KDP packet
9037 set manual_pkt.input = 0
9038 set manual_pkt.len = sizeof(kdp_readioport_req_t)
9039 set $kgm_pkt = (kdp_readioport_req_t *)&manual_pkt.data
9040 set $kgm_pkt->hdr.request = KDP_READIOPORT
9041 set $kgm_pkt->hdr.len = sizeof(kdp_readioport_req_t)
9042 set $kgm_pkt->hdr.is_reply = 0
9043 set $kgm_pkt->hdr.seq = 0
9044 set $kgm_pkt->hdr.key = 0
9045 set $kgm_pkt->address = (uint16_t)$arg0
9046 set $kgm_pkt->nbytes = $arg1 >> 3
9047 set $kgm_pkt->lcpu = (uint16_t)$arg2
9048 set manual_pkt.input = 1
9049 # dummy to make sure manual packet is executed
9050 set $kgm_dummy = &_mh_execute_header
9051 set $kgm_pkt = (kdp_readioport_reply_t *)&manual_pkt.data
9052 if ($kgm_pkt->error == 0)
9054 set $kgm_readioportint_result = *((uint8_t *) $kgm_pkt->data)
9057 set $kgm_readioportint_result = *((uint16_t *) $kgm_pkt->data)
9060 set $kgm_readioportint_result = *((uint32_t *) $kgm_pkt->data)
9066 set $lcpu = $kgm_lcpu_self
9070 readioportint $arg0 8 $lcpu
9072 printf ":\t0x%02hhx\n", $kgm_readioportint_result
9076 set $lcpu = $kgm_lcpu_self
9080 readioportint $arg0 16 $lcpu
9082 printf ":\t0x%04hx\n", $kgm_readioportint_result
9086 set $lcpu = $kgm_lcpu_self
9090 readioportint $arg0 32 $lcpu
9092 printf ":\t0x%08x\n", $kgm_readioportint_result
9095 document readioport8
9099 document readioport16
9103 document readioport32
9104 Syntax: (gdb) readioport32 <port> [lcpu (kernel's numbering convention)]
9105 | Read value stored in the specified IO port. The CPU can be optionally
9106 | specified as well.
9109 define writeioportint
9110 # set up the manual KDP packet
9111 set manual_pkt.input = 0
9112 set manual_pkt.len = sizeof(kdp_writeioport_req_t)
9113 set $kgm_pkt = (kdp_writeioport_req_t *)&manual_pkt.data
9114 set $kgm_pkt->hdr.request = KDP_WRITEIOPORT
9115 set $kgm_pkt->hdr.len = sizeof(kdp_writeioport_req_t)
9116 set $kgm_pkt->hdr.is_reply = 0
9117 set $kgm_pkt->hdr.seq = 0
9118 set $kgm_pkt->hdr.key = 0
9119 set $kgm_pkt->address = (uint16_t)$arg0
9120 set $kgm_pkt->nbytes = $arg1 >> 3
9121 set $kgm_pkt->lcpu = (uint16_t)$arg3
9123 set *(uint8_t *)$kgm_pkt->data = (uint8_t)$arg2
9126 set *(uint16_t *)$kgm_pkt->data = (uint16_t)$arg2
9129 set *(uint32_t *)$kgm_pkt->data = (uint32_t)$arg2
9131 set manual_pkt.input = 1
9132 # dummy to make sure manual packet is executed
9133 set $kgm_dummy = &_mh_execute_header
9134 set $kgm_pkt = (kdp_writeioport_reply_t *)&manual_pkt.data
9135 set $kgm_writeioportint_result = $kgm_pkt->error
9139 set $lcpu = $kgm_lcpu_self
9143 writeioportint $arg0 8 $arg1 $lcpu
9146 define writeioport16
9147 set $lcpu = $kgm_lcpu_self
9151 writeioportint $arg0 16 $arg1 $lcpu
9154 define writeioport32
9155 set $lcpu = $kgm_lcpu_self
9159 writeioportint $arg0 32 $arg1 $lcpu
9162 document writeioport8
9163 | See writeioport32.
9166 document writeioport16
9167 | See writeioport32.
9170 document writeioport32
9171 Syntax: (gdb) writeioport32 <port> <value> [lcpu (kernel's numbering convention)]
9172 | Write the value to the specified IO port. The size of the value is
9173 | determined by the name of the command. The CPU used can be optionally
9178 set $kgm_readmsr64int_result = 0xBAD10AD
9179 # set up the manual KDP packet
9180 set manual_pkt.input = 0
9181 set manual_pkt.len = sizeof(kdp_readmsr64_req_t)
9182 set $kgm_pkt = (kdp_readmsr64_req_t *)&manual_pkt.data
9183 set $kgm_pkt->hdr.request = KDP_READMSR64
9184 set $kgm_pkt->hdr.len = sizeof(kdp_readmsr64_req_t)
9185 set $kgm_pkt->hdr.is_reply = 0
9186 set $kgm_pkt->hdr.seq = 0
9187 set $kgm_pkt->hdr.key = 0
9188 set $kgm_pkt->address = (uint32_t)$arg0
9189 set $kgm_pkt->lcpu = (uint16_t)$arg1
9190 set manual_pkt.input = 1
9191 # dummy to make sure manual packet is executed
9192 set $kgm_dummy = &_mh_execute_header
9193 set $kgm_pkt = (kdp_readmsr64_reply_t *)&manual_pkt.data
9194 if ($kgm_pkt->error == 0)
9195 set $kgm_readmsr64int_result = *((uint64_t *) $kgm_pkt->data)
9200 set $lcpu = $kgm_lcpu_self
9204 readmsr64int $arg0 $lcpu
9206 printf ":\t0x%016llx\n", $kgm_readmsr64int_result
9209 define writemsr64int
9210 # set up the manual KDP packet
9211 set manual_pkt.input = 0
9212 set manual_pkt.len = sizeof(kdp_writemsr64_req_t)
9213 set $kgm_pkt = (kdp_writemsr64_req_t *)&manual_pkt.data
9214 set $kgm_pkt->hdr.request = KDP_WRITEMSR64
9215 set $kgm_pkt->hdr.len = sizeof(kdp_writemsr64_req_t)
9216 set $kgm_pkt->hdr.is_reply = 0
9217 set $kgm_pkt->hdr.seq = 0
9218 set $kgm_pkt->hdr.key = 0
9219 set $kgm_pkt->address = (uint32_t)$arg0
9220 set $kgm_pkt->lcpu = (uint16_t)$arg2
9221 set *(uint64_t *)$kgm_pkt->data = (uint64_t)$arg1
9222 set manual_pkt.input = 1
9223 # dummy to make sure manual packet is executed
9224 set $kgm_dummy = &_mh_execute_header
9225 set $kgm_pkt = (kdp_writemsr64_reply_t *)&manual_pkt.data
9226 set $kgm_writemsr64int_result = $kgm_pkt->error
9230 set $lcpu = $kgm_lcpu_self
9234 writemsr64int $arg0 $arg1 $lcpu
9238 Syntax: (gdb) writemsr64 <msr> <value> [lcpu (kernel's numbering convention)]
9239 | Write <value> to the specified MSR. The CPU can be optionally specified.
9243 Syntax: (gdb) readmsr64 <msr> [lcpu (kernel's numbering convention)]
9244 | Read the specified MSR. The CPU can be optionally specified.
9247 # default if we can't find a registry entry
9248 set $kgm_ioapic_addr = 0xFEC00000
9249 set $kgm_ioapic_init = 0
9251 set $_ioapic_index_off = 0x00
9252 set $_ioapic_data_off = 0x10
9253 set $_ioapic_eoi_off = 0x40
9255 set $_ioapic_index_id = 0x00
9256 set $_ioapic_index_ver = 0x01
9257 set $_ioapic_index_redir_base = 0x10
9259 set $_apic_vector_mask = 0xFF
9260 set $_apic_timer_tsc_deadline = 0x40000
9261 set $_apic_timer_periodic = 0x20000
9262 set $_apic_masked = 0x10000
9263 set $_apic_trigger_level = 0x08000
9264 set $_apic_polarity_high = 0x02000
9265 set $_apic_pending = 0x01000
9268 if $kgm_ioapic_init == 0
9269 strcmp_arg_pack64 'i' 'o' '-' 'a' 'p' 'i' 'c' 0
9270 setfindregistrystr $kgm_strcmp_arg
9272 set $olddepth = $kgm_reg_depth_max
9273 set $kgm_reg_depth_max = 3
9275 set $kgm_reg_depth_max = $olddepth
9277 if $kgm_registry_entry
9278 strcmp_arg_pack64 'P' 'h' 'y' 's' 'i' 'c' 'a' 'l'
9279 set $Physical = $kgm_strcmp_arg
9280 strcmp_arg_pack64 ' ' 'A' 'd' 'd' 'r' 'e' 's' 's'
9281 set $_Address = $kgm_strcmp_arg
9282 setfindregistrystr $Physical $_Address
9284 _findregistryprop $kgm_registry_entry
9285 if $kgm_registry_value
9286 set $kgm_ioapic_addr = ((OSNumber *) $kgm_registry_value)->value
9289 set $kgm_ioapic_index_addr = $kgm_ioapic_addr + $_ioapic_index_off
9290 set $kgm_ioapic_data_addr = $kgm_ioapic_addr + $_ioapic_data_off
9291 set $kgm_ioapic_init = 1
9295 define _ioapic_addr_value
9297 writephysint $kgm_ioapic_index_addr 8 $arg0 $kgm_lcpu_self
9299 writephysint $kgm_ioapic_data_addr 32 $arg1 $kgm_lcpu_self
9301 readphysint $kgm_ioapic_data_addr 32 $kgm_lcpu_self
9302 set $kgm_ioapic_value = $kgm_readphysint_result
9309 printf "[VEC=%3d", $value & $_apic_vector_mask
9310 if $value & $_apic_masked
9316 if $value & $_apic_trigger_level
9317 printf " TRIG=level"
9319 printf " TRIG=edge "
9322 if $value & $_apic_polarity_high
9328 if $value & $_apic_pending
9334 if $value & $_apic_timer_periodic
9337 if $value & $_apic_timer_tsc_deadline
9338 printf " TSC_DEADLINE"
9344 define ioapic_read32
9345 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
9346 printf "ioapic_read32 not supported on this architecture.\n"
9348 _ioapic_addr_value $arg0
9349 printf "IOAPIC[0x%02X]: 0x%08X\n", $arg0, $kgm_ioapic_value
9353 document ioapic_read32
9354 Syntax: (gdb) ioapic_read <offset>
9355 | Read the IOAPIC register at the offset specified.
9358 define ioapic_write32
9359 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
9360 printf "ioapic_write32 not supported on this architecture.\n"
9362 _ioapic_addr_value $arg0 $arg1
9366 document ioapic_write32
9367 Syntax: (gdb) ioapic_write32 <offset> <value>
9368 | Write the IOAPIC register at the offset specified.
9372 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
9373 printf "ioapic_dump not supported on this architecture.\n"
9376 _ioapic_addr_value $_ioapic_index_id
9377 printf "IOAPIC[0x%02X] ID: 0x%08X\n", $_ioapic_index_id, $kgm_ioapic_value
9380 _ioapic_addr_value $_ioapic_index_ver
9381 set $maxredir = (($kgm_ioapic_value & 0xFF0000) >> 16) + 1
9383 printf "IOAPIC[0x%02X] VERSION: 0x%08X [", $_ioapic_index_ver, $kgm_ioapic_value
9384 printf "MAXREDIR=%02d PRQ=%d VERSION=0x%02X]\n", $maxredir, ($kgm_ioapic_value >> 15) & 0x1, $kgm_ioapic_value & 0xFF
9386 # all the redir entries
9388 while $i < $maxredir
9389 set $addr0 = $_ioapic_index_redir_base + ($i << 1)
9390 set $addr1 = $addr0 + 1
9391 _ioapic_addr_value $addr1
9392 printf "IOAPIC[0x%02X] IOREDIR%02d: 0x%08X", $addr0, $i, $kgm_ioapic_value
9394 _ioapic_addr_value $addr0
9395 printf "%08X ", $kgm_ioapic_value
9396 _apic_print $kgm_ioapic_value
9402 document ioapic_dump
9403 Syntax: (gdb) ioapic_dump
9404 | Dump all the IOAPIC entries.
9408 set $_lapic_base_addr = 0xFEE00000
9409 set $_lapic_id = 0x20
9410 set $_lapic_version = 0x30
9411 set $_lapic_tpr = 0x80
9412 set $_lapic_apr = 0x90
9413 set $_lapic_ppr = 0xA0
9414 set $_lapic_eoi = 0xB0
9415 set $_lapic_ldr = 0xD0
9416 set $_lapic_dfr = 0xE0
9417 set $_lapic_sivr = 0xF0
9419 set $_lapic_isr_size = 0x10
9420 set $_lapic_isr_num = 8
9421 set $_lapic_isr0 = 0x100
9422 set $_lapic_tmr0 = 0x180
9423 set $_lapic_irr0 = 0x200
9425 set $_lapic_esr = 0x280
9426 set $_lapic_esr_register = 0x80
9427 set $_lapic_esr_recv_vect = 0x40
9428 set $_lapic_esr_send_vect = 0x20
9430 set $_lapic_icr0 = 0x300
9431 set $_lapic_icr1 = 0x310
9433 set $_lapic_lvt_timer = 0x320
9434 set $_lapic_lvt_thermal = 0x330
9435 set $_lapic_lvt_pmcr = 0x340
9436 set $_lapic_lvt_lint0 = 0x350
9437 set $_lapic_lvt_lint1 = 0x360
9438 set $_lapic_lvt_error = 0x370
9440 set $_lapic_icr = 0x380
9441 set $_lapic_ccr = 0x390
9442 set $_lapic_dcr = 0x3E0
9444 set $_apic_cfg_msr = 0x1B
9445 set $_apic_cfg_msr_x2EN = 0x00000C00
9446 set $_x2apic_enabled = -1
9448 # _lapic_addr $offset returns the actual address to use
9450 if $_x2apic_enabled < 0
9451 readmsr64int $_apic_cfg_msr $kgm_lcpu_self
9452 if ($kgm_readmsr64int_result & $_apic_cfg_msr_x2EN) == $_apic_cfg_msr_x2EN
9453 set $_x2apic_enabled = 1
9455 set $_x2apic_enabled = 0
9460 # x2APIC addresses are MSRs that use xAPIC offsets that
9462 set $kgm_lapic_addr = $arg0 >> 4
9464 set $kgm_lapic_addr = $_lapic_base_addr + $arg0
9468 # _lapic_addr_value $offset $lcpu
9469 define _lapic_addr_value
9472 readmsr64int $kgm_lapic_addr $arg1
9473 set $kgm_lapic_value = $kgm_readmsr64int_result
9475 readphysint $kgm_lapic_addr 32 $arg1
9476 set $kgm_lapic_value = $kgm_readphysint_result
9480 # lapic_read32 $offset [$lcpu]
9482 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
9483 printf "lapic_read32 not supported on this architecture.\n"
9485 set $lcpu = $kgm_lcpu_self
9489 _lapic_addr_value $arg0 $lcpu
9490 printf "LAPIC[0x%03X]: 0x%08X\n", $arg0, $kgm_lapic_value
9494 document lapic_read32
9495 Syntax: (gdb) apic_read32_cpu <offset> [lcpu (kernel's numbering convention)]
9496 | Read the LAPIC register at the offset specified. The CPU can be optionally
9500 # lapic_write32 $offset $value [$lcpu]
9501 define lapic_write32
9502 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
9503 printf "lapic_write32_cpu not supported on this architecture.\n"
9505 set $lcpu = $kgm_lcpu_self
9512 writemsr64int $kgm_lapic_addr $arg1 $lcpu
9514 writephysint $kgm_lapic_addr 32 $arg1 $lcpu
9519 document lapic_write32
9520 Syntax: (gdb) lapic_write32 <offset> <value> [lcpu (kernel's numbering convention)]
9521 | Write the LAPIC register at the offset specified. The CPU can be optionally
9527 if (($kgm_mtype & $kgm_mtype_x86_mask) != $kgm_mtype_x86_any)
9528 printf "lapic_dump not supported on this architecture.\n"
9530 set $lcpu = $kgm_lcpu_self
9535 _lapic_addr_value $_lapic_id $lcpu
9537 # the above also figures out if we're using an xAPIC or an x2APIC
9538 printf "LAPIC operating mode: "
9545 printf "LAPIC[0x%03X] ID: 0x%08X\n", $_lapic_id, $kgm_lapic_value
9547 _lapic_addr_value $_lapic_version $lcpu
9548 set $lvt_num = ($kgm_lapic_value >> 16) + 1
9549 printf "LAPIC[0x%03X] VERSION: 0x%08X [VERSION=%d MaxLVT=%d]\n", $_lapic_version, $kgm_lapic_value, $kgm_lapic_value & 0xFF, $lvt_num
9551 _lapic_addr_value $_lapic_tpr $lcpu
9552 printf "LAPIC[0x%03X] TASK PRIORITY: 0x%08X\n", $_lapic_tpr, $kgm_lapic_value
9554 _lapic_addr_value $_lapic_ppr $lcpu
9555 printf "LAPIC[0x%03X] PROCESSOR PRIORITY: 0x%08X\n", $_lapic_ppr, $kgm_lapic_value
9557 _lapic_addr_value $_lapic_ldr $lcpu
9558 printf "LAPIC[0x%03X] LOGICAL DEST: 0x%08X\n", $_lapic_ldr, $kgm_lapic_value
9560 _lapic_addr_value $_lapic_dfr $lcpu
9561 printf "LAPIC[0x%03X] DEST FORMAT: 0x%08X\n", $_lapic_dfr, $kgm_lapic_value
9563 _lapic_addr_value $_lapic_sivr $lcpu
9564 printf "LAPIC[0x%03X] SPURIOUS VECTOR: 0x%08X [VEC=%3d ENABLED=%d]\n", $_lapic_sivr, $kgm_lapic_value, $kgm_lapic_value & $_apic_vector_mask, ($kgm_lapic_value & 0x100) >> 8,
9567 while $i < $_lapic_isr_num
9568 set $addr = $_lapic_isr0 + $i * $_lapic_isr_size
9569 _lapic_addr_value $addr $lcpu
9570 printf "LAPIC[0x%03X] ISR[%03d:%03d]: 0x%08X\n", $addr, 32*($i + 1) - 1, 32*$i, $kgm_lapic_value
9575 while $i < $_lapic_isr_num
9576 set $addr = $_lapic_tmr0 + $i * $_lapic_isr_size
9577 _lapic_addr_value $addr $lcpu
9578 printf "LAPIC[0x%03X] TMR[%03d:%03d]: 0x%08X\n", $addr, 32*($i + 1) - 1, 32*$i, $kgm_lapic_value
9583 while $i < $_lapic_isr_num
9584 set $addr = $_lapic_irr0 + $i * $_lapic_isr_size
9585 _lapic_addr_value $addr $lcpu
9586 printf "LAPIC[0x%03X] IRR[%03d:%03d]: 0x%08X\n", $addr, 32*($i + 1) - 1, 32*$i, $kgm_lapic_value
9590 _lapic_addr_value $_lapic_esr $lcpu
9591 printf "LAPIC[0x%03X] ERROR STATUS: 0x%08X ", $_lapic_esr, $kgm_lapic_value
9595 if $kgm_lapic_value & $_lapic_esr_register
9598 if $kgm_lapic_value & $_lapic_esr_recv_vect
9599 printf "Received Vector "
9601 if $kgm_lapic_value & $_lapic_esr_send_vect
9602 printf "Send Vector"
9609 _lapic_addr_value $_lapic_icr1 $lcpu
9610 printf "LAPIC[0x%03X] Interrupt Command: 0x%08X [DEST=%d]\n", $_lapic_icr0, $kgm_lapic_value, $kgm_lapic_value >> 24
9611 _lapic_addr_value $_lapic_icr0 $lcpu
9612 printf " 0x%08X ", $kgm_lapic_value
9613 _apic_print $kgm_lapic_value
9616 _lapic_addr_value $_lapic_lvt_timer $lcpu
9617 printf "LAPIC[0x%03X] LVT Timer: 0x%08X ", $_lapic_lvt_timer, $kgm_lapic_value
9618 _apic_print $kgm_lapic_value
9622 _lapic_addr_value $_lapic_lvt_lint0 $lcpu
9623 printf "LAPIC[0x%03X] LVT LINT0: 0x%08X ", $_lapic_lvt_lint0, $kgm_lapic_value
9624 _apic_print $kgm_lapic_value
9628 _lapic_addr_value $_lapic_lvt_lint1 $lcpu
9629 printf "LAPIC[0x%03X] LVT LINT1: 0x%08X ", $_lapic_lvt_lint1, $kgm_lapic_value
9630 _apic_print $kgm_lapic_value
9634 _lapic_addr_value $_lapic_lvt_error $lcpu
9635 printf "LAPIC[0x%03X] LVT Error: 0x%08X ", $_lapic_lvt_error, $kgm_lapic_value
9636 _apic_print $kgm_lapic_value
9640 _lapic_addr_value $_lapic_lvt_pmcr $lcpu
9641 printf "LAPIC[0x%03X] LVT PerfMon: 0x%08X ", $_lapic_lvt_pmcr, $kgm_lapic_value
9642 _apic_print $kgm_lapic_value
9646 _lapic_addr_value $_lapic_lvt_thermal $lcpu
9647 printf "LAPIC[0x%03X] LVT Thermal: 0x%08X ", $_lapic_lvt_thermal, $kgm_lapic_value
9648 _apic_print $kgm_lapic_value
9651 _lapic_addr_value $_lapic_dcr $lcpu
9652 printf "LAPIC[0x%03X] Timer Divide: 0x%08X [Divide by ", $_lapic_dcr, $kgm_lapic_value
9653 set $kgm_lapic_value = ($kgm_lapic_value & 0x8) >> 1 | $kgm_lapic_value & 0x3
9654 if $kgm_lapic_value == 0x7
9657 printf "%d]\n", 2 << $kgm_lapic_value
9660 _lapic_addr_value $_lapic_icr $lcpu
9661 printf "LAPIC[0x%03X] Timer Init Count: 0x%08X\n", $_lapic_icr, $kgm_lapic_value
9663 _lapic_addr_value $_lapic_ccr $lcpu
9664 printf "LAPIC[0x%03X] Timer Cur Count: 0x%08X\n", $_lapic_ccr, $kgm_lapic_value
9669 Syntax: (gdb) lapic_dump [lcpu (kernel's numbering convention)]
9670 | Dump all the LAPIC entries. The CPU can be optionally specified.
9673 define showknoteheader
9674 printf " knote filter ident kn_ptr status\n"
9678 set $kgm_knotep = ((struct knote *) $arg0)
9682 set $kgm_filt = -$kgm_knotep->kn_kevent.filter
9684 printf "EVFILT_READ "
9687 printf "EVFILT_WRITE "
9690 printf "EVFILT_AIO "
9693 printf "EVFILT_VNODE "
9696 printf "EVFILT_PROC "
9699 printf "EVFILT_SIGNAL "
9702 printf "EVFILT_TIMER "
9705 printf "EVFILT_MACHPORT"
9710 if ($kgm_filt == 10)
9711 printf "EVFILT_USER "
9713 if ($kgm_filt == 11)
9714 printf "EVFILT_SESSION "
9716 printf "%7d ", $kgm_knotep->kn_kevent.ident
9717 showptr $kgm_knotep->kn_ptr.p_fp
9719 if ($kgm_knotep->kn_status == 0)
9722 if ($kgm_knotep->kn_status & 0x01)
9725 if ($kgm_knotep->kn_status & 0x02)
9728 if ($kgm_knotep->kn_status & 0x04)
9731 if ($kgm_knotep->kn_status & 0x08)
9734 if ($kgm_knotep->kn_status & 0x10)
9737 if ($kgm_knotep->kn_status & 0x20)
9740 if ($kgm_knotep->kn_status & 0x40)
9747 define showprocknotes
9749 set $kgm_fdp = ((proc_t)$arg0)->p_fd
9750 set $kgm_knlist = $kgm_fdp->fd_knlist
9752 while (($i < $kgm_fdp->fd_knlistsize) && ($kgm_knlist != 0))
9753 set $kgm_kn = ((struct knote *)$kgm_knlist[$i].slh_first)
9754 while ($kgm_kn != 0)
9755 showknoteint $kgm_kn
9756 set $kgm_kn = ((struct knote *)$kgm_kn->kn_link.sle_next)
9760 set $kgm_knhash = $kgm_fdp->fd_knhash
9762 while (($i < $kgm_fdp->fd_knhashmask + 1) && ($kgm_knhash != 0))
9763 set $kgm_kn = ((struct knote *)$kgm_knhash[$i].slh_first)
9764 while ($kgm_kn != 0)
9765 showknoteint $kgm_kn
9766 set $kgm_kn = ((struct knote *)$kgm_kn->kn_link.sle_next)
9772 define showallknotes
9773 set $kgm_head_taskp = &tasks
9774 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
9775 while $kgm_taskp != $kgm_head_taskp
9777 showtaskint $kgm_taskp
9778 showprocknotes $kgm_taskp->bsd_info
9779 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
9782 document showprocknotes
9783 Syntax: showprocknotes <proc>
9784 | Displays filter and status information for every kevent registered for
9789 # Device node related debug macros
9793 set $kgm_tty = (struct tty *) $arg0
9794 printf "tty struct at "
9797 printf "-last input to raw queue:\n"
9798 p $kgm_tty->t_rawq->c_cs
9799 printf "-last input to canonical queue:\n"
9800 p $kgm_tty->t_canq->c_cs
9801 printf "-last output data:\n"
9802 p $kgm_tty->t_outq->c_cs
9804 if ($kgm_tty->t_state & 0x00000001)
9805 printf " TS_SO_OLOWAT (Wake up when output <= low water)\n"
9807 if ($kgm_tty->t_state & 0x00000002)
9808 printf " TS_ASYNC (async I/O mode)\n"
9810 printf " - (synchronous I/O mode)\n"
9812 if ($kgm_tty->t_state & 0x00000004)
9813 printf " TS_BUSY (Draining output)\n"
9815 if ($kgm_tty->t_state & 0x00000008)
9816 printf " TS_CARR_ON (Carrier is present)\n"
9818 printf " - (Carrier is NOT present)\n"
9820 if ($kgm_tty->t_state & 0x00000010)
9821 printf " TS_FLUSH (Outq has been flushed during DMA)\n"
9823 if ($kgm_tty->t_state & 0x00000020)
9824 printf " TS_ISOPEN (Open has completed)\n"
9826 printf " - (Open has NOT completed)\n"
9828 if ($kgm_tty->t_state & 0x00000040)
9829 printf " TS_TBLOCK (Further input blocked)\n"
9831 if ($kgm_tty->t_state & 0x00000080)
9832 printf " TS_TIMEOUT (Wait for output char processing)\n"
9834 if ($kgm_tty->t_state & 0x00000100)
9835 printf " TS_TTSTOP (Output paused)\n"
9837 if ($kgm_tty->t_state & 0x00000200)
9838 printf " TS_WOPEN (Open in progress)\n"
9840 if ($kgm_tty->t_state & 0x00000400)
9841 printf " TS_XCLUDE (Tty requires exclusivity)\n"
9843 if ($kgm_tty->t_state & 0x00000800)
9844 printf " TS_BKSL (State for lowercase \\ work)\n"
9846 if ($kgm_tty->t_state & 0x00001000)
9847 printf " TS_CNTTB (Counting tab width, ignore FLUSHO)\n"
9849 if ($kgm_tty->t_state & 0x00002000)
9850 printf " TS_ERASE (Within a \\.../ for PRTRUB)\n"
9852 if ($kgm_tty->t_state & 0x00004000)
9853 printf " TS_LNCH (Next character is literal)\n"
9855 if ($kgm_tty->t_state & 0x00008000)
9856 printf " TS_TYPEN (Retyping suspended input (PENDIN))\n"
9858 if ($kgm_tty->t_state & 0x00010000)
9859 printf " TS_CAN_BYPASS_L_RINT (Device in "raw" mode)\n"
9861 if ($kgm_tty->t_state & 0x00020000)
9862 printf " TS_CONNECTED (Connection open)\n"
9864 printf " - (Connection NOT open)\n"
9866 if ($kgm_tty->t_state & 0x00040000)
9867 printf " TS_SNOOP (Device is being snooped on)\n"
9869 if ($kgm_tty->t_state & 0x80000)
9870 printf " TS_SO_OCOMPLETE (Wake up when output completes)\n"
9872 if ($kgm_tty->t_state & 0x00100000)
9873 printf " TS_ZOMBIE (Connection lost)\n"
9875 if ($kgm_tty->t_state & 0x00200000)
9876 printf " TS_CAR_OFLOW (For MDMBUF - handle in driver)\n"
9878 if ($kgm_tty->t_state & 0x00400000)
9879 printf " TS_CTS_OFLOW (For CCTS_OFLOW - handle in driver)\n"
9881 if ($kgm_tty->t_state & 0x00800000)
9882 printf " TS_DSR_OFLOW (For CDSR_OFLOW - handle in driver)\n"
9884 # xxx todo: do we care about decoding flags?
9885 printf "flags: 0x%08x\n", $kgm_tty->t_flags
9886 printf "foreground process group: "
9887 showptr $kgm_tty->t_pgrp
9889 printf "enclosing session: "
9890 showptr $kgm_tty->t_session
9893 # XXX todo: decode these flags, someday
9894 printf " Input flags: 0x%08x\n", $kgm_tty->t_termios.c_iflag
9895 printf " Output flags: 0x%08x\n", $kgm_tty->t_termios.c_oflag
9896 printf " Control flags: 0x%08x\n", $kgm_tty->t_termios.c_cflag
9897 printf " Local flags: 0x%08x\n", $kgm_tty->t_termios.c_lflag
9898 printf " Input speed: %d\n", $kgm_tty->t_termios.c_ispeed
9899 printf " Output speed: %d\n", $kgm_tty->t_termios.c_ospeed
9900 # XXX todo: useful to decode t_winsize? t_iokit? c_cc? anything else?
9901 printf "high watermark: %d bytes\n", $kgm_tty->t_hiwat
9902 printf "low watermark: %d bytes\n", $kgm_tty->t_lowat
9906 # _showwhohas <major> <minor>
9916 set $kgm_swh_devnode_dev = (((int) $arg0) << 24) | (int) $arg1
9917 # iterate all tasks to iterate all processes to iterate all
9918 # open files in each process to see who has a given major/minor
9920 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
9921 while $kgm_taskp != $kgm_head_taskp
9922 set $kgm_procp = (proc_t) $kgm_taskp->bsd_info
9923 set $kgm_spf_filedesc = $kgm_procp->p_fd
9924 set $kgm_spf_last = $kgm_spf_filedesc->fd_lastfile
9925 set $kgm_spf_ofiles = $kgm_spf_filedesc->fd_ofiles
9926 set $kgm_spf_count = 0
9927 while (($kgm_spf_ofiles != 0) && ($kgm_spf_count <= $kgm_spf_last))
9928 # only files currently open
9929 if ($kgm_spf_ofiles[$kgm_spf_count] != 0)
9930 set $kgm_spf_fg = $kgm_spf_ofiles[$kgm_spf_count].f_fglob
9931 if ($kgm_spf_fg->fg_type == 1)
9932 # display fd #, fileglob & vnode address, proc name
9933 set $kgm_swh_m_vnode = (vnode_t) $kgm_spf_fg->fg_data
9934 set $kgm_swh_m_vtype = (enum vtype) $kgm_swh_m_vnode->v_type
9935 if (($kgm_swh_m_vtype == VBLK) || ($kgm_swh_m_vtype == VCHR)) && ((((devnode_t *)$kgm_swh_m_vnode->v_data)->dn_typeinfo.dev) == $kgm_swh_devnode_dev)
9936 printf "%-5d ", $kgm_spf_count
9939 showptr $kgm_swh_m_vnode
9942 printf " %s\n", $kgm_procp->p_comm
9946 set $kgm_spf_count = $kgm_spf_count + 1
9949 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
9953 define _showvnodedev_cpty
9954 set $kgm_ptmx_major = (int) $arg0
9955 set $kgm_ptmx_minor = (int) $arg1
9956 set $kgm_ptmx_ioctl = _state.pis_ioctl_list[$kgm_ptmx_minor]
9957 set $kgm_ptmx_ioctl = _state.pis_ioctl_list[$kgm_ptmx_minor]
9958 printf " ptmx_ioctl struct at "
9959 showptr $kgm_ptmx_ioctl
9962 if ($kgm_ptmx_ioctl->pt_flags & 0x0008)
9963 printf " PF_PKT (packet mode)\n"
9965 if ($kgm_ptmx_ioctl->pt_flags & 0x0010)
9966 printf " PF_STOPPED (user told stopped)\n"
9968 if ($kgm_ptmx_ioctl->pt_flags & 0x0020)
9969 printf " PF_REMOTE (remote and flow controlled input)\n"
9971 if ($kgm_ptmx_ioctl->pt_flags & 0x0040)
9974 if ($kgm_ptmx_ioctl->pt_flags & 0x0080)
9975 printf " PF_UCNTL (user control mode)\n"
9977 if ($kgm_ptmx_ioctl->pt_flags & 0x0100)
9978 printf " PF_UNLOCKED (slave unlock - master open resets)\n"
9980 if ($kgm_ptmx_ioctl->pt_flags & 0x0200)
9981 printf " PF_OPEN_M (master is open)\n"
9982 # XXX we should search for who has the master open, but
9983 # XXX each master gets the same minor, even though it
9984 # XXX gets a different vnode. we chold probably change
9985 # XXX this, but to do it we would need some way of
9986 # XXX expressing the information in the vnode structure
9987 # XXX somewhere. If we *did* change it, it would buy us
9988 # XXX the ability to determine who has the corresponding
9989 # XXX master end of the pty open
9991 printf " PF_OPEN_M (master is closed)\n"
9993 if ($kgm_ptmx_ioctl->pt_flags & 0x0400)
9994 printf " PF_OPEN_S (slave is open)\n"
9995 printf "---vvvvv--- fds open on this device ---vvvvv---\n"
9996 _showwhohas ($kgm_ptmx_major) ($kgm_ptmx_minor)
9997 printf "---^^^^^--- fds open on this device ---^^^^^---\n"
9999 printf " - (slave is closed)\n"
10001 printf "TTY Specific Information\n"
10002 _showtty $kgm_ptmx_ioctl->pt_tty
10005 define showvnodedev
10007 set $kgm_vnode = (vnode_t) $arg0
10008 set $kgm_vtype = (enum vtype) $kgm_vnode->v_type
10009 if (($kgm_vtype == VBLK) || ($kgm_vtype == VCHR))
10010 set $kgm_devnode = (devnode_t *) $kgm_vnode->v_data
10011 set $kgm_devnode_dev = $kgm_devnode->dn_typeinfo.dev
10012 set $kgm_devnode_major = ($kgm_devnode_dev >> 24) & 0xff
10013 set $kgm_devnode_minor = $kgm_devnode_dev & 0x00ffffff
10015 # boilerplate device information for a vnode
10016 printf "Device Info:\n"
10021 if ($kgm_vtype == VBLK)
10024 if ($kgm_vtype == VCHR)
10028 printf " name: %s\n", $kgm_vnode->v_name
10029 printf " major, minor: %d, %d\n", $kgm_devnode_major, $kgm_devnode_minor
10030 printf " mode 0%o\n", $kgm_devnode->dn_mode
10031 printf " owner (u,g): %d %d", $kgm_devnode->dn_uid, $kgm_devnode->dn_gid
10034 # decode device specific data
10035 printf "Device Specific Information: "
10036 if ($kgm_vtype == VBLK)
10037 printf " Sorry, I do not know how to decode block devices yet!\n"
10038 printf " Maybe you can write me!"
10040 if ($kgm_vtype == VCHR)
10041 # Device information; this is scanty
10043 if ($kgm_devnode_major > 42) || ($kgm_devnode_major < 0)
10044 printf "Invalid major #\n"
10046 # static assignments in conf
10047 if ($kgm_devnode_major == 0)
10048 printf "Console mux device\n"
10050 if ($kgm_devnode_major == 2)
10051 printf "Current tty alias\n"
10053 if ($kgm_devnode_major == 3)
10054 printf "NULL device\n"
10056 if ($kgm_devnode_major == 4)
10057 printf "Old pty slave\n"
10059 if ($kgm_devnode_major == 5)
10060 printf "Old pty master\n"
10062 if ($kgm_devnode_major == 6)
10063 printf "Kernel log\n"
10065 if ($kgm_devnode_major == 12)
10066 printf "Memory devices\n"
10068 # Statically linked dynamic assignments
10069 if cdevsw[$kgm_devnode_major].d_open == ptmx_open
10070 printf "Cloning pty master\n"
10071 _showvnodedev_cpty ($kgm_devnode_major) ($kgm_devnode_minor)
10073 if cdevsw[$kgm_devnode_major].d_open == ptsd_open
10074 printf "Cloning pty slave\n"
10075 _showvnodedev_cpty ($kgm_devnode_major) ($kgm_devnode_minor)
10077 printf "RESERVED SLOT\n"
10091 printf " is not a device\n"
10094 printf "| Usage:\n|\n"
10098 document showvnodedev
10099 Syntax: (gdb) showvnodedev <vnode>
10100 | showvnodedev Display information about a device vnode
10107 printf "| Usage:\n|\n"
10112 Syntax: (gdb) showtty <tty struct>
10113 | showtty Display information about a struct tty
10116 define showeventsourceobject
10117 set $kgm_vt = *((void **) $arg1)
10119 set $kgm_vt = $kgm_vt - 16
10123 document showeventsourceobject
10124 Syntax: (gdb) showeventsourceobject <prefix> <object>
10125 | Routine to display information about an IOEventSource subclass.
10128 define showworkloopeventsources
10129 set $kgm_eventsource = (struct IOEventSource*)$arg0
10130 while $kgm_eventsource != 0
10132 printf "EventSource:\t"
10133 showptr $kgm_eventsource
10134 printf " Description: "
10135 showeventsourceobject _ $kgm_eventsource
10137 if $kgm_eventsource->action != 0
10139 printf "Action: \t"
10140 pcprint $kgm_eventsource->action
10143 if $kgm_eventsource->owner != 0
10146 showptr $kgm_eventsource->owner
10147 printf " Description: "
10148 showeventsourceobject _ $kgm_eventsource->owner
10151 set $kgm_eventsource = $kgm_eventsource->eventChainNext
10155 document showworkloopeventsources
10156 Syntax: (gdb) showworkloopeventsources
10157 | Routine to walk an IOEventSource chain associated with an IOWorkLoop and print information
10158 | about each event source in the chain.
10161 define showworkloopheader
10164 printf " workloop "
10166 printf " pri state\tLockGroupName\n"
10168 document showworkloopheader
10169 Syntax: (gdb) showworkloopheader
10170 | Routine to print out header info about an IOKit workloop.
10173 define showworkloop
10174 set $kgm_workloopthread = (struct thread*)$arg0
10175 set $kgm_workloop = (struct IOWorkLoop*)$arg1
10176 showptr $kgm_workloopthread
10178 showptr $kgm_workloop
10179 printf " %3d ", $kgm_workloopthread.sched_pri
10180 set $kgm_state = $kgm_workloopthread.state
10181 if $kgm_state & 0x80
10184 if $kgm_state & 0x40
10187 if $kgm_state & 0x20
10190 if $kgm_state & 0x10
10193 if $kgm_state & 0x08
10196 if $kgm_state & 0x04
10199 if $kgm_state & 0x02
10202 if $kgm_state & 0x01
10206 set $kgm_gateLock = ( struct _IORecursiveLock *)$kgm_workloop->gateLock
10207 set $kgm_lockGroup = (struct _lck_grp_*)($kgm_gateLock->group)
10208 printf "%s", $kgm_lockGroup->lck_grp_name
10210 showworkloopeventsources $kgm_workloop->eventChain
10212 document showworkloop
10213 Syntax: (gdb) showworkloop <thread> <workloop>
10214 | Routine to print out info about an IOKit workloop.
10217 define showallworkloopthreads
10218 set $kgm_head_taskp = &tasks
10219 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
10220 set $kgm_head_actp = &($kgm_taskp->threads)
10221 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
10222 while $kgm_actp != $kgm_head_actp
10223 if ($kgm_actp->continuation == _ZN10IOWorkLoop10threadMainEv)
10225 showworkloop $kgm_actp $kgm_actp->parameter
10227 if ($kgm_actp->kernel_stack != 0)
10228 if ($kgm_mtype == $kgm_mtype_x86_64)
10229 #Warning: Grokking stack looking for hopeful workloops until we squirrel some info in thread_t.
10230 set $kgm_workloop = *((struct IOWorkLoop **)($kgm_actp->kernel_stack + kernel_stack_size - 0xB8))
10232 if ($kgm_mtype == $kgm_mtype_i386)
10233 set $kgm_workloop = *((struct IOWorkLoop **)($kgm_actp->kernel_stack + kernel_stack_size - 0x3C))
10236 if ($kgm_workloop != 0)
10237 set $kgm_vt = *((void **) $kgm_workloop)
10239 set $kgm_vt = $kgm_vt - 16
10241 if ($kgm_vt == &_ZTV10IOWorkLoop)
10243 showworkloop $kgm_actp $kgm_workloop
10248 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
10252 document showallworkloopthreads
10253 Syntax: (gdb) showallworkloopthreads
10254 | Routine to print out info about all IOKit workloop threads in the system. This macro will find
10255 | all IOWorkLoop threads blocked in continuations and on i386 and x86_64 systems will make a
10256 | best-effort guess to find any workloops that are actually not blocked in a continuation. For a
10257 | complete list, it is best to compare the output of this macro against the output of 'showallstacks'.
10260 define showthreadfortid
10261 set $kgm_id_found = 0
10263 set $kgm_head_taskp = &tasks
10264 set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
10265 while $kgm_taskp != $kgm_head_taskp
10266 set $kgm_head_actp = &($kgm_taskp->threads)
10267 set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
10268 while $kgm_actp != $kgm_head_actp
10269 set $kgm_thread = *(struct thread *)$kgm_actp
10270 set $kgm_thread_id = $kgm_thread.thread_id
10271 if ($kgm_thread_id == $arg0)
10274 set $kgm_id_found = 1
10277 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
10279 if ($kgm_id_found == 1)
10282 set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
10284 if ($kgm_id_found == 0)
10285 printf "Not a valid thread_id\n"
10289 document showthreadfortid
10290 Syntax: showthreadfortid <thread_id>
10291 |The thread structure contains a unique thread_id value for each thread.
10292 |This command is used to retrieve the address of the thread structure(thread_t)
10293 |corresponding to a given thread_id.
10296 define showtaskbusyports
10297 set $kgm_isp = ((task_t)$arg0)->itk_space
10298 set $kgm_iindex = 0
10299 while ( $kgm_iindex < $kgm_isp->is_table_size )
10300 set $kgm_iep = &($kgm_isp->is_table[$kgm_iindex])
10301 if $kgm_iep->ie_bits & 0x00020000
10302 set $kgm_port = ((ipc_port_t)$kgm_iep->ie_object)
10303 if $kgm_port->ip_messages.data.port.msgcount > 0
10307 set $kgm_iindex = $kgm_iindex + 1
10311 document showtaskbusyports
10312 Syntax: showtaskbusyports <task>
10313 |Routine to print information about receive rights belonging to this task that
10314 |have enqueued messages. This is often a sign of a blocked or hung process.
10317 define showallbusyports
10318 set $kgm_head_taskp = &tasks
10319 set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
10320 while $kgm_cur_taskp != $kgm_head_taskp
10321 showtaskbusyports $kgm_cur_taskp
10322 set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->tasks.next)
10326 document showallbusyports
10327 Syntax: showallbusyports
10328 |Routine to print information about all receive rights on the system that
10329 |have enqueued messages.
10336 printf "Attempting to attach to localhost...\n"
10337 kdp-reattach localhost
10341 document kdp-connect
10342 Syntax: (gdb) kdpconnect <address-of-remote-host>
10343 | Attach to the machine with given hostname or IP address, or 'localhost' if blank