Annotation of kernel/machdep/ppc/serial_console.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /* 
                     26:  * Mach Operating System
                     27:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
                     28:  * All Rights Reserved.
                     29:  * 
                     30:  * Permission to use, copy, modify and distribute this software and its
                     31:  * documentation is hereby granted, provided that both the copyright
                     32:  * notice and this permission notice appear in all copies of the
                     33:  * software, derivative works or modified versions, and any portions
                     34:  * thereof, and that both notices appear in supporting documentation.
                     35:  * 
                     36:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     37:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     38:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     39:  * 
                     40:  * Carnegie Mellon requests users of this software to return to
                     41:  * 
                     42:  *  Software Distribution Coordinator  or  [email protected]
                     43:  *  School of Computer Science
                     44:  *  Carnegie Mellon University
                     45:  *  Pittsburgh PA 15213-3890
                     46:  * 
                     47:  * any improvements or extensions that they make and grant Carnegie Mellon
                     48:  * the rights to redistribute these changes.
                     49:  */
                     50: /*
                     51:  */
                     52: /*
                     53:  *     File: serial_console.c
                     54:  *     Author: Alessandro Forin, Carnegie Mellon University
                     55:  *     Date:   7/91
                     56:  *
                     57:  *     Console driver for serial-line based consoles.
                     58:  */
                     59: 
                     60: #include <platforms.h>
                     61: #include <serial_console_default.h>
                     62: 
                     63: #include <mach_kdb.h>
                     64: #include <kern/spl.h>
                     65: #include <machine/machparam.h>         /* spl definitions */
                     66: #include <types.h>
                     67: #include <device/io_req.h>
                     68: #include <device/tty.h>
                     69: #include <device/conf.h>
                     70: #include <sys/syslog.h>
                     71: #include <chips/busses.h>
                     72: #include <chips/serial_console_entries.h>
                     73: #include <ppc/screen_defs.h>
                     74: #include <ppc/misc_protos.h>
                     75: #include <ppc/POWERMAC/video_console_entries.h>
                     76: #include <ppc/screen_switch.h>
                     77: 
                     78: /*
                     79:  * A machine MUST have a console.  In our case
                     80:  * things are a little complicated by the graphic
                     81:  * display: people expect it to be their "console",
                     82:  * but we'd like to be able to live without it.
                     83:  * This is not to be confused with the "rconsole" thing:
                     84:  * that just duplicates the console I/O to
                     85:  * another place (for debugging/logging purposes).
                     86:  */
                     87: 
                     88: const int console_unit = 0;
                     89: const int console_chan = CONSOLE_PORT;
                     90: 
                     91: #if MACH_KGDB
                     92: void no_spl_vcputc(char), no_spl_scputc(char);
                     93: int no_spl_vcgetc(void), no_spl_scgetc(void);
                     94: 
                     95: #define OPS(putc, getc, nosplputc, nosplgetc) putc, getc, nosplputc, nosplgetc
                     96: 
                     97: #else
                     98: 
                     99: #define OPS(putc, getc, nosplputc, nosplgetc) putc, getc
                    100: 
                    101: #endif /* MACH_KGDB */
                    102: 
                    103: const struct console_ops {
                    104:        int     (*putc)(int, int, int);
                    105:        int     (*getc)(int, int, boolean_t, boolean_t);
                    106: #if MACH_KGDB
                    107:        void    (*no_spl_putc)(char);   /* Must not do splwhatever(). */
                    108:        int     (*no_spl_getc)(void);   /* Must not do splwhatever(). */
                    109: #endif
                    110: } cons_ops[] = {
                    111: #define SCC_CONS_OPS 0
                    112:        {OPS(scc_putc, scc_getc, no_spl_scputc, no_spl_scgetc)},
                    113: #define VC_CONS_OPS 1
                    114:        {OPS(vcputc, vcgetc, no_spl_vcputc, no_spl_vcgetc)},
                    115: };
                    116: #define NCONSOPS (sizeof cons_ops / sizeof cons_ops[0])
                    117: 
                    118: #if SERIAL_CONSOLE_DEFAULT
                    119: #define CONS_OPS SCC_CONS_OPS
                    120: #define CONS_NAME "com"
                    121: #else
                    122: #define CONS_OPS VC_CONS_OPS
                    123: #define CONS_NAME "vc"
                    124: #endif
                    125: unsigned int cons_ops_index = CONS_OPS;
                    126: 
                    127: void
                    128: m3_cnputc(char c)
                    129: {
                    130:        cons_ops[cons_ops_index].putc(console_unit, console_chan, c);
                    131:        if (c == '\n')
                    132:                cnputc('\r');
                    133: }
                    134: 
                    135: int
                    136: m3_cngetc()
                    137: {
                    138:        return cons_ops[cons_ops_index].getc(console_unit, console_chan,
                    139:                                             TRUE, FALSE);
                    140: }
                    141: 
                    142: #if MACH_KGDB
                    143: void
                    144: kgdb_putc(char c)
                    145: {
                    146:        no_spl_scc_putc(KGDB_PORT, c);
                    147: }
                    148: 
                    149: int
                    150: kgdb_getc(boolean_t timeout)
                    151: {
                    152:        return no_spl_scc_getc(KGDB_PORT, timeout);
                    153: }
                    154: 
                    155: void
                    156: no_spl_putc(char c)
                    157: {
                    158:        cons_ops[cons_ops_index].no_spl_putc(c);
                    159:        if (c == '\n')
                    160:                cons_ops[cons_ops_index].no_spl_putc('\r');
                    161: }
                    162: 
                    163: int
                    164: no_spl_getc()
                    165: {
                    166:        return cons_ops[cons_ops_index].no_spl_getc();
                    167: }
                    168: 
                    169: void
                    170: no_spl_scputc(char c)
                    171: {
                    172:        no_spl_scc_putc(CONSOLE_PORT, c);
                    173: }
                    174: 
                    175: int
                    176: no_spl_scgetc()
                    177: {
                    178:        return no_spl_scc_getc(CONSOLE_PORT, FALSE);
                    179: }
                    180: 
                    181: void
                    182: no_spl_vcputc(char c)
                    183: {
                    184:        vc_putchar(c);
                    185: }
                    186: 
                    187: int
                    188: no_spl_vcgetc()
                    189: {
                    190:        return( kmtrygetc());
                    191: //     return vcgetc(0, 0, TRUE, FALSE);
                    192: }
                    193: #endif /* MACH_KGDB */
                    194: 
                    195: int    
                    196: vcputc(int a, int b, int c)
                    197: {
                    198:        return( kmputc( c));
                    199: }
                    200: 
                    201: int    
                    202: vcgetc(int a, int b, boolean_t c, boolean_t d)
                    203: {
                    204:        return( kmgetc());
                    205: }
                    206: 
                    207: int
                    208: switch_to_video_console()
                    209: {
                    210:        int old_cons_ops = cons_ops_index;
                    211:        cons_ops_index = VC_CONS_OPS;
                    212:        return old_cons_ops;
                    213: }
                    214: 
                    215: int
                    216: switch_to_serial_console()
                    217: {
                    218:        int old_cons_ops = cons_ops_index;
                    219:        cons_ops_index = SCC_CONS_OPS;
                    220:        return old_cons_ops;
                    221: }
                    222: 
                    223: /* The switch_to_{video,serial,kgdb}_console functions return a cookie that
                    224:    can be used to restore the console to whatever it was before, in the
                    225:    same way that splwhatever() and splx() work.  */
                    226: void
                    227: switch_to_old_console(int old_console)
                    228: {
                    229:        static boolean_t squawked;
                    230:        unsigned int ops = old_console;
                    231: 
                    232:        if (ops >= NCONSOPS && !squawked) {
                    233:                squawked = TRUE;
                    234:                printf("switch_to_old_console: unknown ops %d\n", ops);
                    235:        } else
                    236:                cons_ops_index = ops;
                    237: }
                    238: 
                    239: /*
                    240:  * This is basically a special form of autoconf,
                    241:  * to get printf() going before true autoconf.
                    242:  */
                    243: int
                    244: cons_find(boolean_t tube)
                    245: {
                    246:        register int             i;
                    247:        struct tty              *tp;
                    248: 
                    249:        extern struct dev_ops dev_name_list[];
                    250:        extern int dev_name_count;
                    251:        extern struct dev_indirect dev_indirect_list[];
                    252: 
                    253:        /* Set up indirect console device */
                    254: 
                    255:        for (i = 0; i < dev_name_count; i++) {
                    256:                if (strcmp(dev_name_list[i].d_name, CONS_NAME) == 0) {
                    257:                        dev_indirect_list[0].d_ops = &dev_name_list[i];
                    258:                        break;
                    259:                }
                    260:        }
                    261: 
                    262:        return  1;
                    263: }

unix.superglobalmegacorp.com

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