Annotation of XNU/osfmk/.gdbinit, revision 1.1.1.1

1.1       root        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: |
                     35: |     showtask       Display status of the specified task
                     36: |     showtaskacts   Display the status of all activations in the task
                     37: |     showtaskstacks Display all kernel stacks for all activations in the task
                     38: |     showtaskvm     Display status of the specified task's vm_map
                     39: |     showtaskvme    Display a summary list of the task's vm_map entries
                     40: |     showtaskipc    Display status of the specified task's ipc space
                     41: |     showtaskrights Display a summary list of the task's ipc space entries
                     42: |
                     43: |     showact       Display status of the specified thread activation
                     44: |     showactstack   Display the kernel stack for the specified activation
                     45: |
                     46: |     showmap       Display the status of the specified vm_map
                     47: |     showmapvme     Display a summary list of the specified vm_map's entries
                     48: |
                     49: |     showipc        Display the status of the specified ipc space
                     50: |     showrights     Display a summary list of all the rights in an ipc space
                     51: |
                     52: |     showpid        Display the status of the process identified by pid
                     53: |     showproc       Display the status of the process identified by a proc pointer
                     54: |
                     55: | Type "help <macro>" for more specific help on a particular macro.
                     56: | Type "show user <macro>" to see what the macro is really doing.
                     57: end
                     58: 
                     59: 
                     60: define showactheader
                     61:     printf "            activation  "
                     62:     printf "thread      pri  state  wait_queue  wait_event\n"
                     63: end
                     64: 
                     65: 
                     66: define showactint
                     67:    printf "            0x%08x  ", $arg0
                     68:    set $kgm_actp = *(Thread_Activation *)$arg0
                     69:    if $kgm_actp.thread
                     70:        set $kgm_thread = *$kgm_actp.thread
                     71:        printf "0x%08x  ", $kgm_actp.thread
                     72:        printf "%3d  ", $kgm_thread.sched_pri
                     73:        set $kgm_state = $kgm_thread.state
                     74:        if $kgm_state & 0x80
                     75:            printf "I" 
                     76:        end
                     77:        if $kgm_state & 0x40
                     78:            printf "P" 
                     79:        end
                     80:        if $kgm_state & 0x20
                     81:            printf "A" 
                     82:        end
                     83:        if $kgm_state & 0x10
                     84:            printf "H" 
                     85:        end
                     86:        if $kgm_state & 0x08
                     87:            printf "U" 
                     88:        end
                     89:        if $kgm_state & 0x04
                     90:            printf "R" 
                     91:        end
                     92:        if $kgm_state & 0x02
                     93:            printf "S" 
                     94:        end
                     95:        if $kgm_state & 0x01
                     96:            printf "W\t" 
                     97:            printf "0x%08x  ", $kgm_thread.wait_queue
                     98:            output /a $kgm_thread.wait_event
                     99:        end
                    100:        if $arg1 != 0
                    101:            if ($kgm_thread.kernel_stack != 0)
                    102:                set $mysp = $kgm_actp->mact.pcb.ss.r1
                    103:                while ($mysp != 0) && (($mysp & 0xf) == 0)
                    104:                                printf "\n\t\t\t"
                    105:                                output /a * ($mysp + 8)
                    106:                                set $mysp = * $mysp
                    107:                end
                    108:            else
                    109:                printf "\n\t\t\tcontinuation="
                    110:                output /a $kgm_thread.continuation
                    111:            end
                    112:            printf "\n"
                    113:        else
                    114:            printf "\n"
                    115:        end
                    116:     end
                    117: end        
                    118: 
                    119: define showact
                    120:     showactheader
                    121:     showactint $arg0 0
                    122: end
                    123: document showact
                    124: | Routine to print out the state of a specific thread activation.
                    125: | The following is the syntax:
                    126: |     (gdb) showact <activation> 
                    127: end
                    128: 
                    129: 
                    130: define showactstack
                    131:     showactheader
                    132:     showactint $arg0 1
                    133: end
                    134: document showactstack
                    135: | Routine to print out the stack of a specific thread activation.
                    136: | The following is the syntax:
                    137: |     (gdb) showactstack <activation> 
                    138: end
                    139: 
                    140: 
                    141: define showallacts
                    142:     set $kgm_head_taskp = &default_pset.tasks
                    143:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    144:     while $kgm_taskp != $kgm_head_taskp
                    145:         showtaskheader
                    146:        showtaskint $kgm_taskp
                    147:        showactheader
                    148:        set $kgm_head_actp = &($kgm_taskp->thr_acts)
                    149:         set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
                    150:        while $kgm_actp != $kgm_head_actp
                    151:            showactint $kgm_actp 0
                    152:            set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
                    153:         end
                    154:        printf "\n"
                    155:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    156:     end
                    157: end
                    158: document showallacts
                    159: | Routine to print out a summary listing of all the thread activations.
                    160: | The following is the syntax:
                    161: |     (gdb) showallacts
                    162: end
                    163: 
                    164: 
                    165: define showallstacks
                    166:     set $kgm_head_taskp = &default_pset.tasks
                    167:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    168:     while $kgm_taskp != $kgm_head_taskp
                    169:         showtaskheader
                    170:        showtaskint $kgm_taskp
                    171:        set $kgm_head_actp = &($kgm_taskp->thr_acts)
                    172:         set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
                    173:        while $kgm_actp != $kgm_head_actp
                    174:            showactheader
                    175:            showactint $kgm_actp 1
                    176:            set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
                    177:         end
                    178:        printf "\n"
                    179:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    180:     end
                    181: end
                    182: document showallstacks
                    183: | Routine to print out a summary listing of all the thread kernel stacks.
                    184: | The following is the syntax:
                    185: |     (gdb) showallstacks
                    186: end
                    187: 
                    188: 
                    189: 
                    190: 
                    191: define showmapheader
                    192:     printf "vm_map      pmap        vm_size    "
                    193:     printf "#ents rpage  hint        first_free\n"
                    194: end
                    195: 
                    196: define showvmeheader
                    197:     printf "            entry       start       "
                    198:     printf "prot #page  object      offset\n"
                    199: end
                    200: 
                    201: define showvmint
                    202:     set $kgm_mapp = (vm_map_t)$arg0
                    203:     set $kgm_map = *$kgm_mapp
                    204:     printf "0x%08x  ", $arg0
                    205:     printf "0x%08x  ", $kgm_map.pmap
                    206:     printf "0x%08x  ", $kgm_map.size
                    207:     printf "%3d  ", $kgm_map.hdr.nentries
                    208:     printf "%5d  ", $kgm_map.pmap->stats.resident_count
                    209:     printf "0x%08x  ", $kgm_map.hint
                    210:     printf "0x%08x\n", $kgm_map.first_free
                    211:     if $arg1 != 0
                    212:        showvmeheader   
                    213:        set $kgm_head_vmep = &($kgm_mapp->hdr.links)
                    214:        set $kgm_vmep = $kgm_map.hdr.links.next
                    215:        while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
                    216:            set $kgm_vme = *$kgm_vmep
                    217:            printf "            0x%08x  ", $kgm_vmep
                    218:            printf "0x%08x  ", $kgm_vme.links.start
                    219:            printf "%1x", $kgm_vme.protection
                    220:            printf "%1x", $kgm_vme.max_protection
                    221:            if $kgm_vme.inheritance == 0x0
                    222:                printf "S"
                    223:            end
                    224:            if $kgm_vme.inheritance == 0x1
                    225:                printf "C"
                    226:            end
                    227:            if $kgm_vme.inheritance == 0x2
                    228:                printf "-"
                    229:            end
                    230:            if $kgm_vme.inheritance == 0x3
                    231:                printf "D"
                    232:            end
                    233:            if $kgm_vme.is_sub_map
                    234:                printf "s "
                    235:            else
                    236:                if $kgm_vme.needs_copy
                    237:                    printf "n "
                    238:                else
                    239:                    printf "  "
                    240:                end
                    241:            end
                    242:            printf "%5d  ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
                    243:            printf "0x%08x  ", $kgm_vme.object.vm_object
                    244:            printf "0x%08x\n", $kgm_vme.offset
                    245:            set $kgm_vmep = $kgm_vme.links.next
                    246:         end
                    247:     end
                    248:     printf "\n"
                    249: end
                    250: 
                    251: 
                    252: define showmapvme
                    253:        showmapheader
                    254:        showvmint $arg0 1
                    255: end
                    256: document showmapvme
                    257: | Routine to print out a summary listing of all the entries in a vm_map
                    258: | The following is the syntax:
                    259: |     (gdb) showmapvme <vm_map>
                    260: end
                    261: 
                    262: 
                    263: define showmap
                    264:        showmapheader
                    265:        showvmint $arg0 0
                    266: end
                    267: document showmap
                    268: | Routine to print out a summary description of a vm_map
                    269: | The following is the syntax:
                    270: |     (gdb) showmap <vm_map>
                    271: end
                    272: 
                    273: define showallvm
                    274:     set $kgm_head_taskp = &default_pset.tasks
                    275:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    276:     while $kgm_taskp != $kgm_head_taskp
                    277:         showtaskheader
                    278:        showmapheader
                    279:        showtaskint $kgm_taskp
                    280:        showvmint $kgm_taskp->map 0
                    281:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    282:     end
                    283: end
                    284: document showallvm
                    285: | Routine to print a summary listing of all the vm maps
                    286: | The following is the syntax:
                    287: |     (gdb) showallvm
                    288: end
                    289: 
                    290: 
                    291: define showallvme
                    292:     set $kgm_head_taskp = &default_pset.tasks
                    293:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    294:     while $kgm_taskp != $kgm_head_taskp
                    295:         showtaskheader
                    296:        showmapheader
                    297:        showtaskint $kgm_taskp
                    298:        showvmint $kgm_taskp->map 1
                    299:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    300:     end
                    301: end
                    302: document showallvme
                    303: | Routine to print a summary listing of all the vm map entries
                    304: | The following is the syntax:
                    305: |     (gdb) showallvme
                    306: end
                    307: 
                    308: 
                    309: define showipcheader
                    310:     printf "ipc_space   is_table    table_next "
                    311:     printf "flags tsize  splaytree   splaybase\n"
                    312: end
                    313: 
                    314: define showipceheader
                    315:     printf "            entry       name        "
                    316:     printf "rite urefs  object      request\n"
                    317: end
                    318: 
                    319: define showipceint
                    320:     set $kgm_ie = *(ipc_entry_t)$arg0
                    321:     printf "            0x%08x  ", $arg0
                    322:     printf "0x%08x  ", $arg1
                    323:     if $kgm_ie.ie_bits & 0x00010000
                    324:        if $kgm_ie.ie_bits & 0x00020000
                    325:            printf " SR"
                    326:        else
                    327:            printf "  S"
                    328:        end
                    329:     else
                    330:        if $kgm_ie.ie_bits & 0x00020000
                    331:            printf "  R"
                    332:        end
                    333:     end
                    334:     if $kgm_ie.ie_bits & 0x00040000
                    335:        printf "  O"
                    336:     end
                    337:     if $kgm_ie.ie_bits & 0x00080000
                    338:        printf "SET"
                    339:     end
                    340:     if $kgm_ie.ie_bits & 0x00100000
                    341:        printf "  D"
                    342:     end
                    343:     if $kgm_ie.ie_bits & 0x00800000
                    344:        printf "c "
                    345:     else
                    346:        printf "  "
                    347:     end
                    348:     printf "%5d  ", $kgm_ie.ie_bits & 0xffff
                    349:     printf "0x%08x  ", $kgm_ie.ie_object
                    350:     printf "0x%08x\n", $kgm_ie.index.request
                    351: end
                    352: 
                    353: define showipcint
                    354:     set $kgm_isp = (ipc_space_t)$arg0
                    355:     set $kgm_is = *$kgm_isp
                    356:     printf "0x%08x  ", $arg0
                    357:     printf "0x%08x  ", $kgm_is.is_table
                    358:     printf "0x%08x  ", $kgm_is.is_table_next
                    359:     if $kgm_is.is_growing != 0
                    360:        printf "G"
                    361:     else
                    362:        printf " "
                    363:     end
                    364:     if $kgm_is.is_fast != 0
                    365:        printf "F"
                    366:     else
                    367:        printf " "
                    368:     end
                    369:     if $kgm_is.is_active != 0
                    370:        printf "A  "
                    371:     else
                    372:        printf "   "
                    373:     end
                    374:     printf "%5d  ", $kgm_is.is_table_size
                    375:     printf "0x%08x  ", $kgm_is.is_tree_total
                    376:     printf "0x%08x\n", &$kgm_isp->is_tree
                    377:     if $arg1 != 0
                    378:        showipceheader
                    379:        set $kgm_iindex = 0
                    380:        set $kgm_iep = $kgm_is.is_table
                    381:         while ( $kgm_iindex < $kgm_is.is_table_size )
                    382:            set $kgm_ie = *$kgm_iep
                    383:            if $kgm_ie.ie_bits & 0x001f0000
                    384:                set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
                    385:                showipceint $kgm_iep $kgm_name
                    386:            end
                    387:            set $kgm_iindex = $kgm_iindex + 1
                    388:            set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
                    389:        end
                    390:        if $kgm_is.is_tree_total
                    391:            printf "Still need to write tree traversal\n"
                    392:        end
                    393:     end
                    394:     printf "\n"
                    395: end
                    396: 
                    397: 
                    398: define showipc
                    399:        set $kgm_isp = (ipc_space_t)$arg0
                    400:         showipcheader
                    401:        showipcint $kgm_isp 0
                    402: end
                    403: document showipc
                    404: | Routine to print the status of the specified ipc space
                    405: | The following is the syntax:
                    406: |     (gdb) showipc <ipc_space>
                    407: end
                    408: 
                    409: define showrights
                    410:        set $kgm_isp = (ipc_space_t)$arg0
                    411:         showipcheader
                    412:        showipcint $kgm_isp 1
                    413: end
                    414: document showrights
                    415: | Routine to print a summary list of all the rights in a specified ipc space
                    416: | The following is the syntax:
                    417: |     (gdb) showrights <ipc_space>
                    418: end
                    419: 
                    420: 
                    421: define showtaskipc
                    422:        set $kgm_taskp = (task_t)$arg0
                    423:        showtaskheader
                    424:     showipcheader
                    425:        showtaskint $kgm_taskp
                    426:        showipcint $kgm_taskp->itk_space 0
                    427: end
                    428: document showtaskipc
                    429: | Routine to print the status of the ipc space for a task
                    430: | The following is the syntax:
                    431: |     (gdb) showtaskipc <task>
                    432: end
                    433: 
                    434: 
                    435: define showtaskrights
                    436:        set $kgm_taskp = (task_t)$arg0
                    437:        showtaskheader
                    438:         showipcheader
                    439:        showtaskint $kgm_taskp
                    440:        showipcint $kgm_taskp->itk_space 1
                    441: end
                    442: document showtaskrights
                    443: | Routine to print a summary listing of all the ipc rights for a task
                    444: | The following is the syntax:
                    445: |     (gdb) showtaskrights <task>
                    446: end
                    447: 
                    448: define showallipc
                    449:     set $kgm_head_taskp = &default_pset.tasks
                    450:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    451:     while $kgm_taskp != $kgm_head_taskp
                    452:         showtaskheader
                    453:         showipcheader
                    454:        showtaskint $kgm_taskp
                    455:        showipcint $kgm_taskp->itk_space 0
                    456:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    457:     end
                    458: end
                    459: document showallipc
                    460: | Routine to print a summary listing of all the ipc spaces
                    461: | The following is the syntax:
                    462: |     (gdb) showallipc
                    463: end
                    464: 
                    465: 
                    466: define showallrights
                    467:     set $kgm_head_taskp = &default_pset.tasks
                    468:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    469:     while $kgm_taskp != $kgm_head_taskp
                    470:         showtaskheader
                    471:         showipcheader
                    472:        showtaskint $kgm_taskp
                    473:        showipcint $kgm_taskp->itk_space 1
                    474:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    475:     end
                    476: end
                    477: document showallrights
                    478: | Routine to print a summary listing of all the ipc rights
                    479: | The following is the syntax:
                    480: |     (gdb) showallrights
                    481: end
                    482: 
                    483: 
                    484: define showtaskvm
                    485:        set $kgm_taskp = (task_t)$arg0
                    486:        showtaskheader
                    487:        showmapheader
                    488:        showtaskint $kgm_taskp
                    489:        showvmint $kgm_taskp->map 0
                    490: end
                    491: document showtaskvm
                    492: | Routine to print out a summary description of a task's vm_map
                    493: | The following is the syntax:
                    494: |     (gdb) showtaskvm <task>
                    495: end
                    496: 
                    497: define showtaskvme
                    498:        set $kgm_taskp = (task_t)$arg0
                    499:        showtaskheader
                    500:        showmapheader
                    501:        showtaskint $kgm_taskp
                    502:        showvmint $kgm_taskp->map 1
                    503: end
                    504: document showtaskvme
                    505: | Routine to print out a summary listing of a task's vm_map_entries
                    506: | The following is the syntax:
                    507: |     (gdb) showtaskvme <task>
                    508: end
                    509: 
                    510: 
                    511: define showtaskheader
                    512:     printf "task        vm_map      ipc_space  #acts  "
                    513:     showprocheader
                    514: end
                    515: 
                    516: 
                    517: define showtaskint
                    518:     set $kgm_task = *(Task *)$arg0
                    519:     printf "0x%08x  ", $arg0
                    520:     printf "0x%08x  ", $kgm_task.map
                    521:     printf "0x%08x  ", $kgm_task.itk_space
                    522:     printf "%3d  ", $kgm_task.thr_act_count
                    523:     showprocint $kgm_task.bsd_info
                    524: end
                    525: 
                    526: define showtask
                    527:     showtaskheader
                    528:     showtaskint $arg0
                    529: end
                    530: document showtask
                    531: | Routine to print out info about a task.
                    532: | The following is the syntax:
                    533: |     (gdb) showtask <task>
                    534: end
                    535: 
                    536: 
                    537: define showtaskacts
                    538:     showtaskheader
                    539:     set $kgm_taskp = (Task *)$arg0
                    540:     showtaskint $kgm_taskp
                    541:     showactheader
                    542:     set $kgm_head_actp = &($kgm_taskp->thr_acts)
                    543:     set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
                    544:     while $kgm_actp != $kgm_head_actp
                    545:        showactint $kgm_actp 0
                    546:        set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
                    547:     end
                    548: end
                    549: document showtaskacts
                    550: | Routine to print a summary listing of the activations in a task
                    551: | The following is the syntax:
                    552: |     (gdb) showtaskacts <task>
                    553: end
                    554: 
                    555: 
                    556: define showtaskstacks
                    557:     showtaskheader
                    558:     set $kgm_taskp = (Task *)$arg0
                    559:     showtaskint $kgm_taskp
                    560:     set $kgm_head_actp = &($kgm_taskp->thr_acts)
                    561:     set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
                    562:     while $kgm_actp != $kgm_head_actp
                    563:         showactheader
                    564:        showactint $kgm_actp 1
                    565:        set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
                    566:     end
                    567: end
                    568: document showtaskstacks
                    569: | Routine to print a summary listing of the activations in a task and their stacks
                    570: | The following is the syntax:
                    571: |     (gdb) showtaskstacks <task>
                    572: end
                    573: 
                    574: 
                    575: define showalltasks
                    576:     showtaskheader
                    577:     set $kgm_head_taskp = &default_pset.tasks
                    578:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    579:     while $kgm_taskp != $kgm_head_taskp
                    580:        showtaskint $kgm_taskp
                    581:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    582:     end
                    583: end
                    584: document showalltasks
                    585: | Routine to print a summary listing of all the tasks
                    586: | The following is the syntax:
                    587: |     (gdb) showalltasks
                    588: end
                    589: 
                    590: 
                    591: define showprocheader
                    592:     printf " pid  proc        command\n"
                    593: end
                    594: 
                    595: define showprocint
                    596:     set $kgm_procp = (struct proc *)$arg0
                    597:     if $kgm_procp != 0
                    598:         printf "%5d  ", $kgm_procp->p_pid
                    599:        printf "0x%08x  ", $kgm_procp
                    600:        printf "%s\n", $kgm_procp->p_comm
                    601:     else
                    602:        printf "  *0*  0x00000000  --\n"
                    603:     end
                    604: end
                    605: 
                    606: define showpid
                    607:     showtaskheader
                    608:     set $kgm_head_taskp = &default_pset.tasks
                    609:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    610:     while $kgm_taskp != $kgm_head_taskp
                    611:        set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info
                    612:        if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0))
                    613:            showtaskint $kgm_taskp
                    614:            set $kgm_taskp = $kgm_head_taskp
                    615:        else
                    616:            set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    617:        end
                    618:     end
                    619: end
                    620: document showpid
                    621: | Routine to print a summary listing of all the tasks
                    622: | The following is the syntax:
                    623: |     (gdb) showalltasks
                    624: end
                    625: 
                    626: define showproc
                    627:     showtaskheader
                    628:     set $kgm_procp = (struct proc *)$arg0
                    629:     showtaskint $kgm_procp->task $arg1 $arg2
                    630: end
                    631: 
                    632: 
                    633: define kdb
                    634:     set switch_debugger=1
                    635:     continue
                    636: end
                    637: document kdb
                    638: | kdb - Switch to the inline kernel debugger
                    639: |
                    640: | usage: kdb
                    641: |
                    642: | The kdb macro allows you to invoke the inline kernel debugger.
                    643: end
                    644: 
                    645: define showpsetheader
                    646:     printf "portset     waitqueue   recvname    "
                    647:     printf "flags refs  recvspace   process\n"
                    648: end
                    649: 
                    650: define showportheader
                    651:     printf "port        mqueue      recvname    "
                    652:     printf "flags refs  recvspace   process\n"
                    653: end
                    654: 
                    655: define showportmemberheader
                    656:     printf "            port        recvname    "
                    657:     printf "flags refs  mqueue      msgcount\n"
                    658: end
                    659: 
                    660: define showkmsgheader
                    661:     printf "            kmsg        size        "
                    662:     printf "disp msgid  remote-port local-port\n"
                    663: end
                    664: 
                    665: define showkmsgint
                    666:     printf "            0x%08x  ", $arg0
                    667:     set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header
                    668:     printf "0x%08x  ", $kgm_kmsgh.msgh_size
                    669:     if (($kgm_kmsgh.msgh_bits & 0xff) == 19)
                    670:        printf "rC"
                    671:     else
                    672:        printf "rM"
                    673:     end
                    674:     if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 < 8))
                    675:        printf "lC"
                    676:     else
                    677:        printf "lM"
                    678:     end
                    679:     if ($kgm_kmsgh.msgh_bits & 0xf0000000)
                    680:        printf "c"
                    681:     else
                    682:        printf "s"
                    683:     end
                    684:     printf "%5d  ", $kgm_kmsgh.msgh_msgid
                    685:     printf "0x%08x  ", $kgm_kmsgh.msgh_remote_port
                    686:     printf "0x%08x\n", $kgm_kmsgh.msgh_local_port
                    687: end
                    688: 
                    689: define showprocforspace
                    690:     set $kgm_spacep = (ipc_space_t)$arg0
                    691:     set $kgm_found = 0
                    692:     set $kgm_head_taskp = &default_pset.tasks
                    693:     set $kgm_taskp = (Task *)($kgm_head_taskp->next)
                    694:     while (!$kgm_found && ($kgm_taskp != $kgm_head_taskp))
                    695:        if ($kgm_taskp->itk_space == $kgm_spacep)
                    696:            set $kgm_found = 1
                    697:            set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info
                    698:            if $kgm_procp != 0
                    699:                printf "%s\n", $kgm_procp->p_comm
                    700:            else
                    701:                printf "task 0x%08x\n", $kgm_taskp
                    702:            end
                    703:        end
                    704:        set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
                    705:     end
                    706: end
                    707: 
                    708: define showportmember
                    709:     printf "            0x%08x  ", $arg0
                    710:     set $kgm_portp = (ipc_port_t)$arg0
                    711:     printf "0x%08x  ", $kgm_portp->ip_object.io_receiver_name
                    712:     if ($kgm_portp->ip_object.io_bits & 0x80000000)
                    713:        printf "A"
                    714:     else
                    715:        printf " "
                    716:     end
                    717:     if ($kgm_portp->ip_object.io_bits & 0x7fff0000)
                    718:        printf "Set "
                    719:     else
                    720:        printf "Port"
                    721:     end
                    722:     printf "%5d  ", $kgm_portp->ip_object.io_references
                    723:     printf "0x%08x  ", &($kgm_portp->ip_messages)
                    724:     printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount
                    725: end
                    726: 
                    727: define showportint
                    728:     printf "0x%08x  ", $arg0
                    729:     set $kgm_portp = (ipc_port_t)$arg0
                    730:     printf "0x%08x  ", &($kgm_portp->ip_messages)
                    731:     printf "0x%08x  ", $kgm_portp->ip_object.io_receiver_name
                    732:     if ($kgm_portp->ip_object.io_bits & 0x80000000)
                    733:        printf "A"
                    734:     else
                    735:        printf "D"
                    736:     end
                    737:     if ($kgm_portp->ip_object.io_bits & 0x7fff0000)
                    738:        printf "Set "
                    739:     else
                    740:        printf "Port"
                    741:     end
                    742:     printf "%5d  ", $kgm_portp->ip_object.io_references
                    743:     printf "0x%08x  ", $kgm_portp->data.receiver
                    744:     showprocforspace $kgm_portp->data.receiver
                    745:     set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base
                    746:     if $arg1 && $kgm_kmsgp
                    747:        showkmsgheader
                    748:        showkmsgint $kgm_kmsgp
                    749:        set $kgm_kmsgheadp = $kgm_kmsgp
                    750:        set $kgm_kmsgp = $kgm_kmsgp->ikm_next
                    751:        while $kgm_kmsgp != $kgm_kmsgheadp
                    752:            showkmsgint $kgm_kmsgp
                    753:            set $kgm_kmsgp = $kgm_kmsgp->ikm_next
                    754:         end
                    755:     end
                    756: end
                    757: 
                    758: define showpsetint
                    759:     printf "0x%08x  ", $arg0
                    760:     set $kgm_psetp = (ipc_pset_t)$arg0
                    761:     printf "0x%08x  ", &($kgm_psetp->ips_messages)
                    762:     printf "0x%08x  ", $kgm_psetp->ips_object.io_receiver_name
                    763:     if ($kgm_psetp->ips_object.io_bits & 0x80000000)
                    764:        printf "A"
                    765:     else
                    766:        printf "D"
                    767:     end
                    768:     if ($kgm_psetp->ips_object.io_bits & 0x7fff0000)
                    769:        printf "Set "
                    770:     else
                    771:        printf "Port"
                    772:     end
                    773:     printf "%5d  ", $kgm_psetp->ips_object.io_references
                    774:     set $kgm_sublinksp = &($kgm_psetp->ips_messages.data.set_queue.wqs_sublinks)
                    775:     set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next
                    776:     set $kgm_found = 0
                    777:     while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp)
                    778:         set $kgm_portp = (ipc_port_t)((int)($kgm_wql->wql_element->wqe_queue) - ((int)$kgm_portoff))
                    779:        if !$kgm_found  
                    780:            printf "0x%08x  ", $kgm_portp->data.receiver
                    781:            showprocforspace $kgm_portp->data.receiver
                    782:            showportmemberheader
                    783:            set $kgm_found = 1
                    784:        end
                    785:        showportmember $kgm_portp 0
                    786:        set $kgm_wql = (wait_queue_link_t)$kgm_wql->wql_sublinks.next
                    787:     end
                    788:     if !$kgm_found   
                    789:        printf "--n/e--     --n/e--\n"
                    790:     end
                    791: end
                    792: 
                    793: define showpset
                    794:     showpsetheader
                    795:     showpsetint $arg0 1
                    796: end
                    797: 
                    798: define showport
                    799:     showportheader
                    800:     showportint $arg0 1
                    801: end
                    802: 
                    803: define showmqueue
                    804:     set $kgm_mqueue = *(ipc_mqueue_t)$arg0
                    805:     set $kgm_psetoff = &(((ipc_pset_t)0)->ips_messages)
                    806:     set $kgm_portoff = &(((ipc_port_t)0)->ip_messages)
                    807:     if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_issub)
                    808:        set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff))
                    809:         showpsetheader
                    810:        showpsetint $kgm_pset 1
                    811:     else
                    812:        showportheader
                    813:        set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff))
                    814:        showportint $kgm_port 1
                    815:     end
                    816: end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.