[BACK]Return to db_command.c CVS log [TXT][DIR] Up to [local] / sys / ddb

Annotation of sys/ddb/db_command.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: db_command.c,v 1.45 2006/09/30 14:31:28 mickey Exp $  */
                      2: /*     $NetBSD: db_command.c,v 1.20 1996/03/30 22:30:05 christos Exp $ */
                      3:
                      4: /*
                      5:  * Mach Operating System
                      6:  * Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University
                      7:  * All Rights Reserved.
                      8:  *
                      9:  * Permission to use, copy, modify and distribute this software and its
                     10:  * documentation is hereby granted, provided that both the copyright
                     11:  * notice and this permission notice appear in all copies of the
                     12:  * software, derivative works or modified versions, and any portions
                     13:  * thereof, and that both notices appear in supporting documentation.
                     14:  *
                     15:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     16:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     17:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     18:  *
                     19:  * Carnegie Mellon requests users of this software to return to
                     20:  *
                     21:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     22:  *  School of Computer Science
                     23:  *  Carnegie Mellon University
                     24:  *  Pittsburgh PA 15213-3890
                     25:  *
                     26:  * any improvements or extensions that they make and grant Carnegie Mellon
                     27:  * the rights to redistribute these changes.
                     28:  */
                     29:
                     30: /*
                     31:  * Command dispatcher.
                     32:  */
                     33: #include <sys/param.h>
                     34: #include <sys/systm.h>
                     35: #include <sys/proc.h>
                     36: #include <sys/reboot.h>
                     37: #include <sys/extent.h>
                     38: #include <sys/pool.h>
                     39: #include <sys/msgbuf.h>
                     40: #include <sys/malloc.h>
                     41:
                     42: #include <uvm/uvm_extern.h>
                     43: #include <machine/db_machdep.h>                /* type definitions */
                     44:
                     45: #include <ddb/db_lex.h>
                     46: #include <ddb/db_output.h>
                     47: #include <ddb/db_command.h>
                     48: #include <ddb/db_break.h>
                     49: #include <ddb/db_watch.h>
                     50: #include <ddb/db_run.h>
                     51: #include <ddb/db_variables.h>
                     52: #include <ddb/db_interface.h>
                     53: #include <ddb/db_sym.h>
                     54: #include <ddb/db_extern.h>
                     55:
                     56: #include <uvm/uvm_ddb.h>
                     57:
                     58: /*
                     59:  * Exported global variables
                     60:  */
                     61: boolean_t      db_cmd_loop_done;
                     62: label_t                *db_recover;
                     63:
                     64: /*
                     65:  * if 'ed' style: 'dot' is set at start of last item printed,
                     66:  * and '+' points to next line.
                     67:  * Otherwise: 'dot' points to next item, '..' points to last.
                     68:  */
                     69: boolean_t      db_ed_style = TRUE;
                     70:
                     71: db_addr_t      db_dot;         /* current location */
                     72: db_addr_t      db_last_addr;   /* last explicit address typed */
                     73: db_addr_t      db_prev;        /* last address examined
                     74:                                   or written */
                     75: db_addr_t      db_next;        /* next address to be examined
                     76:                                   or written */
                     77:
                     78: /*
                     79:  * Utility routine - discard tokens through end-of-line.
                     80:  */
                     81: void
                     82: db_skip_to_eol(void)
                     83: {
                     84:        int     t;
                     85:        do {
                     86:            t = db_read_token();
                     87:        } while (t != tEOL);
                     88: }
                     89:
                     90: /*
                     91:  * Results of command search.
                     92:  */
                     93: #define        CMD_UNIQUE      0
                     94: #define        CMD_FOUND       1
                     95: #define        CMD_NONE        2
                     96: #define        CMD_AMBIGUOUS   3
                     97:
                     98: /*
                     99:  * Search for command prefix.
                    100:  */
                    101: int
                    102: db_cmd_search(char *name, struct db_command *table, struct db_command **cmdp)
                    103: {
                    104:        struct db_command       *cmd;
                    105:        int                     result = CMD_NONE;
                    106:
                    107:        for (cmd = table; cmd->name != 0; cmd++) {
                    108:            char *lp;
                    109:            char *rp;
                    110:            int  c;
                    111:
                    112:            lp = name;
                    113:            rp = cmd->name;
                    114:            while ((c = *lp) == *rp) {
                    115:                if (c == 0) {
                    116:                    /* complete match */
                    117:                    *cmdp = cmd;
                    118:                    return (CMD_UNIQUE);
                    119:                }
                    120:                lp++;
                    121:                rp++;
                    122:            }
                    123:            if (c == 0) {
                    124:                /* end of name, not end of command -
                    125:                   partial match */
                    126:                if (result == CMD_FOUND) {
                    127:                    result = CMD_AMBIGUOUS;
                    128:                    /* but keep looking for a full match -
                    129:                       this lets us match single letters */
                    130:                }
                    131:                else {
                    132:                    *cmdp = cmd;
                    133:                    result = CMD_FOUND;
                    134:                }
                    135:            }
                    136:        }
                    137:        return (result);
                    138: }
                    139:
                    140: void
                    141: db_cmd_list(struct db_command *table)
                    142: {
                    143:        struct db_command *cmd;
                    144:
                    145:        for (cmd = table; cmd->name != 0; cmd++) {
                    146:            db_printf("%-12s", cmd->name);
                    147:            db_end_line(12);
                    148:        }
                    149: }
                    150:
                    151: void
                    152: db_command(struct db_command **last_cmdp, struct db_command *cmd_table)
                    153: {
                    154:        struct db_command       *cmd;
                    155:        int             t;
                    156:        char            modif[TOK_STRING_SIZE];
                    157:        db_expr_t       addr, count;
                    158:        boolean_t       have_addr = FALSE;
                    159:        int             result;
                    160:
                    161:        t = db_read_token();
                    162:        if (t == tEOL) {
                    163:            /* empty line repeats last command, at 'next' */
                    164:            cmd = *last_cmdp;
                    165:            addr = (db_expr_t)db_next;
                    166:            have_addr = FALSE;
                    167:            count = 1;
                    168:            modif[0] = '\0';
                    169:        }
                    170:        else if (t == tEXCL) {
                    171:            db_fncall(0, 0, 0, NULL);
                    172:            return;
                    173:        }
                    174:        else if (t != tIDENT) {
                    175:            db_printf("?\n");
                    176:            db_flush_lex();
                    177:            return;
                    178:        }
                    179:        else {
                    180:            /*
                    181:             * Search for command
                    182:             */
                    183:            while (cmd_table) {
                    184:                result = db_cmd_search(db_tok_string,
                    185:                                       cmd_table,
                    186:                                       &cmd);
                    187:                switch (result) {
                    188:                    case CMD_NONE:
                    189:                        db_printf("No such command\n");
                    190:                        db_flush_lex();
                    191:                        return;
                    192:                    case CMD_AMBIGUOUS:
                    193:                        db_printf("Ambiguous\n");
                    194:                        db_flush_lex();
                    195:                        return;
                    196:                    default:
                    197:                        break;
                    198:                }
                    199:                if ((cmd_table = cmd->more) != 0) {
                    200:                    t = db_read_token();
                    201:                    if (t != tIDENT) {
                    202:                        db_cmd_list(cmd_table);
                    203:                        db_flush_lex();
                    204:                        return;
                    205:                    }
                    206:                }
                    207:            }
                    208:
                    209:            if ((cmd->flag & CS_OWN) == 0) {
                    210:                /*
                    211:                 * Standard syntax:
                    212:                 * command [/modifier] [addr] [,count]
                    213:                 */
                    214:                t = db_read_token();
                    215:                if (t == tSLASH) {
                    216:                    t = db_read_token();
                    217:                    if (t != tIDENT) {
                    218:                        db_printf("Bad modifier\n");
                    219:                        db_flush_lex();
                    220:                        return;
                    221:                    }
                    222:                    db_strlcpy(modif, db_tok_string, sizeof(modif));
                    223:                }
                    224:                else {
                    225:                    db_unread_token(t);
                    226:                    modif[0] = '\0';
                    227:                }
                    228:
                    229:                if (db_expression(&addr)) {
                    230:                    db_dot = (db_addr_t) addr;
                    231:                    db_last_addr = db_dot;
                    232:                    have_addr = TRUE;
                    233:                }
                    234:                else {
                    235:                    addr = (db_expr_t) db_dot;
                    236:                    have_addr = FALSE;
                    237:                }
                    238:                t = db_read_token();
                    239:                if (t == tCOMMA) {
                    240:                    if (!db_expression(&count)) {
                    241:                        db_printf("Count missing\n");
                    242:                        db_flush_lex();
                    243:                        return;
                    244:                    }
                    245:                }
                    246:                else {
                    247:                    db_unread_token(t);
                    248:                    count = -1;
                    249:                }
                    250:                if ((cmd->flag & CS_MORE) == 0) {
                    251:                    db_skip_to_eol();
                    252:                }
                    253:            }
                    254:        }
                    255:        *last_cmdp = cmd;
                    256:        if (cmd != 0) {
                    257:            /*
                    258:             * Execute the command.
                    259:             */
                    260:            (*cmd->fcn)(addr, have_addr, count, modif);
                    261:
                    262:            if (cmd->flag & CS_SET_DOT) {
                    263:                /*
                    264:                 * If command changes dot, set dot to
                    265:                 * previous address displayed (if 'ed' style).
                    266:                 */
                    267:                if (db_ed_style) {
                    268:                    db_dot = db_prev;
                    269:                }
                    270:                else {
                    271:                    db_dot = db_next;
                    272:                }
                    273:            }
                    274:            else {
                    275:                /*
                    276:                 * If command does not change dot,
                    277:                 * set 'next' location to be the same.
                    278:                 */
                    279:                db_next = db_dot;
                    280:            }
                    281:        }
                    282: }
                    283:
                    284: /*ARGSUSED*/
                    285: void
                    286: db_buf_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    287: {
                    288:        boolean_t full = FALSE;
                    289:
                    290:        if (modif[0] == 'f')
                    291:                full = TRUE;
                    292:
                    293:        vfs_buf_print((struct buf *) addr, full, db_printf);
                    294: }
                    295:
                    296: /*ARGSUSED*/
                    297: void
                    298: db_map_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    299: {
                    300:         boolean_t full = FALSE;
                    301:
                    302:         if (modif[0] == 'f')
                    303:                 full = TRUE;
                    304:
                    305:         uvm_map_printit((struct vm_map *) addr, full, db_printf);
                    306: }
                    307:
                    308: /*ARGSUSED*/
                    309: void
                    310: db_malloc_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    311: {
                    312: #if defined(MALLOC_DEBUG)
                    313:        extern void debug_malloc_printit(int (*)(const char *, ...), vaddr_t);
                    314:
                    315:        if (!have_addr)
                    316:                addr = 0;
                    317:
                    318:        debug_malloc_printit(db_printf, (vaddr_t)addr);
                    319: #else
                    320:        malloc_printit(db_printf);
                    321: #endif
                    322: }
                    323:
                    324: /*ARGSUSED*/
                    325: void
                    326: db_mount_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    327: {
                    328:        boolean_t full = FALSE;
                    329:
                    330:        if (modif[0] == 'f')
                    331:                full = TRUE;
                    332:
                    333:        vfs_mount_print((struct mount *) addr, full, db_printf);
                    334: }
                    335:
                    336: /*ARGSUSED*/
                    337: void
                    338: db_object_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    339: {
                    340:         boolean_t full = FALSE;
                    341:
                    342:         if (modif[0] == 'f')
                    343:                 full = TRUE;
                    344:
                    345:        uvm_object_printit((struct uvm_object *) addr, full, db_printf);
                    346: }
                    347:
                    348: /*ARGSUSED*/
                    349: void
                    350: db_page_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    351: {
                    352:         boolean_t full = FALSE;
                    353:
                    354:         if (modif[0] == 'f')
                    355:                 full = TRUE;
                    356:
                    357:        uvm_page_printit((struct vm_page *) addr, full, db_printf);
                    358: }
                    359:
                    360: /*ARGSUSED*/
                    361: void
                    362: db_vnode_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    363: {
                    364:        boolean_t full = FALSE;
                    365:
                    366:        if (modif[0] == 'f')
                    367:                full = TRUE;
                    368:
                    369:        vfs_vnode_print((struct vnode *) addr, full, db_printf);
                    370: }
                    371:
                    372: /*ARGSUSED*/
                    373: void
                    374: db_show_panic_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    375: {
                    376:        if (panicstr)
                    377:                db_printf("%s\n", panicstr);
                    378:        else
                    379:                db_printf("the kernel did not panic\n");        /* yet */
                    380: }
                    381:
                    382: /*ARGSUSED*/
                    383: void
                    384: db_extent_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    385: {
                    386:        extent_print_all();
                    387: }
                    388:
                    389: /*ARGSUSED*/
                    390: void
                    391: db_pool_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    392: {
                    393:        pool_printit((struct pool *)addr, modif, db_printf);
                    394: }
                    395:
                    396: /*ARGSUSED*/
                    397: void
                    398: db_proc_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    399: {
                    400:        if (!have_addr)
                    401:                addr = (db_expr_t)curproc;
                    402:
                    403:        proc_printit((struct proc *)addr, modif, db_printf);
                    404: }
                    405:
                    406: /*ARGSUSED*/
                    407: void
                    408: db_uvmexp_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    409: {
                    410:        uvmexp_print(db_printf);
                    411: }
                    412:
                    413: /*
                    414:  * 'show' commands
                    415:  */
                    416:
                    417: struct db_command db_show_all_cmds[] = {
                    418:        { "procs",      db_show_all_procs,      0, NULL },
                    419:        { "callout",    db_show_callout,        0, NULL },
                    420:        { "pools",      db_show_all_pools,      0, NULL },
                    421:        { NULL,         NULL,                   0, NULL }
                    422: };
                    423:
                    424: struct db_command db_show_cmds[] = {
                    425:        { "all",        NULL,                   0,      db_show_all_cmds },
                    426:        { "breaks",     db_listbreak_cmd,       0,      NULL },
                    427:        { "buf",        db_buf_print_cmd,       0,      NULL },
                    428:        { "extents",    db_extent_print_cmd,    0,      NULL },
                    429:        { "malloc",     db_malloc_print_cmd,    0,      NULL },
                    430:        { "map",        db_map_print_cmd,       0,      NULL },
                    431:        { "mount",      db_mount_print_cmd,     0,      NULL },
                    432:        { "object",     db_object_print_cmd,    0,      NULL },
                    433:        { "page",       db_page_print_cmd,      0,      NULL },
                    434:        { "panic",      db_show_panic_cmd,      0,      NULL },
                    435:        { "pool",       db_pool_print_cmd,      0,      NULL },
                    436:        { "proc",       db_proc_print_cmd,      0,      NULL },
                    437:        { "registers",  db_show_regs,           0,      NULL },
                    438:        { "uvmexp",     db_uvmexp_print_cmd,    0,      NULL },
                    439:        { "vnode",      db_vnode_print_cmd,     0,      NULL },
                    440:        { "watches",    db_listwatch_cmd,       0,      NULL },
                    441:        { NULL,         NULL,                   0,      NULL }
                    442: };
                    443:
                    444: struct db_command db_boot_cmds[] = {
                    445:        { "sync",       db_boot_sync_cmd,       0,      0 },
                    446:        { "crash",      db_boot_crash_cmd,      0,      0 },
                    447:        { "dump",       db_boot_dump_cmd,       0,      0 },
                    448:        { "halt",       db_boot_halt_cmd,       0,      0 },
                    449:        { "reboot",     db_boot_reboot_cmd,     0,      0 },
                    450:        { "poweroff",   db_boot_poweroff_cmd,   0,      0 },
                    451:        { NULL, }
                    452: };
                    453:
                    454: struct db_command db_command_table[] = {
                    455: #ifdef DB_MACHINE_COMMANDS
                    456:   /* this must be the first entry, if it exists */
                    457:        { "machine",    NULL,                   0,              NULL},
                    458: #endif
                    459:        { "print",      db_print_cmd,           0,              NULL },
                    460:        { "examine",    db_examine_cmd,         CS_SET_DOT,     NULL },
                    461:        { "x",          db_examine_cmd,         CS_SET_DOT,     NULL },
                    462:        { "search",     db_search_cmd,          CS_OWN|CS_SET_DOT, NULL },
                    463:        { "set",        db_set_cmd,             CS_OWN,         NULL },
                    464:        { "write",      db_write_cmd,           CS_MORE|CS_SET_DOT, NULL },
                    465:        { "w",          db_write_cmd,           CS_MORE|CS_SET_DOT, NULL },
                    466:        { "delete",     db_delete_cmd,          0,              NULL },
                    467:        { "d",          db_delete_cmd,          0,              NULL },
                    468:        { "break",      db_breakpoint_cmd,      0,              NULL },
                    469:        { "dwatch",     db_deletewatch_cmd,     0,              NULL },
                    470:        { "watch",      db_watchpoint_cmd,      CS_MORE,        NULL },
                    471:        { "step",       db_single_step_cmd,     0,              NULL },
                    472:        { "s",          db_single_step_cmd,     0,              NULL },
                    473:        { "continue",   db_continue_cmd,        0,              NULL },
                    474:        { "c",          db_continue_cmd,        0,              NULL },
                    475:        { "until",      db_trace_until_call_cmd,0,              NULL },
                    476:        { "next",       db_trace_until_matching_cmd,0,          NULL },
                    477:        { "match",      db_trace_until_matching_cmd,0,          NULL },
                    478:        { "trace",      db_stack_trace_cmd,     0,              NULL },
                    479:        { "call",       db_fncall,              CS_OWN,         NULL },
                    480:        { "ps",         db_show_all_procs,      0,              NULL },
                    481:        { "callout",    db_show_callout,        0,              NULL },
                    482:        { "show",       NULL,                   0,              db_show_cmds },
                    483:        { "boot",       NULL,                   0,              db_boot_cmds },
                    484:        { "help",       db_help_cmd,            0,              NULL },
                    485:        { "hangman",    db_hangman,             0,              NULL },
                    486:        { "dmesg",      db_dmesg_cmd,           0,              NULL },
                    487:        { NULL,         NULL,                   0,              NULL }
                    488: };
                    489:
                    490: #ifdef DB_MACHINE_COMMANDS
                    491:
                    492: /* this function should be called to install the machine dependent
                    493:    commands. It should be called before the debugger is enabled  */
                    494: void db_machine_commands_install(struct db_command *ptr)
                    495: {
                    496:   db_command_table[0].more = ptr;
                    497:   return;
                    498: }
                    499:
                    500: #endif
                    501:
                    502: struct db_command      *db_last_command = 0;
                    503:
                    504: void
                    505: db_help_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    506: {
                    507:        db_cmd_list(db_command_table);
                    508: }
                    509:
                    510: void
                    511: db_command_loop(void)
                    512: {
                    513:        label_t         db_jmpbuf;
                    514:        label_t         *savejmp;
                    515:        extern int      db_output_line;
                    516:
                    517:        /*
                    518:         * Initialize 'prev' and 'next' to dot.
                    519:         */
                    520:        db_prev = db_dot;
                    521:        db_next = db_dot;
                    522:
                    523:        db_cmd_loop_done = 0;
                    524:
                    525:        savejmp = db_recover;
                    526:        db_recover = &db_jmpbuf;
                    527:        (void) setjmp(&db_jmpbuf);
                    528:
                    529:        while (!db_cmd_loop_done) {
                    530:
                    531:                if (db_print_position() != 0)
                    532:                        db_printf("\n");
                    533:                db_output_line = 0;
                    534:
                    535: #ifdef MULTIPROCESSOR
                    536:                db_printf("ddb{%d}> ", CPU_INFO_UNIT(curcpu()));
                    537: #else
                    538:                db_printf("ddb> ");
                    539: #endif
                    540:                (void) db_read_line();
                    541:
                    542:                db_command(&db_last_command, db_command_table);
                    543:        }
                    544:
                    545:        db_recover = savejmp;
                    546: }
                    547:
                    548: void
                    549: db_error(char *s)
                    550: {
                    551:        if (s)
                    552:                db_printf("%s", s);
                    553:        db_flush_lex();
                    554:        longjmp(db_recover);
                    555: }
                    556:
                    557:
                    558: /*
                    559:  * Call random function:
                    560:  * !expr(arg,arg,arg)
                    561:  */
                    562: /*ARGSUSED*/
                    563: void
                    564: db_fncall(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
                    565: {
                    566:        db_expr_t       fn_addr;
                    567: #define        MAXARGS         11
                    568:        db_expr_t       args[MAXARGS];
                    569:        int             nargs = 0;
                    570:        db_expr_t       retval;
                    571:        db_expr_t       (*func)(db_expr_t, ...);
                    572:        int             t;
                    573:
                    574:        if (!db_expression(&fn_addr)) {
                    575:            db_printf("Bad function\n");
                    576:            db_flush_lex();
                    577:            return;
                    578:        }
                    579:        func = (db_expr_t (*)(db_expr_t, ...)) fn_addr;
                    580:
                    581:        t = db_read_token();
                    582:        if (t == tLPAREN) {
                    583:            if (db_expression(&args[0])) {
                    584:                nargs++;
                    585:                while ((t = db_read_token()) == tCOMMA) {
                    586:                    if (nargs == MAXARGS) {
                    587:                        db_printf("Too many arguments\n");
                    588:                        db_flush_lex();
                    589:                        return;
                    590:                    }
                    591:                    if (!db_expression(&args[nargs])) {
                    592:                        db_printf("Argument missing\n");
                    593:                        db_flush_lex();
                    594:                        return;
                    595:                    }
                    596:                    nargs++;
                    597:                }
                    598:                db_unread_token(t);
                    599:            }
                    600:            if (db_read_token() != tRPAREN) {
                    601:                db_printf("?\n");
                    602:                db_flush_lex();
                    603:                return;
                    604:            }
                    605:        }
                    606:        db_skip_to_eol();
                    607:
                    608:        while (nargs < MAXARGS) {
                    609:            args[nargs++] = 0;
                    610:        }
                    611:
                    612:        retval = (*func)(args[0], args[1], args[2], args[3], args[4],
                    613:                         args[5], args[6], args[7], args[8], args[9]);
                    614:        db_printf("%#n\n", retval);
                    615: }
                    616:
                    617: void
                    618: db_boot_sync_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    619: {
                    620:        boot(RB_AUTOBOOT | RB_TIMEBAD | RB_USERREQ);
                    621: }
                    622:
                    623: void
                    624: db_boot_crash_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    625: {
                    626:        boot(RB_NOSYNC | RB_DUMP | RB_TIMEBAD | RB_USERREQ);
                    627: }
                    628:
                    629: void
                    630: db_boot_dump_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    631: {
                    632:        boot(RB_DUMP | RB_TIMEBAD | RB_USERREQ);
                    633: }
                    634:
                    635: void
                    636: db_boot_halt_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    637: {
                    638:        boot(RB_NOSYNC | RB_HALT | RB_TIMEBAD | RB_USERREQ);
                    639: }
                    640:
                    641: void
                    642: db_boot_reboot_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    643: {
                    644:        boot(RB_AUTOBOOT | RB_NOSYNC | RB_TIMEBAD | RB_USERREQ);
                    645: }
                    646:
                    647: void
                    648: db_boot_poweroff_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    649: {
                    650:        boot(RB_NOSYNC | RB_HALT | RB_POWERDOWN | RB_TIMEBAD | RB_USERREQ);
                    651: }
                    652:
                    653: void
                    654: db_dmesg_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif)
                    655: {
                    656:        int i, off;
                    657:        char *p;
                    658:
                    659:        if (!msgbufp || msgbufp->msg_magic != MSG_MAGIC)
                    660:                return;
                    661:        off = msgbufp->msg_bufx;
                    662:        if (off > msgbufp->msg_bufs)
                    663:                off = 0;
                    664:        for (i = 0, p = msgbufp->msg_bufc + off;
                    665:            i < msgbufp->msg_bufs; i++, p++) {
                    666:                if (p >= msgbufp->msg_bufc + msgbufp->msg_bufs)
                    667:                        p = msgbufp->msg_bufc;
                    668:                if (*p != '\0')
                    669:                        db_putchar(*p);
                    670:        }
                    671:        db_putchar('\n');
                    672: }
                    673:
                    674: void
                    675: db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
                    676:     char *modif)
                    677: {
                    678:        db_stack_trace_print(addr, have_addr, count, modif, db_printf);
                    679: }

CVSweb