linux/drivers/char/vt_ioctl.c
<<
>>
Prefs
   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/types.h>
  14#include <linux/errno.h>
  15#include <linux/sched.h>
  16#include <linux/tty.h>
  17#include <linux/timer.h>
  18#include <linux/kernel.h>
  19#include <linux/compat.h>
  20#include <linux/module.h>
  21#include <linux/kd.h>
  22#include <linux/vt.h>
  23#include <linux/string.h>
  24#include <linux/slab.h>
  25#include <linux/major.h>
  26#include <linux/fs.h>
  27#include <linux/console.h>
  28#include <linux/consolemap.h>
  29#include <linux/signal.h>
  30#include <linux/smp_lock.h>
  31#include <linux/timex.h>
  32
  33#include <asm/io.h>
  34#include <asm/uaccess.h>
  35
  36#include <linux/kbd_kern.h>
  37#include <linux/vt_kern.h>
  38#include <linux/kbd_diacr.h>
  39#include <linux/selection.h>
  40
  41char vt_dont_switch;
  42extern struct tty_driver *console_driver;
  43
  44#define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count)
  45#define VT_BUSY(i)      (VT_IS_IN_USE(i) || i == fg_console || vc_cons[i].d == sel_cons)
  46
  47/*
  48 * Console (vt and kd) routines, as defined by USL SVR4 manual, and by
  49 * experimentation and study of X386 SYSV handling.
  50 *
  51 * One point of difference: SYSV vt's are /dev/vtX, which X >= 0, and
  52 * /dev/console is a separate ttyp. Under Linux, /dev/tty0 is /dev/console,
  53 * and the vc start at /dev/ttyX, X >= 1. We maintain that here, so we will
  54 * always treat our set of vt as numbered 1..MAX_NR_CONSOLES (corresponding to
  55 * ttys 0..MAX_NR_CONSOLES-1). Explicitly naming VT 0 is illegal, but using
  56 * /dev/tty0 (fg_console) as a target is legal, since an implicit aliasing
  57 * to the current console is done by the main ioctl code.
  58 */
  59
  60#ifdef CONFIG_X86
  61#include <linux/syscalls.h>
  62#endif
  63
  64static void complete_change_console(struct vc_data *vc);
  65
  66/*
  67 *      User space VT_EVENT handlers
  68 */
  69
  70struct vt_event_wait {
  71        struct list_head list;
  72        struct vt_event event;
  73        int done;
  74};
  75
  76static LIST_HEAD(vt_events);
  77static DEFINE_SPINLOCK(vt_event_lock);
  78static DECLARE_WAIT_QUEUE_HEAD(vt_event_waitqueue);
  79
  80/**
  81 *      vt_event_post
  82 *      @event: the event that occurred
  83 *      @old: old console
  84 *      @new: new console
  85 *
  86 *      Post an VT event to interested VT handlers
  87 */
  88
  89void vt_event_post(unsigned int event, unsigned int old, unsigned int new)
  90{
  91        struct list_head *pos, *head;
  92        unsigned long flags;
  93        int wake = 0;
  94
  95        spin_lock_irqsave(&vt_event_lock, flags);
  96        head = &vt_events;
  97
  98        list_for_each(pos, head) {
  99                struct vt_event_wait *ve = list_entry(pos,
 100                                                struct vt_event_wait, list);
 101                if (!(ve->event.event & event))
 102                        continue;
 103                ve->event.event = event;
 104                /* kernel view is consoles 0..n-1, user space view is
 105                   console 1..n with 0 meaning current, so we must bias */
 106                ve->event.oldev = old + 1;
 107                ve->event.newev = new + 1;
 108                wake = 1;
 109                ve->done = 1;
 110        }
 111        spin_unlock_irqrestore(&vt_event_lock, flags);
 112        if (wake)
 113                wake_up_interruptible(&vt_event_waitqueue);
 114}
 115
 116/**
 117 *      vt_event_wait           -       wait for an event
 118 *      @vw: our event
 119 *
 120 *      Waits for an event to occur which completes our vt_event_wait
 121 *      structure. On return the structure has wv->done set to 1 for success
 122 *      or 0 if some event such as a signal ended the wait.
 123 */
 124
 125static void vt_event_wait(struct vt_event_wait *vw)
 126{
 127        unsigned long flags;
 128        /* Prepare the event */
 129        INIT_LIST_HEAD(&vw->list);
 130        vw->done = 0;
 131        /* Queue our event */
 132        spin_lock_irqsave(&vt_event_lock, flags);
 133        list_add(&vw->list, &vt_events);
 134        spin_unlock_irqrestore(&vt_event_lock, flags);
 135        /* Wait for it to pass */
 136        wait_event_interruptible(vt_event_waitqueue, vw->done);
 137        /* Dequeue it */
 138        spin_lock_irqsave(&vt_event_lock, flags);
 139        list_del(&vw->list);
 140        spin_unlock_irqrestore(&vt_event_lock, flags);
 141}
 142
 143/**
 144 *      vt_event_wait_ioctl     -       event ioctl handler
 145 *      @arg: argument to ioctl
 146 *
 147 *      Implement the VT_WAITEVENT ioctl using the VT event interface
 148 */
 149
 150static int vt_event_wait_ioctl(struct vt_event __user *event)
 151{
 152        struct vt_event_wait vw;
 153
 154        if (copy_from_user(&vw.event, event, sizeof(struct vt_event)))
 155                return -EFAULT;
 156        /* Highest supported event for now */
 157        if (vw.event.event & ~VT_MAX_EVENT)
 158                return -EINVAL;
 159
 160        vt_event_wait(&vw);
 161        /* If it occurred report it */
 162        if (vw.done) {
 163                if (copy_to_user(event, &vw.event, sizeof(struct vt_event)))
 164                        return -EFAULT;
 165                return 0;
 166        }
 167        return -EINTR;
 168}
 169
 170/**
 171 *      vt_waitactive   -       active console wait
 172 *      @event: event code
 173 *      @n: new console
 174 *
 175 *      Helper for event waits. Used to implement the legacy
 176 *      event waiting ioctls in terms of events
 177 */
 178
 179int vt_waitactive(int n)
 180{
 181        struct vt_event_wait vw;
 182        do {
 183                if (n == fg_console + 1)
 184                        break;
 185                vw.event.event = VT_EVENT_SWITCH;
 186                vt_event_wait(&vw);
 187                if (vw.done == 0)
 188                        return -EINTR;
 189        } while (vw.event.newev != n);
 190        return 0;
 191}
 192
 193/*
 194 * these are the valid i/o ports we're allowed to change. they map all the
 195 * video ports
 196 */
 197#define GPFIRST 0x3b4
 198#define GPLAST 0x3df
 199#define GPNUM (GPLAST - GPFIRST + 1)
 200
 201#define i (tmp.kb_index)
 202#define s (tmp.kb_table)
 203#define v (tmp.kb_value)
 204static inline int
 205do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, struct kbd_struct *kbd)
 206{
 207        struct kbentry tmp;
 208        ushort *key_map, val, ov;
 209
 210        if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry)))
 211                return -EFAULT;
 212
 213        if (!capable(CAP_SYS_TTY_CONFIG))
 214                perm = 0;
 215
 216        switch (cmd) {
 217        case KDGKBENT:
 218                key_map = key_maps[s];
 219                if (key_map) {
 220                    val = U(key_map[i]);
 221                    if (kbd->kbdmode != VC_UNICODE && KTYP(val) >= NR_TYPES)
 222                        val = K_HOLE;
 223                } else
 224                    val = (i ? K_HOLE : K_NOSUCHMAP);
 225                return put_user(val, &user_kbe->kb_value);
 226        case KDSKBENT:
 227                if (!perm)
 228                        return -EPERM;
 229                if (!i && v == K_NOSUCHMAP) {
 230                        /* deallocate map */
 231                        key_map = key_maps[s];
 232                        if (s && key_map) {
 233                            key_maps[s] = NULL;
 234                            if (key_map[0] == U(K_ALLOCATED)) {
 235                                        kfree(key_map);
 236                                        keymap_count--;
 237                            }
 238                        }
 239                        break;
 240                }
 241
 242                if (KTYP(v) < NR_TYPES) {
 243                    if (KVAL(v) > max_vals[KTYP(v)])
 244                                return -EINVAL;
 245                } else
 246                    if (kbd->kbdmode != VC_UNICODE)
 247                                return -EINVAL;
 248
 249                /* ++Geert: non-PC keyboards may generate keycode zero */
 250#if !defined(__mc68000__) && !defined(__powerpc__)
 251                /* assignment to entry 0 only tests validity of args */
 252                if (!i)
 253                        break;
 254#endif
 255
 256                if (!(key_map = key_maps[s])) {
 257                        int j;
 258
 259                        if (keymap_count >= MAX_NR_OF_USER_KEYMAPS &&
 260                            !capable(CAP_SYS_RESOURCE))
 261                                return -EPERM;
 262
 263                        key_map = kmalloc(sizeof(plain_map),
 264                                                     GFP_KERNEL);
 265                        if (!key_map)
 266                                return -ENOMEM;
 267                        key_maps[s] = key_map;
 268                        key_map[0] = U(K_ALLOCATED);
 269                        for (j = 1; j < NR_KEYS; j++)
 270                                key_map[j] = U(K_HOLE);
 271                        keymap_count++;
 272                }
 273                ov = U(key_map[i]);
 274                if (v == ov)
 275                        break;  /* nothing to do */
 276                /*
 277                 * Attention Key.
 278                 */
 279                if (((ov == K_SAK) || (v == K_SAK)) && !capable(CAP_SYS_ADMIN))
 280                        return -EPERM;
 281                key_map[i] = U(v);
 282                if (!s && (KTYP(ov) == KT_SHIFT || KTYP(v) == KT_SHIFT))
 283                        compute_shiftstate();
 284                break;
 285        }
 286        return 0;
 287}
 288#undef i
 289#undef s
 290#undef v
 291
 292static inline int 
 293do_kbkeycode_ioctl(int cmd, struct kbkeycode __user *user_kbkc, int perm)
 294{
 295        struct kbkeycode tmp;
 296        int kc = 0;
 297
 298        if (copy_from_user(&tmp, user_kbkc, sizeof(struct kbkeycode)))
 299                return -EFAULT;
 300        switch (cmd) {
 301        case KDGETKEYCODE:
 302                kc = getkeycode(tmp.scancode);
 303                if (kc >= 0)
 304                        kc = put_user(kc, &user_kbkc->keycode);
 305                break;
 306        case KDSETKEYCODE:
 307                if (!perm)
 308                        return -EPERM;
 309                kc = setkeycode(tmp.scancode, tmp.keycode);
 310                break;
 311        }
 312        return kc;
 313}
 314
 315static inline int
 316do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm)
 317{
 318        struct kbsentry *kbs;
 319        char *p;
 320        u_char *q;
 321        u_char __user *up;
 322        int sz;
 323        int delta;
 324        char *first_free, *fj, *fnw;
 325        int i, j, k;
 326        int ret;
 327
 328        if (!capable(CAP_SYS_TTY_CONFIG))
 329                perm = 0;
 330
 331        kbs = kmalloc(sizeof(*kbs), GFP_KERNEL);
 332        if (!kbs) {
 333                ret = -ENOMEM;
 334                goto reterr;
 335        }
 336
 337        /* we mostly copy too much here (512bytes), but who cares ;) */
 338        if (copy_from_user(kbs, user_kdgkb, sizeof(struct kbsentry))) {
 339                ret = -EFAULT;
 340                goto reterr;
 341        }
 342        kbs->kb_string[sizeof(kbs->kb_string)-1] = '\0';
 343        i = kbs->kb_func;
 344
 345        switch (cmd) {
 346        case KDGKBSENT:
 347                sz = sizeof(kbs->kb_string) - 1; /* sz should have been
 348                                                  a struct member */
 349                up = user_kdgkb->kb_string;
 350                p = func_table[i];
 351                if(p)
 352                        for ( ; *p && sz; p++, sz--)
 353                                if (put_user(*p, up++)) {
 354                                        ret = -EFAULT;
 355                                        goto reterr;
 356                                }
 357                if (put_user('\0', up)) {
 358                        ret = -EFAULT;
 359                        goto reterr;
 360                }
 361                kfree(kbs);
 362                return ((p && *p) ? -EOVERFLOW : 0);
 363        case KDSKBSENT:
 364                if (!perm) {
 365                        ret = -EPERM;
 366                        goto reterr;
 367                }
 368
 369                q = func_table[i];
 370                first_free = funcbufptr + (funcbufsize - funcbufleft);
 371                for (j = i+1; j < MAX_NR_FUNC && !func_table[j]; j++) 
 372                        ;
 373                if (j < MAX_NR_FUNC)
 374                        fj = func_table[j];
 375                else
 376                        fj = first_free;
 377
 378                delta = (q ? -strlen(q) : 1) + strlen(kbs->kb_string);
 379                if (delta <= funcbufleft) {     /* it fits in current buf */
 380                    if (j < MAX_NR_FUNC) {
 381                        memmove(fj + delta, fj, first_free - fj);
 382                        for (k = j; k < MAX_NR_FUNC; k++)
 383                            if (func_table[k])
 384                                func_table[k] += delta;
 385                    }
 386                    if (!q)
 387                      func_table[i] = fj;
 388                    funcbufleft -= delta;
 389                } else {                        /* allocate a larger buffer */
 390                    sz = 256;
 391                    while (sz < funcbufsize - funcbufleft + delta)
 392                      sz <<= 1;
 393                    fnw = kmalloc(sz, GFP_KERNEL);
 394                    if(!fnw) {
 395                      ret = -ENOMEM;
 396                      goto reterr;
 397                    }
 398
 399                    if (!q)
 400                      func_table[i] = fj;
 401                    if (fj > funcbufptr)
 402                        memmove(fnw, funcbufptr, fj - funcbufptr);
 403                    for (k = 0; k < j; k++)
 404                      if (func_table[k])
 405                        func_table[k] = fnw + (func_table[k] - funcbufptr);
 406
 407                    if (first_free > fj) {
 408                        memmove(fnw + (fj - funcbufptr) + delta, fj, first_free - fj);
 409                        for (k = j; k < MAX_NR_FUNC; k++)
 410                          if (func_table[k])
 411                            func_table[k] = fnw + (func_table[k] - funcbufptr) + delta;
 412                    }
 413                    if (funcbufptr != func_buf)
 414                      kfree(funcbufptr);
 415                    funcbufptr = fnw;
 416                    funcbufleft = funcbufleft - delta + sz - funcbufsize;
 417                    funcbufsize = sz;
 418                }
 419                strcpy(func_table[i], kbs->kb_string);
 420                break;
 421        }
 422        ret = 0;
 423reterr:
 424        kfree(kbs);
 425        return ret;
 426}
 427
 428static inline int 
 429do_fontx_ioctl(int cmd, struct consolefontdesc __user *user_cfd, int perm, struct console_font_op *op)
 430{
 431        struct consolefontdesc cfdarg;
 432        int i;
 433
 434        if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc))) 
 435                return -EFAULT;
 436        
 437        switch (cmd) {
 438        case PIO_FONTX:
 439                if (!perm)
 440                        return -EPERM;
 441                op->op = KD_FONT_OP_SET;
 442                op->flags = KD_FONT_FLAG_OLD;
 443                op->width = 8;
 444                op->height = cfdarg.charheight;
 445                op->charcount = cfdarg.charcount;
 446                op->data = cfdarg.chardata;
 447                return con_font_op(vc_cons[fg_console].d, op);
 448        case GIO_FONTX: {
 449                op->op = KD_FONT_OP_GET;
 450                op->flags = KD_FONT_FLAG_OLD;
 451                op->width = 8;
 452                op->height = cfdarg.charheight;
 453                op->charcount = cfdarg.charcount;
 454                op->data = cfdarg.chardata;
 455                i = con_font_op(vc_cons[fg_console].d, op);
 456                if (i)
 457                        return i;
 458                cfdarg.charheight = op->height;
 459                cfdarg.charcount = op->charcount;
 460                if (copy_to_user(user_cfd, &cfdarg, sizeof(struct consolefontdesc)))
 461                        return -EFAULT;
 462                return 0;
 463                }
 464        }
 465        return -EINVAL;
 466}
 467
 468static inline int 
 469do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, struct vc_data *vc)
 470{
 471        struct unimapdesc tmp;
 472
 473        if (copy_from_user(&tmp, user_ud, sizeof tmp))
 474                return -EFAULT;
 475        if (tmp.entries)
 476                if (!access_ok(VERIFY_WRITE, tmp.entries,
 477                                tmp.entry_ct*sizeof(struct unipair)))
 478                        return -EFAULT;
 479        switch (cmd) {
 480        case PIO_UNIMAP:
 481                if (!perm)
 482                        return -EPERM;
 483                return con_set_unimap(vc, tmp.entry_ct, tmp.entries);
 484        case GIO_UNIMAP:
 485                if (!perm && fg_console != vc->vc_num)
 486                        return -EPERM;
 487                return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries);
 488        }
 489        return 0;
 490}
 491
 492
 493
 494/*
 495 * We handle the console-specific ioctl's here.  We allow the
 496 * capability to modify any console, not just the fg_console. 
 497 */
 498int vt_ioctl(struct tty_struct *tty, struct file * file,
 499             unsigned int cmd, unsigned long arg)
 500{
 501        struct vc_data *vc = tty->driver_data;
 502        struct console_font_op op;      /* used in multiple places here */
 503        struct kbd_struct * kbd;
 504        unsigned int console;
 505        unsigned char ucval;
 506        void __user *up = (void __user *)arg;
 507        int i, perm;
 508        int ret = 0;
 509
 510        console = vc->vc_num;
 511
 512        lock_kernel();
 513
 514        if (!vc_cons_allocated(console)) {      /* impossible? */
 515                ret = -ENOIOCTLCMD;
 516                goto out;
 517        }
 518
 519
 520        /*
 521         * To have permissions to do most of the vt ioctls, we either have
 522         * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
 523         */
 524        perm = 0;
 525        if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG))
 526                perm = 1;
 527 
 528        kbd = kbd_table + console;
 529        switch (cmd) {
 530        case TIOCLINUX:
 531                ret = tioclinux(tty, arg);
 532                break;
 533        case KIOCSOUND:
 534                if (!perm)
 535                        goto eperm;
 536                /* FIXME: This is an old broken API but we need to keep it
 537                   supported and somehow separate the historic advertised
 538                   tick rate from any real one */
 539                if (arg)
 540                        arg = CLOCK_TICK_RATE / arg;
 541                kd_mksound(arg, 0);
 542                break;
 543
 544        case KDMKTONE:
 545                if (!perm)
 546                        goto eperm;
 547        {
 548                unsigned int ticks, count;
 549                
 550                /*
 551                 * Generate the tone for the appropriate number of ticks.
 552                 * If the time is zero, turn off sound ourselves.
 553                 */
 554                ticks = HZ * ((arg >> 16) & 0xffff) / 1000;
 555                count = ticks ? (arg & 0xffff) : 0;
 556                /* FIXME: This is an old broken API but we need to keep it
 557                   supported and somehow separate the historic advertised
 558                   tick rate from any real one */
 559                if (count)
 560                        count = CLOCK_TICK_RATE / count;
 561                kd_mksound(count, ticks);
 562                break;
 563        }
 564
 565        case KDGKBTYPE:
 566                /*
 567                 * this is naive.
 568                 */
 569                ucval = KB_101;
 570                goto setchar;
 571
 572                /*
 573                 * These cannot be implemented on any machine that implements
 574                 * ioperm() in user level (such as Alpha PCs) or not at all.
 575                 *
 576                 * XXX: you should never use these, just call ioperm directly..
 577                 */
 578#ifdef CONFIG_X86
 579        case KDADDIO:
 580        case KDDELIO:
 581                /*
 582                 * KDADDIO and KDDELIO may be able to add ports beyond what
 583                 * we reject here, but to be safe...
 584                 */
 585                if (arg < GPFIRST || arg > GPLAST) {
 586                        ret = -EINVAL;
 587                        break;
 588                }
 589                ret = sys_ioperm(arg, 1, (cmd == KDADDIO)) ? -ENXIO : 0;
 590                break;
 591
 592        case KDENABIO:
 593        case KDDISABIO:
 594                ret = sys_ioperm(GPFIRST, GPNUM,
 595                                  (cmd == KDENABIO)) ? -ENXIO : 0;
 596                break;
 597#endif
 598
 599        /* Linux m68k/i386 interface for setting the keyboard delay/repeat rate */
 600                
 601        case KDKBDREP:
 602        {
 603                struct kbd_repeat kbrep;
 604                
 605                if (!capable(CAP_SYS_TTY_CONFIG))
 606                        goto eperm;
 607
 608                if (copy_from_user(&kbrep, up, sizeof(struct kbd_repeat))) {
 609                        ret =  -EFAULT;
 610                        break;
 611                }
 612                ret = kbd_rate(&kbrep);
 613                if (ret)
 614                        break;
 615                if (copy_to_user(up, &kbrep, sizeof(struct kbd_repeat)))
 616                        ret = -EFAULT;
 617                break;
 618        }
 619
 620        case KDSETMODE:
 621                /*
 622                 * currently, setting the mode from KD_TEXT to KD_GRAPHICS
 623                 * doesn't do a whole lot. i'm not sure if it should do any
 624                 * restoration of modes or what...
 625                 *
 626                 * XXX It should at least call into the driver, fbdev's definitely
 627                 * need to restore their engine state. --BenH
 628                 */
 629                if (!perm)
 630                        goto eperm;
 631                switch (arg) {
 632                case KD_GRAPHICS:
 633                        break;
 634                case KD_TEXT0:
 635                case KD_TEXT1:
 636                        arg = KD_TEXT;
 637                case KD_TEXT:
 638                        break;
 639                default:
 640                        ret = -EINVAL;
 641                        goto out;
 642                }
 643                if (vc->vc_mode == (unsigned char) arg)
 644                        break;
 645                vc->vc_mode = (unsigned char) arg;
 646                if (console != fg_console)
 647                        break;
 648                /*
 649                 * explicitly blank/unblank the screen if switching modes
 650                 */
 651                acquire_console_sem();
 652                if (arg == KD_TEXT)
 653                        do_unblank_screen(1);
 654                else
 655                        do_blank_screen(1);
 656                release_console_sem();
 657                break;
 658
 659        case KDGETMODE:
 660                ucval = vc->vc_mode;
 661                goto setint;
 662
 663        case KDMAPDISP:
 664        case KDUNMAPDISP:
 665                /*
 666                 * these work like a combination of mmap and KDENABIO.
 667                 * this could be easily finished.
 668                 */
 669                ret = -EINVAL;
 670                break;
 671
 672        case KDSKBMODE:
 673                if (!perm)
 674                        goto eperm;
 675                switch(arg) {
 676                  case K_RAW:
 677                        kbd->kbdmode = VC_RAW;
 678                        break;
 679                  case K_MEDIUMRAW:
 680                        kbd->kbdmode = VC_MEDIUMRAW;
 681                        break;
 682                  case K_XLATE:
 683                        kbd->kbdmode = VC_XLATE;
 684                        compute_shiftstate();
 685                        break;
 686                  case K_UNICODE:
 687                        kbd->kbdmode = VC_UNICODE;
 688                        compute_shiftstate();
 689                        break;
 690                  default:
 691                        ret = -EINVAL;
 692                        goto out;
 693                }
 694                tty_ldisc_flush(tty);
 695                break;
 696
 697        case KDGKBMODE:
 698                ucval = ((kbd->kbdmode == VC_RAW) ? K_RAW :
 699                                 (kbd->kbdmode == VC_MEDIUMRAW) ? K_MEDIUMRAW :
 700                                 (kbd->kbdmode == VC_UNICODE) ? K_UNICODE :
 701                                 K_XLATE);
 702                goto setint;
 703
 704        /* this could be folded into KDSKBMODE, but for compatibility
 705           reasons it is not so easy to fold KDGKBMETA into KDGKBMODE */
 706        case KDSKBMETA:
 707                switch(arg) {
 708                  case K_METABIT:
 709                        clr_vc_kbd_mode(kbd, VC_META);
 710                        break;
 711                  case K_ESCPREFIX:
 712                        set_vc_kbd_mode(kbd, VC_META);
 713                        break;
 714                  default:
 715                        ret = -EINVAL;
 716                }
 717                break;
 718
 719        case KDGKBMETA:
 720                ucval = (vc_kbd_mode(kbd, VC_META) ? K_ESCPREFIX : K_METABIT);
 721        setint:
 722                ret = put_user(ucval, (int __user *)arg);
 723                break;
 724
 725        case KDGETKEYCODE:
 726        case KDSETKEYCODE:
 727                if(!capable(CAP_SYS_TTY_CONFIG))
 728                        perm = 0;
 729                ret = do_kbkeycode_ioctl(cmd, up, perm);
 730                break;
 731
 732        case KDGKBENT:
 733        case KDSKBENT:
 734                ret = do_kdsk_ioctl(cmd, up, perm, kbd);
 735                break;
 736
 737        case KDGKBSENT:
 738        case KDSKBSENT:
 739                ret = do_kdgkb_ioctl(cmd, up, perm);
 740                break;
 741
 742        case KDGKBDIACR:
 743        {
 744                struct kbdiacrs __user *a = up;
 745                struct kbdiacr diacr;
 746                int i;
 747
 748                if (put_user(accent_table_size, &a->kb_cnt)) {
 749                        ret = -EFAULT;
 750                        break;
 751                }
 752                for (i = 0; i < accent_table_size; i++) {
 753                        diacr.diacr = conv_uni_to_8bit(accent_table[i].diacr);
 754                        diacr.base = conv_uni_to_8bit(accent_table[i].base);
 755                        diacr.result = conv_uni_to_8bit(accent_table[i].result);
 756                        if (copy_to_user(a->kbdiacr + i, &diacr, sizeof(struct kbdiacr))) {
 757                                ret = -EFAULT;
 758                                break;
 759                        }
 760                }
 761                break;
 762        }
 763        case KDGKBDIACRUC:
 764        {
 765                struct kbdiacrsuc __user *a = up;
 766
 767                if (put_user(accent_table_size, &a->kb_cnt))
 768                        ret = -EFAULT;
 769                else if (copy_to_user(a->kbdiacruc, accent_table,
 770                                accent_table_size*sizeof(struct kbdiacruc)))
 771                        ret = -EFAULT;
 772                break;
 773        }
 774
 775        case KDSKBDIACR:
 776        {
 777                struct kbdiacrs __user *a = up;
 778                struct kbdiacr diacr;
 779                unsigned int ct;
 780                int i;
 781
 782                if (!perm)
 783                        goto eperm;
 784                if (get_user(ct,&a->kb_cnt)) {
 785                        ret = -EFAULT;
 786                        break;
 787                }
 788                if (ct >= MAX_DIACR) {
 789                        ret = -EINVAL;
 790                        break;
 791                }
 792                accent_table_size = ct;
 793                for (i = 0; i < ct; i++) {
 794                        if (copy_from_user(&diacr, a->kbdiacr + i, sizeof(struct kbdiacr))) {
 795                                ret = -EFAULT;
 796                                break;
 797                        }
 798                        accent_table[i].diacr = conv_8bit_to_uni(diacr.diacr);
 799                        accent_table[i].base = conv_8bit_to_uni(diacr.base);
 800                        accent_table[i].result = conv_8bit_to_uni(diacr.result);
 801                }
 802                break;
 803        }
 804
 805        case KDSKBDIACRUC:
 806        {
 807                struct kbdiacrsuc __user *a = up;
 808                unsigned int ct;
 809
 810                if (!perm)
 811                        goto eperm;
 812                if (get_user(ct,&a->kb_cnt)) {
 813                        ret = -EFAULT;
 814                        break;
 815                }
 816                if (ct >= MAX_DIACR) {
 817                        ret = -EINVAL;
 818                        break;
 819                }
 820                accent_table_size = ct;
 821                if (copy_from_user(accent_table, a->kbdiacruc, ct*sizeof(struct kbdiacruc)))
 822                        ret = -EFAULT;
 823                break;
 824        }
 825
 826        /* the ioctls below read/set the flags usually shown in the leds */
 827        /* don't use them - they will go away without warning */
 828        case KDGKBLED:
 829                ucval = kbd->ledflagstate | (kbd->default_ledflagstate << 4);
 830                goto setchar;
 831
 832        case KDSKBLED:
 833                if (!perm)
 834                        goto eperm;
 835                if (arg & ~0x77) {
 836                        ret = -EINVAL;
 837                        break;
 838                }
 839                kbd->ledflagstate = (arg & 7);
 840                kbd->default_ledflagstate = ((arg >> 4) & 7);
 841                set_leds();
 842                break;
 843
 844        /* the ioctls below only set the lights, not the functions */
 845        /* for those, see KDGKBLED and KDSKBLED above */
 846        case KDGETLED:
 847                ucval = getledstate();
 848        setchar:
 849                ret = put_user(ucval, (char __user *)arg);
 850                break;
 851
 852        case KDSETLED:
 853                if (!perm)
 854                        goto eperm;
 855                setledstate(kbd, arg);
 856                break;
 857
 858        /*
 859         * A process can indicate its willingness to accept signals
 860         * generated by pressing an appropriate key combination.
 861         * Thus, one can have a daemon that e.g. spawns a new console
 862         * upon a keypress and then changes to it.
 863         * See also the kbrequest field of inittab(5).
 864         */
 865        case KDSIGACCEPT:
 866        {
 867                if (!perm || !capable(CAP_KILL))
 868                        goto eperm;
 869                if (!valid_signal(arg) || arg < 1 || arg == SIGKILL)
 870                        ret = -EINVAL;
 871                else {
 872                        spin_lock_irq(&vt_spawn_con.lock);
 873                        put_pid(vt_spawn_con.pid);
 874                        vt_spawn_con.pid = get_pid(task_pid(current));
 875                        vt_spawn_con.sig = arg;
 876                        spin_unlock_irq(&vt_spawn_con.lock);
 877                }
 878                break;
 879        }
 880
 881        case VT_SETMODE:
 882        {
 883                struct vt_mode tmp;
 884
 885                if (!perm)
 886                        goto eperm;
 887                if (copy_from_user(&tmp, up, sizeof(struct vt_mode))) {
 888                        ret = -EFAULT;
 889                        goto out;
 890                }
 891                if (tmp.mode != VT_AUTO && tmp.mode != VT_PROCESS) {
 892                        ret = -EINVAL;
 893                        goto out;
 894                }
 895                acquire_console_sem();
 896                vc->vt_mode = tmp;
 897                /* the frsig is ignored, so we set it to 0 */
 898                vc->vt_mode.frsig = 0;
 899                put_pid(vc->vt_pid);
 900                vc->vt_pid = get_pid(task_pid(current));
 901                /* no switch is required -- saw@shade.msu.ru */
 902                vc->vt_newvt = -1;
 903                release_console_sem();
 904                break;
 905        }
 906
 907        case VT_GETMODE:
 908        {
 909                struct vt_mode tmp;
 910                int rc;
 911
 912                acquire_console_sem();
 913                memcpy(&tmp, &vc->vt_mode, sizeof(struct vt_mode));
 914                release_console_sem();
 915
 916                rc = copy_to_user(up, &tmp, sizeof(struct vt_mode));
 917                if (rc)
 918                        ret = -EFAULT;
 919                break;
 920        }
 921
 922        /*
 923         * Returns global vt state. Note that VT 0 is always open, since
 924         * it's an alias for the current VT, and people can't use it here.
 925         * We cannot return state for more than 16 VTs, since v_state is short.
 926         */
 927        case VT_GETSTATE:
 928        {
 929                struct vt_stat __user *vtstat = up;
 930                unsigned short state, mask;
 931
 932                if (put_user(fg_console + 1, &vtstat->v_active))
 933                        ret = -EFAULT;
 934                else {
 935                        state = 1;      /* /dev/tty0 is always open */
 936                        for (i = 0, mask = 2; i < MAX_NR_CONSOLES && mask;
 937                                                        ++i, mask <<= 1)
 938                                if (VT_IS_IN_USE(i))
 939                                        state |= mask;
 940                        ret = put_user(state, &vtstat->v_state);
 941                }
 942                break;
 943        }
 944
 945        /*
 946         * Returns the first available (non-opened) console.
 947         */
 948        case VT_OPENQRY:
 949                for (i = 0; i < MAX_NR_CONSOLES; ++i)
 950                        if (! VT_IS_IN_USE(i))
 951                                break;
 952                ucval = i < MAX_NR_CONSOLES ? (i+1) : -1;
 953                goto setint;             
 954
 955        /*
 956         * ioctl(fd, VT_ACTIVATE, num) will cause us to switch to vt # num,
 957         * with num >= 1 (switches to vt 0, our console, are not allowed, just
 958         * to preserve sanity).
 959         */
 960        case VT_ACTIVATE:
 961                if (!perm)
 962                        goto eperm;
 963                if (arg == 0 || arg > MAX_NR_CONSOLES)
 964                        ret =  -ENXIO;
 965                else {
 966                        arg--;
 967                        acquire_console_sem();
 968                        ret = vc_allocate(arg);
 969                        release_console_sem();
 970                        if (ret)
 971                                break;
 972                        set_console(arg);
 973                }
 974                break;
 975
 976        case VT_SETACTIVATE:
 977        {
 978                struct vt_setactivate vsa;
 979
 980                if (!perm)
 981                        goto eperm;
 982
 983                if (copy_from_user(&vsa, (struct vt_setactivate __user *)arg,
 984                                        sizeof(struct vt_setactivate))) {
 985                        ret = -EFAULT;
 986                        goto out;
 987                }
 988                if (vsa.console == 0 || vsa.console > MAX_NR_CONSOLES)
 989                        ret = -ENXIO;
 990                else {
 991                        vsa.console--;
 992                        acquire_console_sem();
 993                        ret = vc_allocate(vsa.console);
 994                        if (ret == 0) {
 995                                struct vc_data *nvc;
 996                                /* This is safe providing we don't drop the
 997                                   console sem between vc_allocate and
 998                                   finishing referencing nvc */
 999                                nvc = vc_cons[vsa.console].d;
1000                                nvc->vt_mode = vsa.mode;
1001                                nvc->vt_mode.frsig = 0;
1002                                put_pid(nvc->vt_pid);
1003                                nvc->vt_pid = get_pid(task_pid(current));
1004                        }
1005                        release_console_sem();
1006                        if (ret)
1007                                break;
1008                        /* Commence switch and lock */
1009                        set_console(arg);
1010                }
1011        }
1012
1013        /*
1014         * wait until the specified VT has been activated
1015         */
1016        case VT_WAITACTIVE:
1017                if (!perm)
1018                        goto eperm;
1019                if (arg == 0 || arg > MAX_NR_CONSOLES)
1020                        ret = -ENXIO;
1021                else
1022                        ret = vt_waitactive(arg);
1023                break;
1024
1025        /*
1026         * If a vt is under process control, the kernel will not switch to it
1027         * immediately, but postpone the operation until the process calls this
1028         * ioctl, allowing the switch to complete.
1029         *
1030         * According to the X sources this is the behavior:
1031         *      0:      pending switch-from not OK
1032         *      1:      pending switch-from OK
1033         *      2:      completed switch-to OK
1034         */
1035        case VT_RELDISP:
1036                if (!perm)
1037                        goto eperm;
1038
1039                if (vc->vt_mode.mode != VT_PROCESS) {
1040                        ret = -EINVAL;
1041                        break;
1042                }
1043                /*
1044                 * Switching-from response
1045                 */
1046                acquire_console_sem();
1047                if (vc->vt_newvt >= 0) {
1048                        if (arg == 0)
1049                                /*
1050                                 * Switch disallowed, so forget we were trying
1051                                 * to do it.
1052                                 */
1053                                vc->vt_newvt = -1;
1054
1055                        else {
1056                                /*
1057                                 * The current vt has been released, so
1058                                 * complete the switch.
1059                                 */
1060                                int newvt;
1061                                newvt = vc->vt_newvt;
1062                                vc->vt_newvt = -1;
1063                                ret = vc_allocate(newvt);
1064                                if (ret) {
1065                                        release_console_sem();
1066                                        break;
1067                                }
1068                                /*
1069                                 * When we actually do the console switch,
1070                                 * make sure we are atomic with respect to
1071                                 * other console switches..
1072                                 */
1073                                complete_change_console(vc_cons[newvt].d);
1074                        }
1075                } else {
1076                        /*
1077                         * Switched-to response
1078                         */
1079                        /*
1080                         * If it's just an ACK, ignore it
1081                         */
1082                        if (arg != VT_ACKACQ)
1083                                ret = -EINVAL;
1084                }
1085                release_console_sem();
1086                break;
1087
1088         /*
1089          * Disallocate memory associated to VT (but leave VT1)
1090          */
1091         case VT_DISALLOCATE:
1092                if (arg > MAX_NR_CONSOLES) {
1093                        ret = -ENXIO;
1094                        break;
1095                }
1096                if (arg == 0) {
1097                    /* deallocate all unused consoles, but leave 0 */
1098                        acquire_console_sem();
1099                        for (i=1; i<MAX_NR_CONSOLES; i++)
1100                                if (! VT_BUSY(i))
1101                                        vc_deallocate(i);
1102                        release_console_sem();
1103                } else {
1104                        /* deallocate a single console, if possible */
1105                        arg--;
1106                        if (VT_BUSY(arg))
1107                                ret = -EBUSY;
1108                        else if (arg) {                       /* leave 0 */
1109                                acquire_console_sem();
1110                                vc_deallocate(arg);
1111                                release_console_sem();
1112                        }
1113                }
1114                break;
1115
1116        case VT_RESIZE:
1117        {
1118                struct vt_sizes __user *vtsizes = up;
1119                struct vc_data *vc;
1120
1121                ushort ll,cc;
1122                if (!perm)
1123                        goto eperm;
1124                if (get_user(ll, &vtsizes->v_rows) ||
1125                    get_user(cc, &vtsizes->v_cols))
1126                        ret = -EFAULT;
1127                else {
1128                        acquire_console_sem();
1129                        for (i = 0; i < MAX_NR_CONSOLES; i++) {
1130                                vc = vc_cons[i].d;
1131
1132                                if (vc) {
1133                                        vc->vc_resize_user = 1;
1134                                        vc_resize(vc_cons[i].d, cc, ll);
1135                                }
1136                        }
1137                        release_console_sem();
1138                }
1139                break;
1140        }
1141
1142        case VT_RESIZEX:
1143        {
1144                struct vt_consize __user *vtconsize = up;
1145                ushort ll,cc,vlin,clin,vcol,ccol;
1146                if (!perm)
1147                        goto eperm;
1148                if (!access_ok(VERIFY_READ, vtconsize,
1149                                sizeof(struct vt_consize))) {
1150                        ret = -EFAULT;
1151                        break;
1152                }
1153                /* FIXME: Should check the copies properly */
1154                __get_user(ll, &vtconsize->v_rows);
1155                __get_user(cc, &vtconsize->v_cols);
1156                __get_user(vlin, &vtconsize->v_vlin);
1157                __get_user(clin, &vtconsize->v_clin);
1158                __get_user(vcol, &vtconsize->v_vcol);
1159                __get_user(ccol, &vtconsize->v_ccol);
1160                vlin = vlin ? vlin : vc->vc_scan_lines;
1161                if (clin) {
1162                        if (ll) {
1163                                if (ll != vlin/clin) {
1164                                        /* Parameters don't add up */
1165                                        ret = -EINVAL;
1166                                        break;
1167                                }
1168                        } else 
1169                                ll = vlin/clin;
1170                }
1171                if (vcol && ccol) {
1172                        if (cc) {
1173                                if (cc != vcol/ccol) {
1174                                        ret = -EINVAL;
1175                                        break;
1176                                }
1177                        } else
1178                                cc = vcol/ccol;
1179                }
1180
1181                if (clin > 32) {
1182                        ret =  -EINVAL;
1183                        break;
1184                }
1185                    
1186                for (i = 0; i < MAX_NR_CONSOLES; i++) {
1187                        if (!vc_cons[i].d)
1188                                continue;
1189                        acquire_console_sem();
1190                        if (vlin)
1191                                vc_cons[i].d->vc_scan_lines = vlin;
1192                        if (clin)
1193                                vc_cons[i].d->vc_font.height = clin;
1194                        vc_cons[i].d->vc_resize_user = 1;
1195                        vc_resize(vc_cons[i].d, cc, ll);
1196                        release_console_sem();
1197                }
1198                break;
1199        }
1200
1201        case PIO_FONT: {
1202                if (!perm)
1203                        goto eperm;
1204                op.op = KD_FONT_OP_SET;
1205                op.flags = KD_FONT_FLAG_OLD | KD_FONT_FLAG_DONT_RECALC; /* Compatibility */
1206                op.width = 8;
1207                op.height = 0;
1208                op.charcount = 256;
1209                op.data = up;
1210                ret = con_font_op(vc_cons[fg_console].d, &op);
1211                break;
1212        }
1213
1214        case GIO_FONT: {
1215                op.op = KD_FONT_OP_GET;
1216                op.flags = KD_FONT_FLAG_OLD;
1217                op.width = 8;
1218                op.height = 32;
1219                op.charcount = 256;
1220                op.data = up;
1221                ret = con_font_op(vc_cons[fg_console].d, &op);
1222                break;
1223        }
1224
1225        case PIO_CMAP:
1226                if (!perm)
1227                        ret = -EPERM;
1228                else
1229                        ret = con_set_cmap(up);
1230                break;
1231
1232        case GIO_CMAP:
1233                ret = con_get_cmap(up);
1234                break;
1235
1236        case PIO_FONTX:
1237        case GIO_FONTX:
1238                ret = do_fontx_ioctl(cmd, up, perm, &op);
1239                break;
1240
1241        case PIO_FONTRESET:
1242        {
1243                if (!perm)
1244                        goto eperm;
1245
1246#ifdef BROKEN_GRAPHICS_PROGRAMS
1247                /* With BROKEN_GRAPHICS_PROGRAMS defined, the default
1248                   font is not saved. */
1249                ret = -ENOSYS;
1250                break;
1251#else
1252                {
1253                op.op = KD_FONT_OP_SET_DEFAULT;
1254                op.data = NULL;
1255                ret = con_font_op(vc_cons[fg_console].d, &op);
1256                if (ret)
1257                        break;
1258                con_set_default_unimap(vc_cons[fg_console].d);
1259                break;
1260                }
1261#endif
1262        }
1263
1264        case KDFONTOP: {
1265                if (copy_from_user(&op, up, sizeof(op))) {
1266                        ret = -EFAULT;
1267                        break;
1268                }
1269                if (!perm && op.op != KD_FONT_OP_GET)
1270                        goto eperm;
1271                ret = con_font_op(vc, &op);
1272                if (ret)
1273                        break;
1274                if (copy_to_user(up, &op, sizeof(op)))
1275                        ret = -EFAULT;
1276                break;
1277        }
1278
1279        case PIO_SCRNMAP:
1280                if (!perm)
1281                        ret = -EPERM;
1282                else
1283                        ret = con_set_trans_old(up);
1284                break;
1285
1286        case GIO_SCRNMAP:
1287                ret = con_get_trans_old(up);
1288                break;
1289
1290        case PIO_UNISCRNMAP:
1291                if (!perm)
1292                        ret = -EPERM;
1293                else
1294                        ret = con_set_trans_new(up);
1295                break;
1296
1297        case GIO_UNISCRNMAP:
1298                ret = con_get_trans_new(up);
1299                break;
1300
1301        case PIO_UNIMAPCLR:
1302              { struct unimapinit ui;
1303                if (!perm)
1304                        goto eperm;
1305                ret = copy_from_user(&ui, up, sizeof(struct unimapinit));
1306                if (!ret)
1307                        con_clear_unimap(vc, &ui);
1308                break;
1309              }
1310
1311        case PIO_UNIMAP:
1312        case GIO_UNIMAP:
1313                ret = do_unimap_ioctl(cmd, up, perm, vc);
1314                break;
1315
1316        case VT_LOCKSWITCH:
1317                if (!capable(CAP_SYS_TTY_CONFIG))
1318                        goto eperm;
1319                vt_dont_switch = 1;
1320                break;
1321        case VT_UNLOCKSWITCH:
1322                if (!capable(CAP_SYS_TTY_CONFIG))
1323                        goto eperm;
1324                vt_dont_switch = 0;
1325                break;
1326        case VT_GETHIFONTMASK:
1327                ret = put_user(vc->vc_hi_font_mask,
1328                                        (unsigned short __user *)arg);
1329                break;
1330        case VT_WAITEVENT:
1331                ret = vt_event_wait_ioctl((struct vt_event __user *)arg);
1332                break;
1333        default:
1334                ret = -ENOIOCTLCMD;
1335        }
1336out:
1337        unlock_kernel();
1338        return ret;
1339eperm:
1340        ret = -EPERM;
1341        goto out;
1342}
1343
1344void reset_vc(struct vc_data *vc)
1345{
1346        vc->vc_mode = KD_TEXT;
1347        kbd_table[vc->vc_num].kbdmode = default_utf8 ? VC_UNICODE : VC_XLATE;
1348        vc->vt_mode.mode = VT_AUTO;
1349        vc->vt_mode.waitv = 0;
1350        vc->vt_mode.relsig = 0;
1351        vc->vt_mode.acqsig = 0;
1352        vc->vt_mode.frsig = 0;
1353        put_pid(vc->vt_pid);
1354        vc->vt_pid = NULL;
1355        vc->vt_newvt = -1;
1356        if (!in_interrupt())    /* Via keyboard.c:SAK() - akpm */
1357                reset_palette(vc);
1358}
1359
1360void vc_SAK(struct work_struct *work)
1361{
1362        struct vc *vc_con =
1363                container_of(work, struct vc, SAK_work);
1364        struct vc_data *vc;
1365        struct tty_struct *tty;
1366
1367        acquire_console_sem();
1368        vc = vc_con->d;
1369        if (vc) {
1370                tty = vc->vc_tty;
1371                /*
1372                 * SAK should also work in all raw modes and reset
1373                 * them properly.
1374                 */
1375                if (tty)
1376                        __do_SAK(tty);
1377                reset_vc(vc);
1378        }
1379        release_console_sem();
1380}
1381
1382#ifdef CONFIG_COMPAT
1383
1384struct compat_consolefontdesc {
1385        unsigned short charcount;       /* characters in font (256 or 512) */
1386        unsigned short charheight;      /* scan lines per character (1-32) */
1387        compat_caddr_t chardata;        /* font data in expanded form */
1388};
1389
1390static inline int
1391compat_fontx_ioctl(int cmd, struct compat_consolefontdesc __user *user_cfd,
1392                         int perm, struct console_font_op *op)
1393{
1394        struct compat_consolefontdesc cfdarg;
1395        int i;
1396
1397        if (copy_from_user(&cfdarg, user_cfd, sizeof(struct compat_consolefontdesc)))
1398                return -EFAULT;
1399
1400        switch (cmd) {
1401        case PIO_FONTX:
1402                if (!perm)
1403                        return -EPERM;
1404                op->op = KD_FONT_OP_SET;
1405                op->flags = KD_FONT_FLAG_OLD;
1406                op->width = 8;
1407                op->height = cfdarg.charheight;
1408                op->charcount = cfdarg.charcount;
1409                op->data = compat_ptr(cfdarg.chardata);
1410                return con_font_op(vc_cons[fg_console].d, op);
1411        case GIO_FONTX:
1412                op->op = KD_FONT_OP_GET;
1413                op->flags = KD_FONT_FLAG_OLD;
1414                op->width = 8;
1415                op->height = cfdarg.charheight;
1416                op->charcount = cfdarg.charcount;
1417                op->data = compat_ptr(cfdarg.chardata);
1418                i = con_font_op(vc_cons[fg_console].d, op);
1419                if (i)
1420                        return i;
1421                cfdarg.charheight = op->height;
1422                cfdarg.charcount = op->charcount;
1423                if (copy_to_user(user_cfd, &cfdarg, sizeof(struct compat_consolefontdesc)))
1424                        return -EFAULT;
1425                return 0;
1426        }
1427        return -EINVAL;
1428}
1429
1430struct compat_console_font_op {
1431        compat_uint_t op;        /* operation code KD_FONT_OP_* */
1432        compat_uint_t flags;     /* KD_FONT_FLAG_* */
1433        compat_uint_t width, height;     /* font size */
1434        compat_uint_t charcount;
1435        compat_caddr_t data;    /* font data with height fixed to 32 */
1436};
1437
1438static inline int
1439compat_kdfontop_ioctl(struct compat_console_font_op __user *fontop,
1440                         int perm, struct console_font_op *op, struct vc_data *vc)
1441{
1442        int i;
1443
1444        if (copy_from_user(op, fontop, sizeof(struct compat_console_font_op)))
1445                return -EFAULT;
1446        if (!perm && op->op != KD_FONT_OP_GET)
1447                return -EPERM;
1448        op->data = compat_ptr(((struct compat_console_font_op *)op)->data);
1449        op->flags |= KD_FONT_FLAG_OLD;
1450        i = con_font_op(vc, op);
1451        if (i)
1452                return i;
1453        ((struct compat_console_font_op *)op)->data = (unsigned long)op->data;
1454        if (copy_to_user(fontop, op, sizeof(struct compat_console_font_op)))
1455                return -EFAULT;
1456        return 0;
1457}
1458
1459struct compat_unimapdesc {
1460        unsigned short entry_ct;
1461        compat_caddr_t entries;
1462};
1463
1464static inline int
1465compat_unimap_ioctl(unsigned int cmd, struct compat_unimapdesc __user *user_ud,
1466                         int perm, struct vc_data *vc)
1467{
1468        struct compat_unimapdesc tmp;
1469        struct unipair __user *tmp_entries;
1470
1471        if (copy_from_user(&tmp, user_ud, sizeof tmp))
1472                return -EFAULT;
1473        tmp_entries = compat_ptr(tmp.entries);
1474        if (tmp_entries)
1475                if (!access_ok(VERIFY_WRITE, tmp_entries,
1476                                tmp.entry_ct*sizeof(struct unipair)))
1477                        return -EFAULT;
1478        switch (cmd) {
1479        case PIO_UNIMAP:
1480                if (!perm)
1481                        return -EPERM;
1482                return con_set_unimap(vc, tmp.entry_ct, tmp_entries);
1483        case GIO_UNIMAP:
1484                if (!perm && fg_console != vc->vc_num)
1485                        return -EPERM;
1486                return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp_entries);
1487        }
1488        return 0;
1489}
1490
1491long vt_compat_ioctl(struct tty_struct *tty, struct file * file,
1492             unsigned int cmd, unsigned long arg)
1493{
1494        struct vc_data *vc = tty->driver_data;
1495        struct console_font_op op;      /* used in multiple places here */
1496        struct kbd_struct *kbd;
1497        unsigned int console;
1498        void __user *up = (void __user *)arg;
1499        int perm;
1500        int ret = 0;
1501
1502        console = vc->vc_num;
1503
1504        lock_kernel();
1505
1506        if (!vc_cons_allocated(console)) {      /* impossible? */
1507                ret = -ENOIOCTLCMD;
1508                goto out;
1509        }
1510
1511        /*
1512         * To have permissions to do most of the vt ioctls, we either have
1513         * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
1514         */
1515        perm = 0;
1516        if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG))
1517                perm = 1;
1518
1519        kbd = kbd_table + console;
1520        switch (cmd) {
1521        /*
1522         * these need special handlers for incompatible data structures
1523         */
1524        case PIO_FONTX:
1525        case GIO_FONTX:
1526                ret = compat_fontx_ioctl(cmd, up, perm, &op);
1527                break;
1528
1529        case KDFONTOP:
1530                ret = compat_kdfontop_ioctl(up, perm, &op, vc);
1531                break;
1532
1533        case PIO_UNIMAP:
1534        case GIO_UNIMAP:
1535                ret = compat_unimap_ioctl(cmd, up, perm, vc);
1536                break;
1537
1538        /*
1539         * all these treat 'arg' as an integer
1540         */
1541        case KIOCSOUND:
1542        case KDMKTONE:
1543#ifdef CONFIG_X86
1544        case KDADDIO:
1545        case KDDELIO:
1546#endif
1547        case KDSETMODE:
1548        case KDMAPDISP:
1549        case KDUNMAPDISP:
1550        case KDSKBMODE:
1551        case KDSKBMETA:
1552        case KDSKBLED:
1553        case KDSETLED:
1554        case KDSIGACCEPT:
1555        case VT_ACTIVATE:
1556        case VT_WAITACTIVE:
1557        case VT_RELDISP:
1558        case VT_DISALLOCATE:
1559        case VT_RESIZE:
1560        case VT_RESIZEX:
1561                goto fallback;
1562
1563        /*
1564         * the rest has a compatible data structure behind arg,
1565         * but we have to convert it to a proper 64 bit pointer.
1566         */
1567        default:
1568                arg = (unsigned long)compat_ptr(arg);
1569                goto fallback;
1570        }
1571out:
1572        unlock_kernel();
1573        return ret;
1574
1575fallback:
1576        unlock_kernel();
1577        return vt_ioctl(tty, file, cmd, arg);
1578}
1579
1580
1581#endif /* CONFIG_COMPAT */
1582
1583
1584/*
1585 * Performs the back end of a vt switch. Called under the console
1586 * semaphore.
1587 */
1588static void complete_change_console(struct vc_data *vc)
1589{
1590        unsigned char old_vc_mode;
1591        int old = fg_console;
1592
1593        last_console = fg_console;
1594
1595        /*
1596         * If we're switching, we could be going from KD_GRAPHICS to
1597         * KD_TEXT mode or vice versa, which means we need to blank or
1598         * unblank the screen later.
1599         */
1600        old_vc_mode = vc_cons[fg_console].d->vc_mode;
1601        switch_screen(vc);
1602
1603        /*
1604         * This can't appear below a successful kill_pid().  If it did,
1605         * then the *blank_screen operation could occur while X, having
1606         * received acqsig, is waking up on another processor.  This
1607         * condition can lead to overlapping accesses to the VGA range
1608         * and the framebuffer (causing system lockups).
1609         *
1610         * To account for this we duplicate this code below only if the
1611         * controlling process is gone and we've called reset_vc.
1612         */
1613        if (old_vc_mode != vc->vc_mode) {
1614                if (vc->vc_mode == KD_TEXT)
1615                        do_unblank_screen(1);
1616                else
1617                        do_blank_screen(1);
1618        }
1619
1620        /*
1621         * If this new console is under process control, send it a signal
1622         * telling it that it has acquired. Also check if it has died and
1623         * clean up (similar to logic employed in change_console())
1624         */
1625        if (vc->vt_mode.mode == VT_PROCESS) {
1626                /*
1627                 * Send the signal as privileged - kill_pid() will
1628                 * tell us if the process has gone or something else
1629                 * is awry
1630                 */
1631                if (kill_pid(vc->vt_pid, vc->vt_mode.acqsig, 1) != 0) {
1632                /*
1633                 * The controlling process has died, so we revert back to
1634                 * normal operation. In this case, we'll also change back
1635                 * to KD_TEXT mode. I'm not sure if this is strictly correct
1636                 * but it saves the agony when the X server dies and the screen
1637                 * remains blanked due to KD_GRAPHICS! It would be nice to do
1638                 * this outside of VT_PROCESS but there is no single process
1639                 * to account for and tracking tty count may be undesirable.
1640                 */
1641                        reset_vc(vc);
1642
1643                        if (old_vc_mode != vc->vc_mode) {
1644                                if (vc->vc_mode == KD_TEXT)
1645                                        do_unblank_screen(1);
1646                                else
1647                                        do_blank_screen(1);
1648                        }
1649                }
1650        }
1651
1652        /*
1653         * Wake anyone waiting for their VT to activate
1654         */
1655        vt_event_post(VT_EVENT_SWITCH, old, vc->vc_num);
1656        return;
1657}
1658
1659/*
1660 * Performs the front-end of a vt switch
1661 */
1662void change_console(struct vc_data *new_vc)
1663{
1664        struct vc_data *vc;
1665
1666        if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch)
1667                return;
1668
1669        /*
1670         * If this vt is in process mode, then we need to handshake with
1671         * that process before switching. Essentially, we store where that
1672         * vt wants to switch to and wait for it to tell us when it's done
1673         * (via VT_RELDISP ioctl).
1674         *
1675         * We also check to see if the controlling process still exists.
1676         * If it doesn't, we reset this vt to auto mode and continue.
1677         * This is a cheap way to track process control. The worst thing
1678         * that can happen is: we send a signal to a process, it dies, and
1679         * the switch gets "lost" waiting for a response; hopefully, the
1680         * user will try again, we'll detect the process is gone (unless
1681         * the user waits just the right amount of time :-) and revert the
1682         * vt to auto control.
1683         */
1684        vc = vc_cons[fg_console].d;
1685        if (vc->vt_mode.mode == VT_PROCESS) {
1686                /*
1687                 * Send the signal as privileged - kill_pid() will
1688                 * tell us if the process has gone or something else
1689                 * is awry.
1690                 *
1691                 * We need to set vt_newvt *before* sending the signal or we
1692                 * have a race.
1693                 */
1694                vc->vt_newvt = new_vc->vc_num;
1695                if (kill_pid(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) {
1696                        /*
1697                         * It worked. Mark the vt to switch to and
1698                         * return. The process needs to send us a
1699                         * VT_RELDISP ioctl to complete the switch.
1700                         */
1701                        return;
1702                }
1703
1704                /*
1705                 * The controlling process has died, so we revert back to
1706                 * normal operation. In this case, we'll also change back
1707                 * to KD_TEXT mode. I'm not sure if this is strictly correct
1708                 * but it saves the agony when the X server dies and the screen
1709                 * remains blanked due to KD_GRAPHICS! It would be nice to do
1710                 * this outside of VT_PROCESS but there is no single process
1711                 * to account for and tracking tty count may be undesirable.
1712                 */
1713                reset_vc(vc);
1714
1715                /*
1716                 * Fall through to normal (VT_AUTO) handling of the switch...
1717                 */
1718        }
1719
1720        /*
1721         * Ignore all switches in KD_GRAPHICS+VT_AUTO mode
1722         */
1723        if (vc->vc_mode == KD_GRAPHICS)
1724                return;
1725
1726        complete_change_console(new_vc);
1727}
1728
1729/* Perform a kernel triggered VT switch for suspend/resume */
1730
1731static int disable_vt_switch;
1732
1733int vt_move_to_console(unsigned int vt, int alloc)
1734{
1735        int prev;
1736
1737        acquire_console_sem();
1738        /* Graphics mode - up to X */
1739        if (disable_vt_switch) {
1740                release_console_sem();
1741                return 0;
1742        }
1743        prev = fg_console;
1744
1745        if (alloc && vc_allocate(vt)) {
1746                /* we can't have a free VC for now. Too bad,
1747                 * we don't want to mess the screen for now. */
1748                release_console_sem();
1749                return -ENOSPC;
1750        }
1751
1752        if (set_console(vt)) {
1753                /*
1754                 * We're unable to switch to the SUSPEND_CONSOLE.
1755                 * Let the calling function know so it can decide
1756                 * what to do.
1757                 */
1758                release_console_sem();
1759                return -EIO;
1760        }
1761        release_console_sem();
1762        if (vt_waitactive(vt + 1)) {
1763                pr_debug("Suspend: Can't switch VCs.");
1764                return -EINTR;
1765        }
1766        return prev;
1767}
1768
1769/*
1770 * Normally during a suspend, we allocate a new console and switch to it.
1771 * When we resume, we switch back to the original console.  This switch
1772 * can be slow, so on systems where the framebuffer can handle restoration
1773 * of video registers anyways, there's little point in doing the console
1774 * switch.  This function allows you to disable it by passing it '0'.
1775 */
1776void pm_set_vt_switch(int do_switch)
1777{
1778        acquire_console_sem();
1779        disable_vt_switch = !do_switch;
1780        release_console_sem();
1781}
1782EXPORT_SYMBOL(pm_set_vt_switch);
1783