|
|
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/i386/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: ! 43: struct ConsoleSize { ! 44: unsigned short rows; ! 45: unsigned short cols; ! 46: unsigned short pixel_width; ! 47: unsigned short pixel_height; ! 48: }; ! 49: ! 50: /* ! 51: * 'Global' variables, shared only by this file and conf.c. ! 52: */ ! 53: extern struct tty cons; ! 54: struct tty *km_tty[1] = { &cons }; ! 55: ! 56: /* ! 57: * 'Global' variables, shared only by this file and kmDevice.m. ! 58: */ ! 59: int initialized = 0; ! 60: ! 61: static int kmoutput(struct tty *tp); ! 62: static void kmstart(struct tty *tp); ! 63: ! 64: extern void KeyboardOpen(void); ! 65: ! 66: int kminit() ! 67: { ! 68: cons.t_dev = makedev(12, 0); ! 69: initialized = 1; ! 70: } ! 71: /* ! 72: * cdevsw interface to km driver. ! 73: */ ! 74: int ! 75: kmopen( ! 76: dev_t dev, ! 77: int flag, ! 78: int devtype, ! 79: struct proc *pp) ! 80: { ! 81: int rtn; ! 82: int unit; ! 83: struct tty *tp; ! 84: struct winsize *wp; ! 85: struct ConsoleSize size; ! 86: int ret; ! 87: ! 88: unit = minor(dev); ! 89: if(unit >= 1) ! 90: return (ENXIO); ! 91: ! 92: tp = (struct tty *)&cons; ! 93: tp->t_oproc = kmstart; ! 94: tp->t_param = NULL; ! 95: tp->t_dev = dev; ! 96: ! 97: if ( !(tp->t_state & TS_ISOPEN) ) { ! 98: tp->t_iflag = TTYDEF_IFLAG; ! 99: tp->t_oflag = TTYDEF_OFLAG; ! 100: tp->t_cflag = (CREAD | CS8 | CLOCAL); ! 101: tp->t_lflag = TTYDEF_LFLAG; ! 102: tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; ! 103: termioschars(&tp->t_termios); ! 104: ttsetwater(tp); ! 105: } else if ((tp->t_state & TS_XCLUDE) && pp->p_ucred->cr_uid != 0) ! 106: return EBUSY; ! 107: ! 108: tp->t_state |= TS_CARR_ON; /* lie and say carrier exists and is on. */ ! 109: ret = ((*linesw[tp->t_line].l_open)(dev, tp)); ! 110: #if FIXME ! 111: if (ret == 0) { ! 112: (*basicConsole->GetSize)(basicConsole, &size); ! 113: wp = &tp->t_winsize; ! 114: wp->ws_row = size.rows; ! 115: wp->ws_col = size.cols; ! 116: wp->ws_xpixel = size.pixel_width; ! 117: wp->ws_ypixel = size.pixel_height; ! 118: } ! 119: KeyboardOpen(); ! 120: #else /* FIXME */ ! 121: wp = &tp->t_winsize; ! 122: wp->ws_row = 24; ! 123: wp->ws_col = 80; ! 124: wp->ws_xpixel = 10; ! 125: wp->ws_ypixel = 12; ! 126: #endif /* FIXME */ ! 127: ! 128: return ret; ! 129: } ! 130: ! 131: int ! 132: kmclose( ! 133: dev_t dev, ! 134: int flag, ! 135: int mode, ! 136: struct proc *p) ! 137: { ! 138: ! 139: struct tty *tp; ! 140: ! 141: tp = &cons; ! 142: (*linesw[tp->t_line].l_close)(tp,flag); ! 143: ttyclose(tp); ! 144: return (0); ! 145: } ! 146: ! 147: int ! 148: kmread( ! 149: dev_t dev, ! 150: struct uio *uio, ! 151: int ioflag) ! 152: { ! 153: register struct tty *tp; ! 154: ! 155: tp = &cons; ! 156: return ((*linesw[tp->t_line].l_read)(tp, uio, ioflag)); ! 157: } ! 158: ! 159: int ! 160: kmwrite( ! 161: dev_t dev, ! 162: struct uio *uio, ! 163: int ioflag) ! 164: { ! 165: register struct tty *tp; ! 166: ! 167: tp = &cons; ! 168: return ((*linesw[tp->t_line].l_write)(tp, uio, ioflag)); ! 169: } ! 170: ! 171: int ! 172: kmioctl( ! 173: dev_t dev, ! 174: int cmd, ! 175: caddr_t data, ! 176: int flag, ! 177: struct proc *p) ! 178: { ! 179: int error; ! 180: struct tty *tp = &cons; ! 181: struct ConsoleSize size; ! 182: struct winsize *wp; ! 183: ! 184: switch (cmd) { ! 185: ! 186: ! 187: ! 188: case KMIOCSIZE: ! 189: wp = (struct winsize *)data; ! 190: wp->ws_row = 24; ! 191: wp->ws_col = 80; ! 192: wp->ws_xpixel = 10; ! 193: wp->ws_ypixel = 12; ! 194: return 0; ! 195: ! 196: case TIOCSWINSZ: ! 197: /* Prevent changing of console size -- ! 198: * this ensures that login doesn't revert to the ! 199: * termcap-defined size ! 200: */ ! 201: return EINVAL; ! 202: ! 203: /* Bodge in the CLOCAL flag as the km device is always local */ ! 204: case TIOCSETA: ! 205: case TIOCSETAW: ! 206: case TIOCSETAF: { ! 207: register struct termios *t = (struct termios *)data; ! 208: t->c_cflag |= CLOCAL; ! 209: /* No Break */ ! 210: } ! 211: default: ! 212: error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p); ! 213: if (error >= 0) { ! 214: return error; ! 215: } ! 216: error = ttioctl (tp, cmd, data, flag, p); ! 217: if (error >= 0) { ! 218: return error; ! 219: } ! 220: else { ! 221: return ENOTTY; ! 222: } ! 223: } ! 224: } ! 225: ! 226: /* ! 227: * this works early on, after initialize_screen() but before autoconf (and thus ! 228: * before we have a kmDevice). ! 229: */ ! 230: int disableConsoleOutput; ! 231: ! 232: int ! 233: kmputc( ! 234: int c) ! 235: { ! 236: ! 237: if( disableConsoleOutput) ! 238: return( 0); ! 239: ! 240: ! 241: if(!initialized) ! 242: return( 0); ! 243: ! 244: if(c == '\n') { ! 245: cnputc('\r'); ! 246: } ! 247: cnputc(c); ! 248: return 0; ! 249: } ! 250: ! 251: int ! 252: kmgetc( ! 253: dev_t dev) ! 254: { ! 255: extern int cnputc(char c); ! 256: int c; ! 257: ! 258: c= cngetc(); ! 259: ! 260: if (c == '\r') { ! 261: c = '\n'; ! 262: } ! 263: cnputc(c); ! 264: return c; ! 265: } ! 266: ! 267: int ! 268: kmgetc_silent( ! 269: dev_t dev) ! 270: { ! 271: int c; ! 272: ! 273: c= cngetc(); ! 274: if (c == '\r') { ! 275: c = '\n'; ! 276: } ! 277: return c; ! 278: } ! 279: ! 280: /* ! 281: * Callouts from linesw. ! 282: */ ! 283: ! 284: #define KM_LOWAT_DELAY ((ns_time_t)1000) ! 285: ! 286: static void ! 287: kmstart( ! 288: struct tty *tp) ! 289: { ! 290: extern int hz; ! 291: if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) ! 292: goto out; ! 293: if (tp->t_outq.c_cc == 0) ! 294: goto out; ! 295: tp->t_state |= TS_BUSY; ! 296: if (tp->t_outq.c_cc > tp->t_lowat) { ! 297: /* ! 298: * Start immediately. ! 299: */ ! 300: kmoutput(tp); ! 301: } ! 302: else { ! 303: /* ! 304: * Wait a bit... ! 305: */ ! 306: #if 0 ! 307: /* FIXME */ ! 308: timeout(kmoutput, tp, hz); ! 309: #else ! 310: kmoutput(tp); ! 311: #endif ! 312: } ! 313: out: ! 314: ttwwakeup(tp); ! 315: } ! 316: ! 317: static int ! 318: kmoutput( ! 319: struct tty *tp) ! 320: { ! 321: /* ! 322: * FIXME - to be grokked...copied from m68k km.c. ! 323: */ ! 324: char buf[80]; ! 325: char *cp; ! 326: int cc = -1; ! 327: ! 328: extern int hz; ! 329: while (tp->t_outq.c_cc > 0) { ! 330: cc = ndqb(&tp->t_outq, 0); ! 331: if (cc == 0) ! 332: break; ! 333: cc = min(cc, sizeof buf); ! 334: (void) q_to_b(&tp->t_outq, buf, cc); ! 335: for (cp = buf; cp < &buf[cc]; cp++) { ! 336: kmputc(*cp & 0x7f); ! 337: } ! 338: } ! 339: if (tp->t_outq.c_cc > 0) { ! 340: timeout(kmoutput, tp, hz); ! 341: } ! 342: tp->t_state &= ~TS_BUSY; ! 343: ttwwakeup(tp); ! 344: return 0; ! 345: } ! 346: cons_cinput(char ch) ! 347: { ! 348: struct tty *tp = &cons; ! 349: ! 350: (*linesw[tp->t_line].l_rint) (ch, tp); ! 351: } ! 352:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.