Loading...
--- xnu/xnu-792.13.8/kgmacros
+++ xnu/xnu-1699.24.23/kgmacros
@@ -1,4 +1,4 @@
-#
+
 # Kernel gdb macros
 #
 #  These gdb macros should be useful during kernel development in
@@ -9,6 +9,11 @@
 set print asm-demangle on
 set cp-abi gnu-v2
 
+# This option tells gdb to relax its stack tracing heuristics
+# Useful for debugging across stack switches
+# (to the interrupt stack, for instance). Requires gdb-675 or greater.
+set backtrace sanity-checks off
+
 echo Loading Kernel GDB Macros package.  Type "help kgm" for more info.\n
 
 define kgm
@@ -20,8 +25,8 @@
 | These are the kernel gdb macros.  These gdb macros are intended to be
 | used when debugging a remote kernel via the kdp protocol.  Typically, you
 | would connect to your remote target like so:
-|     (gdb) target remote-kdp
-|     (gdb) attach <name-of-remote-host>
+| 		 (gdb) target remote-kdp
+| 		 (gdb) attach <name-of-remote-host>
 |
 | The following macros are available in this package:
 |     showversion    Displays a string describing the remote kernel version
@@ -34,8 +39,12 @@
 |     showallvm      Display a summary listing of all the vm maps
 |     showallvme     Display a summary listing of all the vm map entries
 |     showallipc     Display a summary listing of all the ipc spaces
+|     showipcsummary     Display a summary listing of the ipc spaces of all tasks
 |     showallrights  Display a summary listing of all the ipc rights
-|     showallkmods   Display a summary listing of all the kernel modules
+|     showallkexts   Display a summary listing of all loaded kexts (alias: showallkmods)
+|     showallknownkexts   Display a summary listing of all kexts, loaded or not
+|     showallbusyports    Display a listing of all ports with unread messages
+|     showallprocessors   Display a listing of all psets and processors
 |
 |     showallclasses    Display info about all OSObject subclasses in the system
 |     showobject        Show info about an OSObject - its vtable ptr and retain count, & more info for simple container classes.
@@ -44,6 +53,14 @@
 |     showregistryentry Show info about a registry entry; its properties and descendants in the current plane
 |     setregistryplane  Set the plane to be used for the iokit registry macros (pass zero for list)
 |
+|     setfindregistrystr  Set the encoded string for matching with
+|                         findregistryentry or findregistryprop (created from
+|                         strcmp_arg_pack64)
+|     findregistryentry   Find a registry entry that matches the encoded string
+|     findregistryentries Find all the registry entries that match the encoded string
+|     findregistryprop    Search the registry entry for a property that matches
+|                         the encoded string
+|
 |     showtask       Display info about the specified task
 |     showtaskthreads      Display info about the threads in the task
 |     showtaskstacks Display the stack for each thread in the task
@@ -51,6 +68,8 @@
 |     showtaskvme    Display info about the task's vm_map entries
 |     showtaskipc    Display info about the specified task's ipc space
 |     showtaskrights Display info about the task's ipc space entries
+|     showtaskrightsbt Display info about the task's ipc space entries with back traces
+|     showtaskbusyports    Display all of the task's ports with unread messages
 |
 |     showact	     Display info about a thread specified by activation
 |     showactstack   Display the stack for a thread specified by activation
@@ -63,9 +82,18 @@
 |
 |     showpid        Display info about the process identified by pid
 |     showproc       Display info about the process identified by proc struct
+|     showprocinfo   Display detailed info about the process identified by proc struct
+|     showprocfiles  Given a proc_t pointer, display the list of open file descriptors
+|     showproclocks  Given a proc_t pointer, display the list of advisory file locks
+|     zombproc       Print out all procs in the zombie list
+|     showproctree   Show all the processes in a hierarchical tree form
+|     allproc        Print out all process in the system not in the zombie list
+|     zombstacks     Print out all stacks of tasks that are exiting
 |
-|     showkmod	     Display info about a kernel module
-|     showkmodaddr   Given an address, display the kernel module and offset
+|     showinitchild  Print out all processes in the system which are children of init process
+|
+|     showkext	     Display info about a kext (alias: showkmod)
+|     showkextaddr   Given an address, display the kext and offset (alias: showkmodaddr)
 |
 |     dumpcallqueue  Dump out all the entries given a queue head
 |
@@ -80,6 +108,9 @@
 |     switchtoctx    Switch to different context
 |     showuserstack  Display numeric backtrace of the user stack for an 
 |     		     activation
+|     showtaskuserstacks	 Display user stacks for a specified task
+|     showuserregisters		 Display user registers for the specified thread
+|     showtaskuserregisters		 Display user registers for the specified task
 |
 |     switchtouserthread Switch to the user context of the specified thread
 |     resetstacks    Return to the original kernel context
@@ -89,15 +120,193 @@
 |     resume_off     Don't resume when detaching from gdb 
 |
 |     sendcore	     Configure kernel to send a coredump to the specified IP
+|     sendsyslog     Configure kernel to send a system log to the specified IP
+|     sendpaniclog   Configure kernel to send a panic log to the specified IP
 |     disablecore    Configure the kernel to disable coredump transmission
+|     getdumpinfo    Retrieve the current remote dump parameters
+|     setdumpinfo    Configure the remote dump parameters
+|
 |     switchtocorethread Corefile version of "switchtoact"
 |     resetcorectx   Corefile version of "resetctx"
 |
-|     readphys       Reads the specified untranslated address
-|     readphys64     Reads the specified untranslated 64-bit address
+|     readphys8      Reads the specified untranslated address (8-bit read)
+|     readphys16     Reads the specified untranslated address (16-bit read)
+|     readphys32     Reads the specified untranslated address (32-bit read)
+|     readphys64     Reads the specified untranslated address (64-bit read)
+|     writephys8     Writes to the specified untranslated address (8-bit write)
+|     writephys16    Writes to the specified untranslated address (16-bit write)
+|     writephys32    Writes to the specified untranslated address (32-bit write)
+|     writephys64    Writes to the specified untranslated address (64-bit write)
 |
-|     kdp-reboot     Restart remote target
-|	
+|     readioport8    Read 8-bits from the specified I/O Port
+|     readioport16   Read 16-bits from the specified I/O Port
+|     readioport32   Read 32-bits from the specified I/O Port
+|     writeioport8   Write 8-bits into the specified I/O Port
+|     writeioport16  Write 16-bits into the specified I/O Port
+|     writeioport32  Write 32-bits into the specified I/O Port
+|
+|     readmsr64      Read 64-bits from the specified MSR
+|     writemsr64     Write 64-bits into the specified MSR
+|
+|     rtentry_showdbg Print the debug information of a route entry
+|     rtentry_trash  Walk the list of trash route entries
+|
+|     inifa_showdbg  Print the debug information of an IPv4 interface address
+|     in6ifa_showdbg Print the debug information of an IPv6 interface address
+|     inm_showdbg    Print the debug information of an IPv4 multicast address
+|     ifma_showdbg   Print the debug information of a link multicast address
+|     ifpref_showdbg Print the debug information of an interface ref count
+|
+|     ndpr_showdbg   Print the debug information of a nd_prefix structure
+|     nddr_showdbg   Print the debug information of a nd_defrouter structure
+|
+|     imo_showdbg    Print the debug information of a ip_moptions structure
+|     im6o_showdbg   Print the debug information of a ip6_moptions structure
+|
+|     inifa_trash    Walk the list of trash in_ifaddr entries
+|     in6ifa_trash   Walk the list of trash in6_ifaddr entries
+|     inm_trash      Walk the list of trash in_multi entries
+|     in6m_trash     Walk the list of trash in6_multi entries
+|     ifma_trash     Walk the list of trash ifmultiaddr entries
+|
+|     mbuf_walkpkt   Walk the mbuf packet chain (m_nextpkt)
+|     mbuf_walk      Walk the mbuf chain (m_next)
+|     mbuf_buf2slab  Find the slab structure of the corresponding buffer
+|     mbuf_buf2mca   Find the mcache audit structure of the corresponding mbuf
+|     mbuf_showmca   Print the contents of an mbuf mcache audit structure
+|     mbuf_showactive   Print all active/in-use mbuf objects
+|     mbuf_showinactive Print all freed/in-cache mbuf objects 
+|     mbuf_showall   Print all mbuf objects
+|     mbuf_slabs     Print all slabs in the group
+|     mbuf_slabstbl  Print slabs table
+|     mbuf_stat      Print extended mbuf allocator statistics
+|     mbuf_countchain   Count the length of an mbuf chain
+|     mbuf_topleak   Print the top suspected mbuf leakers
+|     mbuf_traceleak Print the leak information for a given leak address
+|
+|     mcache_walkobj     Walk the mcache object chain (obj_next)
+|     mcache_stat        Print all mcaches in the system
+|     mcache_showcache   Display the number of objects in the cache
+|
+|     showbootargs       Display boot arguments passed to the target kernel
+|     showbootermemorymap Dump phys memory map from EFI
+|
+|     systemlog          Display the kernel's printf ring buffer
+|
+|     hexdump            Show the contents of memory as a hex/ASCII dump
+|
+|     showvnodepath      Print the path for a vnode
+|     showvnodelocks     Display list of advisory locks held/blocked on a vnode
+|     showvnodedev       Display information about a device vnode
+|     showtty            Display information about a struct tty
+|     showallvols        Display a summary of mounted volumes
+|     showvnode          Display info about one vnode
+|     showvolvnodes      Display info about all vnodes of a given volume
+|     showvolbusyvnodes  Display info about busy (iocount!=0) vnodes of a given volume
+|     showallbusyvnodes  Display info about all busy (iocount!=0) vnodes
+|     showallvnodes      Display info about all vnodes
+|     print_vnode        Print out the fields of a vnode struct
+|     showprocvnodes     Print out all the open fds which are vnodes in a process
+|     showallprocvnodes  Print out all the open fds which are vnodes in any process
+|     showmountvnodes    Print the vnode list
+|     showmountallvnodes Print the vnode inactive list
+|     showworkqvnodes    Print the vnode worker list
+|     shownewvnodes      Print the new vnode list
+|
+|     ifconfig           display ifconfig-like output
+|     showifnets         show the list of attached and detached interfaces
+|     showifaddrs        show the list of addresses for the given ifp
+|     showifmultiaddrs   show the list of multicast addresses for the given ifp
+|     showinmultiaddrs   show the list of IPv4 multicast addresses records 
+|     showin6multiaddrs  show the list of IPv6 multicast addresses records
+|
+|     showsocket         Display information about a socket
+|     showprocsockets    Given a proc_t pointer, display information about its sockets
+|     showallprocsockets Display information about the sockets of all the processes
+|
+|     show_tcp_pcbinfo   Display the list of the TCP protocol control blocks
+|     show_tcp_timewaitslots Display the list of the TCP protocol control blocks in TIMEWAIT
+|     show_udp_pcbinfo   Display the list of UDP protocol control blocks
+|
+|     show_rt_inet       Display the IPv4 routing table
+|     show_rt_inet6      Display the IPv6 routing table
+|
+|     showpmworkqueue       Display the IOPMWorkQueue object
+|     showregistrypmstate   Display power management state for all IOPower registry entries
+|     showioservicepm       Display the IOServicePM object
+|     showstacksaftertask   showallstacks starting after a given task
+|     showstacksafterthread showallstacks starting after a given thread
+|
+|     showMCAstate	Print machine-check register state after MC exception.
+|
+|     showallgdbstacks	Cause GDB to trace all thread stacks
+|     showallgdbcorestacks Corefile equivalent of "showallgdbstacks"
+|     kdp-reenter	Schedule reentry into the debugger and continue.
+|     kdp-reboot	Restart remote target
+|     kdp-version       Get KDP version number
+|
+|     zstack		Print zalloc caller stack (zone leak debugging)
+|     findoldest	Find oldest zone leak debugging record
+|     countpcs		Print how often a pc occurs in the zone leak log
+|
+|     showtopztrace     Print the ztrace with the most outstanding allocated memory
+|     showztrace		Print a backtrace record given its index
+|     showzalloc	    Print an allocation record + stacktrace at index
+|     showztraceaddr    Print a backtrace record given its address
+|     showztracesabove  Print all the backtrace records with a size bigger than X
+|     showzstacktrace   Symbolicate and print a stored OSBacktrace
+|     
+|     showztraces       Finds all in-use traces in the ztraces table
+|     showzallocs       Finds all in-use allocations in the zallocs table
+|     showzstats        Shows the statistics gathered about the hash tables
+|
+|     showzallocsfortrace   Print all the allocations that refer to a trace
+|     showztracehistogram   Prints a histogram of the ztraces table
+|     showzallochistogram   Prints a histogram of the zallocs table	
+|
+|     pmap_walk     Perform a page-table walk
+|     pmap_vtop     Translate a virtual address to physical address
+|
+|     showuserdyldinfo       Show dyld information and error messages
+|                            in the target task
+|     showuserlibraries      Show binary images known by dyld in the
+|                            target task
+|     showallvmstats	Prints a summary of vm statistics in a table format
+|     memstats			Displays memory statistics in a table format
+|
+|     showthreadfortid	Displays the address of the thread structure
+|                       for a given thread_id value. 
+|     
+|     strcmp_nomalloc   A version of strcmp that avoids the use of malloc
+|                       through the use of encoded strings created via
+|                       strcmp_arg_pack64.
+|     strcmp_arg_pack64 Pack a string into a 64-bit quantity for use by
+|                       strcmp_nomalloc
+|
+|     pci_cfg_read8     Read 8-bits from a PCI config space register
+|     pci_cfg_read16    Read 16-bits from a PCI config space register
+|     pci_cfg_read32    Read 32-bits from a PCI config space register
+|     pci_cfg_write8    Write 8-bits into a PCI config space register
+|     pci_cfg_write16   Write 16-bits into a PCI config space register
+|     pci_cfg_write32   Write 32-bits into a PCI config space register
+|     pci_cfg_dump      Dump entire config space for a PCI device
+|     pci_cfg_scan      Perform a scan for PCI devices
+|     pci_cfg_dump_all  Dump config spaces for all detected PCI devices
+|
+|     lapic_read32      Read APIC entry
+|     lapic_write32     Write APIC entry
+|     lapic_dump        Dump APIC entries
+|
+|     ioapic_read32     Read IOAPIC entry
+|     ioapic_write32    Write IOAPIC entry
+|     ioapic_dump       Dump IOAPIC entries
+|
+|     showallproviders  Display summary listing of all dtrace_providers
+|     showallmodctls    Display summary listing of all dtrace modctls
+|     showmodctl        Display info about a dtrace modctl
+|     showfbtprobe      Display info about an fbt probe given an id (traverses fbt_probetab)
+|     processortimers   Display all processor timers, noting any inconsistencies
+|
 | Type "help <macro>" for more specific help on a particular macro.
 | Type "show user <macro>" to see what the macro is really doing.
 end
@@ -105,7 +314,7 @@
 # This macro should appear before any symbol references, to facilitate
 # a gdb "source" without a loaded symbol file.
 define showversion
-       printf "%s\n", *(char **)0x501C
+    kdp-kernelversion
 end
 
 document showversion
@@ -119,72 +328,163 @@
 | correctly.
 end
 
-set $kgm_dummy = &proc0
-set $kgm_dummy = &kmod
-set $kgm_mtype = ((struct mach_header)_mh_execute_header).cputype
+set $kgm_mtype_ppc      = 0x00000012
+set $kgm_mtype_arm      = 0x0000000C
+
+set $kgm_mtype_i386     = 0x00000007
+set $kgm_mtype_x86_64   = 0x01000007
+set $kgm_mtype_x86_any  = $kgm_mtype_i386
+set $kgm_mtype_x86_mask = 0xFEFFFFFF
+
+set $kgm_mtype = ((unsigned int *)&_mh_execute_header)[1]
+set $kgm_lp64 = $kgm_mtype & 0x01000000
+
+set $kgm_manual_pkt_ppc    = 0x549C
+set $kgm_manual_pkt_i386   = 0x249C
+set $kgm_manual_pkt_x86_64 = 0xFFFFFF8000002930
+set $kgm_manual_pkt_arm    = 0xFFFF04A0
+
+set $kgm_kdp_pkt_data_len   = 128
+
+# part of data packet
+set $kgm_kdp_pkt_hdr_req_off = 0
+set $kgm_kdp_pkt_hdr_seq_off = 1
+set $kgm_kdp_pkt_hdr_len_off = 2
+set $kgm_kdp_pkt_hdr_key_off = 4
+
+# after data packet
+set $kgm_kdp_pkt_len_off     = $kgm_kdp_pkt_data_len
+set $kgm_kdp_pkt_input_off   = $kgm_kdp_pkt_data_len + 4
+
+set $kgm_kdp_pkt_hostreboot = 0x13
+set $kgm_kdp_pkt_hdr_size   = 8
+
+
+set $kgm_readphys_force_kdp     = 0
+set $kgm_readphys_force_physmap = 0
+
+set $kgm_lcpu_self      = 0xFFFE
 
 set $kgm_reg_depth = 0
-set $kgm_reg_plane = (void **) gIOServicePlane
+set $kgm_reg_depth_max = 0xFFFF
+set $kgm_reg_plane = (IORegistryPlane *) gIOServicePlane
 set $kgm_namekey = (OSSymbol *) 0
 set $kgm_childkey = (OSSymbol *) 0
 
 set $kgm_show_object_addrs = 0
 set $kgm_show_object_retain = 0
 set $kgm_show_props = 0
+set $kgm_show_data_alwaysbytes = 0
+
+set $kgm_show_kmod_syms = 0
+
+# send a manual packet header that doesn't require knowing the location
+# of everything.
+define manualhdrint
+       set $req = $arg0
+
+       set $hdrp = (uint32_t *) $kgm_manual_pkt_i386
+       if ($kgm_mtype == $kgm_mtype_ppc)
+          set $hdrp = (uint32_t *) $kgm_manual_pkt_ppc
+          set $req = $req << 1 # shift to deal with endiannness
+       end
+       if ($kgm_mtype == $kgm_mtype_x86_64)
+          set $hdrp = (uint64_t *) $kgm_manual_pkt_x86_64
+       end
+       if ($kgm_mtype == $kgm_mtype_arm)
+          set $hdrp = (uint32_t *) $kgm_manual_pkt_arm
+       end
+
+       set $pkt_hdr = *$hdrp
+       set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_input_off))    = 0
+       set *((uint32_t *) ($pkt_hdr + $kgm_kdp_pkt_len_off))     = $kgm_kdp_pkt_hdr_size
+
+       set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_req_off))  = $req
+       set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_seq_off))  = 0
+       set *((uint16_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_len_off)) = $kgm_kdp_pkt_hdr_size
+       set *((uint32_t *) ($pkt_hdr + $kgm_kdp_pkt_hdr_key_off)) = 0
+       set *((uint8_t *) ($pkt_hdr + $kgm_kdp_pkt_input_off))    = 1
+
+       # dummy to make sure manual packet is executed
+       set $kgm_dummy = &_mh_execute_header
+end
+
+# Print a pointer
+define showptr
+    if $kgm_lp64
+        printf "0x%016llx", $arg0
+    else
+        printf "0x%08x", $arg0
+    end
+end
+
+# for headers, leave 8 chars for LP64 pointers
+define showptrhdrpad
+    if $kgm_lp64
+        printf "        "
+    end
+end
+
+# Print a userspace pointer, using $kgm_tasp
+define showuserptr
+    set $kgm_userptr_task_64 = ( $kgm_taskp->taskFeatures[0] & 0x80000000)
+    if $kgm_userptr_task_64
+        printf "0x%016llx", $arg0
+    else
+        printf "0x%08x", $arg0
+    end
+end
 
 define showkmodheader
-    printf "kmod        address     size        "
-    printf "id    refs     version  name\n"
+    printf   "kmod_info "
+    showptrhdrpad
+    printf "  address   "
+    showptrhdrpad
+    printf "  size      "
+    showptrhdrpad
+    printf "  id    refs     version  name\n"
 end
 
 define showkmodint
     set $kgm_kmodp = (struct kmod_info *)$arg0
-    printf "0x%08x  ", $arg0
-    printf "0x%08x  ", $kgm_kmodp->address
-    printf "0x%08x  ", $kgm_kmodp->size
+    showptr $kgm_kmodp
+    printf "  "
+    showptr $kgm_kmodp->address
+    printf "  "
+    showptr $kgm_kmodp->size
+    printf "  "
     printf "%3d  ", $kgm_kmodp->id
     printf "%5d  ", $kgm_kmodp->reference_count
-    printf "%10s  ", &$kgm_kmodp->version
-    printf "%s\n", &$kgm_kmodp->name
-end
-
-set $kgm_kmodmin = 0xffffffff
-set $kgm_fkmodmin = 0x00000000
-set $kgm_kmodmax = 0x00000000
-set $kgm_fkmodmax = 0xffffffff
+    printf "%10s  ", $kgm_kmodp->version
+    printf "%s\n", $kgm_kmodp->name
+end
+
+# cached info of the last kext found, to speed up subsequent lookups
 set $kgm_pkmod = 0
 set $kgm_pkmodst = 0
 set $kgm_pkmoden = 0
+
 define showkmodaddrint
-    printf "0x%x" , $arg0
-    if ((unsigned int)$arg0 >= (unsigned int)$kgm_pkmodst) && ((unsigned int)$arg0 <= (unsigned int)$kgm_pkmoden)
-	set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_pkmodst)
+    showptr $arg0
+    if ((unsigned long)$arg0 >= (unsigned long)$kgm_pkmodst) && ((unsigned long)$arg0 < (unsigned long)$kgm_pkmoden)
+	set $kgm_off = ((unsigned long)$arg0 - (unsigned long)$kgm_pkmodst)
 	printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off
     else
-        if  ((unsigned int)$arg0 <= (unsigned int)$kgm_fkmodmax) && ((unsigned int)$arg0 >= (unsigned int)$kgm_fkmodmin)
-	    set $kgm_kmodp = (struct kmod_info *)kmod
-	    while $kgm_kmodp
-		set $kgm_kmod = *$kgm_kmodp
-		if $kgm_kmod.address && ($kgm_kmod.address < $kgm_kmodmin)
-		    set $kgm_kmodmin = $kgm_kmod.address
-		end
-		if ($kgm_kmod.address + $kgm_kmod.size) > $kgm_kmodmax
-	    	    set $kgm_kmodmax = $kgm_kmod.address + $kgm_kmod.size
-	    	end
-	        set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address)
-	        if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size)
-		    printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off
-		    set $kgm_pkmod = $kgm_kmodp
-		    set $kgm_pkmodst = $kgm_kmod.address
-		    set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmod.size
-	    	    set $kgm_kmodp = 0
-	        else
-	    	    set $kgm_kmodp = $kgm_kmod.next
-	        end
-	    end
-	    if !$kgm_pkmod
-		set $kgm_fkmodmin = $kgm_kmodmin
-		set $kgm_fkmodmax = $kgm_kmodmax
+    	set $kgm_kmodp = (struct kmod_info *)kmod
+	if ($kgm_mtype == $kgm_mtype_x86_64) && ($arg0 >= (unsigned long)&_mh_execute_header)
+	    # kexts are loaded below the kernel for x86_64
+	    set $kgm_kmodp = 0
+	end
+	while $kgm_kmodp
+	    set $kgm_off = ((unsigned long)$arg0 - (unsigned long)$kgm_kmodp->address)
+	    if ($kgm_kmodp->address <= $arg0) && ($kgm_off < $kgm_kmodp->size)
+		printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off
+		set $kgm_pkmod = $kgm_kmodp
+		set $kgm_pkmodst = $kgm_kmodp->address
+		set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmodp->size
+	    	set $kgm_kmodp = 0
+	    else
+		set $kgm_kmodp = $kgm_kmodp->next
 	    end
 	end
     end
@@ -192,13 +492,10 @@
 
 define showkmodaddr
     showkmodaddrint $arg0
-    printf "\n"
-end
-
+end
 document showkmodaddr
+Syntax: (gdb) showkmodaddr <addr>
 | Given an address, print the offset and name for the kmod containing it
-| The following is the syntax:
-|     (gdb) showkmodaddr <addr>
 end
 
 define showkmod
@@ -206,9 +503,16 @@
     showkmodint $arg0
 end
 document showkmod
-| Routine to print info about a kernel module
-| The following is the syntax:
-|     (gdb) showkmod <kmod>
+Syntax: (gdb) showkmod <kmod>
+| Routine to print info about a kext
+end
+
+define showkext
+    showkmod $arg0
+end
+document showkext
+Syntax: (gdb) showkext <kmod_info_address>
+| Routine to print info about a kext
 end
 
 define showallkmods
@@ -220,22 +524,181 @@
     end
 end
 document showallkmods
-| Routine to print a summary listing of all the kernel modules
-| The following is the syntax:
-|     (gdb) showallkmods
+Syntax: (gdb) showallkmods
+| Routine to print a summary listing of all loaded kexts
+end
+
+define showallkexts
+    showallkmods
+end
+document showallkexts
+Syntax: (gdb) showallkexts
+| Routine to print a summary listing of all loaded kexts
+end
+
+# See OSKextVersion.c for the C code this is based on
+#
+set $KGM_OSKEXT_VERS_MAJ_MULT   = 100000000
+set $KGM_OSKEXT_VERS_MIN_MULT   = 1000000
+set $KGM_OSKEXT_VERS_REV_MULT   = 10000
+set $KGM_OSKEXT_VERS_STAGE_MULT = 1000
+
+define printoskextversion
+    set $vers_scratch = $arg0
+
+    if ($vers_scratch == -1)
+        printf "(invalid)"
+    else
+     
+        set $vers_major =  $vers_scratch / $KGM_OSKEXT_VERS_MAJ_MULT
+
+        set $vers_scratch = $vers_scratch - ($vers_major * $KGM_OSKEXT_VERS_MAJ_MULT)
+        set $vers_minor = $vers_scratch / $KGM_OSKEXT_VERS_MIN_MULT
+
+        set $vers_scratch = $vers_scratch - ( $vers_minor * $KGM_OSKEXT_VERS_MIN_MULT)
+        set $vers_revision =  $vers_scratch / $KGM_OSKEXT_VERS_REV_MULT
+
+        set $vers_scratch = $vers_scratch - ( $vers_revision * $KGM_OSKEXT_VERS_REV_MULT)
+        set $vers_stage =  $vers_scratch / $KGM_OSKEXT_VERS_STAGE_MULT
+
+        set $vers_scratch = $vers_scratch - ( $vers_stage * $KGM_OSKEXT_VERS_STAGE_MULT)
+        set $vers_stagelevel =  $vers_scratch
+
+        printf "%d.%d", $vers_major, $vers_minor
+        if ($vers_revision > 0)
+            printf ".%d", $vers_revision
+        end
+        
+        if ($vers_stage == 1)
+            printf "d"
+        end
+        if ($vers_stage == 3)
+            printf "a"
+        end
+        if ($vers_stage == 5)
+            printf "b"
+        end
+        if ($vers_stage == 7)
+            printf "fc"
+        end
+        if ($vers_stage == 1 || $vers_stage == 3 || $vers_stage == 5 || $vers_stage == 7)
+            printf "%d", $vers_stagelevel
+        end
+    end
+end
+
+define showallknownkexts
+   set $kext_count = sKextsByID->count
+   set $kext_index = 0
+   printf "%d kexts in sKextsByID:\n", $kext_count
+
+   printf "OSKext *    "
+   showptrhdrpad
+   printf "load_addr   "
+   showptrhdrpad
+   
+   printf " id  name (version)\n"
+
+   while $kext_index < $kext_count
+       set $kext_id = sKextsByID->dictionary[$kext_index].key->string
+       set $oskext = (OSKext *)sKextsByID->dictionary[$kext_index].value
+
+       showptr $oskext
+       printf "  "
+
+       if ($oskext->flags.loaded)
+           showptr $oskext->kmod_info
+           printf "  "
+           printf "%3d", $oskext->loadTag
+       else
+           showptrhdrpad
+           printf " -------- "
+           printf "  "
+           printf " --"
+        end
+        printf "  "
+
+       printf "%.64s (", $kext_id
+       printoskextversion (uint64_t)$oskext->version
+       printf ")\n"
+       set $kext_index = $kext_index + 1
+   end
+end
+document showallknownkexts
+Syntax: (gdb) showallknownkexts
+| Routine to print a summary listing of all kexts, loaded or not
 end
 
 define showactheader
-    printf "            activation  "
-    printf "thread      pri  state  wait_queue  wait_event\n"
+    printf "          "
+    showptrhdrpad
+    printf "  thread    "
+    showptrhdrpad
+    printf "    thread_id "
+    showptrhdrpad
+    printf "  processor "
+    showptrhdrpad
+    printf "   pri io_policy   state    wait_queue"
+    showptrhdrpad
+    printf "  wait_event\n"
 end
 
 
 define showactint
-	printf "            0x%08x  ", $arg0
+	printf "            "
+	showptrhdrpad
 	set $kgm_thread = *(struct thread *)$arg0
-	printf "0x%08x  ", $arg0
-	printf "%3d  ", $kgm_thread.sched_pri
+        showptr $arg0
+	if ($kgm_thread.static_param)
+	   printf "[WQ]"
+	else
+	   printf "    "
+	end
+	printf "  0x%llx   ", $kgm_thread.thread_id
+	showptr $kgm_thread.last_processor
+	printf "   %3d ", $kgm_thread.sched_pri
+	if ($kgm_thread.uthread != 0)
+	   set $kgm_printed = 0
+	   set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
+	   if ($kgm_uthread->uu_flag & 0x400)
+	      printf "RAGE "
+	   else
+	      printf "     "
+	   end
+	   set $diskpolicy = 0
+	   if ($kgm_thread->ext_actionstate.hw_disk != 0)
+		set $diskpolicy = $kgm_thread->ext_actionstate.hw_disk
+	   else 
+		if ($kgm_thread->actionstate.hw_disk != 0)
+			set $diskpolicy = $kgm_thread->actionstate.hw_disk
+		end
+	   end
+	   if ($kgm_thread->ext_actionstate.hw_bg != 0)
+		set $diskpolicy = 5
+	   end
+	   if ($kgm_thread->actionstate.hw_bg != 0)
+		set $diskpolicy = 4
+	   end
+	   if ($diskpolicy == 2)
+	      printf "PASS    "
+	      set $kgm_printed = 1
+           end
+	   if ($diskpolicy == 3)
+	      printf "THROT   "
+	      set $kgm_printed = 1
+	   end
+	   if ($diskpolicy == 4)
+	      printf "BG_THRT "
+	      set $kgm_printed = 1
+           end
+	   if ($diskpolicy == 5)
+	      printf "EBG_THRT"
+	      set $kgm_printed = 1
+           end
+	   if ($kgm_printed == 0)
+	      printf "        "
+	   end
+	end
 	set $kgm_state = $kgm_thread.state
 	if $kgm_state & 0x80
 	    printf "I" 
@@ -259,67 +722,130 @@
 	    printf "S" 
 	end
    	if $kgm_state & 0x01
-	    printf "W\t" 
-	    printf "0x%08x  ", $kgm_thread.wait_queue
-	    	if (((unsigned)$kgm_thread.wait_event > (unsigned)sectPRELINKB) \
-		    && ($arg1 != 2))
+	    printf "W"
+	    printf "\t    " 
+	    showptr $kgm_thread.wait_queue
+            printf "  "
+	    	if (((unsigned long)$kgm_thread.wait_event > (unsigned long)&last_kernel_symbol) \
+		    && ($arg1 != 2) && ($kgm_show_kmod_syms == 0))
 			showkmodaddr $kgm_thread.wait_event
 	        else
-			output /a (unsigned) $kgm_thread.wait_event
-		end
+			output /a $kgm_thread.wait_event
+		end
+		if ($kgm_thread.uthread != 0)
+		    set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
+		    if ($kgm_uthread->uu_wmesg != 0)
+			printf "\t \"%s\"", $kgm_uthread->uu_wmesg
+		    end
+		end
+	end
+	if ($kgm_thread.uthread != 0)
+	   set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
+	   if ($kgm_uthread->pth_name && $kgm_uthread->pth_name[0])
+	   	   printf "\n\t\tThread Name: %s", $kgm_uthread->pth_name
+	   end
 	end
 	if $arg1 != 0
 	    if ($kgm_thread.kernel_stack != 0)
+		if ($kgm_thread.uthread != 0)
+			printf "\n          "
+			set $kgm_uthread = (struct uthread *)$kgm_thread.uthread
+			if ($kgm_uthread->uu_kwe.kwe_kwqqueue != 0)
+				set $kwq = (ksyn_wait_queue_t)$kgm_uthread->uu_kwe.kwe_kwqqueue
+				printf "              kwq_lockcount:0x%x; kwq_retval:0x%x", $kgm_uthread->uu_kwe.kwe_lockseq, $kgm_uthread->uu_kwe.kwe_psynchretval
+				printf "\n                "
+				show_kwq $kwq
+				printf "          "
+			end
+		end
 		if ($kgm_thread.reserved_stack != 0)
-			printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack
-		end
-		printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
-		if ($kgm_mtype == 18)
+			printf "\n          "
+			showptrhdrpad
+			printf "      reserved_stack="
+                   	showptr $kgm_thread.reserved_stack
+		end
+		printf "\n          "
+		showptrhdrpad
+		printf "      kernel_stack="
+		showptr $kgm_thread.kernel_stack
+		if ($kgm_mtype == $kgm_mtype_ppc)
 			set $mysp = $kgm_thread.machine.pcb->save_r1
-		else
-			set $kgm_statep = (struct x86_kernel_state32 *) \
-				($kgm_thread->kernel_stack + 0x4000 \
-				 - sizeof(struct x86_kernel_state32))
-			set $mysp = $kgm_statep->k_ebp
+		end
+		if (($kgm_mtype & $kgm_mtype_x86_mask) == $kgm_mtype_x86_any)
+			set $kgm_statep = (struct x86_kernel_state *) \
+				($kgm_thread->kernel_stack + kernel_stack_size \
+				 - sizeof(struct x86_kernel_state))
+			if ($kgm_mtype == $kgm_mtype_i386)
+				set $mysp = $kgm_statep->k_ebp
+			else
+				set $mysp = $kgm_statep->k_rbp
+			end
+		end
+		if ($kgm_mtype == $kgm_mtype_arm)
+			if (((unsigned long)$r7 < ((unsigned long) ($kgm_thread->kernel_stack+kernel_stack_size))) \
+                      && ((unsigned long)$r7 > (unsigned long) ($kgm_thread->kernel_stack)))
+				set $mysp = $r7
+			else
+				set $kgm_statep = (struct arm_saved_state *)$kgm_thread.machine.kstackptr
+				set $mysp = $kgm_statep->r[7]
+			end
 		end
 		set $prevsp = $mysp - 16
-		printf "\n\t\tstacktop=0x%08x", $mysp
-		if ($kgm_mtype == 18)
+		printf "\n          "
+		showptrhdrpad
+		printf "      stacktop="
+ 		showptr $mysp
+		if ($kgm_mtype == $kgm_mtype_ppc)
 			set $stkmask = 0xf
 		else
 			set $stkmask = 0x3
 		end
 		set $kgm_return = 0
+		set $kgm_actint_framecount = 0
 	    	while ($mysp != 0) && (($mysp & $stkmask) == 0) \
 		      && ($mysp != $prevsp) \
-		      && ((((unsigned) $mysp ^ (unsigned) $prevsp) < 0x2000) \
-		      || (((unsigned)$mysp < ((unsigned) ($kgm_thread->kernel_stack+0x4000))) \
-		      && ((unsigned)$mysp > (unsigned) ($kgm_thread->kernel_stack))))
-
-			if ((unsigned) $kgm_return > (unsigned) sectPRELINKB)
-			    showkmodaddr $kgm_return
-			else
-				if ((unsigned) $kgm_return > 0)
-				    output /a (unsigned) $kgm_return
-				end
+		      && ((((unsigned long) $mysp ^ (unsigned long) $prevsp) < 0x2000) \
+		      || (((unsigned long)$mysp < ((unsigned long) ($kgm_thread->kernel_stack+kernel_stack_size))) \
+		      && ((unsigned long)$mysp > (unsigned long) ($kgm_thread->kernel_stack)))) \
+		      && ($kgm_actint_framecount < 128)
+			printf "\n          "
+			set $kgm_actint_framecount = $kgm_actint_framecount + 1
+			showptrhdrpad
+			printf "      "
+ 			showptr $mysp
+			printf "  "
+			if ($kgm_mtype == $kgm_mtype_ppc)
+				set $kgm_return = *($mysp + 8)
 			end
-			printf "\n\t\t0x%08x  ", $mysp
-			if ($kgm_mtype == 18)
-				set $kgm_return = *($mysp + 8)
-			else
+			if ($kgm_mtype == $kgm_mtype_i386)
 				set $kgm_return = *($mysp + 4)
 			end
+			if ($kgm_mtype == $kgm_mtype_x86_64)
+				set $kgm_return = *(unsigned long *)($mysp + 8)
+			end
+			if ($kgm_mtype == $kgm_mtype_arm)
+				set $kgm_return = *($mysp + 4)
+			end
+			if (((unsigned long) $kgm_return < (unsigned long) &_mh_execute_header || \
+			     (unsigned long) $kgm_return >= (unsigned long) &last_kernel_symbol ) \
+			    && ($kgm_show_kmod_syms == 0))
+				showkmodaddr $kgm_return
+			else
+				output /a $kgm_return
+			end
 			set $prevsp = $mysp
-			set $mysp = * $mysp
-		end
-		if ((unsigned) $kgm_return > 0)
-		   output/a $kgm_return
+			set $mysp = *(unsigned long *)$mysp
 		end
 		set $kgm_return = 0
-		printf "\n\t\tstackbottom=0x%08x", $prevsp
+		printf "\n          "
+		showptrhdrpad
+		printf "      stackbottom="
+		showptr $prevsp
 	    else
-		printf "\n\t\t\tcontinuation="
-		output /a (unsigned) $kgm_thread.continuation
+		printf "\n          "
+		showptrhdrpad
+		printf "      continuation="
+		output /a $kgm_thread.continuation
 	    end
 	    printf "\n"
 	else
@@ -332,9 +858,8 @@
     showactint $arg0 0
 end
 document showact
+Syntax: (gdb) showact <activation> 
 | Routine to print out the state of a specific thread.
-| The following is the syntax:
-|     (gdb) showact <activation> 
 end
 
 
@@ -343,14 +868,13 @@
     showactint $arg0 1
 end
 document showactstack
+Syntax: (gdb) showactstack <activation> 
 | Routine to print out the stack of a specific thread.
-| The following is the syntax:
-|     (gdb) showactstack <activation> 
 end
 
 
 define showallthreads
-    set $kgm_head_taskp = &default_pset.tasks
+    set $kgm_head_taskp = &tasks
     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
     while $kgm_taskp != $kgm_head_taskp
         showtaskheader
@@ -363,18 +887,25 @@
   	    set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
         end
 	printf "\n"
-    	set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
+    	set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
     end
 end
 document showallthreads
+Syntax: (gdb) showallthreads
 | Routine to print out info about all threads in the system.
-| The following is the syntax:
-|     (gdb) showallthreads
+end
+
+define showprocessorint
+    set $kgm_processor_int = (struct processor *)$arg0
+    printf "Processor "
+    showptr $kgm_processor_int
+    printf " State %d (cpu_id 0x%x)\n", ($kgm_processor_int)->state, ($kgm_processor_int)->cpu_id
 end
 
 define showcurrentthreads
-set $kgm_prp = processor_list
+    set $kgm_prp = (struct processor *)processor_list
     while $kgm_prp != 0
+        showprocessorint $kgm_prp
 	if ($kgm_prp)->active_thread != 0
 	    set $kgm_actp = ($kgm_prp)->active_thread
 	    showtaskheader
@@ -387,20 +918,196 @@
     end
 end
 document showcurrentthreads
+Syntax: (gdb) showcurrentthreads
 | Routine to print out info about the thread running on each cpu.
-| The following is the syntax:
-|     (gdb) showcurrentthreads
+end
+
+
+define _showrunqint
+	set $kgm_runq = (struct run_queue *)$arg0
+	
+	printf "    Priority Run Queue Info: Count %d\n", $kgm_runq->count
+	set $kgm_runq_queue_i = 0
+	set $kgm_runq_queue_count = sizeof($kgm_runq->queues)/sizeof($kgm_runq->queues[0])
+	while $kgm_runq->count && $kgm_runq_queue_i < $kgm_runq_queue_count
+		set $kgm_runq_queue_head = &$kgm_runq->queues[$kgm_runq_queue_i]
+		set $kgm_runq_queue_p = $kgm_runq_queue_head->next
+		if $kgm_runq_queue_p != $kgm_runq_queue_head
+			set $kgm_runq_queue_this_count = 0
+			while $kgm_runq_queue_p != $kgm_runq_queue_head
+				set $kgm_runq_queue_this_count = $kgm_runq_queue_this_count + 1
+				showtask ((thread_t)$kgm_runq_queue_p)->task
+				showactstack $kgm_runq_queue_p
+				set $kgm_runq_queue_p = $kgm_runq_queue_p->next
+			end
+			printf "      Queue Priority %3d [", $kgm_runq_queue_i
+			showptr $kgm_runq_queue_head
+			printf "] Count %d\n", $kgm_runq_queue_this_count
+		end
+		set $kgm_runq_queue_i = $kgm_runq_queue_i + 1
+	end
+
+end
+
+define _showgrrrint
+	set $kgm_grrr_runq = $arg0
+	
+	printf "    GRRR Info: Count %d Weight %d Current Group ", $kgm_grrr_runq->count, $kgm_grrr_runq->weight
+	showptr $kgm_grrr_runq->current_group
+	printf "\n"
+	set $kgm_grrr_group_i = 0
+	set $kgm_grrr_group_count = sizeof($kgm_grrr_runq->groups)/sizeof($kgm_grrr_runq->groups[0])
+	while $kgm_grrr_runq->count && $kgm_grrr_group_i < $kgm_grrr_group_count
+		set $kgm_grrr_group = &$kgm_grrr_runq->groups[$kgm_grrr_group_i]
+		if $kgm_grrr_group->count > 0
+			printf "      Group %3d [", $kgm_grrr_group->index
+			showptr $kgm_grrr_group
+			printf "] Count %d Weight %d\n", $kgm_grrr_group->count, $kgm_grrr_group->weight
+			set $kgm_grrr_group_client_head = &$kgm_grrr_group->clients
+			set $kgm_grrr_group_client = $kgm_grrr_group_client_head->next
+			while $kgm_grrr_group_client != $kgm_grrr_group_client_head
+				# showtask ((thread_t)$kgm_grrr_group_client)->task
+				# showactstack $kgm_grrr_group_client
+				set $kgm_grrr_group_client = $kgm_grrr_group_client->next
+			end
+		end
+		set $kgm_grrr_group_i = $kgm_grrr_group_i + 1
+	end
+end
+
+define showallprocessors
+	set $kgm_pset = &pset0
+
+	set $kgm_show_grrr = 0
+	set $kgm_show_priority_runq = 0
+	set $kgm_show_priority_pset_runq = 0
+	set $kgm_show_fairshare_grrr = 0
+	set $kgm_show_fairshare_list = 0
+
+	if _sched_enum == 1
+		set $kgm_show_priority_runq = 1
+		set $kgm_show_fairshare_list = 1
+	end
+	if _sched_enum == 2
+		set $kgm_show_priority_pset_runq = 1
+		set $kgm_show_fairshare_list = 1
+	end
+	if _sched_enum == 4
+		set $kgm_show_grrr = 1
+		set $kgm_show_fairshare_grrr = 1
+	end
+	if _sched_enum == 5
+		set $kgm_show_priority_runq = 1
+		set $kgm_show_fairshare_list = 1
+	end
+	if _sched_enum == 6
+		set $kgm_show_priority_pset_runq = 1
+		set $kgm_show_fairshare_list = 1
+	end
+
+	while $kgm_pset != 0
+		printf "Processor Set "
+		showptr $kgm_pset
+		printf " Count %d (cpu_id 0x%x-0x%x)\n", ($kgm_pset)->cpu_set_count, ($kgm_pset)->cpu_set_low, ($kgm_pset)->cpu_set_hi
+		printf "  Active Processors:\n"
+		set $kgm_active_queue_head = &($kgm_pset)->active_queue
+		set $kgm_active_elt = $kgm_active_queue_head->next
+		while $kgm_active_elt != $kgm_active_queue_head
+			set $kgm_processor = (processor_t)$kgm_active_elt
+			printf "    "
+			showprocessorint $kgm_processor
+
+			if $kgm_show_priority_runq
+				set $kgm_runq = &$kgm_processor->runq
+				_showrunqint $kgm_runq
+			end
+			if $kgm_show_grrr
+				set $kgm_grrr_runq = &$kgm_processor->grrr_runq
+				_showgrrrint $kgm_grrr_runq
+			end
+			
+			if $kgm_processor->processor_meta != 0 && $kgm_processor->processor_meta->primary == $kgm_processor
+				set $kgm_processor_meta_idle_head = &$kgm_processor->processor_meta->idle_queue
+				set $kgm_processor_meta_idle = $kgm_processor_meta_idle_head->next
+				while $kgm_processor_meta_idle != $kgm_processor_meta_idle_head
+					printf "      Idle Meta Processor: "
+					showprocessorint $kgm_processor_meta_idle
+					set $kgm_processor_meta_idle = $kgm_processor_meta_idle->next
+				end
+			end
+			
+			set $kgm_active_elt = $kgm_active_elt->next
+		end
+		printf "  Idle Processors:\n"
+		set $kgm_idle_queue_head = &($kgm_pset)->idle_queue
+		set $kgm_idle_elt = $kgm_idle_queue_head->next
+		while $kgm_idle_elt != $kgm_idle_queue_head
+			set $kgm_processor = (processor_t)$kgm_idle_elt
+			printf "    "
+			showprocessorint $kgm_processor
+			
+			if $kgm_processor->processor_meta != 0 && $kgm_processor->processor_meta->primary == $kgm_processor
+				set $kgm_processor_meta_idle_head = &$kgm_processor->processor_meta->idle_queue
+				set $kgm_processor_meta_idle = $kgm_processor_meta_idle_head->next
+				while $kgm_processor_meta_idle != $kgm_processor_meta_idle_head
+					printf "      Idle Meta Processor: "
+					showprocessorint $kgm_processor_meta_idle
+					set $kgm_processor_meta_idle = $kgm_processor_meta_idle->next
+				end
+			end
+
+			set $kgm_idle_elt = $kgm_idle_elt->next
+		end
+
+		if $kgm_show_priority_pset_runq
+			set $kgm_runq = &$kgm_pset->pset_runq
+			printf "\n"
+			_showrunqint $kgm_runq
+		end
+		set $kgm_pset = ($kgm_pset)->pset_list
+	end
+	
+	printf "\n"
+	printf "Realtime Queue Count %d\n", rt_runq.count
+	set $kgm_rt_runq_head = &rt_runq.queue
+	set $kgm_rt_runq = $kgm_rt_runq_head->next
+	while $kgm_rt_runq != $kgm_rt_runq_head
+		showtask ((thread_t)$kgm_rt_runq)->task
+		showact $kgm_rt_runq
+		set $kgm_rt_runq = $kgm_rt_runq->next
+	end
+	
+	printf "\n"
+	if $kgm_show_fairshare_list
+		printf "Fair Share Queue Count %d\n", fs_runq.count
+		set $kgm_fs_runq_head = &fs_runq.queue
+		set $kgm_fs_runq = $kgm_fs_runq_head->next
+		while $kgm_fs_runq != $kgm_fs_runq_head
+			showtask ((thread_t)$kgm_fs_runq)->task
+			showact $kgm_fs_runq
+			set $kgm_fs_runq = $kgm_fs_runq->next
+		end
+	end
+	if $kgm_show_fairshare_grrr
+		printf "Fair Share Queue Count %d\n", fs_grrr_runq.count
+		set $kgm_fs_grrr = &fs_grrr_runq
+		_showgrrrint $kgm_fs_grrr
+	end
+end
+document showallprocessors
+Syntax: (gdb) showallprocessors
+| Routine to print out info about all psets and processors
 end
 
 set $decode_wait_events = 0
 define showallstacks
-    set $kgm_head_taskp = &default_pset.tasks
+    set $kgm_head_taskp = &tasks
     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
     while $kgm_taskp != $kgm_head_taskp
-        showtaskheader
+	showtaskheader
 	showtaskint $kgm_taskp
 	set $kgm_head_actp = &($kgm_taskp->threads)
-        set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
+	set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
 	while $kgm_actp != $kgm_head_actp
 	    showactheader
 	    if ($decode_wait_events > 0)
@@ -408,25 +1115,28 @@
 	    else
 	       showactint $kgm_actp 2
 	    end
-  	    set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
-        end
+	    set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
+	end
 	printf "\n"
-    	set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
-    end
+	set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
+    end
+
+    printf "\nZombie Processes:\n" 
+    zombstacks
 end
 
 document showallstacks
+Syntax: (gdb) showallstacks
 | Routine to print out the stack for each thread in the system.
-| The following is the syntax:
-|     (gdb) showallstacks
 | If the variable $decode_wait_events is non-zero, the routine attempts to
 | interpret thread wait_events as kernel module offsets, which can add to
 | processing time.
 end
 
 define showcurrentstacks
-set $kgm_prp = processor_list
+    set $kgm_prp = processor_list
     while $kgm_prp != 0
+    	showprocessorint $kgm_prp
 	if ($kgm_prp)->active_thread != 0
 	    set $kgm_actp = ($kgm_prp)->active_thread
 	    showtaskheader
@@ -440,20 +1150,19 @@
 end
 
 document showcurrentstacks
+Syntax: (gdb) showcurrentstacks
 | Routine to print out the thread running on each cpu (incl. its stack)
-| The following is the syntax:
-|     (gdb) showcurrentstacks
 end
 
 define showwaiterheader
-    printf "waiters     activation  "
-    printf "thread      pri  state  wait_queue  wait_event\n"
+    printf "waiters     thread      "
+    printf "processor   pri  state  wait_queue  wait_event\n"
 end
 
 define showwaitqwaiters
-    set $kgm_w_waitqp = (struct wait_queue *)$arg0
+    set $kgm_w_waitqp = (WaitQueue*)$arg0
     set $kgm_w_linksp = &($kgm_w_waitqp->wq_queue)
-    set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_linksp->next
+    set $kgm_w_wqe = (WaitQueueElement *)$kgm_w_linksp->next
     set $kgm_w_found = 0
     while ( (queue_entry_t)$kgm_w_wqe != (queue_entry_t)$kgm_w_linksp)
 	if ($kgm_w_wqe->wqe_type != &_wait_queue_link)
@@ -464,32 +1173,32 @@
 		set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe
 		showactint $kgm_w_shuttle 0
 	end	
-	set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_wqe->wqe_links.next
+	set $kgm_w_wqe = (WaitQueueElement *)$kgm_w_wqe->wqe_links.next
     end
 end
 
 define showwaitqwaitercount
-    set $kgm_wc_waitqp = (struct wait_queue *)$arg0
+    set $kgm_wc_waitqp = (WaitQueue*)$arg0
     set $kgm_wc_linksp = &($kgm_wc_waitqp->wq_queue)
-    set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_linksp->next
+    set $kgm_wc_wqe = (WaitQueueElement *)$kgm_wc_linksp->next
     set $kgm_wc_count = 0
     while ( (queue_entry_t)$kgm_wc_wqe != (queue_entry_t)$kgm_wc_linksp)
 	if ($kgm_wc_wqe->wqe_type != &_wait_queue_link)
         	set $kgm_wc_count = $kgm_wc_count + 1
 	end
-        set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_wqe->wqe_links.next
+        set $kgm_wc_wqe = (WaitQueueElement *)$kgm_wc_wqe->wqe_links.next
     end
     printf "0x%08x  ", $kgm_wc_count
 end
 
 define showwaitqmembercount
-    set $kgm_mc_waitqsetp = (struct wait_queue_set *)$arg0
+    set $kgm_mc_waitqsetp = (WaitQueueSet*)$arg0
     set $kgm_mc_setlinksp = &($kgm_mc_waitqsetp->wqs_setlinks)
-    set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_setlinksp->next
+    set $kgm_mc_wql = (WaitQueueLink *)$kgm_mc_setlinksp->next
     set $kgm_mc_count = 0
     while ( (queue_entry_t)$kgm_mc_wql != (queue_entry_t)$kgm_mc_setlinksp)
         set $kgm_mc_count = $kgm_mc_count + 1
-        set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_wql->wql_setlinks.next
+        set $kgm_mc_wql = (WaitQueueLink *)$kgm_mc_wql->wql_setlinks.next
     end
     printf "0x%08x  ", $kgm_mc_count
 end
@@ -501,7 +1210,7 @@
 end
 
 define showwaitqmemberint
-    set $kgm_m_waitqp = (struct wait_queue *)$arg0
+    set $kgm_m_waitqp = (WaitQueue*)$arg0
     printf "            0x%08x  ", $kgm_m_waitqp
     printf "0x%08x  ", $kgm_m_waitqp->wq_interlock.lock_data
     if ($kgm_m_waitqp->wq_fifo)
@@ -526,9 +1235,9 @@
 end
 
 define showwaitqmemberof
-    set $kgm_mo_waitqp = (struct wait_queue *)$arg0
+    set $kgm_mo_waitqp = (WaitQueue*)$arg0
     set $kgm_mo_linksp = &($kgm_mo_waitqp->wq_queue)
-    set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_linksp->next
+    set $kgm_mo_wqe = (WaitQueueElement *)$kgm_mo_linksp->next
     set $kgm_mo_found = 0
     while ( (queue_entry_t)$kgm_mo_wqe != (queue_entry_t)$kgm_mo_linksp)
 	if ($kgm_mo_wqe->wqe_type == &_wait_queue_link)
@@ -536,18 +1245,18 @@
 			set $kgm_mo_found = 1
 			showwaitqmemberofheader
 		end
-		set $kgm_mo_wqlp = (struct wait_queue_link *)$kgm_mo_wqe
-		set $kgm_mo_wqsetp = (struct wait_queue *)($kgm_mo_wqlp->wql_setqueue)
+		set $kgm_mo_wqlp = (WaitQueueLink *)$kgm_mo_wqe
+		set $kgm_mo_wqsetp = (WaitQueue*)($kgm_mo_wqlp->wql_setqueue)
 		showwaitqmemberint $kgm_mo_wqsetp
 	end	
-	set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_wqe->wqe_links.next
+	set $kgm_mo_wqe = (WaitQueueElement *)$kgm_mo_wqe->wqe_links.next
     end
 end
 
 define showwaitqmembers
-    set $kgm_ms_waitqsetp = (struct wait_queue_set *)$arg0
+    set $kgm_ms_waitqsetp = (WaitQueueSet*)$arg0
     set $kgm_ms_setlinksp = &($kgm_ms_waitqsetp->wqs_setlinks)
-    set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_setlinksp->next
+    set $kgm_ms_wql = (WaitQueueLink *)$kgm_ms_setlinksp->next
     set $kgm_ms_found = 0
     while ( (queue_entry_t)$kgm_ms_wql != (queue_entry_t)$kgm_ms_setlinksp)
         set $kgm_ms_waitqp = $kgm_ms_wql->wql_element.wqe_queue
@@ -556,7 +1265,7 @@
 	    set $kgm_ms_found = 1
         end
         showwaitqmemberint $kgm_ms_waitqp
-	set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_wql->wql_setlinks.next
+	set $kgm_ms_wql = (WaitQueueLink *)$kgm_ms_wql->wql_setlinks.next
     end
 end
 
@@ -566,10 +1275,10 @@
 end
 
 define showwaitqint
-    set $kgm_waitqp = (struct wait_queue *)$arg0
+    set $kgm_waitqp = (WaitQueue*)$arg0
     printf "0x%08x  ", $kgm_waitqp
     if ($kgm_waitqp->wq_type == 0xf1d1)
-	printf "0x%08x  ", ((struct wait_queue_set *)$kgm_waitqp)->wqs_refcount
+	printf "0x%08x  ", ((WaitQueueSet*)$kgm_waitqp)->wqs_refcount
     else
 	printf "0x00000000  "
     end
@@ -590,7 +1299,7 @@
 end
 
 define showwaitq
-    set $kgm_waitq1p = (wait_queue_t)$arg0
+    set $kgm_waitq1p = (WaitQueue*)$arg0
     showwaitqheader
     showwaitqint $kgm_waitq1p	
     if ($kgm_waitq1p->wq_type == 0xf1d1)
@@ -602,78 +1311,179 @@
 end
 
 define showmapheader
-    printf "vm_map      pmap        vm_size    "
-    printf "#ents rpage  hint        first_free\n"
+    printf "vm_map    "
+    showptrhdrpad
+    printf "  pmap      "
+    showptrhdrpad
+    printf "  vm_size   "
+    showptrhdrpad
+    printf " #ents rpage  hint      "
+    showptrhdrpad
+    printf "  first_free\n"
 end
 
 define showvmeheader
-    printf "    entry       start       "
-    printf "        prot #page  object      offset\n"
+    printf "    entry     "
+    showptrhdrpad
+    printf "  start               prot  #page  object    "
+    showptrhdrpad
+    printf "  offset\n"
 end
 
 define showvmint
     set $kgm_mapp = (vm_map_t)$arg0
     set $kgm_map = *$kgm_mapp
-    printf "0x%08x  ", $arg0
-    printf "0x%08x  ", $kgm_map.pmap
-    printf "0x%08x  ", $kgm_map.size
-    printf "%3d  ", $kgm_map.hdr.nentries
+    showptr $arg0
+    printf "  "
+    showptr $kgm_map.pmap
+    printf "  "
+    showptr $kgm_map.size
+    printf "   %3d ", $kgm_map.hdr.nentries
     if $kgm_map.pmap
 	printf "%5d  ", $kgm_map.pmap->stats.resident_count
     else
 	printf "<n/a>  "
     end
-    printf "0x%08x  ", $kgm_map.hint
-    printf "0x%08x\n", $kgm_map.first_free
+    showptr $kgm_map.hint
+    printf "  "
+    showptr $kgm_map.first_free
+    printf "\n"
     if $arg1 != 0
-	showvmeheader	
-	set $kgm_head_vmep = &($kgm_mapp->hdr.links)
-	set $kgm_vmep = $kgm_map.hdr.links.next
-	while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
-	    set $kgm_vme = *$kgm_vmep
-	    printf "    0x%08x  ", $kgm_vmep
-	    printf "0x%016llx  ", $kgm_vme.links.start
-	    printf "%1x", $kgm_vme.protection
-	    printf "%1x", $kgm_vme.max_protection
-	    if $kgm_vme.inheritance == 0x0
-		printf "S"
+        showvmeheader	
+        set $kgm_head_vmep = &($kgm_mapp->hdr.links)
+        set $kgm_vmep = $kgm_map.hdr.links.next
+        while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
+            set $kgm_vme = *$kgm_vmep
+            printf "    "
+	    showptr $kgm_vmep
+            printf "  0x%016llx  ", $kgm_vme.links.start
+            printf "%1x", $kgm_vme.protection
+            printf "%1x", $kgm_vme.max_protection
+            if $kgm_vme.inheritance == 0x0
+                printf "S"
+            end
+            if $kgm_vme.inheritance == 0x1
+                printf "C"
+            end
+            if $kgm_vme.inheritance == 0x2
+                printf "-"
+            end
+            if $kgm_vme.inheritance == 0x3
+                printf "D"
+            end
+            if $kgm_vme.is_sub_map
+                printf "s "
+            else
+                if $kgm_vme.needs_copy
+                    printf "n "
+                else
+                    printf "  "
+                end
+            end
+            printf "%6d  ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
+            showptr $kgm_vme.object.vm_object
+            printf "  0x%016llx\n", $kgm_vme.offset
+            set $kgm_vmep = $kgm_vme.links.next
+        end
+    end
+    printf "\n"
+end
+
+
+define showmapwiredp
+    set $kgm_mapp = (vm_map_t)$arg0
+    set $kgm_map = *$kgm_mapp
+    set $kgm_head_vmep = &($kgm_mapp->hdr.links)
+    set $kgm_vmep = $kgm_map.hdr.links.next
+    set $kgm_objp_prev = (struct vm_object *)0
+    if $arg1 == 0
+        set $kgm_saw_kernel_obj = 0
+	set $kgm_wired_count = 0
+	set $kgm_objp_print_space = 1
+    else
+	set $kgm_objp_print_space = 0
+    end
+    while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
+        set $kgm_vme = *$kgm_vmep
+	set $kgm_objp = $kgm_vme.object.vm_object
+	if $kgm_vme.is_sub_map
+	    if $arg1 == 0
+	        set $kgm_mapp_orig = $kgm_mapp
+		set $kgm_vmep_orig = $kgm_vmep
+		set $kgm_vme_orig = $kgm_vme
+		set $kgm_head_vmep_orig = $kgm_head_vmep
+		printf "\n****"
+		showptr $kgm_objp
+		showmapwiredp $kgm_objp 1
+		set $kgm_vme = $kgm_vme_orig
+		set $kgm_vmep = $kgm_vmep_orig
+		set $kgm_mapp = $kgm_mapp_orig
+		set $kgm_head_vmep = $kgm_head_vmep_orig
+		set $kgm_objp = (struct vm_object *)0
+	    else
+	        printf "\n????"	    
+		showptr $kgm_mapp
+	        printf "    "
+	        showptr $kgm_vmep
+		set $kgm_objp = (struct vm_object *)0
+		printf "\n"
 	    end
-	    if $kgm_vme.inheritance == 0x1
-		printf "C"
+	end
+	if ($kgm_objp == $kgm_objp_prev)
+	    set $kgm_objp = (struct vm_object *)0
+	end
+	if $kgm_objp == kernel_object
+	   if $kgm_saw_kernel_obj
+	       set $kgm_objp = (struct vm_object *)0
+	   end
+	   set $kgm_saw_kernel_obj = 1
+	end
+	if $kgm_objp && $kgm_objp->wired_page_count
+	    if $kgm_objp_print_space == 1
+	        printf "    "
+		showptr $kgm_mapp
 	    end
-	    if $kgm_vme.inheritance == 0x2
-		printf "-"
-	    end
-	    if $kgm_vme.inheritance == 0x3
-		printf "D"
-	    end
-	    if $kgm_vme.is_sub_map
-		printf "s "
-	    else
-		if $kgm_vme.needs_copy
-		    printf "n "
-		else
-		    printf "  "
-		end
-	    end
-	    printf "%5d  ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
-	    printf "0x%08x  ", $kgm_vme.object.vm_object
-	    printf "0x%016llx\n", $kgm_vme.offset
-  	    set $kgm_vmep = $kgm_vme.links.next
-        end
-    end
-    printf "\n"
-end
-
+	    set $kgm_objp_print_space = 1
+	    printf "    "
+	    showptr $kgm_vmep
+	    printf "  0x%016llx  ", $kgm_vme.links.start
+	    printf "%5d", $kgm_vme.alias
+            printf "%6d  ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
+	    showptr $kgm_objp
+	    printf "[%3d]", $kgm_objp->ref_count
+	    printf "%7d\n", $kgm_objp->wired_page_count
+	    set $kgm_wired_count = $kgm_wired_count + $kgm_objp->wired_page_count
+	    set $kgm_objp_prev = $kgm_objp
+	end
+        set $kgm_vmep = $kgm_vme.links.next
+    end
+    if $arg1 == 0
+        printf "total wired count = %d\n", $kgm_wired_count
+    end
+end
+
+define showmapwired
+    printf "    map       "
+    showptrhdrpad
+    printf "    entry     "
+    showptrhdrpad
+    printf "  start               alias  #page  object    "
+    showptrhdrpad
+    printf "       wired\n"
+    showmapwiredp $arg0 0
+end
+document showmapwired
+Syntax: (gdb) showmapwired <vm_map>
+| Routine to print out a summary listing of all the entries with wired pages in a vm_map
+end
 
 define showmapvme
 	showmapheader
 	showvmint $arg0 1
 end
 document showmapvme
+Syntax: (gdb) showmapvme <vm_map>
 | Routine to print out a summary listing of all the entries in a vm_map
-| The following is the syntax:
-|     (gdb) showmapvme <vm_map>
 end
 
 
@@ -682,92 +1492,124 @@
 	showvmint $arg0 0
 end
 document showmap
+Syntax: (gdb) showmap <vm_map>
 | Routine to print out info about the specified vm_map
-| The following is the syntax:
-|     (gdb) showmap <vm_map>
 end
 
 define showallvm
-    set $kgm_head_taskp = &default_pset.tasks
+    set $kgm_head_taskp = &tasks
     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
     while $kgm_taskp != $kgm_head_taskp
         showtaskheader
 	showmapheader
 	showtaskint $kgm_taskp
 	showvmint $kgm_taskp->map 0
-    	set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
+    	set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
     end
 end
 document showallvm
+Syntax: (gdb) showallvm
 | Routine to print a summary listing of all the vm maps
-| The following is the syntax:
-|     (gdb) showallvm
 end
 
 
 define showallvme
-    set $kgm_head_taskp = &default_pset.tasks
+    set $kgm_head_taskp = &tasks
     set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
     while $kgm_taskp != $kgm_head_taskp
         showtaskheader
 	showmapheader
 	showtaskint $kgm_taskp
 	showvmint $kgm_taskp->map 1
-    	set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
+    	set $kgm_taskp = (struct task *)($kgm_taskp->tasks.next)
     end
 end
 document showallvme
+Syntax: (gdb) showallvme
 | Routine to print a summary listing of all the vm map entries
-| The following is the syntax:
-|     (gdb) showallvme
 end
 
 
 define showipcheader
-    printf "ipc_space   is_table    table_next "
-    printf "flags tsize  splaytree   splaybase\n"
+    printf "ipc_space "
+    showptrhdrpad
+    printf "  is_table  "
+    showptrhdrpad
+    printf "  table_next"
+    showptrhdrpad
+    printf " flags ports  splaysize   "
+    showptrhdrpad
+    printf "splaybase\n"
 end
 
 define showipceheader
-    printf "            name        object      "
-    printf "rite urefs  destname    destination\n"
+    printf "            "
+    showptrhdrpad
+    printf "object      "
+    showptrhdrpad
+    showptrhdrpad
+    printf "name        rite urefs  destname    "
+    showptrhdrpad
+    printf "destination\n"
 end
 
 define showipceint
     set $kgm_ie = *(ipc_entry_t)$arg0
-    printf "            0x%08x  ", $arg1
-    printf "0x%08x  ", $kgm_ie.ie_object
+    printf "            "
+    showptrhdrpad
+    showptr $kgm_ie.ie_object
+    showptrhdrpad
+    printf "  0x%08x  ", $arg1
     if $kgm_ie.ie_bits & 0x00100000
-	printf "Dead "
+        printf "Dead "
         printf "%5d\n", $kgm_ie.ie_bits & 0xffff
     else
         if $kgm_ie.ie_bits & 0x00080000
-	    printf "SET  "
+            printf "SET  "
             printf "%5d\n", $kgm_ie.ie_bits & 0xffff
         else
             if $kgm_ie.ie_bits & 0x00010000
-	        if $kgm_ie.ie_bits & 0x00020000
-	            printf " SR"
-	        else
-	            printf "  S"
-	        end
+                if $kgm_ie.ie_bits & 0x00020000
+                    printf " SR"
+                else
+                    printf "  S"
+                end
             else
-	        if $kgm_ie.ie_bits & 0x00020000
-	           printf "  R"
-	        end
+                if $kgm_ie.ie_bits & 0x00020000
+                   printf "  R"
+                end
             end
             if $kgm_ie.ie_bits & 0x00040000
-	        printf "  O"
+                printf "  O"
             end
             if $kgm_ie.index.request
-	        printf "n"
+                set $kgm_port = (ipc_port_t)$kgm_ie.ie_object
+		set $kgm_requests = $kgm_port->ip_requests
+		set $kgm_req_soright = $kgm_requests[$kgm_ie.index.request].notify.port
+		if $kgm_req_soright
+#                   Armed send-possible notification?
+		    if (uintptr_t)$kgm_req_soright & 0x1
+		        printf "s"
+                    else
+#                       Delayed send-possible notification?
+		        if (uintptr_t)$kgm_req_soright & 0x2
+			    printf "d"
+			else
+#                           Dead-name notification
+			    printf "n"
+			end
+		    end     
+		else
+		    printf " "
+         	end
             else
                 printf " "
             end
+#           Collision (with tree)?
             if $kgm_ie.ie_bits & 0x00800000
-		printf "c"
+                printf "c"
     	    else
-		printf " "
+                printf " "
     	    end
             printf "%5d  ", $kgm_ie.ie_bits & 0xffff
             showportdest $kgm_ie.ie_object
@@ -778,132 +1620,184 @@
 define showipcint
     set $kgm_isp = (ipc_space_t)$arg0
     set $kgm_is = *$kgm_isp
-    printf "0x%08x  ", $arg0
-    printf "0x%08x  ", $kgm_is.is_table
-    printf "0x%08x  ", $kgm_is.is_table_next
+    showptr $arg0
+    printf "  "
+    showptr $kgm_is.is_table
+    printf "  "
+    showptr $kgm_is.is_table_next
+    printf "  "
     if $kgm_is.is_growing != 0
-	printf "G"
+        printf "G"
     else
-	printf " "
+        printf " "
     end
     if $kgm_is.is_fast != 0
-	printf "F"
+        printf "F"
     else
-	printf " "
+        printf " "
     end
     if $kgm_is.is_active != 0
-	printf "A  "
+        printf "A  "
     else
-	printf "   "
-    end
-    printf "%5d  ", $kgm_is.is_table_size
-    printf "0x%08x  ", $kgm_is.is_tree_total
-    printf "0x%08x\n", &$kgm_isp->is_tree
+        printf "   "
+    end
+    printf "%5d  ", $kgm_is.is_table_size + $kgm_is.is_tree_total
+    showptr $kgm_is.is_tree_total
+    printf "  "
+    showptr &$kgm_isp->is_tree
+    printf "\n"
     if $arg1 != 0
-	showipceheader
-	set $kgm_iindex = 0
-	set $kgm_iep = $kgm_is.is_table
-	set $kgm_destspacep = (ipc_space_t)0
+        showipceheader
+        set $kgm_iindex = 0
+        set $kgm_iep = $kgm_is.is_table
+        set $kgm_destspacep = (ipc_space_t)0
         while ( $kgm_iindex < $kgm_is.is_table_size )
-	    set $kgm_ie = *$kgm_iep
-	    if $kgm_ie.ie_bits & 0x001f0000
-		set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
-		showipceint $kgm_iep $kgm_name
-	    end
-	    set $kgm_iindex = $kgm_iindex + 1
-	    set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
-	end
-	if $kgm_is.is_tree_total
-	    printf "Still need to write tree traversal\n"
-	end
+            set $kgm_ie = *$kgm_iep
+            if $kgm_ie.ie_bits & 0x001f0000
+                set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
+                showipceint $kgm_iep $kgm_name
+                if $arg2 != 0
+		   if $kgm_ie.ie_object != 0 && ($kgm_ie.ie_bits & 0x00070000) && ((ipc_port_t) $kgm_ie.ie_object)->ip_callstack[0] != 0
+                   	printf "              user bt: "
+                   	showportbt $kgm_ie.ie_object $kgm_is.is_task
+                   end
+		end
+            end
+            set $kgm_iindex = $kgm_iindex + 1
+            set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
+        end
+        if $kgm_is.is_tree_total
+            printf "Still need to write tree traversal\n"
+        end
     end
     printf "\n"
 end
 
 
 define showipc
-	set $kgm_isp = (ipc_space_t)$arg0
-        showipcheader
-	showipcint $kgm_isp 0
+    set $kgm_isp = (ipc_space_t)$arg0
+    showipcheader
+    showipcint $kgm_isp 0 0
 end
 document showipc
+Syntax: (gdb) showipc <ipc_space>
 | Routine to print the status of the specified ipc space
-| The following is the syntax:
-|     (gdb) showipc <ipc_space>
 end
 
 define showrights
 	set $kgm_isp = (ipc_space_t)$arg0
-        showipcheader
-	showipcint $kgm_isp 1
+    showipcheader
+	showipcint $kgm_isp 1 0
 end
 document showrights
+Syntax: (gdb) showrights <ipc_space>
 | Routine to print a summary list of all the rights in a specified ipc space
-| The following is the syntax:
-|     (gdb) showrights <ipc_space>
 end
 
 
 define showtaskipc
 	set $kgm_taskp = (task_t)$arg0
 	showtaskheader
-    showipcheader
 	showtaskint $kgm_taskp
-	showipcint $kgm_taskp->itk_space 0
+        s