Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.15-rc3 1209 lines 29 kB view raw
1/* 2 * linux/drivers/char/vt_ioctl.c 3 * 4 * Copyright (C) 1992 obz under the linux copyright 5 * 6 * Dynamic diacritical handling - aeb@cwi.nl - Dec 1993 7 * Dynamic keymap and string allocation - aeb@cwi.nl - May 1994 8 * Restrict VT switching via ioctl() - grif@cs.ucr.edu - Dec 1995 9 * Some code moved for less code duplication - Andi Kleen - Mar 1997 10 * Check put/get_user, cleanups - acme@conectiva.com.br - Jun 2001 11 */ 12 13#include <linux/config.h> 14#include <linux/types.h> 15#include <linux/errno.h> 16#include <linux/sched.h> 17#include <linux/tty.h> 18#include <linux/timer.h> 19#include <linux/kernel.h> 20#include <linux/kd.h> 21#include <linux/vt.h> 22#include <linux/string.h> 23#include <linux/slab.h> 24#include <linux/major.h> 25#include <linux/fs.h> 26#include <linux/console.h> 27#include <linux/signal.h> 28#include <linux/timex.h> 29 30#include <asm/io.h> 31#include <asm/uaccess.h> 32 33#include <linux/kbd_kern.h> 34#include <linux/vt_kern.h> 35#include <linux/kbd_diacr.h> 36#include <linux/selection.h> 37 38static char vt_dont_switch; 39extern struct tty_driver *console_driver; 40 41#define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) 42#define VT_BUSY(i) (VT_IS_IN_USE(i) || i == fg_console || vc_cons[i].d == sel_cons) 43 44/* 45 * Console (vt and kd) routines, as defined by USL SVR4 manual, and by 46 * experimentation and study of X386 SYSV handling. 47 * 48 * One point of difference: SYSV vt's are /dev/vtX, which X >= 0, and 49 * /dev/console is a separate ttyp. Under Linux, /dev/tty0 is /dev/console, 50 * and the vc start at /dev/ttyX, X >= 1. We maintain that here, so we will 51 * always treat our set of vt as numbered 1..MAX_NR_CONSOLES (corresponding to 52 * ttys 0..MAX_NR_CONSOLES-1). Explicitly naming VT 0 is illegal, but using 53 * /dev/tty0 (fg_console) as a target is legal, since an implicit aliasing 54 * to the current console is done by the main ioctl code. 55 */ 56 57#ifdef CONFIG_X86 58#include <linux/syscalls.h> 59#endif 60 61static void complete_change_console(struct vc_data *vc); 62 63/* 64 * these are the valid i/o ports we're allowed to change. they map all the 65 * video ports 66 */ 67#define GPFIRST 0x3b4 68#define GPLAST 0x3df 69#define GPNUM (GPLAST - GPFIRST + 1) 70 71#define i (tmp.kb_index) 72#define s (tmp.kb_table) 73#define v (tmp.kb_value) 74static inline int 75do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, struct kbd_struct *kbd) 76{ 77 struct kbentry tmp; 78 ushort *key_map, val, ov; 79 80 if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry))) 81 return -EFAULT; 82 83 if (!capable(CAP_SYS_TTY_CONFIG)) 84 perm = 0; 85 86 switch (cmd) { 87 case KDGKBENT: 88 key_map = key_maps[s]; 89 if (key_map) { 90 val = U(key_map[i]); 91 if (kbd->kbdmode != VC_UNICODE && KTYP(val) >= NR_TYPES) 92 val = K_HOLE; 93 } else 94 val = (i ? K_HOLE : K_NOSUCHMAP); 95 return put_user(val, &user_kbe->kb_value); 96 case KDSKBENT: 97 if (!perm) 98 return -EPERM; 99 if (!i && v == K_NOSUCHMAP) { 100 /* disallocate map */ 101 key_map = key_maps[s]; 102 if (s && key_map) { 103 key_maps[s] = NULL; 104 if (key_map[0] == U(K_ALLOCATED)) { 105 kfree(key_map); 106 keymap_count--; 107 } 108 } 109 break; 110 } 111 112 if (KTYP(v) < NR_TYPES) { 113 if (KVAL(v) > max_vals[KTYP(v)]) 114 return -EINVAL; 115 } else 116 if (kbd->kbdmode != VC_UNICODE) 117 return -EINVAL; 118 119 /* ++Geert: non-PC keyboards may generate keycode zero */ 120#if !defined(__mc68000__) && !defined(__powerpc__) 121 /* assignment to entry 0 only tests validity of args */ 122 if (!i) 123 break; 124#endif 125 126 if (!(key_map = key_maps[s])) { 127 int j; 128 129 if (keymap_count >= MAX_NR_OF_USER_KEYMAPS && 130 !capable(CAP_SYS_RESOURCE)) 131 return -EPERM; 132 133 key_map = (ushort *) kmalloc(sizeof(plain_map), 134 GFP_KERNEL); 135 if (!key_map) 136 return -ENOMEM; 137 key_maps[s] = key_map; 138 key_map[0] = U(K_ALLOCATED); 139 for (j = 1; j < NR_KEYS; j++) 140 key_map[j] = U(K_HOLE); 141 keymap_count++; 142 } 143 ov = U(key_map[i]); 144 if (v == ov) 145 break; /* nothing to do */ 146 /* 147 * Attention Key. 148 */ 149 if (((ov == K_SAK) || (v == K_SAK)) && !capable(CAP_SYS_ADMIN)) 150 return -EPERM; 151 key_map[i] = U(v); 152 if (!s && (KTYP(ov) == KT_SHIFT || KTYP(v) == KT_SHIFT)) 153 compute_shiftstate(); 154 break; 155 } 156 return 0; 157} 158#undef i 159#undef s 160#undef v 161 162static inline int 163do_kbkeycode_ioctl(int cmd, struct kbkeycode __user *user_kbkc, int perm) 164{ 165 struct kbkeycode tmp; 166 int kc = 0; 167 168 if (copy_from_user(&tmp, user_kbkc, sizeof(struct kbkeycode))) 169 return -EFAULT; 170 switch (cmd) { 171 case KDGETKEYCODE: 172 kc = getkeycode(tmp.scancode); 173 if (kc >= 0) 174 kc = put_user(kc, &user_kbkc->keycode); 175 break; 176 case KDSETKEYCODE: 177 if (!perm) 178 return -EPERM; 179 kc = setkeycode(tmp.scancode, tmp.keycode); 180 break; 181 } 182 return kc; 183} 184 185static inline int 186do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) 187{ 188 struct kbsentry *kbs; 189 char *p; 190 u_char *q; 191 u_char __user *up; 192 int sz; 193 int delta; 194 char *first_free, *fj, *fnw; 195 int i, j, k; 196 int ret; 197 198 if (!capable(CAP_SYS_TTY_CONFIG)) 199 perm = 0; 200 201 kbs = kmalloc(sizeof(*kbs), GFP_KERNEL); 202 if (!kbs) { 203 ret = -ENOMEM; 204 goto reterr; 205 } 206 207 /* we mostly copy too much here (512bytes), but who cares ;) */ 208 if (copy_from_user(kbs, user_kdgkb, sizeof(struct kbsentry))) { 209 ret = -EFAULT; 210 goto reterr; 211 } 212 kbs->kb_string[sizeof(kbs->kb_string)-1] = '\0'; 213 i = kbs->kb_func; 214 215 switch (cmd) { 216 case KDGKBSENT: 217 sz = sizeof(kbs->kb_string) - 1; /* sz should have been 218 a struct member */ 219 up = user_kdgkb->kb_string; 220 p = func_table[i]; 221 if(p) 222 for ( ; *p && sz; p++, sz--) 223 if (put_user(*p, up++)) { 224 ret = -EFAULT; 225 goto reterr; 226 } 227 if (put_user('\0', up)) { 228 ret = -EFAULT; 229 goto reterr; 230 } 231 kfree(kbs); 232 return ((p && *p) ? -EOVERFLOW : 0); 233 case KDSKBSENT: 234 if (!perm) { 235 ret = -EPERM; 236 goto reterr; 237 } 238 239 q = func_table[i]; 240 first_free = funcbufptr + (funcbufsize - funcbufleft); 241 for (j = i+1; j < MAX_NR_FUNC && !func_table[j]; j++) 242 ; 243 if (j < MAX_NR_FUNC) 244 fj = func_table[j]; 245 else 246 fj = first_free; 247 248 delta = (q ? -strlen(q) : 1) + strlen(kbs->kb_string); 249 if (delta <= funcbufleft) { /* it fits in current buf */ 250 if (j < MAX_NR_FUNC) { 251 memmove(fj + delta, fj, first_free - fj); 252 for (k = j; k < MAX_NR_FUNC; k++) 253 if (func_table[k]) 254 func_table[k] += delta; 255 } 256 if (!q) 257 func_table[i] = fj; 258 funcbufleft -= delta; 259 } else { /* allocate a larger buffer */ 260 sz = 256; 261 while (sz < funcbufsize - funcbufleft + delta) 262 sz <<= 1; 263 fnw = (char *) kmalloc(sz, GFP_KERNEL); 264 if(!fnw) { 265 ret = -ENOMEM; 266 goto reterr; 267 } 268 269 if (!q) 270 func_table[i] = fj; 271 if (fj > funcbufptr) 272 memmove(fnw, funcbufptr, fj - funcbufptr); 273 for (k = 0; k < j; k++) 274 if (func_table[k]) 275 func_table[k] = fnw + (func_table[k] - funcbufptr); 276 277 if (first_free > fj) { 278 memmove(fnw + (fj - funcbufptr) + delta, fj, first_free - fj); 279 for (k = j; k < MAX_NR_FUNC; k++) 280 if (func_table[k]) 281 func_table[k] = fnw + (func_table[k] - funcbufptr) + delta; 282 } 283 if (funcbufptr != func_buf) 284 kfree(funcbufptr); 285 funcbufptr = fnw; 286 funcbufleft = funcbufleft - delta + sz - funcbufsize; 287 funcbufsize = sz; 288 } 289 strcpy(func_table[i], kbs->kb_string); 290 break; 291 } 292 ret = 0; 293reterr: 294 kfree(kbs); 295 return ret; 296} 297 298static inline int 299do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struct console_font_op *op) 300{ 301 struct consolefontdesc cfdarg; 302 int i; 303 304 if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc))) 305 return -EFAULT; 306 307 switch (cmd) { 308 case PIO_FONTX: 309 if (!perm) 310 return -EPERM; 311 op->op = KD_FONT_OP_SET; 312 op->flags = KD_FONT_FLAG_OLD; 313 op->width = 8; 314 op->height = cfdarg.charheight; 315 op->charcount = cfdarg.charcount; 316 op->data = cfdarg.chardata; 317 return con_font_op(vc_cons[fg_console].d, op); 318 case GIO_FONTX: { 319 op->op = KD_FONT_OP_GET; 320 op->flags = KD_FONT_FLAG_OLD; 321 op->width = 8; 322 op->height = cfdarg.charheight; 323 op->charcount = cfdarg.charcount; 324 op->data = cfdarg.chardata; 325 i = con_font_op(vc_cons[fg_console].d, op); 326 if (i) 327 return i; 328 cfdarg.charheight = op->height; 329 cfdarg.charcount = op->charcount; 330 if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc))) 331 return -EFAULT; 332 return 0; 333 } 334 } 335 return -EINVAL; 336} 337 338static inline int 339do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, struct vc_data *vc) 340{ 341 struct unimapdesc tmp; 342 343 if (copy_from_user(&tmp, user_ud, sizeof tmp)) 344 return -EFAULT; 345 if (tmp.entries) 346 if (!access_ok(VERIFY_WRITE, tmp.entries, 347 tmp.entry_ct*sizeof(struct unipair))) 348 return -EFAULT; 349 switch (cmd) { 350 case PIO_UNIMAP: 351 if (!perm) 352 return -EPERM; 353 return con_set_unimap(vc, tmp.entry_ct, tmp.entries); 354 case GIO_UNIMAP: 355 if (!perm && fg_console != vc->vc_num) 356 return -EPERM; 357 return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); 358 } 359 return 0; 360} 361 362/* 363 * We handle the console-specific ioctl's here. We allow the 364 * capability to modify any console, not just the fg_console. 365 */ 366int vt_ioctl(struct tty_struct *tty, struct file * file, 367 unsigned int cmd, unsigned long arg) 368{ 369 struct vc_data *vc = (struct vc_data *)tty->driver_data; 370 struct console_font_op op; /* used in multiple places here */ 371 struct kbd_struct * kbd; 372 unsigned int console; 373 unsigned char ucval; 374 void __user *up = (void __user *)arg; 375 int i, perm; 376 377 console = vc->vc_num; 378 379 if (!vc_cons_allocated(console)) /* impossible? */ 380 return -ENOIOCTLCMD; 381 382 /* 383 * To have permissions to do most of the vt ioctls, we either have 384 * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG. 385 */ 386 perm = 0; 387 if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG)) 388 perm = 1; 389 390 kbd = kbd_table + console; 391 switch (cmd) { 392 case KIOCSOUND: 393 if (!perm) 394 return -EPERM; 395 if (arg) 396 arg = CLOCK_TICK_RATE / arg; 397 kd_mksound(arg, 0); 398 return 0; 399 400 case KDMKTONE: 401 if (!perm) 402 return -EPERM; 403 { 404 unsigned int ticks, count; 405 406 /* 407 * Generate the tone for the appropriate number of ticks. 408 * If the time is zero, turn off sound ourselves. 409 */ 410 ticks = HZ * ((arg >> 16) & 0xffff) / 1000; 411 count = ticks ? (arg & 0xffff) : 0; 412 if (count) 413 count = CLOCK_TICK_RATE / count; 414 kd_mksound(count, ticks); 415 return 0; 416 } 417 418 case KDGKBTYPE: 419 /* 420 * this is naive. 421 */ 422 ucval = KB_101; 423 goto setchar; 424 425 /* 426 * These cannot be implemented on any machine that implements 427 * ioperm() in user level (such as Alpha PCs) or not at all. 428 * 429 * XXX: you should never use these, just call ioperm directly.. 430 */ 431#ifdef CONFIG_X86 432 case KDADDIO: 433 case KDDELIO: 434 /* 435 * KDADDIO and KDDELIO may be able to add ports beyond what 436 * we reject here, but to be safe... 437 */ 438 if (arg < GPFIRST || arg > GPLAST) 439 return -EINVAL; 440 return sys_ioperm(arg, 1, (cmd == KDADDIO)) ? -ENXIO : 0; 441 442 case KDENABIO: 443 case KDDISABIO: 444 return sys_ioperm(GPFIRST, GPNUM, 445 (cmd == KDENABIO)) ? -ENXIO : 0; 446#endif 447 448 /* Linux m68k/i386 interface for setting the keyboard delay/repeat rate */ 449 450 case KDKBDREP: 451 { 452 struct kbd_repeat kbrep; 453 int err; 454 455 if (!capable(CAP_SYS_TTY_CONFIG)) 456 return -EPERM; 457 458 if (copy_from_user(&kbrep, up, sizeof(struct kbd_repeat))) 459 return -EFAULT; 460 err = kbd_rate(&kbrep); 461 if (err) 462 return err; 463 if (copy_to_user(up, &kbrep, sizeof(struct kbd_repeat))) 464 return -EFAULT; 465 return 0; 466 } 467 468 case KDSETMODE: 469 /* 470 * currently, setting the mode from KD_TEXT to KD_GRAPHICS 471 * doesn't do a whole lot. i'm not sure if it should do any 472 * restoration of modes or what... 473 * 474 * XXX It should at least call into the driver, fbdev's definitely 475 * need to restore their engine state. --BenH 476 */ 477 if (!perm) 478 return -EPERM; 479 switch (arg) { 480 case KD_GRAPHICS: 481 break; 482 case KD_TEXT0: 483 case KD_TEXT1: 484 arg = KD_TEXT; 485 case KD_TEXT: 486 break; 487 default: 488 return -EINVAL; 489 } 490 if (vc->vc_mode == (unsigned char) arg) 491 return 0; 492 vc->vc_mode = (unsigned char) arg; 493 if (console != fg_console) 494 return 0; 495 /* 496 * explicitly blank/unblank the screen if switching modes 497 */ 498 acquire_console_sem(); 499 if (arg == KD_TEXT) 500 do_unblank_screen(1); 501 else 502 do_blank_screen(1); 503 release_console_sem(); 504 return 0; 505 506 case KDGETMODE: 507 ucval = vc->vc_mode; 508 goto setint; 509 510 case KDMAPDISP: 511 case KDUNMAPDISP: 512 /* 513 * these work like a combination of mmap and KDENABIO. 514 * this could be easily finished. 515 */ 516 return -EINVAL; 517 518 case KDSKBMODE: 519 if (!perm) 520 return -EPERM; 521 switch(arg) { 522 case K_RAW: 523 kbd->kbdmode = VC_RAW; 524 break; 525 case K_MEDIUMRAW: 526 kbd->kbdmode = VC_MEDIUMRAW; 527 break; 528 case K_XLATE: 529 kbd->kbdmode = VC_XLATE; 530 compute_shiftstate(); 531 break; 532 case K_UNICODE: 533 kbd->kbdmode = VC_UNICODE; 534 compute_shiftstate(); 535 break; 536 default: 537 return -EINVAL; 538 } 539 tty_ldisc_flush(tty); 540 return 0; 541 542 case KDGKBMODE: 543 ucval = ((kbd->kbdmode == VC_RAW) ? K_RAW : 544 (kbd->kbdmode == VC_MEDIUMRAW) ? K_MEDIUMRAW : 545 (kbd->kbdmode == VC_UNICODE) ? K_UNICODE : 546 K_XLATE); 547 goto setint; 548 549 /* this could be folded into KDSKBMODE, but for compatibility 550 reasons it is not so easy to fold KDGKBMETA into KDGKBMODE */ 551 case KDSKBMETA: 552 switch(arg) { 553 case K_METABIT: 554 clr_vc_kbd_mode(kbd, VC_META); 555 break; 556 case K_ESCPREFIX: 557 set_vc_kbd_mode(kbd, VC_META); 558 break; 559 default: 560 return -EINVAL; 561 } 562 return 0; 563 564 case KDGKBMETA: 565 ucval = (vc_kbd_mode(kbd, VC_META) ? K_ESCPREFIX : K_METABIT); 566 setint: 567 return put_user(ucval, (int __user *)arg); 568 569 case KDGETKEYCODE: 570 case KDSETKEYCODE: 571 if(!capable(CAP_SYS_TTY_CONFIG)) 572 perm=0; 573 return do_kbkeycode_ioctl(cmd, up, perm); 574 575 case KDGKBENT: 576 case KDSKBENT: 577 return do_kdsk_ioctl(cmd, up, perm, kbd); 578 579 case KDGKBSENT: 580 case KDSKBSENT: 581 return do_kdgkb_ioctl(cmd, up, perm); 582 583 case KDGKBDIACR: 584 { 585 struct kbdiacrs __user *a = up; 586 587 if (put_user(accent_table_size, &a->kb_cnt)) 588 return -EFAULT; 589 if (copy_to_user(a->kbdiacr, accent_table, accent_table_size*sizeof(struct kbdiacr))) 590 return -EFAULT; 591 return 0; 592 } 593 594 case KDSKBDIACR: 595 { 596 struct kbdiacrs __user *a = up; 597 unsigned int ct; 598 599 if (!perm) 600 return -EPERM; 601 if (get_user(ct,&a->kb_cnt)) 602 return -EFAULT; 603 if (ct >= MAX_DIACR) 604 return -EINVAL; 605 accent_table_size = ct; 606 if (copy_from_user(accent_table, a->kbdiacr, ct*sizeof(struct kbdiacr))) 607 return -EFAULT; 608 return 0; 609 } 610 611 /* the ioctls below read/set the flags usually shown in the leds */ 612 /* don't use them - they will go away without warning */ 613 case KDGKBLED: 614 ucval = kbd->ledflagstate | (kbd->default_ledflagstate << 4); 615 goto setchar; 616 617 case KDSKBLED: 618 if (!perm) 619 return -EPERM; 620 if (arg & ~0x77) 621 return -EINVAL; 622 kbd->ledflagstate = (arg & 7); 623 kbd->default_ledflagstate = ((arg >> 4) & 7); 624 set_leds(); 625 return 0; 626 627 /* the ioctls below only set the lights, not the functions */ 628 /* for those, see KDGKBLED and KDSKBLED above */ 629 case KDGETLED: 630 ucval = getledstate(); 631 setchar: 632 return put_user(ucval, (char __user *)arg); 633 634 case KDSETLED: 635 if (!perm) 636 return -EPERM; 637 setledstate(kbd, arg); 638 return 0; 639 640 /* 641 * A process can indicate its willingness to accept signals 642 * generated by pressing an appropriate key combination. 643 * Thus, one can have a daemon that e.g. spawns a new console 644 * upon a keypress and then changes to it. 645 * See also the kbrequest field of inittab(5). 646 */ 647 case KDSIGACCEPT: 648 { 649 extern int spawnpid, spawnsig; 650 if (!perm || !capable(CAP_KILL)) 651 return -EPERM; 652 if (!valid_signal(arg) || arg < 1 || arg == SIGKILL) 653 return -EINVAL; 654 spawnpid = current->pid; 655 spawnsig = arg; 656 return 0; 657 } 658 659 case VT_SETMODE: 660 { 661 struct vt_mode tmp; 662 663 if (!perm) 664 return -EPERM; 665 if (copy_from_user(&tmp, up, sizeof(struct vt_mode))) 666 return -EFAULT; 667 if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS) 668 return -EINVAL; 669 acquire_console_sem(); 670 vc->vt_mode = tmp; 671 /* the frsig is ignored, so we set it to 0 */ 672 vc->vt_mode.frsig = 0; 673 vc->vt_pid = current->pid; 674 /* no switch is required -- saw@shade.msu.ru */ 675 vc->vt_newvt = -1; 676 release_console_sem(); 677 return 0; 678 } 679 680 case VT_GETMODE: 681 { 682 struct vt_mode tmp; 683 int rc; 684 685 acquire_console_sem(); 686 memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode)); 687 release_console_sem(); 688 689 rc = copy_to_user(up, &tmp, sizeof(struct vt_mode)); 690 return rc ? -EFAULT : 0; 691 } 692 693 /* 694 * Returns global vt state. Note that VT 0 is always open, since 695 * it's an alias for the current VT, and people can't use it here. 696 * We cannot return state for more than 16 VTs, since v_state is short. 697 */ 698 case VT_GETSTATE: 699 { 700 struct vt_stat __user *vtstat = up; 701 unsigned short state, mask; 702 703 if (put_user(fg_console + 1, &vtstat->v_active)) 704 return -EFAULT; 705 state = 1; /* /dev/tty0 is always open */ 706 for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask; ++i, mask <<= 1) 707 if (VT_IS_IN_USE(i)) 708 state |= mask; 709 return put_user(state, &vtstat->v_state); 710 } 711 712 /* 713 * Returns the first available (non-opened) console. 714 */ 715 case VT_OPENQRY: 716 for (i = 0; i < MAX_NR_CONSOLES; ++i) 717 if (! VT_IS_IN_USE(i)) 718 break; 719 ucval = i < MAX_NR_CONSOLES ? (i+1) : -1; 720 goto setint; 721 722 /* 723 * ioctl(fd, VT_ACTIVATE, num) will cause us to switch to vt # num, 724 * with num >= 1 (switches to vt 0, our console, are not allowed, just 725 * to preserve sanity). 726 */ 727 case VT_ACTIVATE: 728 if (!perm) 729 return -EPERM; 730 if (arg == 0 || arg > MAX_NR_CONSOLES) 731 return -ENXIO; 732 arg--; 733 acquire_console_sem(); 734 i = vc_allocate(arg); 735 release_console_sem(); 736 if (i) 737 return i; 738 set_console(arg); 739 return 0; 740 741 /* 742 * wait until the specified VT has been activated 743 */ 744 case VT_WAITACTIVE: 745 if (!perm) 746 return -EPERM; 747 if (arg == 0 || arg > MAX_NR_CONSOLES) 748 return -ENXIO; 749 return vt_waitactive(arg-1); 750 751 /* 752 * If a vt is under process control, the kernel will not switch to it 753 * immediately, but postpone the operation until the process calls this 754 * ioctl, allowing the switch to complete. 755 * 756 * According to the X sources this is the behavior: 757 * 0: pending switch-from not OK 758 * 1: pending switch-from OK 759 * 2: completed switch-to OK 760 */ 761 case VT_RELDISP: 762 if (!perm) 763 return -EPERM; 764 if (vc->vt_mode.mode != VT_PROCESS) 765 return -EINVAL; 766 767 /* 768 * Switching-from response 769 */ 770 if (vc->vt_newvt >= 0) { 771 if (arg == 0) 772 /* 773 * Switch disallowed, so forget we were trying 774 * to do it. 775 */ 776 vc->vt_newvt = -1; 777 778 else { 779 /* 780 * The current vt has been released, so 781 * complete the switch. 782 */ 783 int newvt; 784 acquire_console_sem(); 785 newvt = vc->vt_newvt; 786 vc->vt_newvt = -1; 787 i = vc_allocate(newvt); 788 if (i) { 789 release_console_sem(); 790 return i; 791 } 792 /* 793 * When we actually do the console switch, 794 * make sure we are atomic with respect to 795 * other console switches.. 796 */ 797 complete_change_console(vc_cons[newvt].d); 798 release_console_sem(); 799 } 800 } 801 802 /* 803 * Switched-to response 804 */ 805 else 806 { 807 /* 808 * If it's just an ACK, ignore it 809 */ 810 if (arg != VT_ACKACQ) 811 return -EINVAL; 812 } 813 814 return 0; 815 816 /* 817 * Disallocate memory associated to VT (but leave VT1) 818 */ 819 case VT_DISALLOCATE: 820 if (arg > MAX_NR_CONSOLES) 821 return -ENXIO; 822 if (arg == 0) { 823 /* disallocate all unused consoles, but leave 0 */ 824 acquire_console_sem(); 825 for (i=1; i<MAX_NR_CONSOLES; i++) 826 if (! VT_BUSY(i)) 827 vc_disallocate(i); 828 release_console_sem(); 829 } else { 830 /* disallocate a single console, if possible */ 831 arg--; 832 if (VT_BUSY(arg)) 833 return -EBUSY; 834 if (arg) { /* leave 0 */ 835 acquire_console_sem(); 836 vc_disallocate(arg); 837 release_console_sem(); 838 } 839 } 840 return 0; 841 842 case VT_RESIZE: 843 { 844 struct vt_sizes __user *vtsizes = up; 845 ushort ll,cc; 846 if (!perm) 847 return -EPERM; 848 if (get_user(ll, &vtsizes->v_rows) || 849 get_user(cc, &vtsizes->v_cols)) 850 return -EFAULT; 851 for (i = 0; i < MAX_NR_CONSOLES; i++) { 852 acquire_console_sem(); 853 vc_resize(vc_cons[i].d, cc, ll); 854 release_console_sem(); 855 } 856 return 0; 857 } 858 859 case VT_RESIZEX: 860 { 861 struct vt_consize __user *vtconsize = up; 862 ushort ll,cc,vlin,clin,vcol,ccol; 863 if (!perm) 864 return -EPERM; 865 if (!access_ok(VERIFY_READ, vtconsize, 866 sizeof(struct vt_consize))) 867 return -EFAULT; 868 __get_user(ll, &vtconsize->v_rows); 869 __get_user(cc, &vtconsize->v_cols); 870 __get_user(vlin, &vtconsize->v_vlin); 871 __get_user(clin, &vtconsize->v_clin); 872 __get_user(vcol, &vtconsize->v_vcol); 873 __get_user(ccol, &vtconsize->v_ccol); 874 vlin = vlin ? vlin : vc->vc_scan_lines; 875 if (clin) { 876 if (ll) { 877 if (ll != vlin/clin) 878 return -EINVAL; /* Parameters don't add up */ 879 } else 880 ll = vlin/clin; 881 } 882 if (vcol && ccol) { 883 if (cc) { 884 if (cc != vcol/ccol) 885 return -EINVAL; 886 } else 887 cc = vcol/ccol; 888 } 889 890 if (clin > 32) 891 return -EINVAL; 892 893 for (i = 0; i < MAX_NR_CONSOLES; i++) { 894 if (!vc_cons[i].d) 895 continue; 896 acquire_console_sem(); 897 if (vlin) 898 vc_cons[i].d->vc_scan_lines = vlin; 899 if (clin) 900 vc_cons[i].d->vc_font.height = clin; 901 vc_resize(vc_cons[i].d, cc, ll); 902 release_console_sem(); 903 } 904 return 0; 905 } 906 907 case PIO_FONT: { 908 if (!perm) 909 return -EPERM; 910 op.op = KD_FONT_OP_SET; 911 op.flags = KD_FONT_FLAG_OLD | KD_FONT_FLAG_DONT_RECALC; /* Compatibility */ 912 op.width = 8; 913 op.height = 0; 914 op.charcount = 256; 915 op.data = up; 916 return con_font_op(vc_cons[fg_console].d, &op); 917 } 918 919 case GIO_FONT: { 920 op.op = KD_FONT_OP_GET; 921 op.flags = KD_FONT_FLAG_OLD; 922 op.width = 8; 923 op.height = 32; 924 op.charcount = 256; 925 op.data = up; 926 return con_font_op(vc_cons[fg_console].d, &op); 927 } 928 929 case PIO_CMAP: 930 if (!perm) 931 return -EPERM; 932 return con_set_cmap(up); 933 934 case GIO_CMAP: 935 return con_get_cmap(up); 936 937 case PIO_FONTX: 938 case GIO_FONTX: 939 return do_fontx_ioctl(cmd, up, perm, &op); 940 941 case PIO_FONTRESET: 942 { 943 if (!perm) 944 return -EPERM; 945 946#ifdef BROKEN_GRAPHICS_PROGRAMS 947 /* With BROKEN_GRAPHICS_PROGRAMS defined, the default 948 font is not saved. */ 949 return -ENOSYS; 950#else 951 { 952 op.op = KD_FONT_OP_SET_DEFAULT; 953 op.data = NULL; 954 i = con_font_op(vc_cons[fg_console].d, &op); 955 if (i) 956 return i; 957 con_set_default_unimap(vc_cons[fg_console].d); 958 return 0; 959 } 960#endif 961 } 962 963 case KDFONTOP: { 964 if (copy_from_user(&op, up, sizeof(op))) 965 return -EFAULT; 966 if (!perm && op.op != KD_FONT_OP_GET) 967 return -EPERM; 968 i = con_font_op(vc, &op); 969 if (i) return i; 970 if (copy_to_user(up, &op, sizeof(op))) 971 return -EFAULT; 972 return 0; 973 } 974 975 case PIO_SCRNMAP: 976 if (!perm) 977 return -EPERM; 978 return con_set_trans_old(up); 979 980 case GIO_SCRNMAP: 981 return con_get_trans_old(up); 982 983 case PIO_UNISCRNMAP: 984 if (!perm) 985 return -EPERM; 986 return con_set_trans_new(up); 987 988 case GIO_UNISCRNMAP: 989 return con_get_trans_new(up); 990 991 case PIO_UNIMAPCLR: 992 { struct unimapinit ui; 993 if (!perm) 994 return -EPERM; 995 i = copy_from_user(&ui, up, sizeof(struct unimapinit)); 996 if (i) return -EFAULT; 997 con_clear_unimap(vc, &ui); 998 return 0; 999 } 1000 1001 case PIO_UNIMAP: 1002 case GIO_UNIMAP: 1003 return do_unimap_ioctl(cmd, up, perm, vc); 1004 1005 case VT_LOCKSWITCH: 1006 if (!capable(CAP_SYS_TTY_CONFIG)) 1007 return -EPERM; 1008 vt_dont_switch = 1; 1009 return 0; 1010 case VT_UNLOCKSWITCH: 1011 if (!capable(CAP_SYS_TTY_CONFIG)) 1012 return -EPERM; 1013 vt_dont_switch = 0; 1014 return 0; 1015 default: 1016 return -ENOIOCTLCMD; 1017 } 1018} 1019 1020/* 1021 * Sometimes we want to wait until a particular VT has been activated. We 1022 * do it in a very simple manner. Everybody waits on a single queue and 1023 * get woken up at once. Those that are satisfied go on with their business, 1024 * while those not ready go back to sleep. Seems overkill to add a wait 1025 * to each vt just for this - usually this does nothing! 1026 */ 1027static DECLARE_WAIT_QUEUE_HEAD(vt_activate_queue); 1028 1029/* 1030 * Sleeps until a vt is activated, or the task is interrupted. Returns 1031 * 0 if activation, -EINTR if interrupted. 1032 */ 1033int vt_waitactive(int vt) 1034{ 1035 int retval; 1036 DECLARE_WAITQUEUE(wait, current); 1037 1038 add_wait_queue(&vt_activate_queue, &wait); 1039 for (;;) { 1040 set_current_state(TASK_INTERRUPTIBLE); 1041 retval = 0; 1042 if (vt == fg_console) 1043 break; 1044 retval = -EINTR; 1045 if (signal_pending(current)) 1046 break; 1047 schedule(); 1048 } 1049 remove_wait_queue(&vt_activate_queue, &wait); 1050 current->state = TASK_RUNNING; 1051 return retval; 1052} 1053 1054#define vt_wake_waitactive() wake_up(&vt_activate_queue) 1055 1056void reset_vc(struct vc_data *vc) 1057{ 1058 vc->vc_mode = KD_TEXT; 1059 kbd_table[vc->vc_num].kbdmode = VC_XLATE; 1060 vc->vt_mode.mode = VT_AUTO; 1061 vc->vt_mode.waitv = 0; 1062 vc->vt_mode.relsig = 0; 1063 vc->vt_mode.acqsig = 0; 1064 vc->vt_mode.frsig = 0; 1065 vc->vt_pid = -1; 1066 vc->vt_newvt = -1; 1067 if (!in_interrupt()) /* Via keyboard.c:SAK() - akpm */ 1068 reset_palette(vc); 1069} 1070 1071/* 1072 * Performs the back end of a vt switch 1073 */ 1074static void complete_change_console(struct vc_data *vc) 1075{ 1076 unsigned char old_vc_mode; 1077 1078 last_console = fg_console; 1079 1080 /* 1081 * If we're switching, we could be going from KD_GRAPHICS to 1082 * KD_TEXT mode or vice versa, which means we need to blank or 1083 * unblank the screen later. 1084 */ 1085 old_vc_mode = vc_cons[fg_console].d->vc_mode; 1086 switch_screen(vc); 1087 1088 /* 1089 * This can't appear below a successful kill_proc(). If it did, 1090 * then the *blank_screen operation could occur while X, having 1091 * received acqsig, is waking up on another processor. This 1092 * condition can lead to overlapping accesses to the VGA range 1093 * and the framebuffer (causing system lockups). 1094 * 1095 * To account for this we duplicate this code below only if the 1096 * controlling process is gone and we've called reset_vc. 1097 */ 1098 if (old_vc_mode != vc->vc_mode) { 1099 if (vc->vc_mode == KD_TEXT) 1100 do_unblank_screen(1); 1101 else 1102 do_blank_screen(1); 1103 } 1104 1105 /* 1106 * If this new console is under process control, send it a signal 1107 * telling it that it has acquired. Also check if it has died and 1108 * clean up (similar to logic employed in change_console()) 1109 */ 1110 if (vc->vt_mode.mode == VT_PROCESS) { 1111 /* 1112 * Send the signal as privileged - kill_proc() will 1113 * tell us if the process has gone or something else 1114 * is awry 1115 */ 1116 if (kill_proc(vc->vt_pid, vc->vt_mode.acqsig, 1) != 0) { 1117 /* 1118 * The controlling process has died, so we revert back to 1119 * normal operation. In this case, we'll also change back 1120 * to KD_TEXT mode. I'm not sure if this is strictly correct 1121 * but it saves the agony when the X server dies and the screen 1122 * remains blanked due to KD_GRAPHICS! It would be nice to do 1123 * this outside of VT_PROCESS but there is no single process 1124 * to account for and tracking tty count may be undesirable. 1125 */ 1126 reset_vc(vc); 1127 1128 if (old_vc_mode != vc->vc_mode) { 1129 if (vc->vc_mode == KD_TEXT) 1130 do_unblank_screen(1); 1131 else 1132 do_blank_screen(1); 1133 } 1134 } 1135 } 1136 1137 /* 1138 * Wake anyone waiting for their VT to activate 1139 */ 1140 vt_wake_waitactive(); 1141 return; 1142} 1143 1144/* 1145 * Performs the front-end of a vt switch 1146 */ 1147void change_console(struct vc_data *new_vc) 1148{ 1149 struct vc_data *vc; 1150 1151 if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch) 1152 return; 1153 1154 /* 1155 * If this vt is in process mode, then we need to handshake with 1156 * that process before switching. Essentially, we store where that 1157 * vt wants to switch to and wait for it to tell us when it's done 1158 * (via VT_RELDISP ioctl). 1159 * 1160 * We also check to see if the controlling process still exists. 1161 * If it doesn't, we reset this vt to auto mode and continue. 1162 * This is a cheap way to track process control. The worst thing 1163 * that can happen is: we send a signal to a process, it dies, and 1164 * the switch gets "lost" waiting for a response; hopefully, the 1165 * user will try again, we'll detect the process is gone (unless 1166 * the user waits just the right amount of time :-) and revert the 1167 * vt to auto control. 1168 */ 1169 vc = vc_cons[fg_console].d; 1170 if (vc->vt_mode.mode == VT_PROCESS) { 1171 /* 1172 * Send the signal as privileged - kill_proc() will 1173 * tell us if the process has gone or something else 1174 * is awry 1175 */ 1176 if (kill_proc(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) { 1177 /* 1178 * It worked. Mark the vt to switch to and 1179 * return. The process needs to send us a 1180 * VT_RELDISP ioctl to complete the switch. 1181 */ 1182 vc->vt_newvt = new_vc->vc_num; 1183 return; 1184 } 1185 1186 /* 1187 * The controlling process has died, so we revert back to 1188 * normal operation. In this case, we'll also change back 1189 * to KD_TEXT mode. I'm not sure if this is strictly correct 1190 * but it saves the agony when the X server dies and the screen 1191 * remains blanked due to KD_GRAPHICS! It would be nice to do 1192 * this outside of VT_PROCESS but there is no single process 1193 * to account for and tracking tty count may be undesirable. 1194 */ 1195 reset_vc(vc); 1196 1197 /* 1198 * Fall through to normal (VT_AUTO) handling of the switch... 1199 */ 1200 } 1201 1202 /* 1203 * Ignore all switches in KD_GRAPHICS+VT_AUTO mode 1204 */ 1205 if (vc->vc_mode == KD_GRAPHICS) 1206 return; 1207 1208 complete_change_console(new_vc); 1209}