|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.