|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /* Copyright (c) 1992 NeXT Computer, Inc. All rights reserved.
23: *
24: * km.m - kernel keyboard/monitor module, procedural interface.
25: *
26: * HISTORY
27: */
28:
29: #include <sys/param.h>
30: #include <sys/tty.h>
31:
32: #include <dev/ppc/cons.h>
33: #include <sys/conf.h>
34: #include <sys/systm.h>
35: #include <sys/uio.h>
36: #include <sys/fcntl.h> /* for kmopen */
37: #include <sys/errno.h>
38: #include <sys/proc.h> /* for kmopen */
39: #include <sys/msgbuf.h>
40: #include <sys/time.h>
41: #include <dev/kmreg_com.h>
42: #include <pexpert/pexpert.h>
43:
44: struct ConsoleSize {
45: unsigned short rows;
46: unsigned short cols;
47: unsigned short pixel_width;
48: unsigned short pixel_height;
49: };
50:
51: /*
52: * 'Global' variables, shared only by this file and conf.c.
53: */
54: extern struct tty cons;
55: struct tty *km_tty[1] = { &cons };
56:
57: int disableConsoleOutput;
58:
59: /*
60: * 'Global' variables, shared only by this file and kmDevice.m.
61: */
62: int initialized = 0;
63:
64: static int kmoutput(struct tty *tp);
65: static void kmstart(struct tty *tp);
66:
67: extern void KeyboardOpen(void);
68:
69: int kminit()
70: {
71: cons.t_dev = makedev(12, 0);
72: initialized = 1;
73: }
74: /*
75: * cdevsw interface to km driver.
76: */
77: int
78: kmopen(
79: dev_t dev,
80: int flag,
81: int devtype,
82: struct proc *pp)
83: {
84: int rtn;
85: int unit;
86: struct tty *tp;
87: struct winsize *wp;
88: struct ConsoleSize size;
89: int ret;
90:
91: unit = minor(dev);
92: if(unit >= 1)
93: return (ENXIO);
94:
95: tp = (struct tty *)&cons;
96: tp->t_oproc = kmstart;
97: tp->t_param = NULL;
98: tp->t_dev = dev;
99:
100: if ( !(tp->t_state & TS_ISOPEN) ) {
101: tp->t_iflag = TTYDEF_IFLAG;
102: tp->t_oflag = TTYDEF_OFLAG;
103: tp->t_cflag = (CREAD | CS8 | CLOCAL);
104: tp->t_lflag = TTYDEF_LFLAG;
105: tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
106: termioschars(&tp->t_termios);
107: ttsetwater(tp);
108: } else if ((tp->t_state & TS_XCLUDE) && pp->p_ucred->cr_uid != 0)
109: return EBUSY;
110:
111: tp->t_state |= TS_CARR_ON; /* lie and say carrier exists and is on. */
112: ret = ((*linesw[tp->t_line].l_open)(dev, tp));
113: #if FIXME
114: if (ret == 0) {
115: (*basicConsole->GetSize)(basicConsole, &size);
116: wp = &tp->t_winsize;
117: wp->ws_row = size.rows;
118: wp->ws_col = size.cols;
119: wp->ws_xpixel = size.pixel_width;
120: wp->ws_ypixel = size.pixel_height;
121: }
122: KeyboardOpen();
123: #else /* FIXME */
124: wp = &tp->t_winsize;
125: wp->ws_row = 24;
126: wp->ws_col = 80;
127: wp->ws_xpixel = 10;
128: wp->ws_ypixel = 12;
129: if (flag & O_POPUP)
130: PE_initialize_console( 0, kPETextScreen);
131: #endif /* FIXME */
132:
133: return ret;
134: }
135:
136: int
137: kmclose(
138: dev_t dev,
139: int flag,
140: int mode,
141: struct proc *p)
142: {
143:
144: struct tty *tp;
145:
146: tp = &cons;
147: (*linesw[tp->t_line].l_close)(tp,flag);
148: ttyclose(tp);
149: return (0);
150: }
151:
152: int
153: kmread(
154: dev_t dev,
155: struct uio *uio,
156: int ioflag)
157: {
158: register struct tty *tp;
159:
160: tp = &cons;
161: return ((*linesw[tp->t_line].l_read)(tp, uio, ioflag));
162: }
163:
164: int
165: kmwrite(
166: dev_t dev,
167: struct uio *uio,
168: int ioflag)
169: {
170: register struct tty *tp;
171:
172: tp = &cons;
173: return ((*linesw[tp->t_line].l_write)(tp, uio, ioflag));
174: }
175:
176: int
177: kmioctl(
178: dev_t dev,
179: int cmd,
180: caddr_t data,
181: int flag,
182: struct proc *p)
183: {
184: int error;
185: struct tty *tp = &cons;
186: struct ConsoleSize size;
187: struct winsize *wp;
188:
189: switch (cmd) {
190:
191:
192:
193: case KMIOCSIZE:
194: wp = (struct winsize *)data;
195: wp->ws_row = 24;
196: wp->ws_col = 80;
197: wp->ws_xpixel = 10;
198: wp->ws_ypixel = 12;
199: return 0;
200:
201: case TIOCSWINSZ:
202: /* Prevent changing of console size --
203: * this ensures that login doesn't revert to the
204: * termcap-defined size
205: */
206: return EINVAL;
207:
208: /* Bodge in the CLOCAL flag as the km device is always local */
209: case TIOCSETA:
210: case TIOCSETAW:
211: case TIOCSETAF: {
212: register struct termios *t = (struct termios *)data;
213: t->c_cflag |= CLOCAL;
214: /* No Break */
215: }
216: default:
217: error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
218: if (error >= 0) {
219: return error;
220: }
221: error = ttioctl (tp, cmd, data, flag, p);
222: if (error >= 0) {
223: return error;
224: }
225: else {
226: return ENOTTY;
227: }
228: }
229: }
230:
231: int
232: kmputc(
233: int c)
234: {
235:
236: if( disableConsoleOutput)
237: return( 0);
238:
239: if(!initialized)
240: return( 0);
241:
242: if(c == '\n')
243: cnputcusr('\r');
244:
245: cnputcusr(c);
246:
247: return 0;
248: }
249:
250: int
251: kmgetc(
252: dev_t dev)
253: {
254: extern int cnecho(char c);
255: int c;
256:
257: c= cngetc();
258:
259: if (c == '\r') {
260: c = '\n';
261: }
262: cnputcusr(c);
263: return c;
264: }
265:
266: int
267: kmgetc_silent(
268: dev_t dev)
269: {
270: int c;
271:
272: c= cngetc();
273: if (c == '\r') {
274: c = '\n';
275: }
276: return c;
277: }
278:
279: /*
280: * Callouts from linesw.
281: */
282:
283: #define KM_LOWAT_DELAY ((ns_time_t)1000)
284:
285: static void
286: kmstart(
287: struct tty *tp)
288: {
289: extern int hz;
290: if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
291: goto out;
292: if (tp->t_outq.c_cc == 0)
293: goto out;
294: tp->t_state |= TS_BUSY;
295: if (tp->t_outq.c_cc > tp->t_lowat) {
296: /*
297: * Start immediately.
298: */
299: kmoutput(tp);
300: }
301: else {
302: /*
303: * Wait a bit...
304: */
305: #if 0
306: /* FIXME */
307: timeout(kmoutput, tp, hz);
308: #else
309: kmoutput(tp);
310: #endif
311: }
312: out:
313: ttwwakeup(tp);
314: }
315:
316: static int
317: kmoutput(
318: struct tty *tp)
319: {
320: /*
321: * FIXME - to be grokked...copied from m68k km.c.
322: */
323: char buf[80];
324: char *cp;
325: int cc = -1;
326:
327: extern int hz;
328: while (tp->t_outq.c_cc > 0) {
329: cc = ndqb(&tp->t_outq, 0);
330: if (cc == 0)
331: break;
332: cc = min(cc, sizeof buf);
333: (void) q_to_b(&tp->t_outq, buf, cc);
334: for (cp = buf; cp < &buf[cc]; cp++) {
335: kmputc(*cp & 0x7f);
336: }
337: }
338: if (tp->t_outq.c_cc > 0) {
339: timeout(kmoutput, tp, hz);
340: }
341: tp->t_state &= ~TS_BUSY;
342: ttwwakeup(tp);
343: return 0;
344: }
345: cons_cinput(char ch)
346: {
347: struct tty *tp = &cons;
348:
349: (*linesw[tp->t_line].l_rint) (ch, tp);
350: }
351:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.