Annotation of coherent/b/kernel/i386/die.c, revision 1.1.1.1

1.1       root        1: #if KLAATU
                      2: #define SERIAL_CONSOLE 1
                      3: #define INS8250 0x3f8  /* klaatu */
                      4: #endif
                      5: 
                      6: #if GORT
                      7: #define SERIAL_CONSOLE 1
                      8: #define        INS8250 0x290   /* gort */
                      9: #endif
                     10: 
                     11: #ifndef INS8250
                     12: #define INS8250 0x3f8
                     13: #endif
                     14: 
                     15: /*
                     16:  * die.c -- Get information out from a very young kernel which probably
                     17:  * can't do printf()'s.
                     18:  */
                     19: 
                     20: #include <sys/coherent.h>
                     21: #include <sys/mmu.h>
                     22: #include <ctype.h>
                     23: 
                     24: #define COLOR  ((char *) (0x0000B0000 + ctob(SBASE-PBASE)))
                     25: #define MONO   ((char *) (0x0000B8000 + ctob(SBASE-PBASE)))
                     26: #define PAGING (0x80000000)    /* Paging bit in cr0, set if paging is on.  */
                     27: static int chirp_off;
                     28: 
                     29: /*
                     30:  * void _chirp(char c, off);
                     31:  * Put character 'c' directly in video memory at offset 'off';
                     32:  *
                     33:  * This routine must not use any static variables, since the .data
                     34:  * segment is not necessarily available yet.
                     35:  */
                     36: void
                     37: _chirp(c, off)
                     38: char c;
                     39: int off;
                     40: {
                     41: #if SERIAL_CONSOLE
                     42:        __putchar(c);
                     43: #else
                     44:        if (!paging()) {
                     45:                *(COLOR + off) = c;
                     46:                *(MONO + off) = c;
                     47:        } else {
                     48:                *((char *) (ctob(VIDEOa) + off)) = c;
                     49:                *((char *) (ctob(VIDEOb) + off)) = c;
                     50:        }
                     51: #endif
                     52: } /* _chirp() */
                     53: 
                     54: /*
                     55:  * void chirp(char c);
                     56:  * Put character 'c' directly in the first character of video memory;
                     57:  *
                     58:  * This routine must not use any static variables, since the .data
                     59:  * segment is not necessarily available yet.
                     60:  */
                     61: void
                     62: chirp(c)
                     63: char c;
                     64: {
                     65:        _chirp(c, 158);
                     66: } /* chirp() */
                     67: 
                     68: /*
                     69:  * void strchirp(char *str);
                     70:  * Put string 'str' directly in the next character of video memory;
                     71:  * Note that calls to chirp and dchirp do not effect what mchirp considers
                     72:  *      to be the next character.
                     73:  *
                     74:  * This routine uses a ds variable, so it must not be used until the .data
                     75:  * segment is available (this currently happens in the middle of mchinit).
                     76:  */
                     77: void
                     78: strchirp(str)
                     79: char *str;
                     80: {
                     81:        char c;
                     82:        
                     83:        while (c = *str++) {
                     84:                _chirp(c, chirp_off);
                     85:                chirp_off += 2;
                     86:        }
                     87: } /* strchirp() */
                     88: 
                     89: /*
                     90:  * void mchirp(char c);
                     91:  * Put character 'c' directly in the next character of video memory;
                     92:  * If c == 0 reset the "next" character to be the first character.
                     93:  * Note that calls to chirp and dchirp do not effect what mchirp considers
                     94:  *      to be the next character.
                     95:  *
                     96:  * This routine uses a static variable, so it must not be used until the .data
                     97:  * segment is available (this currently happens in the middle of mchinit).
                     98:  */
                     99: void
                    100: mchirp(c)
                    101: char c;
                    102: {
                    103:        if ('\0' != c) {
                    104:                _chirp(c, chirp_off);
                    105:                chirp_off += 2;
                    106:        }
                    107:        else
                    108:                chirp_off = 0;
                    109: } /* mchirp() */
                    110: 
                    111: /*
                    112:  * void dchirp(char c, charpos);
                    113:  * Put character 'c' directly in the 'charpos' character of video memory;
                    114:  *
                    115:  * This routine must not use any static variables, since the .data
                    116:  * segment is not necessarily available yet.
                    117:  */
                    118: void
                    119: dchirp(c, charpos)
                    120:        char c;
                    121: {
                    122:        _chirp(c, charpos<<1);
                    123: } /* dchirp() */
                    124: 
                    125: /*
                    126:  * void die(char c);
                    127:  * Put character 'c' directly in video memory, and then halt.
                    128:  */
                    129: void
                    130: die(c)
                    131:        char c;
                    132: {
                    133:        _chirp(c, 0);
                    134:        for (;;) {
                    135:                halt();
                    136:        }
                    137: }
                    138: 
                    139: #define LINESIZE 80
                    140: 
                    141: /*
                    142:  * puts() -- put a NUL terminated string.
                    143:  * Takes one argument--a pointer to a NUL terminated character string.
                    144:  */
                    145: void
                    146: puts(s)
                    147:        register char *s;
                    148: {
                    149:        while (*s != '\0') {
                    150:                mchirp(*s++);
                    151:        }
                    152: 
                    153: } /* puts() */
                    154: 
                    155: 
                    156: #define BS '\010'
                    157: #define DEL '\0'       /* This is really what getchar() returns!  */
                    158: #define NAK '\025'
                    159: 
                    160: #define BITS_PER_INT16         16      /* Number of bits in an int16.  */
                    161: #define DIGITS_PER_INT16       4       /* Maximum hex digits in a 16 bit number.  */
                    162: #define DIGITS_PER_INT8                2       /* Maximum hex digits in an 8 bit number.  */
                    163: 
                    164: /*
                    165:  * Print a 32/16/8 bit integers in hexadecimal.
                    166:  */
                    167: void print32(num)      {hexprint(num,8);}
                    168: void print16(num)      {hexprint(num,4);}
                    169: void print8(num)       {hexprint(num,2);}
                    170: 
                    171: #if SERIAL_CONSOLE
                    172: #define OUTCH(c)       __putchar(c)
                    173: #else
                    174: #define OUTCH(c)       mchirp(c)
                    175: #endif
                    176: 
                    177: hexprint(n, hexdigits)
                    178: int n, hexdigits;
                    179: {
                    180:        int shift;
                    181:        char digit, outch;
                    182: 
                    183:        for (shift = 4*(hexdigits-1); shift >= 0; shift -= 4) {
                    184:                digit = (n >> shift) & 0xF;
                    185:                if (digit > 9)
                    186:                        outch = 'A'+digit-10;
                    187:                else
                    188:                        outch = '0'+digit;
                    189:                OUTCH(outch);
                    190:        }
                    191:        OUTCH(' ');
                    192: }
                    193: 
                    194: outch(c)
                    195: int c;
                    196: {
                    197:        OUTCH(c);
                    198: }
                    199: 
                    200: #define        ASCII   1
                    201: #define        XONXOFF 1
                    202: #define        BAUD    9600
                    203: 
                    204: /*
                    205:  *     file:   i8251.c
                    206:  *
                    207:  *     This version of putchar works with the serial lines.
                    208:  *     Various configurations are possible through conditional
                    209:  *     defines:
                    210:  *
                    211:  *     BAUD    default 9600
                    212:  *             specifies the baudrate, can be as high as 38400
                    213:  *
                    214:  *     CONSOLE default COM1:
                    215:  *             is the base address of the uart
                    216:  *
                    217:  *     ASCII   default BINARY
                    218:  *             if set, maps '\n' into CR, LF and reduces input
                    219:  *             to 7-bit
                    220:  *
                    221:  *     XONXOFF default not enabled
                    222:  *             allows user to control output
                    223:  *
                    224:  */
                    225: 
                    226: #define        THR     (INS8250+0)
                    227: #define        IER     (INS8250+1)
                    228: #define        IIR     (INS8250+2)
                    229: #define        LCR     (INS8250+3)
                    230: #define        MCR     (INS8250+4)
                    231: #define        LSR     (INS8250+5)
                    232: #define        MSR     (INS8250+6)
                    233: 
                    234: #define        RBR     THR
                    235: #define        DLL     THR
                    236: #define        DLM     IER
                    237: 
                    238: #define        DR      0x01
                    239: #define        THRE    0x20
                    240: 
                    241: __cinit()
                    242: {
                    243: #if SERIAL_CONSOLE
                    244:        register rate;
                    245: 
                    246: #if    BAUD
                    247:        rate = 115200L / BAUD;
                    248: #else
                    249:        rate = 1;
                    250: #endif
                    251:        outb(LCR, 0x00);
                    252:        outb(IER, 0x00);
                    253:        outb(LCR, 0x80);
                    254:        outb(DLL, rate);
                    255:        outb(DLM, rate>>8);
                    256:        outb(LCR, 0x03);
                    257:        outb(MCR, 0x03);
                    258:        __putchar('\007');
                    259:        __putchar('g');
                    260: #endif
                    261: }
                    262: 
                    263: #define CTLQ   0021
                    264: #define CTLS   0023
                    265: 
                    266: __getchar()
                    267: {
                    268:        register c;
                    269: 
                    270:        while( (inb(LSR) & DR) == 0 )
                    271:                ;
                    272:        c = inb( RBR );
                    273: #if    ASCII
                    274:        c &= 0x7F;
                    275: #endif
                    276:        return( c );
                    277: }
                    278: 
                    279: __putchar( c )
                    280: register c;
                    281: {
                    282:        register f;
                    283: 
                    284: #if    ASCII
                    285:        if (c == '\n')
                    286:                putchar( '\r' );
                    287: #endif
                    288:        while( ((f=inb(LSR)) & THRE) == 0 )
                    289:                ;
                    290: #if    XONXOFF
                    291:        if( (f & DR) != 0 ) {
                    292:                f = inb( RBR ) & 0x7F;
                    293:                if (f == CTLS) {
                    294:                        do {
                    295:                                while( (inb(LSR) & DR) == 0)
                    296:                                        ;
                    297:                                f = inb( RBR ) & 0x7F;
                    298:                        } while (f != CTLQ);
                    299:                }
                    300:        }
                    301: #endif
                    302:        outb( THR, c );
                    303:        return( c );
                    304: }

unix.superglobalmegacorp.com

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