1# $FreeBSD$
2# General kernel macros
3
4# Print the command name of the current process
5define pname
6p (char *)curproc->p_comm
7end 
8document pname
9Print the command name of the current process.
10end
11
12# Show contents of bp supplied as first parameter:
13#
14# (gdb) bpp bp
15define bpp
16set $bp = (struct buf *) $arg0
17    if $bp->b_io.bio_dev
18      printf "  Buffer at 0x%x: dev 0x%x  data 0x%x  bcount 0x%x  blkno 0x%x resid 0x%x\n", \
19        $bp, \
20        $bp->b_io.bio_dev->si_udev, \
21        $bp->b_io.bio_data, \
22        $bp->b_io.bio_bcount, \
23        $bp->b_io.bio_blkno, \
24        $bp->b_io.bio_resid
25    else
26      printf "  Buffer at 0x%x: dev (none) data 0x%x  bcount 0x%x  blkno 0x%x resid 0x%x\n", \
27        $bp, \
28        $bp->b_io.bio_data, \
29        $bp->b_io.bio_bcount, \
30        $bp->b_io.bio_blkno, \
31        $bp->b_io.bio_resid
32    end
33    printf "   flags 0x%x: ", $bp->b_flags
34      if $bp->b_flags & 0x10
35        printf "busy "
36      end
37      if $bp->b_flags & 0x40
38        printf "call "
39      end
40      if $bp->b_flags & 0x200
41        printf "done "
42      end
43      if $bp->b_flags & 0x800
44        printf "error "
45      end
46      if $bp->b_flags & 0x40000
47        printf "phys "
48      end
49      if $bp->b_flags & 0x100000
50        printf "read "
51      end
52    printf "\n"
53end
54document bpp
55Show summary information about the buffer header (struct bp) pointed at by the parameter.
56end
57
58# Show more detailed contents of bp supplied as first parameter:
59#
60# (gdb) bpl bp
61define bpl
62set $bp = (struct buf *) $arg0
63printf "b_proc: "
64output $bp->b_proc
65printf "\nb_flags:      "
66output $bp->b_flags
67printf "\nb_qindex:     "
68output $bp->b_qindex
69printf "\nb_usecount:   "
70output $bp->b_usecount
71printf "\nb_error:      "
72output $bp->b_error
73printf "\nb_bufsize:    "
74output $bp->b_bufsize
75printf "\nb_io.bio_bcount:     "
76output $bp->b_io.bio_bcount
77printf "\nb_io.bio_resid:      "
78output $bp->b_io.bio_resid
79printf "\nb_io.bio_dev:        "
80output $bp->b_io.bio_dev
81printf "\nb_io.bio_data:       "
82output $bp->b_io.bio_data
83printf "\nb_kvasize:    "
84output $bp->b_kvasize
85printf "\nb_lblkno:     "
86output $bp->b_lblkno
87printf "\nb_io.bio_blkno:      "
88output $bp->b_io.bio_blkno
89printf "\nb_iodone:     "
90output $bp->b_iodone
91printf "\nb_vp: "
92output $bp->b_vp
93printf "\nb_dirtyoff:   "
94output $bp->b_dirtyoff
95printf "\nb_dirtyend:   "
96output $bp->b_dirtyend
97printf "\nb_generation: "
98output $bp->b_generation
99printf "\nb_rcred:      "
100output $bp->b_rcred
101printf "\nb_wcred:      "
102output $bp->b_wcred
103printf "\nb_validoff:   "
104output $bp->b_validoff
105printf "\nb_validend:   "
106output $bp->b_validend
107printf "\nb_pblkno:     "
108output $bp->b_pblkno
109printf "\nb_saveaddr:   "
110output $bp->b_saveaddr
111printf "\nb_savekva:    "
112output $bp->b_savekva
113printf "\nb_driver1:    "
114output $bp->b_driver1
115printf "\nb_driver2:    "
116output $bp->b_driver2
117printf "\nb_spc:        "
118output $bp->b_spc
119printf "\nb_npages:     "
120output $bp->b_npages
121printf "\n"
122end
123document bpl
124Show detailed information about the buffer header (struct bp) pointed at by the parameter.
125end
126
127# Show contents of buffer header in local variable bp. 
128define bp
129bpp bp
130end
131document bp
132Show information about the buffer header pointed to by the variable bp in the current frame.
133end
134
135# Show data of buffer header in local variable bp as string.
136define bpd
137    printf "Buffer data:\n%s", (char *) bp->b_io.bio_data
138end
139document bpd
140Show the contents (char*) of bp->data in the current frame.
141end
142document bpl
143Show detailed information about the buffer header (struct bp) pointed at by the local variable bp.
144end
145define bx
146printf "\n b_vnbufs " 
147output/x bp->b_vnbufs
148printf "\n b_freelist " 
149output/x bp->b_freelist
150printf "\n b_act " 
151output/x bp->b_act
152printf "\n b_flags " 
153output/x bp->b_flags
154printf "\n b_qindex " 
155output/x bp->b_qindex
156printf "\n b_usecount " 
157output/x bp->b_usecount
158printf "\n b_error " 
159output/x bp->b_error
160printf "\n b_bufsize " 
161output/x bp->b_bufsize
162printf "\n b_io.bio_bcount " 
163output/x bp->b_io.bio_bcount
164printf "\n b_io.bio_resid " 
165output/x bp->b_io.bio_resid
166printf "\n b_io.bio_dev " 
167output/x bp->b_io.bio_dev
168printf "\n b_io.bio_data " 
169output/x bp->b_io.bio_data
170printf "\n b_kvasize " 
171output/x bp->b_kvasize
172printf "\n b_io.bio_blkno " 
173output/x bp->b_io.bio_blkno
174printf "\n b_iodone_chain " 
175output/x bp->b_iodone_chain
176printf "\n b_vp " 
177output/x bp->b_vp
178printf "\n b_dirtyoff " 
179output/x bp->b_dirtyoff
180printf "\n b_validoff " 
181output/x bp->b_validoff
182echo \n
183end
184document bx
185Print a number of fields from the buffer header pointed at in by the pointer bp in the current environment.
186end
187
188# Switch back to ddb
189define ddb
190set boothowto=0x80000000
191s
192end
193document ddb
194Switch back to ddb.
195end
196
197# ps: equivalent of the userland command
198define ps
199    set $nproc = nprocs
200    set $aproc = allproc.lh_first
201    set $proc = allproc.lh_first
202    printf "  pid    proc   uid  ppid  pgrp   flag stat comm         wchan\n"
203    while (--$nproc >= 0)
204        set $pptr = $proc.p_pptr
205        if ($pptr == 0)
206           set $pptr = $proc
207        end
208        if ($proc.p_state)
209            set $thread = $proc->p_threads.tqh_first
210            while ($thread)
211                printf "%5d %08x %4d %5d %5d  %06x  %d  %-10s   ", \
212                       $proc.p_pid, $aproc, \
213                       $proc.p_ucred->cr_ruid, $pptr->p_pid, \
214                       $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
215                       &$proc.p_comm[0]
216                if ($thread.td_wchan)
217                    if ($thread.td_wmesg)
218                        printf "%s ", $thread.td_wmesg
219                    end
220                    printf "%x", $thread.td_wchan
221                end
222                printf "\n"     
223                set $thread = $thread->td_plist.tqe_next
224            end
225        end
226        set $aproc = $proc.p_list.le_next
227        if ($aproc == 0 && $nproc > 0)
228            set $aproc = zombproc
229        end
230        set $proc = $aproc
231    end
232end
233document ps
234Show process status without options. 
235end
236
237# Specify a process for other commands to refer to.
238# Most are machine-dependent.
239define defproc
240    set $nproc = nprocs
241    set $aproc = allproc.lh_first
242    set $proc = allproc.lh_first
243    while (--$nproc >= 0)
244        if ($proc->p_pid == $arg0)
245	   set $pptr = $proc.p_pptr
246           if ($pptr == 0)
247              set $pptr = $proc
248           end
249	   set $myvectorproc = $proc
250           if ($proc.p_state)
251               set $thread = $proc->p_threads.tqh_first
252               while ($thread)
253                   printf "%5d %08x %08x %4d %5d %5d  %06x  %d  %-10s   ", \
254                          $proc.p_pid, $aproc, \
255                          $proc.p_uarea, $proc.p_ucred->cr_ruid, $pptr->p_pid, \
256                          $proc.p_pgrp->pg_id, $proc.p_flag, $proc.p_state, \
257                          &$proc.p_comm[0]
258                   if ($thread.td_wchan)
259                       if ($thread.td_wmesg)
260                           printf "%s ", $thread.td_wmesg
261                       end
262                       printf "%x", $thread.td_wchan
263                   end
264                   printf "\n"     
265                   set $thread = $thread->td_plist.tqe_next
266               end
267           end
268           btpp
269	   set $nproc = 0
270	else
271           set $proc = $proc.p_list.le_next
272        end
273   end
274end
275document defproc
276Specify a process for btpp and fr commands.
277end
278
279define vdev
280if (vp->v_type == VBLK)
281  p *vp->v_un.vu_spec.vu_specinfo
282  printf "numoutput: %d\n", vp->v_numoutput
283else
284  echo "Not a block device"
285end
286end
287document vdev
288Show some information of the vnode pointed to by the local variable vp.
289end
290
291# Kludge.  When changing macros, it's convenient to copy and paste
292# definitions from the editor into the debugger window.
293# Unfortunately, gdb insists on asking for confirmation after the
294# "define" line.  y enables you to insert the confirmation in the
295# definition without affecting the way the macro runs (much).
296define y
297echo Check your .gdbinit: it contains a y command\n
298end
299
300document y
301Kludge for writing macros   This is a no-op except for printing a message   See gdb(4) for more details.
302end
303
304# dmesg: print msgbuf.  Can take forever.
305define dmesg
306printf "%s", msgbufp->msg_ptr
307end
308document dmesg
309Print the system message buffer (dmesg) This can take a long time due to the time it takes to transmit the data across a serial line and even on a firewire connection the processing time slows it down
310end
311
312# checkmem: check unallocated memory for modifications
313# this assumes that DIAGNOSTIC is set, which causes
314# free memory to be set to 0xdeadc0de
315#
316# Use: checkmem offset length
317define checkmem
318set $offset = $arg0
319# XXX sizeof int.   Needs changing for 64 bit machines.
320# subtract 1 because the last word is always different.
321set $length = $arg1 / 4 - 1
322set $word = 0
323while ($word < $length)
324   if ((int *) $offset) [$word] != 0xdeadc0de
325      printf "invalid word 0x%x at 0x%x\n", ((int *) $offset) [$word], &((int *) $offset) [$word]
326   end
327   set $word = $word + 1
328end
329end
330
331document checkmem
332Check unallocated memory for modifications  This assumes that DIAGNOSTIC is set which causes free memory to be set to 0xdeadc0de.
333end
334
335define kernel
336  exec-file kernel.$arg0   
337  symbol-file symbols.$arg0
338  core-file vmcore.$arg0
339end
340
341define kldstat
342  set $kld = linker_files.tqh_first
343  printf "Id Refs Address    Size     Name\n"
344  while ($kld != 0)
345    printf "%2d %4d 0x%08x %-8x %s\n", \
346      $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
347    set $kld = $kld->link.tqe_next
348  end
349end
350 
351document kldstat
352  Lists the modules that were loaded when the kernel crashed.
353end
354 
355define kldstat-v
356  set $kld = linker_files.tqh_first
357  printf "Id Refs Address    Size     Name\n"
358  while ($kld != 0)
359    printf "%2d %4d 0x%08x %-8x %s\n", \
360      $kld->id, $kld->refs, $kld->address, $kld->size, $kld->filename
361    printf "        Contains modules:\n"
362    printf "                Id Name\n"
363    set $module = $kld->modules.tqh_first
364    while ($module != 0)
365      printf "                %2d %s\n", $module->id, $module->name
366      set $module = $module->link.tqe_next
367    end
368    set $kld = $kld->link.tqe_next
369  end
370end
371