Loading...
--- xnu/xnu-792.13.8/kgmacros
+++ xnu/xnu-517.7.21/kgmacros
@@ -6,8 +6,8 @@
#
# All the convenience variables used by these macros begin with $kgm_
-set print asm-demangle on
-set cp-abi gnu-v2
+set $kgm_dummy = &proc0
+set $kgm_dummy = &kmod
echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n
@@ -24,7 +24,6 @@
| (gdb) attach <name-of-remote-host>
|
| The following macros are available in this package:
-| showversion Displays a string describing the remote kernel version
|
| showalltasks Display a summary listing of all tasks
| showallthreads Display info about all threads in the system
@@ -36,13 +35,6 @@
| showallipc Display a summary listing of all the ipc spaces
| showallrights Display a summary listing of all the ipc rights
| showallkmods Display a summary listing of all the kernel modules
-|
-| 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.
-| showregistry Show info about all registry entries in the current plane
-| showregistryprops Show info about all registry entries in the current plane, and their properties
-| 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)
|
| showtask Display info about the specified task
| showtaskthreads Display info about the threads in the task
@@ -69,68 +61,19 @@
|
| dumpcallqueue Dump out all the entries given a queue head
|
-| showallmtx Display info about mutexes usage
-| showallrwlck Display info about reader/writer locks usage
-|
| zprint Display info about the memory zones
-| showioalloc Display info about iokit allocations
| paniclog Display the panic log info
|
| switchtoact Switch to different context specified by activation
| switchtoctx Switch to different context
-| showuserstack Display numeric backtrace of the user stack for an
-| activation
-|
-| switchtouserthread Switch to the user context of the specified thread
-| resetstacks Return to the original kernel context
-|
| resetctx Reset context
| resume_on Resume when detaching from gdb
| resume_off Don't resume when detaching from gdb
|
-| sendcore Configure kernel to send a coredump to the specified IP
-| disablecore Configure the kernel to disable coredump transmission
-| switchtocorethread Corefile version of "switchtoact"
-| resetcorectx Corefile version of "resetctx"
-|
-| readphys Reads the specified untranslated address
-| readphys64 Reads the specified untranslated 64-bit address
-|
-| kdp-reboot Restart remote target
-|
| Type "help <macro>" for more specific help on a particular macro.
| Type "show user <macro>" to see what the macro is really doing.
end
-# 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
-end
-
-document showversion
-Syntax: showversion
-| Read the kernel version string from a fixed address in low
-| memory. Useful if you don't know which kernel is on the other end,
-| and need to find the appropriate symbols. Beware that if you've
-| loaded a symbol file, but aren't connected to a remote target,
-| the version string from the symbol file will be displayed instead.
-| This macro expects to be connected to the remote kernel to function
-| correctly.
-end
-
-set $kgm_dummy = &proc0
-set $kgm_dummy = &kmod
-set $kgm_mtype = ((struct mach_header)_mh_execute_header).cputype
-
-set $kgm_reg_depth = 0
-set $kgm_reg_plane = (void **) 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
define showkmodheader
printf "kmod address size "
@@ -155,7 +98,7 @@
set $kgm_pkmod = 0
set $kgm_pkmodst = 0
set $kgm_pkmoden = 0
-define showkmodaddrint
+define showkmodaddr
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)
@@ -169,7 +112,7 @@
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
+ set $kgm_kmodmax = $kgm_kmod.address
end
set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address)
if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size)
@@ -189,12 +132,6 @@
end
end
end
-
-define showkmodaddr
- showkmodaddrint $arg0
- printf "\n"
-end
-
document showkmodaddr
| Given an address, print the offset and name for the kmod containing it
| The following is the syntax:
@@ -232,9 +169,11 @@
define showactint
- printf " 0x%08x ", $arg0
- set $kgm_thread = *(struct thread *)$arg0
- printf "0x%08x ", $arg0
+ printf " 0x%08x ", $arg0
+ set $kgm_actp = *(struct thread *)$arg0
+ if $kgm_actp.thread
+ set $kgm_thread = *$kgm_actp.thread
+ printf "0x%08x ", $kgm_actp.thread
printf "%3d ", $kgm_thread.sched_pri
set $kgm_state = $kgm_thread.state
if $kgm_state & 0x80
@@ -261,12 +200,7 @@
if $kgm_state & 0x01
printf "W\t"
printf "0x%08x ", $kgm_thread.wait_queue
- if (((unsigned)$kgm_thread.wait_event > (unsigned)sectPRELINKB) \
- && ($arg1 != 2))
- showkmodaddr $kgm_thread.wait_event
- else
- output /a (unsigned) $kgm_thread.wait_event
- end
+ output /a $kgm_thread.wait_event
end
if $arg1 != 0
if ($kgm_thread.kernel_stack != 0)
@@ -274,57 +208,44 @@
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)
- set $mysp = $kgm_thread.machine.pcb->save_r1
+ if (machine_slot[0].cpu_type == 18)
+ set $mysp = $kgm_actp->mact.pcb->save_r1
else
- set $kgm_statep = (struct x86_kernel_state32 *) \
- ($kgm_thread->kernel_stack + 0x4000 \
- - sizeof(struct x86_kernel_state32))
+ set $kgm_statep = (struct i386_kernel_state *)($kgm_thread->kernel_stack + 0x4000 - sizeof(stru\
+ct i386_kernel_state))
set $mysp = $kgm_statep->k_ebp
end
- set $prevsp = $mysp - 16
+ set $prevsp = 0
printf "\n\t\tstacktop=0x%08x", $mysp
- if ($kgm_mtype == 18)
- set $stkmask = 0xf
- else
- set $stkmask = 0x3
+ while ($mysp != 0) && (($mysp & 0xf) == 0) && ($mysp < 0xb0000000) && ($mysp > $prevsp)
+ printf "\n\t\t0x%08x ", $mysp
+ if (machine_slot[0].cpu_type == 18)
+ set $kgm_return = *($mysp + 8)
+ else
+ set $kgm_return = *($mysp + 4)
+ end
+ if ($kgm_return > sectPRELINKB)
+ showkmodaddr $kgm_return
+ else
+ if (machine_slot[0].cpu_type == 18)
+ output /a * ($mysp + 8)
+ else
+ output /a * ($mysp + 4)
+ end
+ end
+ set $prevsp = $mysp
+ set $mysp = * $mysp
end
- set $kgm_return = 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
- end
- printf "\n\t\t0x%08x ", $mysp
- if ($kgm_mtype == 18)
- set $kgm_return = *($mysp + 8)
- else
- set $kgm_return = *($mysp + 4)
- end
- set $prevsp = $mysp
- set $mysp = * $mysp
- end
- if ((unsigned) $kgm_return > 0)
- output/a $kgm_return
- end
- set $kgm_return = 0
printf "\n\t\tstackbottom=0x%08x", $prevsp
else
printf "\n\t\t\tcontinuation="
- output /a (unsigned) $kgm_thread.continuation
+ output /a $kgm_thread.continuation
end
printf "\n"
else
printf "\n"
end
+ end
end
define showact
@@ -373,17 +294,19 @@
end
define showcurrentthreads
-set $kgm_prp = processor_list
- while $kgm_prp != 0
- if ($kgm_prp)->active_thread != 0
- set $kgm_actp = ($kgm_prp)->active_thread
+set $kgm_ncpus = machine_info.max_cpus
+set $kgm_i = 0
+ while $kgm_i < $kgm_ncpus
+ set $kgm_prp = processor_ptr[$kgm_i]
+ if ($kgm_prp != 0) && (($kgm_prp)->active_thread != 0)
+ set $kgm_actp = (($kgm_prp)->active_thread)->top_act
showtaskheader
showtaskint ($kgm_actp)->task
showactheader
showactint $kgm_actp 0
printf "\n"
end
- set $kgm_prp = ($kgm_prp)->processor_list
+ set $kgm_i = $kgm_i + 1
end
end
document showcurrentthreads
@@ -392,7 +315,6 @@
| (gdb) showcurrentthreads
end
-set $decode_wait_events = 0
define showallstacks
set $kgm_head_taskp = &default_pset.tasks
set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
@@ -403,42 +325,35 @@
set $kgm_actp = (struct thread *)($kgm_taskp->threads.next)
while $kgm_actp != $kgm_head_actp
showactheader
- if ($decode_wait_events > 0)
- showactint $kgm_actp 1
- else
- showactint $kgm_actp 2
- end
+ showactint $kgm_actp 1
set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next)
end
printf "\n"
set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
end
end
-
document 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
- while $kgm_prp != 0
- if ($kgm_prp)->active_thread != 0
- set $kgm_actp = ($kgm_prp)->active_thread
+set $kgm_ncpus = machine_info.max_cpus
+set $kgm_i = 0
+ while $kgm_i < $kgm_ncpus
+ set $kgm_prp = processor_ptr[$kgm_i]
+ if ($kgm_prp != 0) && (($kgm_prp)->active_thread != 0)
+ set $kgm_actp = (($kgm_prp)->active_thread)->top_act
showtaskheader
showtaskint ($kgm_actp)->task
showactheader
showactint $kgm_actp 1
printf "\n"
end
- set $kgm_prp = ($kgm_prp)->processor_list
- end
-end
-
+ set $kgm_i = $kgm_i + 1
+ end
+end
document showcurrentstacks
| Routine to print out the thread running on each cpu (incl. its stack)
| The following is the syntax:
@@ -462,7 +377,7 @@
showwaiterheader
end
set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe
- showactint $kgm_w_shuttle 0
+ showactint $kgm_w_shuttle->top_act 0
end
set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_wqe->wqe_links.next
end
@@ -607,8 +522,8 @@
end
define showvmeheader
- printf " entry start "
- printf " prot #page object offset\n"
+ printf " entry start "
+ printf "prot #page object offset\n"
end
define showvmint
@@ -618,11 +533,7 @@
printf "0x%08x ", $kgm_map.pmap
printf "0x%08x ", $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 "%5d ", $kgm_map.pmap->stats.resident_count
printf "0x%08x ", $kgm_map.hint
printf "0x%08x\n", $kgm_map.first_free
if $arg1 != 0
@@ -631,8 +542,8 @@
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 " 0x%08x ", $kgm_vmep
+ printf "0x%08x ", $kgm_vme.links.start
printf "%1x", $kgm_vme.protection
printf "%1x", $kgm_vme.max_protection
if $kgm_vme.inheritance == 0x0
@@ -658,7 +569,7 @@
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
+ printf "0x%08x\n", $kgm_vme.offset
set $kgm_vmep = $kgm_vme.links.next
end
end
@@ -873,13 +784,13 @@
define showallipc
set $kgm_head_taskp = &default_pset.tasks
- set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
- while $kgm_cur_taskp != $kgm_head_taskp
+ set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
+ while $kgm_taskp != $kgm_head_taskp
showtaskheader
showipcheader
- showtaskint $kgm_cur_taskp
- showipcint $kgm_cur_taskp->itk_space 0
- set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->pset_tasks.next)
+ showtaskint $kgm_taskp
+ showipcint $kgm_taskp->itk_space 0
+ set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
end
end
document showallipc
@@ -891,13 +802,13 @@
define showallrights
set $kgm_head_taskp = &default_pset.tasks
- set $kgm_cur_taskp = (struct task *)($kgm_head_taskp->next)
- while $kgm_cur_taskp != $kgm_head_taskp
+ set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
+ while $kgm_taskp != $kgm_head_taskp
showtaskheader
showipcheader
- showtaskint $kgm_cur_taskp
- showipcint $kgm_cur_taskp->itk_space 1
- set $kgm_cur_taskp = (struct task *)($kgm_cur_taskp->pset_tasks.next)
+ showtaskint $kgm_taskp
+ showipcint $kgm_taskp->itk_space 1
+ set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
end
end
document showallrights
@@ -1221,20 +1132,20 @@
if ($kgm_spacep != $kgm_destspacep)
set $kgm_destprocp = (struct proc *)0
set $kgm_head_taskp = &default_pset.tasks
- set $kgm_desttaskp = (struct task *)($kgm_head_taskp->next)
- while (($kgm_destprocp == 0) && ($kgm_desttaskp != $kgm_head_taskp))
- set $kgm_destspacep = $kgm_desttaskp->itk_space
+ set $kgm_taskp = (struct task *)($kgm_head_taskp->next)
+ while (($kgm_destprocp == 0) && ($kgm_taskp != $kgm_head_taskp))
+ set $kgm_destspacep = $kgm_taskp->itk_space
if ($kgm_destspacep == $kgm_spacep)
- set $kgm_destprocp = (struct proc *)$kgm_desttaskp->bsd_info
+ set $kgm_destprocp = (struct proc *)$kgm_taskp->bsd_info
else
- set $kgm_desttaskp = (struct task *)($kgm_desttaskp->pset_tasks.next)
+ set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next)
end
end
end
if $kgm_destprocp != 0
printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid
else
- printf "task 0x%08x\n", $kgm_desttaskp
+ printf "task 0x%08x\n", $kgm_taskp
end
end
@@ -1405,109 +1316,27 @@
| (gdb) zprint
end
-define showmtxgrp
-set $kgm_mtxgrp = (lck_grp_t *)$arg0
-
-if ($kgm_mtxgrp->lck_grp_mtxcnt)
-printf "0x%08x ", $kgm_mtxgrp
-printf "%8d ",$kgm_mtxgrp->lck_grp_mtxcnt
-printf "%12u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_util_cnt
-printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_miss_cnt
-printf "%8u ",$kgm_mtxgrp->lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_wait_cnt
-printf "%s ",&$kgm_mtxgrp->lck_grp_name
-printf "\n"
-end
-end
-
-
-define showallmtx
-printf "LCK GROUP CNT UTIL MISS WAIT NAME\n"
-set $kgm_mtxgrp_ptr = (lck_grp_t *)&lck_grp_queue
-set $kgm_mtxgrp_ptr = (lck_grp_t *)$kgm_mtxgrp_ptr->lck_grp_link.next
-while ($kgm_mtxgrp_ptr != (lck_grp_t *)&lck_grp_queue)
- showmtxgrp $kgm_mtxgrp_ptr
- set $kgm_mtxgrp_ptr = (lck_grp_t *)$kgm_mtxgrp_ptr->lck_grp_link.next
-end
-printf "\n"
-end
-document showallmtx
-| Routine to print a summary listing of all mutexes
-| The following is the syntax:
-| (gdb) showallmtx
-end
-
-define showrwlckgrp
-set $kgm_rwlckgrp = (lck_grp_t *)$arg0
-
-if ($kgm_rwlckgrp->lck_grp_rwcnt)
-printf "0x%08x ", $kgm_rwlckgrp
-printf "%8d ",$kgm_rwlckgrp->lck_grp_rwcnt
-printf "%12u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt
-printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_miss_cnt
-printf "%8u ",$kgm_rwlckgrp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_wait_cnt
-printf "%s ",&$kgm_rwlckgrp->lck_grp_name
-printf "\n"
-end
-end
-
-
-define showallrwlck
-printf "LCK GROUP CNT UTIL MISS WAIT NAME\n"
-set $kgm_rwlckgrp_ptr = (lck_grp_t *)&lck_grp_queue
-set $kgm_rwlckgrp_ptr = (lck_grp_t *)$kgm_rwlckgrp_ptr->lck_grp_link.next
-while ($kgm_rwlckgrp_ptr != (lck_grp_t *)&lck_grp_queue)
- showrwlckgrp $kgm_rwlckgrp_ptr
- set $kgm_rwlckgrp_ptr = (lck_grp_t *)$kgm_rwlckgrp_ptr->lck_grp_link.next
-end
-printf "\n"
-end
-document showallrwlck
-| Routine to print a summary listing of all read/writer locks
-| The following is the syntax:
-| (gdb) showallrwlck
-end
-
set $kdp_act_counter = 0
define switchtoact
- set $newact = (struct thread *) $arg0
- if ($newact->kernel_stack == 0)
- echo This activation does not have a stack.\n
- echo continuation:
- output/a (unsigned) $newact.continuation
- echo \n
- else
- if ($kgm_mtype == 18)
+ if (machine_slot[0].cpu_type == 18)
if ($kdp_act_counter == 0)
- set $kdpstate = (struct savearea *) kdp.saved_state
+ set $kdpstate = (struct savearea *) kdp.saved_state
end
set $kdp_act_counter = $kdp_act_counter + 1
set $newact = (struct thread *) $arg0
- set (struct savearea *) kdp.saved_state=$newact->machine->pcb
- flushregs
- flushstack
- set $pc=$newact->machine->pcb.save_srr0
+ if (($newact.thread)->kernel_stack == 0)
+ echo This activation does not have a stack.\n
+ echo continuation:
+ output/a $newact.thread.continuation
+ echo \n
+ end
+ set (struct savearea *) kdp.saved_state=$newact->mact->pcb
+ flush
+ set $pc=$newact->mact->pcb.save_srr0
update
else
- set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
- if ($kdp_act_counter == 0)
- set $kdpstate = *($kdpstatep)
- end
- set $kdp_act_counter = $kdp_act_counter + 1
-
- set $kgm_statep = (struct x86_kernel_state32 *) \
- ($newact->kernel_stack + 0x4000 \
- - sizeof(struct x86_kernel_state32))
- set $kdpstatep->ebx = $kgm_statep->k_ebx
- set $kdpstatep->ebp = $kgm_statep->k_ebp
- set $kdpstatep->edi = $kgm_statep->k_edi
- set $kdpstatep->esi = $kgm_statep->k_esi
- set $kdpstatep->eip = $kgm_statep->k_eip
- flushregs
- flushstack
- set $pc = $kgm_statep->k_eip
- update
- end
+ echo switchtoact not implemented for this architecture.\n
end
end
@@ -1521,14 +1350,13 @@
end
define switchtoctx
- if ($kgm_mtype == 18)
+ if (machine_slot[0].cpu_type == 18)
if ($kdp_act_counter == 0)
set $kdpstate = (struct savearea *) kdp.saved_state
end
set $kdp_act_counter = $kdp_act_counter + 1
set (struct savearea *) kdp.saved_state=(struct savearea *) $arg0
- flushregs
- flushstack
+ flush
set $pc=((struct savearea *) $arg0)->save_srr0
update
else
@@ -1545,21 +1373,14 @@
end
define resetctx
- if ($kgm_mtype == 18)
+ if (machine_slot[0].cpu_type == 18)
set (struct savearea *)kdp.saved_state=$kdpstate
- flushregs
- flushstack
+ flush
set $pc=((struct savearea *) kdp.saved_state)->save_srr0
update
set $kdp_act_counter = 0
else
- set $kdpstatep = (struct x86_saved_state32 *) kdp.saved_state
- set *($kdpstatep)=$kdpstate
- flushregs
- flushstack
- set $pc=$kdpstatep->eip
- update
- set $kdp_act_counter = 0
+ echo resetctx not implemented for this architecture.\n
end
end
@@ -1646,900 +1467,3 @@
document showallacts
| See help showallthreads.
end
-
-
-define resetstacks
- _kgm_flush_loop
- set kdp_pmap = 0
- _kgm_flush_loop
- resetctx
- _kgm_flush_loop
- _kgm_update_loop
- resetctx
- _kgm_update_loop
-end
-
-document resetstacks
-| Syntax: resetstacks
-| Internal kgmacro routine used by the "showuserstack" macro
-| to reset the target pmap to the kernel pmap.
-end
-
-#Barely effective hacks to work around bugs in the "flush" and "update"
-#gdb commands in Tiger (up to 219); these aren't necessary with Panther
-#gdb, but do no harm.
-define _kgm_flush_loop
- set $kgm_flush_loop_ctr = 0
- while ($kgm_flush_loop_ctr < 30)
- flushregs
- flushstack
- set $kgm_flush_loop_ctr = $kgm_flush_loop_ctr + 1
- end
-end
-
-define _kgm_update_loop
- set $kgm_update_loop_ctr = 0
- while ($kgm_update_loop_ctr < 30)
- update
- set $kgm_update_loop_ctr = $kgm_update_loop_ctr + 1
- end
-end
-
-#This is necessary since gdb often doesn't do backtraces on x86 correctly
-#in the absence of symbols.The code below in showuserstack and
-#showx86backtrace also contains several workarouds for the gdb bug where
-#gdb stops macro evaluation because of spurious "Cannot read memory"
-#errors on x86. These errors appear on ppc as well, but they don't
-#always stop macro evaluation.
-
-set $kgm_cur_ebp = 0
-set $kgm_cur_eip = 0
-
-define showx86backtrace
- if ($kgm_cur_ebp == 0)
- set $kgm_cur_ebp = $ebp
- end
- if ($kgm_cur_eip == 0)
- set $kgm_cur_eip = $eip
- end
- printf "0: EBP: 0x%08x EIP: 0x%08x\n", $kgm_cur_ebp, $kgm_cur_eip
- x/i $kgm_cur_eip
- set $kgm_prev_ebp = *((uint32_t *) $kgm_cur_ebp)
- set $kgm_prev_eip = *((uint32_t *) ($kgm_cur_ebp + 4))
- set $kgm_frameno = 1
- while $kgm_prev_ebp != 0
- printf "%d: saved EBP: 0x%08x saved EIP: 0x%08x\n", $kgm_frameno, $kgm_prev_ebp, $kgm_prev_eip
- x/i $kgm_prev_eip
- set $kgm_cur_ebp = $kgm_prev_ebp
- set $kgm_prev_ebp = *((uint32_t *) $kgm_cur_ebp)
- set $kgm_prev_eip = *((uint32_t *) ($kgm_cur_ebp + 4))
- set $kgm_frameno = $kgm_frameno + 1
- end
- set $kgm_cur_ebp = 0
- set $kgm_cur_eip = 0
- set kdp_pmap = 0
-end
-
-define showuserstack
- if ($kgm_mtype == 18)
- if ($kdp_act_counter == 0)
- set $kdpstate = (struct savearea *) kdp.saved_state
- end
- set $kdp_act_counter = $kdp_act_counter + 1
- set $newact = (struct thread *) $arg0
- _kgm_flush_loop
- set $checkpc = $newact->machine->upcb.save_srr0
- if ($checkpc == 0)
- echo This activation does not appear to have
- echo \20 a valid user context.\n
- else
- set (struct savearea *) kdp.saved_state=$newact->machine->upcb
- set $pc = $checkpc
-#flush and update seem to be executed lazily by gdb on Tiger, hence the
-#repeated invocations - see 3743135
- _kgm_flush_loop
-# This works because the new pmap is used only for reads
- set kdp_pmap = $newact->task->map->pmap
- _kgm_flush_loop
- _kgm_update_loop
- bt
- resetstacks
- _kgm_flush_loop
- _kgm_update_loop
- resetstacks
- _kgm_flush_loop
- _kgm_update_loop
- end
- else
- set $newact = (struct thread *) $arg0
- set $newiss = (x86_saved_state32_t *) ($newact->machine.pcb->iss)
- set $checkpc = $newiss.eip
- if ($checkpc == 0)
- echo This activation does not appear to have
- echo \20 a valid user context.\n
- else
- set $kgm_cur_ebp = $newiss.ebp
- set $kgm_cur_eip = $checkpc
- printf "You may now issue the showx86backtrace command to see the user space backtrace for this thread (0x%08x); you can also examine memory locations in this address space (pmap 0x%08x) before issuing the backtrace. This two-step process is necessary to work around various bugs in x86 gdb, which cause it to stop memory evaluation on spurious memory read errors. Additionally, you may need to issue a set kdp_pmap = 0 command after the showx86backtrace completes, to resume reading from the kernel address space.\n", $arg0, $newact->task->map->pmap
- set kdp_pmap = $newact->task->map->pmap
- _kgm_flush_loop
- _kgm_update_loop
- end
- end
-end
-document showuserstack
-Syntax: showuserstack <address of thread activation>
-|This command displays a numeric backtrace for the user space stack of
-|the given thread activation. It may, of course, fail to display a
-|complete backtrace if portions of the user stack are not mapped in.
-|Symbolic backtraces can be obtained either by running gdb on the
-|user space binary, or a tool such as "symbolicate".
-|Note that while this command works on Panther's gdb, an issue
-|with Tiger gdb (3743135) appears to hamper the evaluation of this
-|macro in some cas