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

Annotation of sys/ddb/db_output.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: db_output.c,v 1.25 2006/07/06 18:14:14 miod Exp $     */
        !             2: /*     $NetBSD: db_output.c,v 1.13 1996/04/01 17:27:14 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:  * Printf and character output for debugger.
        !            32:  */
        !            33: #include <sys/param.h>
        !            34: #include <sys/proc.h>
        !            35: #include <sys/stdarg.h>
        !            36: #include <sys/systm.h>
        !            37:
        !            38: #include <dev/cons.h>
        !            39:
        !            40: #include <uvm/uvm_extern.h>
        !            41:
        !            42: #include <machine/db_machdep.h>
        !            43:
        !            44: #include <ddb/db_command.h>
        !            45: #include <ddb/db_output.h>
        !            46: #include <ddb/db_interface.h>
        !            47: #include <ddb/db_sym.h>
        !            48: #include <ddb/db_var.h>
        !            49: #include <ddb/db_extern.h>
        !            50:
        !            51: /*
        !            52:  *     Character output - tracks position in line.
        !            53:  *     To do this correctly, we should know how wide
        !            54:  *     the output device is - then we could zero
        !            55:  *     the line position when the output device wraps
        !            56:  *     around to the start of the next line.
        !            57:  *
        !            58:  *     Instead, we count the number of spaces printed
        !            59:  *     since the last printing character so that we
        !            60:  *     don't print trailing spaces.  This avoids most
        !            61:  *     of the wraparounds.
        !            62:  */
        !            63:
        !            64: #ifndef        DB_MAX_LINE
        !            65: #define        DB_MAX_LINE             24      /* maximum line */
        !            66: #define DB_MAX_WIDTH           80      /* maximum width */
        !            67: #endif /* DB_MAX_LINE */
        !            68:
        !            69: #define DB_MIN_MAX_WIDTH       20      /* minimum max width */
        !            70: #define DB_MIN_MAX_LINE                3       /* minimum max line */
        !            71: #define CTRL(c)                        ((c) & 0xff)
        !            72:
        !            73: int    db_output_position = 0;         /* output column */
        !            74: int    db_output_line = 0;             /* output line number */
        !            75: int    db_last_non_space = 0;          /* last non-space character */
        !            76: int    db_tab_stop_width = 8;          /* how wide are tab stops? */
        !            77: #define        NEXT_TAB(i) \
        !            78:        ((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
        !            79: int    db_max_line = DB_MAX_LINE;      /* output max lines */
        !            80: int    db_max_width = DB_MAX_WIDTH;    /* output line width */
        !            81: int    db_radix = 16;                  /* output numbers radix */
        !            82:
        !            83: static void db_more(void);
        !            84:
        !            85: /*
        !            86:  * Force pending whitespace.
        !            87:  */
        !            88: void
        !            89: db_force_whitespace(void)
        !            90: {
        !            91:        int last_print, next_tab;
        !            92:
        !            93:        last_print = db_last_non_space;
        !            94:        while (last_print < db_output_position) {
        !            95:            next_tab = NEXT_TAB(last_print);
        !            96:            if (next_tab <= db_output_position) {
        !            97:                while (last_print < next_tab) { /* DON'T send a tab!!! */
        !            98:                        cnputc(' ');
        !            99:                        last_print++;
        !           100:                }
        !           101:            }
        !           102:            else {
        !           103:                cnputc(' ');
        !           104:                last_print++;
        !           105:            }
        !           106:        }
        !           107:        db_last_non_space = db_output_position;
        !           108: }
        !           109:
        !           110: static void
        !           111: db_more(void)
        !           112: {
        !           113:        char *p;
        !           114:        int quit_output = 0;
        !           115:
        !           116:        for (p = "--db_more--"; *p; p++)
        !           117:            cnputc(*p);
        !           118:        switch(cngetc()) {
        !           119:        case ' ':
        !           120:            db_output_line = 0;
        !           121:            break;
        !           122:        case 'q':
        !           123:        case CTRL('c'):
        !           124:            db_output_line = 0;
        !           125:            quit_output = 1;
        !           126:            break;
        !           127:        default:
        !           128:            db_output_line--;
        !           129:            break;
        !           130:        }
        !           131:        p = "\b\b\b\b\b\b\b\b\b\b\b           \b\b\b\b\b\b\b\b\b\b\b";
        !           132:        while (*p)
        !           133:            cnputc(*p++);
        !           134:        if (quit_output) {
        !           135:            db_error(0);
        !           136:            /* NOTREACHED */
        !           137:        }
        !           138: }
        !           139:
        !           140: /*
        !           141:  * Output character.  Buffer whitespace.
        !           142:  */
        !           143: void
        !           144: db_putchar(int c)
        !           145: {
        !           146:        if (db_max_line >= DB_MIN_MAX_LINE && db_output_line >= db_max_line-1)
        !           147:            db_more();
        !           148:
        !           149:        if (c > ' ' && c <= '~') {
        !           150:            /*
        !           151:             * Printing character.
        !           152:             * If we have spaces to print, print them first.
        !           153:             * Use tabs if possible.
        !           154:             */
        !           155:            db_force_whitespace();
        !           156:            cnputc(c);
        !           157:            db_output_position++;
        !           158:            if (db_max_width >= DB_MIN_MAX_WIDTH
        !           159:                && db_output_position >= db_max_width-1) {
        !           160:                /* auto new line */
        !           161:                cnputc('\n');
        !           162:                db_output_position = 0;
        !           163:                db_last_non_space = 0;
        !           164:                db_output_line++;
        !           165:            }
        !           166:            db_last_non_space = db_output_position;
        !           167:        }
        !           168:        else if (c == '\n') {
        !           169:            /* Return */
        !           170:            cnputc(c);
        !           171:            db_output_position = 0;
        !           172:            db_last_non_space = 0;
        !           173:            db_output_line++;
        !           174:        }
        !           175:        else if (c == '\t') {
        !           176:            /* assume tabs every 8 positions */
        !           177:            db_output_position = NEXT_TAB(db_output_position);
        !           178:        }
        !           179:        else if (c == ' ') {
        !           180:            /* space */
        !           181:            db_output_position++;
        !           182:        }
        !           183:        else if (c == '\007') {
        !           184:            /* bell */
        !           185:            cnputc(c);
        !           186:        }
        !           187:        /* other characters are assumed non-printing */
        !           188: }
        !           189:
        !           190: /*
        !           191:  * Return output position
        !           192:  */
        !           193: int
        !           194: db_print_position(void)
        !           195: {
        !           196:        return (db_output_position);
        !           197: }
        !           198:
        !           199: /*
        !           200:  * End line if too long.
        !           201:  */
        !           202: void
        !           203: db_end_line(int space)
        !           204: {
        !           205:        if (db_output_position >= db_max_width - space)
        !           206:            db_printf("\n");
        !           207: }
        !           208:
        !           209: char *
        !           210: db_format(char *buf, size_t bufsize, long val, int format, int alt, int width)
        !           211: {
        !           212:        const char *fmt;
        !           213:
        !           214:        if (format == DB_FORMAT_Z || db_radix == 16)
        !           215:                fmt = alt ? "-%#*lx" : "-%*lx";
        !           216:        else if (db_radix == 8)
        !           217:                fmt = alt ? "-%#*lo" : "-%*lo";
        !           218:        else
        !           219:                fmt = alt ? "-%#*lu" : "-%*lu";
        !           220:
        !           221:        /* The leading '-' is a nasty (and beautiful) idea from NetBSD */
        !           222:        if (val < 0 && format != DB_FORMAT_N)
        !           223:                val = -val;
        !           224:        else
        !           225:                fmt++;
        !           226:
        !           227:        snprintf(buf, bufsize, fmt, width, val);
        !           228:
        !           229:        return (buf);
        !           230: }
        !           231:
        !           232: void
        !           233: db_stack_dump(void)
        !           234: {
        !           235:        static int intrace;
        !           236:
        !           237:        if (intrace) {
        !           238:                printf("Faulted in traceback, aborting...\n");
        !           239:                return;
        !           240:        }
        !           241:
        !           242:        intrace = 1;
        !           243:        printf("Starting stack trace...\n");
        !           244:        db_stack_trace_print((db_expr_t)__builtin_frame_address(0), TRUE,
        !           245:            256 /* low limit */, "", printf);
        !           246:        printf("End of stack trace.\n");
        !           247:        intrace = 0;
        !           248: }

CVSweb