]>
Commit | Line | Data |
---|---|---|
1 | # | |
2 | # Kernel gdb macros | |
3 | # | |
4 | # These gdb macros should be useful during kernel development in | |
5 | # determining what's going on in the kernel. | |
6 | # | |
7 | # All the convenience variables used by these macros begin with $kgm_ | |
8 | ||
9 | set $kgm_vers = 2 | |
10 | ||
11 | echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n | |
12 | ||
13 | define kgm | |
14 | printf "These are the kernel gdb macros version %d. ", $kgm_vers | |
15 | echo Type "help kgm" for more info.\n | |
16 | end | |
17 | ||
18 | document kgm | |
19 | | These are the kernel gdb macros. These gdb macros are intended to be | |
20 | | used when debugging a remote kernel via the kdp protocol. Typically, you | |
21 | | would connect to your remote target like so: | |
22 | | (gdb) target remote-kdp | |
23 | | (gdb) attach <name-of-remote-host> | |
24 | | | |
25 | | The following macros are available in this package: | |
26 | | | |
27 | | showalltasks Display a summary listing of tasks | |
28 | | showallacts Display a summary listing of all activations | |
29 | | showallstacks Display the kernel stacks for all activations | |
30 | | showallvm Display a summary listing of all the vm maps | |
31 | | showallvme Display a summary listing of all the vm map entries | |
32 | | showallipc Display a summary listing of all the ipc spaces | |
33 | | showallrights Display a summary listing of all the ipc rights | |
34 | | showallkmods Display a summary listing of all the kernel modules | |
35 | | | |
36 | | showtask Display status of the specified task | |
37 | | showtaskacts Display the status of all activations in the task | |
38 | | showtaskstacks Display all kernel stacks for all activations in the task | |
39 | | showtaskvm Display status of the specified task's vm_map | |
40 | | showtaskvme Display a summary list of the task's vm_map entries | |
41 | | showtaskipc Display status of the specified task's ipc space | |
42 | | showtaskrights Display a summary list of the task's ipc space entries | |
43 | | | |
44 | | showact Display status of the specified thread activation | |
45 | | showactstack Display the kernel stack for the specified activation | |
46 | | | |
47 | | showmap Display the status of the specified vm_map | |
48 | | showmapvme Display a summary list of the specified vm_map's entries | |
49 | | | |
50 | | showipc Display the status of the specified ipc space | |
51 | | showrights Display a summary list of all the rights in an ipc space | |
52 | | | |
53 | | showpid Display the status of the process identified by pid | |
54 | | showproc Display the status of the process identified by a proc pointer | |
55 | | | |
56 | | showkmod Display information about a kernel module | |
57 | | showkmodaddr Given an address, display the kernel module and offset | |
58 | | | |
59 | | zprint Display zone information | |
60 | | | |
61 | | Type "help <macro>" for more specific help on a particular macro. | |
62 | | Type "show user <macro>" to see what the macro is really doing. | |
63 | end | |
64 | ||
65 | ||
66 | define showkmodheader | |
67 | printf "kmod address size " | |
68 | printf "id refs version name\n" | |
69 | end | |
70 | ||
71 | define showkmodint | |
72 | set $kgm_kmodp = (struct kmod_info *)$arg0 | |
73 | printf "0x%08x ", $arg0 | |
74 | printf "0x%08x ", $kgm_kmodp->address | |
75 | printf "0x%08x ", $kgm_kmodp->size | |
76 | printf "%3d ", $kgm_kmodp->id | |
77 | printf "%5d ", $kgm_kmodp->reference_count | |
78 | printf "%10s ", &$kgm_kmodp->version | |
79 | printf "%s\n", &$kgm_kmodp->name | |
80 | end | |
81 | ||
82 | set $kgm_kmodmin = 0xffffffff | |
83 | set $kgm_fkmodmin = 0x00000000 | |
84 | set $kgm_kmodmax = 0x00000000 | |
85 | set $kgm_fkmodmax = 0xffffffff | |
86 | set $kgm_pkmod = 0 | |
87 | set $kgm_pkmodst = 0 | |
88 | set $kgm_pkmoden = 0 | |
89 | define showkmodaddr | |
90 | printf "0x%x" , $arg0 | |
91 | if ((unsigned int)$arg0 >= (unsigned int)$kgm_pkmodst) && ((unsigned int)$arg0 <= (unsigned int)$kgm_pkmoden) | |
92 | set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_pkmodst) | |
93 | printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off | |
94 | else | |
95 | if ((unsigned int)$arg0 <= (unsigned int)$kgm_fkmodmax) && ((unsigned int)$arg0 >= (unsigned int)$kgm_fkmodmin) | |
96 | set $kgm_kmodp = (struct kmod_info *)kmod | |
97 | while $kgm_kmodp | |
98 | set $kgm_kmod = *$kgm_kmodp | |
99 | if $kgm_kmod.address && ($kgm_kmod.address < $kgm_kmodmin) | |
100 | set $kgm_kmodmin = $kgm_kmod.address | |
101 | end | |
102 | if ($kgm_kmod.address + $kgm_kmod.size) > $kgm_kmodmax | |
103 | set $kgm_kmodmax = $kgm_kmod.address | |
104 | end | |
105 | set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address) | |
106 | if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size) | |
107 | printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off | |
108 | set $kgm_pkmod = $kgm_kmodp | |
109 | set $kgm_pkmodst = $kgm_kmod.address | |
110 | set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmod.size | |
111 | set $kgm_kmodp = 0 | |
112 | else | |
113 | set $kgm_kmodp = $kgm_kmod.next | |
114 | end | |
115 | end | |
116 | if !$kgm_pkmod | |
117 | set $kgm_fkmodmin = $kgm_kmodmin | |
118 | set $kgm_fkmodmax = $kgm_kmodmax | |
119 | end | |
120 | end | |
121 | end | |
122 | end | |
123 | document showkmodaddr | |
124 | | Given an address, print the offset and name for the kmod containing it | |
125 | | The following is the syntax: | |
126 | | (gdb) showkmodaddr <addr> | |
127 | end | |
128 | ||
129 | define showkmod | |
130 | showkmodheader | |
131 | showkmodint $arg0 | |
132 | end | |
133 | document showkmod | |
134 | | Routine to print info about a kernel module | |
135 | | The following is the syntax: | |
136 | | (gdb) showkmod <kmod> | |
137 | end | |
138 | ||
139 | define showallkmods | |
140 | showkmodheader | |
141 | set $kgm_kmodp = (struct kmod_info *)kmod | |
142 | while $kgm_kmodp | |
143 | showkmodint $kgm_kmodp | |
144 | set $kgm_kmodp = $kgm_kmodp->next | |
145 | end | |
146 | end | |
147 | document showallkmods | |
148 | | Routine to print a summary listing of all the kernel modules | |
149 | | The following is the syntax: | |
150 | | (gdb) showallkmods | |
151 | end | |
152 | ||
153 | define showactheader | |
154 | printf " activation " | |
155 | printf "thread pri state wait_queue wait_event\n" | |
156 | end | |
157 | ||
158 | ||
159 | define showactint | |
160 | printf " 0x%08x ", $arg0 | |
161 | set $kgm_actp = *(Thread_Activation *)$arg0 | |
162 | if $kgm_actp.thread | |
163 | set $kgm_thread = *$kgm_actp.thread | |
164 | printf "0x%08x ", $kgm_actp.thread | |
165 | printf "%3d ", $kgm_thread.sched_pri | |
166 | set $kgm_state = $kgm_thread.state | |
167 | if $kgm_state & 0x80 | |
168 | printf "I" | |
169 | end | |
170 | if $kgm_state & 0x40 | |
171 | printf "P" | |
172 | end | |
173 | if $kgm_state & 0x20 | |
174 | printf "A" | |
175 | end | |
176 | if $kgm_state & 0x10 | |
177 | printf "H" | |
178 | end | |
179 | if $kgm_state & 0x08 | |
180 | printf "U" | |
181 | end | |
182 | if $kgm_state & 0x04 | |
183 | printf "R" | |
184 | end | |
185 | if $kgm_state & 0x02 | |
186 | printf "S" | |
187 | end | |
188 | if $kgm_state & 0x01 | |
189 | printf "W\t" | |
190 | printf "0x%08x ", $kgm_thread.wait_queue | |
191 | output /a $kgm_thread.wait_event | |
192 | end | |
193 | if $arg1 != 0 | |
194 | if ($kgm_thread.kernel_stack != 0) | |
195 | if ($kgm_thread.stack_privilege != 0) | |
196 | printf "\n\t\tstack_privilege=0x%08x", $kgm_thread.stack_privilege | |
197 | end | |
198 | printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack | |
199 | set $mysp = $kgm_actp->mact.pcb.ss.r1 | |
200 | set $prevsp = 0 | |
201 | printf "\n\t\tstacktop=0x%08x", $mysp | |
202 | while ($mysp != 0) && (($mysp & 0xf) == 0) && ($mysp < 0xb0000000) && ($mysp > $prevsp) | |
203 | printf "\n\t\t0x%08x ", $mysp | |
204 | set $kgm_return = *($mysp + 8) | |
205 | if (($kgm_return > end) && ($kgm_return < 0x40000000)) | |
206 | showkmodaddr $kgm_return | |
207 | else | |
208 | output /a * ($mysp + 8) | |
209 | end | |
210 | set $prevsp = $mysp | |
211 | set $mysp = * $mysp | |
212 | end | |
213 | printf "\n\t\tstackbottom=0x%08x", $prevsp | |
214 | else | |
215 | printf "\n\t\t\tcontinuation=" | |
216 | output /a $kgm_thread.continuation | |
217 | end | |
218 | printf "\n" | |
219 | else | |
220 | printf "\n" | |
221 | end | |
222 | end | |
223 | end | |
224 | ||
225 | define showact | |
226 | showactheader | |
227 | showactint $arg0 0 | |
228 | end | |
229 | document showact | |
230 | | Routine to print out the state of a specific thread activation. | |
231 | | The following is the syntax: | |
232 | | (gdb) showact <activation> | |
233 | end | |
234 | ||
235 | ||
236 | define showactstack | |
237 | showactheader | |
238 | showactint $arg0 1 | |
239 | end | |
240 | document showactstack | |
241 | | Routine to print out the stack of a specific thread activation. | |
242 | | The following is the syntax: | |
243 | | (gdb) showactstack <activation> | |
244 | end | |
245 | ||
246 | ||
247 | define showallacts | |
248 | set $kgm_head_taskp = &default_pset.tasks | |
249 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
250 | while $kgm_taskp != $kgm_head_taskp | |
251 | showtaskheader | |
252 | showtaskint $kgm_taskp | |
253 | showactheader | |
254 | set $kgm_head_actp = &($kgm_taskp->thr_acts) | |
255 | set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next) | |
256 | while $kgm_actp != $kgm_head_actp | |
257 | showactint $kgm_actp 0 | |
258 | set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next) | |
259 | end | |
260 | printf "\n" | |
261 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
262 | end | |
263 | end | |
264 | document showallacts | |
265 | | Routine to print out a summary listing of all the thread activations. | |
266 | | The following is the syntax: | |
267 | | (gdb) showallacts | |
268 | end | |
269 | ||
270 | ||
271 | define showallstacks | |
272 | set $kgm_head_taskp = &default_pset.tasks | |
273 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
274 | while $kgm_taskp != $kgm_head_taskp | |
275 | showtaskheader | |
276 | showtaskint $kgm_taskp | |
277 | set $kgm_head_actp = &($kgm_taskp->thr_acts) | |
278 | set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next) | |
279 | while $kgm_actp != $kgm_head_actp | |
280 | showactheader | |
281 | showactint $kgm_actp 1 | |
282 | set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next) | |
283 | end | |
284 | printf "\n" | |
285 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
286 | end | |
287 | end | |
288 | document showallstacks | |
289 | | Routine to print out a summary listing of all the thread kernel stacks. | |
290 | | The following is the syntax: | |
291 | | (gdb) showallstacks | |
292 | end | |
293 | ||
294 | define showwaitqmembercount | |
295 | set $kgm_waitqsubp = (wait_queue_sub_t)$arg0 | |
296 | set $kgm_sublinksp = &($kgm_waitqsubp->wqs_sublinks) | |
297 | set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next | |
298 | set $kgm_count = 0 | |
299 | while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp) | |
300 | set $kgm_waitqp = $kgm_wql->wql_element->wqe_queue | |
301 | if !$kgm_found | |
302 | showwaitqmemberheader | |
303 | set $kgm_found = 1 | |
304 | end | |
305 | showwaitqmemberint $kgm_waitqp | |
306 | end | |
307 | end | |
308 | ||
309 | ||
310 | define showwaitqmemberint | |
311 | set $kgm_waitqp = (wait_queue_t)$arg0 | |
312 | printf " 0x%08x ", $kgm_waitqp | |
313 | printf "0x%08x ", $kgm_waitqp->wq_interlock | |
314 | if ($kgm_waitqp->wq_fifo) | |
315 | printf "Fifo" | |
316 | else | |
317 | printf "Prio" | |
318 | end | |
319 | if ($kgm_waitqp->wq_issub) | |
320 | printf "S" | |
321 | else | |
322 | printf " " | |
323 | end | |
324 | printf " " | |
325 | showwaitqwaitercount $kgm_waitqp | |
326 | showwaitqmembercount $kgm_waitqp | |
327 | printf "\n" | |
328 | end | |
329 | ||
330 | ||
331 | define showwaitqmembers | |
332 | set $kgm_waitqsubp = (wait_queue_sub_t)$arg0 | |
333 | set $kgm_sublinksp = &($kgm_waitqsubp->wqs_sublinks) | |
334 | set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next | |
335 | set $kgm_found = 0 | |
336 | while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp) | |
337 | set $kgm_waitqp = $kgm_wql->wql_element->wqe_queue | |
338 | if !$kgm_found | |
339 | showwaitqmemberheader | |
340 | set $kgm_found = 1 | |
341 | end | |
342 | showwaitqmemberint $kgm_waitqp | |
343 | end | |
344 | end | |
345 | ||
346 | define showwaitq | |
347 | set $kgm_waitq = (wait_queue_t)$arg0 | |
348 | showwaitqheader | |
349 | showwaitqwaiters | |
350 | if ($kgm_waitq->wq_issub) | |
351 | showwaitqmembers | |
352 | end | |
353 | end | |
354 | ||
355 | define showmapheader | |
356 | printf "vm_map pmap vm_size " | |
357 | printf "#ents rpage hint first_free\n" | |
358 | end | |
359 | ||
360 | define showvmeheader | |
361 | printf " entry start " | |
362 | printf "prot #page object offset\n" | |
363 | end | |
364 | ||
365 | define showvmint | |
366 | set $kgm_mapp = (vm_map_t)$arg0 | |
367 | set $kgm_map = *$kgm_mapp | |
368 | printf "0x%08x ", $arg0 | |
369 | printf "0x%08x ", $kgm_map.pmap | |
370 | printf "0x%08x ", $kgm_map.size | |
371 | printf "%3d ", $kgm_map.hdr.nentries | |
372 | printf "%5d ", $kgm_map.pmap->stats.resident_count | |
373 | printf "0x%08x ", $kgm_map.hint | |
374 | printf "0x%08x\n", $kgm_map.first_free | |
375 | if $arg1 != 0 | |
376 | showvmeheader | |
377 | set $kgm_head_vmep = &($kgm_mapp->hdr.links) | |
378 | set $kgm_vmep = $kgm_map.hdr.links.next | |
379 | while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep)) | |
380 | set $kgm_vme = *$kgm_vmep | |
381 | printf " 0x%08x ", $kgm_vmep | |
382 | printf "0x%08x ", $kgm_vme.links.start | |
383 | printf "%1x", $kgm_vme.protection | |
384 | printf "%1x", $kgm_vme.max_protection | |
385 | if $kgm_vme.inheritance == 0x0 | |
386 | printf "S" | |
387 | end | |
388 | if $kgm_vme.inheritance == 0x1 | |
389 | printf "C" | |
390 | end | |
391 | if $kgm_vme.inheritance == 0x2 | |
392 | printf "-" | |
393 | end | |
394 | if $kgm_vme.inheritance == 0x3 | |
395 | printf "D" | |
396 | end | |
397 | if $kgm_vme.is_sub_map | |
398 | printf "s " | |
399 | else | |
400 | if $kgm_vme.needs_copy | |
401 | printf "n " | |
402 | else | |
403 | printf " " | |
404 | end | |
405 | end | |
406 | printf "%5d ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12 | |
407 | printf "0x%08x ", $kgm_vme.object.vm_object | |
408 | printf "0x%08x\n", $kgm_vme.offset | |
409 | set $kgm_vmep = $kgm_vme.links.next | |
410 | end | |
411 | end | |
412 | printf "\n" | |
413 | end | |
414 | ||
415 | ||
416 | define showmapvme | |
417 | showmapheader | |
418 | showvmint $arg0 1 | |
419 | end | |
420 | document showmapvme | |
421 | | Routine to print out a summary listing of all the entries in a vm_map | |
422 | | The following is the syntax: | |
423 | | (gdb) showmapvme <vm_map> | |
424 | end | |
425 | ||
426 | ||
427 | define showmap | |
428 | showmapheader | |
429 | showvmint $arg0 0 | |
430 | end | |
431 | document showmap | |
432 | | Routine to print out a summary description of a vm_map | |
433 | | The following is the syntax: | |
434 | | (gdb) showmap <vm_map> | |
435 | end | |
436 | ||
437 | define showallvm | |
438 | set $kgm_head_taskp = &default_pset.tasks | |
439 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
440 | while $kgm_taskp != $kgm_head_taskp | |
441 | showtaskheader | |
442 | showmapheader | |
443 | showtaskint $kgm_taskp | |
444 | showvmint $kgm_taskp->map 0 | |
445 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
446 | end | |
447 | end | |
448 | document showallvm | |
449 | | Routine to print a summary listing of all the vm maps | |
450 | | The following is the syntax: | |
451 | | (gdb) showallvm | |
452 | end | |
453 | ||
454 | ||
455 | define showallvme | |
456 | set $kgm_head_taskp = &default_pset.tasks | |
457 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
458 | while $kgm_taskp != $kgm_head_taskp | |
459 | showtaskheader | |
460 | showmapheader | |
461 | showtaskint $kgm_taskp | |
462 | showvmint $kgm_taskp->map 1 | |
463 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
464 | end | |
465 | end | |
466 | document showallvme | |
467 | | Routine to print a summary listing of all the vm map entries | |
468 | | The following is the syntax: | |
469 | | (gdb) showallvme | |
470 | end | |
471 | ||
472 | ||
473 | define showipcheader | |
474 | printf "ipc_space is_table table_next " | |
475 | printf "flags tsize splaytree splaybase\n" | |
476 | end | |
477 | ||
478 | define showipceheader | |
479 | printf " name object " | |
480 | printf "rite urefs destname destination\n" | |
481 | end | |
482 | ||
483 | define showipceint | |
484 | set $kgm_ie = *(ipc_entry_t)$arg0 | |
485 | printf " 0x%08x ", $arg1 | |
486 | printf "0x%08x ", $kgm_ie.ie_object | |
487 | if $kgm_ie.ie_bits & 0x00100000 | |
488 | printf "Dead " | |
489 | printf "%5d\n", $kgm_ie.ie_bits & 0xffff | |
490 | else | |
491 | if $kgm_ie.ie_bits & 0x00080000 | |
492 | printf "SET " | |
493 | printf "%5d\n", $kgm_ie.ie_bits & 0xffff | |
494 | else | |
495 | if $kgm_ie.ie_bits & 0x00010000 | |
496 | if $kgm_ie.ie_bits & 0x00020000 | |
497 | printf " SR" | |
498 | else | |
499 | printf " S" | |
500 | end | |
501 | else | |
502 | if $kgm_ie.ie_bits & 0x00020000 | |
503 | printf " R" | |
504 | end | |
505 | end | |
506 | if $kgm_ie.ie_bits & 0x00040000 | |
507 | printf " O" | |
508 | end | |
509 | if $kgm_ie.index.request | |
510 | printf "n" | |
511 | else | |
512 | printf " " | |
513 | end | |
514 | if $kgm_ie.ie_bits & 0x00800000 | |
515 | printf "c" | |
516 | else | |
517 | printf " " | |
518 | end | |
519 | printf "%5d ", $kgm_ie.ie_bits & 0xffff | |
520 | showportdest $kgm_ie.ie_object | |
521 | end | |
522 | end | |
523 | end | |
524 | ||
525 | define showipcint | |
526 | set $kgm_isp = (ipc_space_t)$arg0 | |
527 | set $kgm_is = *$kgm_isp | |
528 | printf "0x%08x ", $arg0 | |
529 | printf "0x%08x ", $kgm_is.is_table | |
530 | printf "0x%08x ", $kgm_is.is_table_next | |
531 | if $kgm_is.is_growing != 0 | |
532 | printf "G" | |
533 | else | |
534 | printf " " | |
535 | end | |
536 | if $kgm_is.is_fast != 0 | |
537 | printf "F" | |
538 | else | |
539 | printf " " | |
540 | end | |
541 | if $kgm_is.is_active != 0 | |
542 | printf "A " | |
543 | else | |
544 | printf " " | |
545 | end | |
546 | printf "%5d ", $kgm_is.is_table_size | |
547 | printf "0x%08x ", $kgm_is.is_tree_total | |
548 | printf "0x%08x\n", &$kgm_isp->is_tree | |
549 | if $arg1 != 0 | |
550 | showipceheader | |
551 | set $kgm_iindex = 0 | |
552 | set $kgm_iep = $kgm_is.is_table | |
553 | set $kgm_destspacep = (ipc_space_t)0 | |
554 | while ( $kgm_iindex < $kgm_is.is_table_size ) | |
555 | set $kgm_ie = *$kgm_iep | |
556 | if $kgm_ie.ie_bits & 0x001f0000 | |
557 | set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24)) | |
558 | showipceint $kgm_iep $kgm_name | |
559 | end | |
560 | set $kgm_iindex = $kgm_iindex + 1 | |
561 | set $kgm_iep = &($kgm_is.is_table[$kgm_iindex]) | |
562 | end | |
563 | if $kgm_is.is_tree_total | |
564 | printf "Still need to write tree traversal\n" | |
565 | end | |
566 | end | |
567 | printf "\n" | |
568 | end | |
569 | ||
570 | ||
571 | define showipc | |
572 | set $kgm_isp = (ipc_space_t)$arg0 | |
573 | showipcheader | |
574 | showipcint $kgm_isp 0 | |
575 | end | |
576 | document showipc | |
577 | | Routine to print the status of the specified ipc space | |
578 | | The following is the syntax: | |
579 | | (gdb) showipc <ipc_space> | |
580 | end | |
581 | ||
582 | define showrights | |
583 | set $kgm_isp = (ipc_space_t)$arg0 | |
584 | showipcheader | |
585 | showipcint $kgm_isp 1 | |
586 | end | |
587 | document showrights | |
588 | | Routine to print a summary list of all the rights in a specified ipc space | |
589 | | The following is the syntax: | |
590 | | (gdb) showrights <ipc_space> | |
591 | end | |
592 | ||
593 | ||
594 | define showtaskipc | |
595 | set $kgm_taskp = (task_t)$arg0 | |
596 | showtaskheader | |
597 | showipcheader | |
598 | showtaskint $kgm_taskp | |
599 | showipcint $kgm_taskp->itk_space 0 | |
600 | end | |
601 | document showtaskipc | |
602 | | Routine to print the status of the ipc space for a task | |
603 | | The following is the syntax: | |
604 | | (gdb) showtaskipc <task> | |
605 | end | |
606 | ||
607 | ||
608 | define showtaskrights | |
609 | set $kgm_taskp = (task_t)$arg0 | |
610 | showtaskheader | |
611 | showipcheader | |
612 | showtaskint $kgm_taskp | |
613 | showipcint $kgm_taskp->itk_space 1 | |
614 | end | |
615 | document showtaskrights | |
616 | | Routine to print a summary listing of all the ipc rights for a task | |
617 | | The following is the syntax: | |
618 | | (gdb) showtaskrights <task> | |
619 | end | |
620 | ||
621 | define showallipc | |
622 | set $kgm_head_taskp = &default_pset.tasks | |
623 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
624 | while $kgm_taskp != $kgm_head_taskp | |
625 | showtaskheader | |
626 | showipcheader | |
627 | showtaskint $kgm_taskp | |
628 | showipcint $kgm_taskp->itk_space 0 | |
629 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
630 | end | |
631 | end | |
632 | document showallipc | |
633 | | Routine to print a summary listing of all the ipc spaces | |
634 | | The following is the syntax: | |
635 | | (gdb) showallipc | |
636 | end | |
637 | ||
638 | ||
639 | define showallrights | |
640 | set $kgm_head_taskp = &default_pset.tasks | |
641 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
642 | while $kgm_taskp != $kgm_head_taskp | |
643 | showtaskheader | |
644 | showipcheader | |
645 | showtaskint $kgm_taskp | |
646 | showipcint $kgm_taskp->itk_space 1 | |
647 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
648 | end | |
649 | end | |
650 | document showallrights | |
651 | | Routine to print a summary listing of all the ipc rights | |
652 | | The following is the syntax: | |
653 | | (gdb) showallrights | |
654 | end | |
655 | ||
656 | ||
657 | define showtaskvm | |
658 | set $kgm_taskp = (task_t)$arg0 | |
659 | showtaskheader | |
660 | showmapheader | |
661 | showtaskint $kgm_taskp | |
662 | showvmint $kgm_taskp->map 0 | |
663 | end | |
664 | document showtaskvm | |
665 | | Routine to print out a summary description of a task's vm_map | |
666 | | The following is the syntax: | |
667 | | (gdb) showtaskvm <task> | |
668 | end | |
669 | ||
670 | define showtaskvme | |
671 | set $kgm_taskp = (task_t)$arg0 | |
672 | showtaskheader | |
673 | showmapheader | |
674 | showtaskint $kgm_taskp | |
675 | showvmint $kgm_taskp->map 1 | |
676 | end | |
677 | document showtaskvme | |
678 | | Routine to print out a summary listing of a task's vm_map_entries | |
679 | | The following is the syntax: | |
680 | | (gdb) showtaskvme <task> | |
681 | end | |
682 | ||
683 | ||
684 | define showtaskheader | |
685 | printf "task vm_map ipc_space #acts " | |
686 | showprocheader | |
687 | end | |
688 | ||
689 | ||
690 | define showtaskint | |
691 | set $kgm_task = *(Task *)$arg0 | |
692 | printf "0x%08x ", $arg0 | |
693 | printf "0x%08x ", $kgm_task.map | |
694 | printf "0x%08x ", $kgm_task.itk_space | |
695 | printf "%3d ", $kgm_task.thr_act_count | |
696 | showprocint $kgm_task.bsd_info | |
697 | end | |
698 | ||
699 | define showtask | |
700 | showtaskheader | |
701 | showtaskint $arg0 | |
702 | end | |
703 | document showtask | |
704 | | Routine to print out info about a task. | |
705 | | The following is the syntax: | |
706 | | (gdb) showtask <task> | |
707 | end | |
708 | ||
709 | ||
710 | define showtaskacts | |
711 | showtaskheader | |
712 | set $kgm_taskp = (Task *)$arg0 | |
713 | showtaskint $kgm_taskp | |
714 | showactheader | |
715 | set $kgm_head_actp = &($kgm_taskp->thr_acts) | |
716 | set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next) | |
717 | while $kgm_actp != $kgm_head_actp | |
718 | showactint $kgm_actp 0 | |
719 | set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next) | |
720 | end | |
721 | end | |
722 | document showtaskacts | |
723 | | Routine to print a summary listing of the activations in a task | |
724 | | The following is the syntax: | |
725 | | (gdb) showtaskacts <task> | |
726 | end | |
727 | ||
728 | ||
729 | define showtaskstacks | |
730 | showtaskheader | |
731 | set $kgm_taskp = (Task *)$arg0 | |
732 | showtaskint $kgm_taskp | |
733 | set $kgm_head_actp = &($kgm_taskp->thr_acts) | |
734 | set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next) | |
735 | while $kgm_actp != $kgm_head_actp | |
736 | showactheader | |
737 | showactint $kgm_actp 1 | |
738 | set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next) | |
739 | end | |
740 | end | |
741 | document showtaskstacks | |
742 | | Routine to print a summary listing of the activations in a task and their stacks | |
743 | | The following is the syntax: | |
744 | | (gdb) showtaskstacks <task> | |
745 | end | |
746 | ||
747 | ||
748 | define showalltasks | |
749 | showtaskheader | |
750 | set $kgm_head_taskp = &default_pset.tasks | |
751 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
752 | while $kgm_taskp != $kgm_head_taskp | |
753 | showtaskint $kgm_taskp | |
754 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
755 | end | |
756 | end | |
757 | document showalltasks | |
758 | | Routine to print a summary listing of all the tasks | |
759 | | The following is the syntax: | |
760 | | (gdb) showalltasks | |
761 | end | |
762 | ||
763 | ||
764 | define showprocheader | |
765 | printf " pid proc command\n" | |
766 | end | |
767 | ||
768 | define showprocint | |
769 | set $kgm_procp = (struct proc *)$arg0 | |
770 | if $kgm_procp != 0 | |
771 | printf "%5d ", $kgm_procp->p_pid | |
772 | printf "0x%08x ", $kgm_procp | |
773 | printf "%s\n", $kgm_procp->p_comm | |
774 | else | |
775 | printf " *0* 0x00000000 --\n" | |
776 | end | |
777 | end | |
778 | ||
779 | define showpid | |
780 | showtaskheader | |
781 | set $kgm_head_taskp = &default_pset.tasks | |
782 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
783 | while $kgm_taskp != $kgm_head_taskp | |
784 | set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info | |
785 | if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0)) | |
786 | showtaskint $kgm_taskp | |
787 | set $kgm_taskp = $kgm_head_taskp | |
788 | else | |
789 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
790 | end | |
791 | end | |
792 | end | |
793 | document showpid | |
794 | | Routine to print a single process by pid | |
795 | | The following is the syntax: | |
796 | | (gdb) showpid <pid> | |
797 | end | |
798 | ||
799 | define showproc | |
800 | showtaskheader | |
801 | set $kgm_procp = (struct proc *)$arg0 | |
802 | showtaskint $kgm_procp->task $arg1 $arg2 | |
803 | end | |
804 | ||
805 | ||
806 | define kdb | |
807 | set switch_debugger=1 | |
808 | continue | |
809 | end | |
810 | document kdb | |
811 | | kdb - Switch to the inline kernel debugger | |
812 | | | |
813 | | usage: kdb | |
814 | | | |
815 | | The kdb macro allows you to invoke the inline kernel debugger. | |
816 | end | |
817 | ||
818 | define showpsetheader | |
819 | printf "portset waitqueue recvname " | |
820 | printf "flags refs recvname process\n" | |
821 | end | |
822 | ||
823 | define showportheader | |
824 | printf "port mqueue recvname " | |
825 | printf "flags refs recvname process\n" | |
826 | end | |
827 | ||
828 | define showportmemberheader | |
829 | printf " port recvname " | |
830 | printf "flags refs mqueue msgcount\n" | |
831 | end | |
832 | ||
833 | define showkmsgheader | |
834 | printf " kmsg size " | |
835 | printf "disp msgid remote-port local-port\n" | |
836 | end | |
837 | ||
838 | define showkmsgint | |
839 | printf " 0x%08x ", $arg0 | |
840 | set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header | |
841 | printf "0x%08x ", $kgm_kmsgh.msgh_size | |
842 | if (($kgm_kmsgh.msgh_bits & 0xff) == 19) | |
843 | printf "rC" | |
844 | else | |
845 | printf "rM" | |
846 | end | |
847 | if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 < 8)) | |
848 | printf "lC" | |
849 | else | |
850 | printf "lM" | |
851 | end | |
852 | if ($kgm_kmsgh.msgh_bits & 0xf0000000) | |
853 | printf "c" | |
854 | else | |
855 | printf "s" | |
856 | end | |
857 | printf "%5d ", $kgm_kmsgh.msgh_msgid | |
858 | printf "0x%08x ", $kgm_kmsgh.msgh_remote_port | |
859 | printf "0x%08x\n", $kgm_kmsgh.msgh_local_port | |
860 | end | |
861 | ||
862 | ||
863 | ||
864 | define showkobject | |
865 | set $kgm_portp = (ipc_port_t)$arg0 | |
866 | printf "0x%08x kobject(", $kgm_portp->ip_kobject | |
867 | set $kgm_kotype = ($kgm_portp->ip_object.io_bits & 0x00000fff) | |
868 | if ($kgm_kotype == 1) | |
869 | printf "THREAD" | |
870 | end | |
871 | if ($kgm_kotype == 2) | |
872 | printf "TASK" | |
873 | end | |
874 | if ($kgm_kotype == 3) | |
875 | printf "HOST" | |
876 | end | |
877 | if ($kgm_kotype == 4) | |
878 | printf "HOST_PRIV" | |
879 | end | |
880 | if ($kgm_kotype == 5) | |
881 | printf "PROCESSOR" | |
882 | end | |
883 | if ($kgm_kotype == 6) | |
884 | printf "PSET" | |
885 | end | |
886 | if ($kgm_kotype == 7) | |
887 | printf "PSET_NAME" | |
888 | end | |
889 | if ($kgm_kotype == 8) | |
890 | printf "TIMER" | |
891 | end | |
892 | if ($kgm_kotype == 9) | |
893 | printf "PAGER_REQ" | |
894 | end | |
895 | if ($kgm_kotype == 10) | |
896 | printf "DEVICE" | |
897 | end | |
898 | if ($kgm_kotype == 11) | |
899 | printf "XMM_OBJECT" | |
900 | end | |
901 | if ($kgm_kotype == 12) | |
902 | printf "XMM_PAGER" | |
903 | end | |
904 | if ($kgm_kotype == 13) | |
905 | printf "XMM_KERNEL" | |
906 | end | |
907 | if ($kgm_kotype == 14) | |
908 | printf "XMM_REPLY" | |
909 | end | |
910 | if ($kgm_kotype == 15) | |
911 | printf "NOTDEF 15" | |
912 | end | |
913 | if ($kgm_kotype == 16) | |
914 | printf "NOTDEF 16" | |
915 | end | |
916 | if ($kgm_kotype == 17) | |
917 | printf "HOST_SEC" | |
918 | end | |
919 | if ($kgm_kotype == 18) | |
920 | printf "LEDGER" | |
921 | end | |
922 | if ($kgm_kotype == 19) | |
923 | printf "MASTER_DEV" | |
924 | end | |
925 | if ($kgm_kotype == 20) | |
926 | printf "ACTIVATION" | |
927 | end | |
928 | if ($kgm_kotype == 21) | |
929 | printf "SUBSYSTEM" | |
930 | end | |
931 | if ($kgm_kotype == 22) | |
932 | printf "IO_DONE_QUE" | |
933 | end | |
934 | if ($kgm_kotype == 23) | |
935 | printf "SEMAPHORE" | |
936 | end | |
937 | if ($kgm_kotype == 24) | |
938 | printf "LOCK_SET" | |
939 | end | |
940 | if ($kgm_kotype == 25) | |
941 | printf "CLOCK" | |
942 | end | |
943 | if ($kgm_kotype == 26) | |
944 | printf "CLOCK_CTRL" | |
945 | end | |
946 | if ($kgm_kotype == 27) | |
947 | printf "IOKIT_SPARE" | |
948 | end | |
949 | if ($kgm_kotype == 28) | |
950 | printf "NAMED_MEM" | |
951 | end | |
952 | if ($kgm_kotype == 29) | |
953 | printf "IOKIT_CON" | |
954 | end | |
955 | if ($kgm_kotype == 30) | |
956 | printf "IOKIT_OBJ" | |
957 | end | |
958 | if ($kgm_kotype == 31) | |
959 | printf "UPL" | |
960 | end | |
961 | printf ")\n" | |
962 | end | |
963 | ||
964 | define showportdestproc | |
965 | set $kgm_portp = (ipc_port_t)$arg0 | |
966 | set $kgm_spacep = $kgm_portp->data.receiver | |
967 | # check against the previous cached value - this is slow | |
968 | if ($kgm_spacep != $kgm_destspacep) | |
969 | set $kgm_destprocp = (struct proc *)0 | |
970 | set $kgm_head_taskp = &default_pset.tasks | |
971 | set $kgm_taskp = (Task *)($kgm_head_taskp->next) | |
972 | while (($kgm_destprocp == 0) && ($kgm_taskp != $kgm_head_taskp)) | |
973 | set $kgm_destspacep = $kgm_taskp->itk_space | |
974 | if ($kgm_destspacep == $kgm_spacep) | |
975 | set $kgm_destprocp = (struct proc *)$kgm_taskp->bsd_info | |
976 | else | |
977 | set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next) | |
978 | end | |
979 | end | |
980 | end | |
981 | if $kgm_destprocp != 0 | |
982 | printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid | |
983 | else | |
984 | printf "task 0x%08x\n", $kgm_taskp | |
985 | end | |
986 | end | |
987 | ||
988 | define showportdest | |
989 | set $kgm_portp = (ipc_port_t)$arg0 | |
990 | set $kgm_spacep = $kgm_portp->data.receiver | |
991 | if ($kgm_spacep == ipc_space_kernel) | |
992 | showkobject $kgm_portp | |
993 | else | |
994 | if ($kgm_portp->ip_object.io_bits & 0x80000000) | |
995 | printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name | |
996 | showportdestproc $kgm_portp | |
997 | else | |
998 | printf "0x%08x inactive-port\n", $kgm_portp | |
999 | end | |
1000 | end | |
1001 | end | |
1002 | ||
1003 | define showportmember | |
1004 | printf " 0x%08x ", $arg0 | |
1005 | set $kgm_portp = (ipc_port_t)$arg0 | |
1006 | printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name | |
1007 | if ($kgm_portp->ip_object.io_bits & 0x80000000) | |
1008 | printf "A" | |
1009 | else | |
1010 | printf " " | |
1011 | end | |
1012 | if ($kgm_portp->ip_object.io_bits & 0x7fff0000) | |
1013 | printf "Set " | |
1014 | else | |
1015 | printf "Port" | |
1016 | end | |
1017 | printf "%5d ", $kgm_portp->ip_object.io_references | |
1018 | printf "0x%08x ", &($kgm_portp->ip_messages) | |
1019 | printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount | |
1020 | end | |
1021 | ||
1022 | define showportint | |
1023 | printf "0x%08x ", $arg0 | |
1024 | set $kgm_portp = (ipc_port_t)$arg0 | |
1025 | printf "0x%08x ", &($kgm_portp->ip_messages) | |
1026 | printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name | |
1027 | if ($kgm_portp->ip_object.io_bits & 0x80000000) | |
1028 | printf "A" | |
1029 | else | |
1030 | printf "D" | |
1031 | end | |
1032 | printf "Port" | |
1033 | printf "%5d ", $kgm_portp->ip_object.io_references | |
1034 | set $kgm_destspacep = (ipc_space_t)0 | |
1035 | showportdest $kgm_portp | |
1036 | set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base | |
1037 | if $arg1 && $kgm_kmsgp | |
1038 | showkmsgheader | |
1039 | showkmsgint $kgm_kmsgp | |
1040 | set $kgm_kmsgheadp = $kgm_kmsgp | |
1041 | set $kgm_kmsgp = $kgm_kmsgp->ikm_next | |
1042 | while $kgm_kmsgp != $kgm_kmsgheadp | |
1043 | showkmsgint $kgm_kmsgp | |
1044 | set $kgm_kmsgp = $kgm_kmsgp->ikm_next | |
1045 | end | |
1046 | end | |
1047 | end | |
1048 | ||
1049 | define showpsetint | |
1050 | printf "0x%08x ", $arg0 | |
1051 | set $kgm_psetp = (ipc_pset_t)$arg0 | |
1052 | printf "0x%08x ", &($kgm_psetp->ips_messages) | |
1053 | printf "0x%08x ", $kgm_psetp->ips_object.io_receiver_name | |
1054 | if ($kgm_psetp->ips_object.io_bits & 0x80000000) | |
1055 | printf "A" | |
1056 | else | |
1057 | printf "D" | |
1058 | end | |
1059 | printf "Set " | |
1060 | printf "%5d ", $kgm_psetp->ips_object.io_references | |
1061 | set $kgm_sublinksp = &($kgm_psetp->ips_messages.data.set_queue.wqs_sublinks) | |
1062 | set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next | |
1063 | set $kgm_found = 0 | |
1064 | while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp) | |
1065 | set $kgm_portp = (ipc_port_t)((int)($kgm_wql->wql_element->wqe_queue) - ((int)$kgm_portoff)) | |
1066 | if !$kgm_found | |
1067 | set $kgm_destspacep = (ipc_space_t)0 | |
1068 | showportdest $kgm_portp | |
1069 | showportmemberheader | |
1070 | set $kgm_found = 1 | |
1071 | end | |
1072 | showportmember $kgm_portp 0 | |
1073 | set $kgm_wql = (wait_queue_link_t)$kgm_wql->wql_sublinks.next | |
1074 | end | |
1075 | if !$kgm_found | |
1076 | printf "--n/e-- --n/e--\n" | |
1077 | end | |
1078 | end | |
1079 | ||
1080 | define showpset | |
1081 | showpsetheader | |
1082 | showpsetint $arg0 1 | |
1083 | end | |
1084 | ||
1085 | define showport | |
1086 | showportheader | |
1087 | showportint $arg0 1 | |
1088 | end | |
1089 | ||
1090 | define showipcobject | |
1091 | set $kgm_object = (ipc_object_t)$arg0 | |
1092 | if ($kgm_objectp->io_bits & 0x7fff0000) | |
1093 | showpset $kgm_objectp | |
1094 | else | |
1095 | showport $kgm_objectp | |
1096 | end | |
1097 | end | |
1098 | ||
1099 | define showmqueue | |
1100 | set $kgm_mqueue = *(ipc_mqueue_t)$arg0 | |
1101 | set $kgm_psetoff = &(((ipc_pset_t)0)->ips_messages) | |
1102 | set $kgm_portoff = &(((ipc_port_t)0)->ip_messages) | |
1103 | if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_issub) | |
1104 | set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff)) | |
1105 | showpsetheader | |
1106 | showpsetint $kgm_pset 1 | |
1107 | else | |
1108 | showportheader | |
1109 | set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff)) | |
1110 | showportint $kgm_port 1 | |
1111 | end | |
1112 | end | |
1113 | ||
1114 | define zprint_one | |
1115 | set $kgm_zone = (struct zone *)$arg0 | |
1116 | ||
1117 | printf "0x%08x ", $kgm_zone | |
1118 | printf "%8d ",$kgm_zone->count | |
1119 | printf "%8x ",$kgm_zone->cur_size | |
1120 | printf "%8x ",$kgm_zone->max_size | |
1121 | printf "%6d ",$kgm_zone->elem_size | |
1122 | printf "%8x ",$kgm_zone->alloc_size | |
1123 | printf "%s ",$kgm_zone->zone_name | |
1124 | ||
1125 | if ($kgm_zone->exhaustible) | |
1126 | printf "H" | |
1127 | end | |
1128 | if ($kgm_zone->collectable) | |
1129 | printf "C" | |
1130 | end | |
1131 | if ($kgm_zone->expandable) | |
1132 | printf "X" | |
1133 | end | |
1134 | printf "\n" | |
1135 | end | |
1136 | ||
1137 | ||
1138 | define zprint | |
1139 | printf "ZONE COUNT TOT_SZ MAX_SZ ELT_SZ ALLOC_SZ NAME\n" | |
1140 | set $kgm_zone_ptr = (struct zone *)first_zone | |
1141 | while ($kgm_zone_ptr != 0) | |
1142 | zprint_one $kgm_zone_ptr | |
1143 | set $kgm_zone_ptr = $kgm_zone_ptr->next_zone | |
1144 | end | |
1145 | printf "\n" | |
1146 | end | |
1147 | document zprint | |
1148 | | Routine to print a summary listing of all the kernel zones | |
1149 | | The following is the syntax: | |
1150 | | (gdb) zprint | |
1151 | end | |
1152 |