Annotation of Gnu-Mach/kern/debug.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1993 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: 
                     27: #include <mach_kdb.h>
                     28: #include <norma_ipc.h>
                     29: #include <cpus.h>
                     30: 
                     31: #include "cpu_number.h"
                     32: #include <kern/lock.h>
                     33: #include <sys/varargs.h>
                     34: #include <kern/thread.h>
                     35: 
                     36: 
                     37: 
                     38: extern void cnputc();
                     39: void Debugger();
                     40: 
                     41: #if    MACH_KDB
                     42: extern int db_breakpoints_inserted;
                     43: #endif
                     44: 
                     45: #if NCPUS>1
                     46: simple_lock_data_t Assert_print_lock; /* uninited, we take our chances */
                     47: #endif
                     48: 
                     49: void
                     50: Assert(char *exp, char *file, int line)
                     51: {
                     52: #if NCPUS > 1
                     53:        simple_lock(&Assert_print_lock);
                     54:        printf("{%d} Assertion failed: file \"%s\", line %d\n", 
                     55:               cpu_number(), file, line);
                     56:        simple_unlock(&Assert_print_lock);
                     57: #else
                     58:        printf("Assertion `%s' failed in file \"%s\", line %d\n",
                     59:                exp, file, line);
                     60: #endif
                     61: 
                     62: #if    MACH_KDB
                     63:        if (db_breakpoints_inserted)
                     64: #endif
                     65:        Debugger("assertion failure");
                     66: }
                     67: 
                     68: void Debugger(message)
                     69:        char *  message;
                     70: {
                     71: #if    !MACH_KDB
                     72:        panic("Debugger invoked, but there isn't one!");
                     73: #endif
                     74: 
                     75: #ifdef lint
                     76:        message++;
                     77: #endif /* lint */
                     78: 
                     79: #if    defined(vax) || defined(PC532)
                     80:        asm("bpt");
                     81: #endif /* vax */
                     82: 
                     83: #ifdef sun3
                     84:        current_thread()->pcb->flag |= TRACE_KDB;
                     85:        asm("orw  #0x00008000,sr");
                     86: #endif /* sun3 */
                     87: #ifdef sun4
                     88:        current_thread()->pcb->pcb_flag |= TRACE_KDB;
                     89:        asm("ta 0x81");
                     90: #endif /* sun4 */
                     91: 
                     92: #if    defined(mips ) || defined(luna88k) || defined(i860) || defined(alpha)
                     93:        gimmeabreak();
                     94: #endif
                     95: 
                     96: #ifdef i386
                     97:        asm("int3");
                     98: #endif
                     99: }
                    100: 
                    101: /* Be prepared to panic anytime,
                    102:    even before panic_init() gets called from the "normal" place in kern/startup.c.
                    103:    (panic_init() still needs to be called from there
                    104:    to make sure we get initialized before starting multiple processors.)  */
                    105: boolean_t              panic_lock_initialized = FALSE;
                    106: decl_simple_lock_data(,        panic_lock)
                    107: 
                    108: char                   *panicstr;
                    109: int                    paniccpu;
                    110: 
                    111: void
                    112: panic_init()
                    113: {
                    114:        if (!panic_lock_initialized)
                    115:        {
                    116:                panic_lock_initialized = TRUE;
                    117:                simple_lock_init(&panic_lock);
                    118:        }
                    119: }
                    120: 
                    121: /*VARARGS1*/
                    122: void
                    123: panic(s, va_alist)
                    124:        char *  s;
                    125:        va_dcl
                    126: {
                    127:        va_list listp;
                    128: #if    NORMA_IPC
                    129:        extern int _node_self;  /* node_self() may not be callable yet */
                    130: #endif /* NORMA_IPC */
                    131: 
                    132:        panic_init();
                    133: 
                    134:        simple_lock(&panic_lock);
                    135:        if (panicstr) {
                    136:            if (cpu_number() != paniccpu) {
                    137:                simple_unlock(&panic_lock);
                    138:                halt_cpu();
                    139:                /* NOTREACHED */
                    140:            }
                    141:        }
                    142:        else {
                    143:            panicstr = s;
                    144:            paniccpu = cpu_number();
                    145:        }
                    146:        simple_unlock(&panic_lock);
                    147:        printf("panic");
                    148: #if    NORMA_IPC
                    149:        printf("(node %U)", _node_self);
                    150: #endif
                    151: #if    NCPUS > 1
                    152:        printf("(cpu %U)", paniccpu);
                    153: #endif
                    154:        printf(": ");
                    155:        va_start(listp);
                    156:        _doprnt(s, &listp, cnputc, 0);
                    157:        va_end(listp);
                    158:        printf("\n");
                    159: 
                    160:        /* Give the user time to see the message */
                    161:        {
                    162:          int i = 60;           /* seconds */
                    163:          while (i--)
                    164:            delay (1000000);    /* microseconds */
                    165:        }
                    166: 
                    167: #if    MACH_KDB
                    168:        Debugger("panic");
                    169: #else
                    170:        halt_all_cpus (1);
                    171: #endif
                    172: }
                    173: 
                    174: /*
                    175:  * We'd like to use BSD's log routines here...
                    176:  */
                    177: /*VARARGS2*/
                    178: void
                    179: log(level, fmt, va_alist)
                    180:        int     level;
                    181:        char *  fmt;
                    182:        va_dcl
                    183: {
                    184:        va_list listp;
                    185: 
                    186: #ifdef lint
                    187:        level++;
                    188: #endif
                    189:        va_start(listp);
                    190:        _doprnt(fmt, &listp, cnputc, 0);
                    191:        va_end(listp);
                    192: }

unix.superglobalmegacorp.com

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