tty: Power: fix suspend vt regression
[safe/jmp/linux-2.6] / drivers / char / vt_ioctl.c
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
41 char vt_dont_switch;
42 extern 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
64 static void complete_change_console(struct vc_data *vc);
65
66 /*
67  *      User space VT_EVENT handlers
68  */
69
70 struct vt_event_wait {
71         struct list_head list;
72         struct vt_event event;
73         int done;
74 };
75
76 static LIST_HEAD(vt_events);
77 static DEFINE_SPINLOCK(vt_event_lock);
78 static 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
89 void 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.old = old + 1;
107                 ve->event.new = 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
125 static 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
150 static 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
179 int 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.new != 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)
204 static inline int
205 do_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
292 static inline int 
293 do_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
315 static inline int
316 do_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;
423 reterr:
424         kfree(kbs);
425         return ret;
426 }
427
428 static inline int 
429 do_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
468 static inline int 
469 do_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  */
498 int 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                         return -EFAULT;
986                 if (vsa.console == 0 || vsa.console > MAX_NR_CONSOLES)
987                         ret = -ENXIO;
988                 else {
989                         vsa.console--;
990                         acquire_console_sem();
991                         ret = vc_allocate(vsa.console);
992                         if (ret == 0) {
993                                 struct vc_data *nvc;
994                                 /* This is safe providing we don't drop the
995                                    console sem between vc_allocate and
996                                    finishing referencing nvc */
997                                 nvc = vc_cons[vsa.console].d;
998                                 nvc->vt_mode = vsa.mode;
999                                 nvc->vt_mode.frsig = 0;
1000                                 put_pid(nvc->vt_pid);
1001                                 nvc->vt_pid = get_pid(task_pid(current));
1002                         }
1003                         release_console_sem();
1004                         if (ret)
1005                                 break;
1006                         /* Commence switch and lock */
1007                         set_console(arg);
1008                 }
1009         }
1010
1011         /*
1012          * wait until the specified VT has been activated
1013          */
1014         case VT_WAITACTIVE:
1015                 if (!perm)
1016                         goto eperm;
1017                 if (arg == 0 || arg > MAX_NR_CONSOLES)
1018                         ret = -ENXIO;
1019                 else
1020                         ret = vt_waitactive(arg);
1021                 break;
1022
1023         /*
1024          * If a vt is under process control, the kernel will not switch to it
1025          * immediately, but postpone the operation until the process calls this
1026          * ioctl, allowing the switch to complete.
1027          *
1028          * According to the X sources this is the behavior:
1029          *      0:      pending switch-from not OK
1030          *      1:      pending switch-from OK
1031          *      2:      completed switch-to OK
1032          */
1033         case VT_RELDISP:
1034                 if (!perm)
1035                         goto eperm;
1036
1037                 if (vc->vt_mode.mode != VT_PROCESS) {
1038                         ret = -EINVAL;
1039                         break;
1040                 }
1041                 /*
1042                  * Switching-from response
1043                  */
1044                 acquire_console_sem();
1045                 if (vc->vt_newvt >= 0) {
1046                         if (arg == 0)
1047                                 /*
1048                                  * Switch disallowed, so forget we were trying
1049                                  * to do it.
1050                                  */
1051                                 vc->vt_newvt = -1;
1052
1053                         else {
1054                                 /*
1055                                  * The current vt has been released, so
1056                                  * complete the switch.
1057                                  */
1058                                 int newvt;
1059                                 newvt = vc->vt_newvt;
1060                                 vc->vt_newvt = -1;
1061                                 ret = vc_allocate(newvt);
1062                                 if (ret) {
1063                                         release_console_sem();
1064                                         break;
1065                                 }
1066                                 /*
1067                                  * When we actually do the console switch,
1068                                  * make sure we are atomic with respect to
1069                                  * other console switches..
1070                                  */
1071                                 complete_change_console(vc_cons[newvt].d);
1072                         }
1073                 } else {
1074                         /*
1075                          * Switched-to response
1076                          */
1077                         /*
1078                          * If it's just an ACK, ignore it
1079                          */
1080                         if (arg != VT_ACKACQ)
1081                                 ret = -EINVAL;
1082                 }
1083                 release_console_sem();
1084                 break;
1085
1086          /*
1087           * Disallocate memory associated to VT (but leave VT1)
1088           */
1089          case VT_DISALLOCATE:
1090                 if (arg > MAX_NR_CONSOLES) {
1091                         ret = -ENXIO;
1092                         break;
1093                 }
1094                 if (arg == 0) {
1095                     /* deallocate all unused consoles, but leave 0 */
1096                         acquire_console_sem();
1097                         for (i=1; i<MAX_NR_CONSOLES; i++)
1098                                 if (! VT_BUSY(i))
1099                                         vc_deallocate(i);
1100                         release_console_sem();
1101                 } else {
1102                         /* deallocate a single console, if possible */
1103                         arg--;
1104                         if (VT_BUSY(arg))
1105                                 ret = -EBUSY;
1106                         else if (arg) {                       /* leave 0 */
1107                                 acquire_console_sem();
1108                                 vc_deallocate(arg);
1109                                 release_console_sem();
1110                         }
1111                 }
1112                 break;
1113
1114         case VT_RESIZE:
1115         {
1116                 struct vt_sizes __user *vtsizes = up;
1117                 struct vc_data *vc;
1118
1119                 ushort ll,cc;
1120                 if (!perm)
1121                         goto eperm;
1122                 if (get_user(ll, &vtsizes->v_rows) ||
1123                     get_user(cc, &vtsizes->v_cols))
1124                         ret = -EFAULT;
1125                 else {
1126                         acquire_console_sem();
1127                         for (i = 0; i < MAX_NR_CONSOLES; i++) {
1128                                 vc = vc_cons[i].d;
1129
1130                                 if (vc) {
1131                                         vc->vc_resize_user = 1;
1132                                         vc_resize(vc_cons[i].d, cc, ll);
1133                                 }
1134                         }
1135                         release_console_sem();
1136                 }
1137                 break;
1138         }
1139
1140         case VT_RESIZEX:
1141         {
1142                 struct vt_consize __user *vtconsize = up;
1143                 ushort ll,cc,vlin,clin,vcol,ccol;
1144                 if (!perm)
1145                         goto eperm;
1146                 if (!access_ok(VERIFY_READ, vtconsize,
1147                                 sizeof(struct vt_consize))) {
1148                         ret = -EFAULT;
1149                         break;
1150                 }
1151                 /* FIXME: Should check the copies properly */
1152                 __get_user(ll, &vtconsize->v_rows);
1153                 __get_user(cc, &vtconsize->v_cols);
1154                 __get_user(vlin, &vtconsize->v_vlin);
1155                 __get_user(clin, &vtconsize->v_clin);
1156                 __get_user(vcol, &vtconsize->v_vcol);
1157                 __get_user(ccol, &vtconsize->v_ccol);
1158                 vlin = vlin ? vlin : vc->vc_scan_lines;
1159                 if (clin) {
1160                         if (ll) {
1161                                 if (ll != vlin/clin) {
1162                                         /* Parameters don't add up */
1163                                         ret = -EINVAL;
1164                                         break;
1165                                 }
1166                         } else 
1167                                 ll = vlin/clin;
1168                 }
1169                 if (vcol && ccol) {
1170                         if (cc) {
1171                                 if (cc != vcol/ccol) {
1172                                         ret = -EINVAL;
1173                                         break;
1174                                 }
1175                         } else
1176                                 cc = vcol/ccol;
1177                 }
1178
1179                 if (clin > 32) {
1180                         ret =  -EINVAL;
1181                         break;
1182                 }
1183                     
1184                 for (i = 0; i < MAX_NR_CONSOLES; i++) {
1185                         if (!vc_cons[i].d)
1186                                 continue;
1187                         acquire_console_sem();
1188                         if (vlin)
1189                                 vc_cons[i].d->vc_scan_lines = vlin;
1190                         if (clin)
1191                                 vc_cons[i].d->vc_font.height = clin;
1192                         vc_cons[i].d->vc_resize_user = 1;
1193                         vc_resize(vc_cons[i].d, cc, ll);
1194                         release_console_sem();
1195                 }
1196                 break;
1197         }
1198
1199         case PIO_FONT: {
1200                 if (!perm)
1201                         goto eperm;
1202                 op.op = KD_FONT_OP_SET;
1203                 op.flags = KD_FONT_FLAG_OLD | KD_FONT_FLAG_DONT_RECALC; /* Compatibility */
1204                 op.width = 8;
1205                 op.height = 0;
1206                 op.charcount = 256;
1207                 op.data = up;
1208                 ret = con_font_op(vc_cons[fg_console].d, &op);
1209                 break;
1210         }
1211
1212         case GIO_FONT: {
1213                 op.op = KD_FONT_OP_GET;
1214                 op.flags = KD_FONT_FLAG_OLD;
1215                 op.width = 8;
1216                 op.height = 32;
1217                 op.charcount = 256;
1218                 op.data = up;
1219                 ret = con_font_op(vc_cons[fg_console].d, &op);
1220                 break;
1221         }
1222
1223         case PIO_CMAP:
1224                 if (!perm)
1225                         ret = -EPERM;
1226                 else
1227                         ret = con_set_cmap(up);
1228                 break;
1229
1230         case GIO_CMAP:
1231                 ret = con_get_cmap(up);
1232                 break;
1233
1234         case PIO_FONTX:
1235         case GIO_FONTX:
1236                 ret = do_fontx_ioctl(cmd, up, perm, &op);
1237                 break;
1238
1239         case PIO_FONTRESET:
1240         {
1241                 if (!perm)
1242                         goto eperm;
1243
1244 #ifdef BROKEN_GRAPHICS_PROGRAMS
1245                 /* With BROKEN_GRAPHICS_PROGRAMS defined, the default
1246                    font is not saved. */
1247                 ret = -ENOSYS;
1248                 break;
1249 #else
1250                 {
1251                 op.op = KD_FONT_OP_SET_DEFAULT;
1252                 op.data = NULL;
1253                 ret = con_font_op(vc_cons[fg_console].d, &op);
1254                 if (ret)
1255                         break;
1256                 con_set_default_unimap(vc_cons[fg_console].d);
1257                 break;
1258                 }
1259 #endif
1260         }
1261
1262         case KDFONTOP: {
1263                 if (copy_from_user(&op, up, sizeof(op))) {
1264                         ret = -EFAULT;
1265                         break;
1266                 }
1267                 if (!perm && op.op != KD_FONT_OP_GET)
1268                         goto eperm;
1269                 ret = con_font_op(vc, &op);
1270                 if (ret)
1271                         break;
1272                 if (copy_to_user(up, &op, sizeof(op)))
1273                         ret = -EFAULT;
1274                 break;
1275         }
1276
1277         case PIO_SCRNMAP:
1278                 if (!perm)
1279                         ret = -EPERM;
1280                 else
1281                         ret = con_set_trans_old(up);
1282                 break;
1283
1284         case GIO_SCRNMAP:
1285                 ret = con_get_trans_old(up);
1286                 break;
1287
1288         case PIO_UNISCRNMAP:
1289                 if (!perm)
1290                         ret = -EPERM;
1291                 else
1292                         ret = con_set_trans_new(up);
1293                 break;
1294
1295         case GIO_UNISCRNMAP:
1296                 ret = con_get_trans_new(up);
1297                 break;
1298
1299         case PIO_UNIMAPCLR:
1300               { struct unimapinit ui;
1301                 if (!perm)
1302                         goto eperm;
1303                 ret = copy_from_user(&ui, up, sizeof(struct unimapinit));
1304                 if (!ret)
1305                         con_clear_unimap(vc, &ui);
1306                 break;
1307               }
1308
1309         case PIO_UNIMAP:
1310         case GIO_UNIMAP:
1311                 ret = do_unimap_ioctl(cmd, up, perm, vc);
1312                 break;
1313
1314         case VT_LOCKSWITCH:
1315                 if (!capable(CAP_SYS_TTY_CONFIG))
1316                         goto eperm;
1317                 vt_dont_switch = 1;
1318                 break;
1319         case VT_UNLOCKSWITCH:
1320                 if (!capable(CAP_SYS_TTY_CONFIG))
1321                         goto eperm;
1322                 vt_dont_switch = 0;
1323                 break;
1324         case VT_GETHIFONTMASK:
1325                 ret = put_user(vc->vc_hi_font_mask,
1326                                         (unsigned short __user *)arg);
1327                 break;
1328         case VT_WAITEVENT:
1329                 ret = vt_event_wait_ioctl((struct vt_event __user *)arg);
1330                 break;
1331         default:
1332                 ret = -ENOIOCTLCMD;
1333         }
1334 out:
1335         unlock_kernel();
1336         return ret;
1337 eperm:
1338         ret = -EPERM;
1339         goto out;
1340 }
1341
1342 void reset_vc(struct vc_data *vc)
1343 {
1344         vc->vc_mode = KD_TEXT;
1345         kbd_table[vc->vc_num].kbdmode = default_utf8 ? VC_UNICODE : VC_XLATE;
1346         vc->vt_mode.mode = VT_AUTO;
1347         vc->vt_mode.waitv = 0;
1348         vc->vt_mode.relsig = 0;
1349         vc->vt_mode.acqsig = 0;
1350         vc->vt_mode.frsig = 0;
1351         put_pid(vc->vt_pid);
1352         vc->vt_pid = NULL;
1353         vc->vt_newvt = -1;
1354         if (!in_interrupt())    /* Via keyboard.c:SAK() - akpm */
1355                 reset_palette(vc);
1356 }
1357
1358 void vc_SAK(struct work_struct *work)
1359 {
1360         struct vc *vc_con =
1361                 container_of(work, struct vc, SAK_work);
1362         struct vc_data *vc;
1363         struct tty_struct *tty;
1364
1365         acquire_console_sem();
1366         vc = vc_con->d;
1367         if (vc) {
1368                 tty = vc->vc_tty;
1369                 /*
1370                  * SAK should also work in all raw modes and reset
1371                  * them properly.
1372                  */
1373                 if (tty)
1374                         __do_SAK(tty);
1375                 reset_vc(vc);
1376         }
1377         release_console_sem();
1378 }
1379
1380 #ifdef CONFIG_COMPAT
1381
1382 struct compat_consolefontdesc {
1383         unsigned short charcount;       /* characters in font (256 or 512) */
1384         unsigned short charheight;      /* scan lines per character (1-32) */
1385         compat_caddr_t chardata;        /* font data in expanded form */
1386 };
1387
1388 static inline int
1389 compat_fontx_ioctl(int cmd, struct compat_consolefontdesc __user *user_cfd,
1390                          int perm, struct console_font_op *op)
1391 {
1392         struct compat_consolefontdesc cfdarg;
1393         int i;
1394
1395         if (copy_from_user(&cfdarg, user_cfd, sizeof(struct compat_consolefontdesc)))
1396                 return -EFAULT;
1397
1398         switch (cmd) {
1399         case PIO_FONTX:
1400                 if (!perm)
1401                         return -EPERM;
1402                 op->op = KD_FONT_OP_SET;
1403                 op->flags = KD_FONT_FLAG_OLD;
1404                 op->width = 8;
1405                 op->height = cfdarg.charheight;
1406                 op->charcount = cfdarg.charcount;
1407                 op->data = compat_ptr(cfdarg.chardata);
1408                 return con_font_op(vc_cons[fg_console].d, op);
1409         case GIO_FONTX:
1410                 op->op = KD_FONT_OP_GET;
1411                 op->flags = KD_FONT_FLAG_OLD;
1412                 op->width = 8;
1413                 op->height = cfdarg.charheight;
1414                 op->charcount = cfdarg.charcount;
1415                 op->data = compat_ptr(cfdarg.chardata);
1416                 i = con_font_op(vc_cons[fg_console].d, op);
1417                 if (i)
1418                         return i;
1419                 cfdarg.charheight = op->height;
1420                 cfdarg.charcount = op->charcount;
1421                 if (copy_to_user(user_cfd, &cfdarg, sizeof(struct compat_consolefontdesc)))
1422                         return -EFAULT;
1423                 return 0;
1424         }
1425         return -EINVAL;
1426 }
1427
1428 struct compat_console_font_op {
1429         compat_uint_t op;        /* operation code KD_FONT_OP_* */
1430         compat_uint_t flags;     /* KD_FONT_FLAG_* */
1431         compat_uint_t width, height;     /* font size */
1432         compat_uint_t charcount;
1433         compat_caddr_t data;    /* font data with height fixed to 32 */
1434 };
1435
1436 static inline int
1437 compat_kdfontop_ioctl(struct compat_console_font_op __user *fontop,
1438                          int perm, struct console_font_op *op, struct vc_data *vc)
1439 {
1440         int i;
1441
1442         if (copy_from_user(op, fontop, sizeof(struct compat_console_font_op)))
1443                 return -EFAULT;
1444         if (!perm && op->op != KD_FONT_OP_GET)
1445                 return -EPERM;
1446         op->data = compat_ptr(((struct compat_console_font_op *)op)->data);
1447         op->flags |= KD_FONT_FLAG_OLD;
1448         i = con_font_op(vc, op);
1449         if (i)
1450                 return i;
1451         ((struct compat_console_font_op *)op)->data = (unsigned long)op->data;
1452         if (copy_to_user(fontop, op, sizeof(struct compat_console_font_op)))
1453                 return -EFAULT;
1454         return 0;
1455 }
1456
1457 struct compat_unimapdesc {
1458         unsigned short entry_ct;
1459         compat_caddr_t entries;
1460 };
1461
1462 static inline int
1463 compat_unimap_ioctl(unsigned int cmd, struct compat_unimapdesc __user *user_ud,
1464                          int perm, struct vc_data *vc)
1465 {
1466         struct compat_unimapdesc tmp;
1467         struct unipair __user *tmp_entries;
1468
1469         if (copy_from_user(&tmp, user_ud, sizeof tmp))
1470                 return -EFAULT;
1471         tmp_entries = compat_ptr(tmp.entries);
1472         if (tmp_entries)
1473                 if (!access_ok(VERIFY_WRITE, tmp_entries,
1474                                 tmp.entry_ct*sizeof(struct unipair)))
1475                         return -EFAULT;
1476         switch (cmd) {
1477         case PIO_UNIMAP:
1478                 if (!perm)
1479                         return -EPERM;
1480                 return con_set_unimap(vc, tmp.entry_ct, tmp_entries);
1481         case GIO_UNIMAP:
1482                 if (!perm && fg_console != vc->vc_num)
1483                         return -EPERM;
1484                 return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp_entries);
1485         }
1486         return 0;
1487 }
1488
1489 long vt_compat_ioctl(struct tty_struct *tty, struct file * file,
1490              unsigned int cmd, unsigned long arg)
1491 {
1492         struct vc_data *vc = tty->driver_data;
1493         struct console_font_op op;      /* used in multiple places here */
1494         struct kbd_struct *kbd;
1495         unsigned int console;
1496         void __user *up = (void __user *)arg;
1497         int perm;
1498         int ret = 0;
1499
1500         console = vc->vc_num;
1501
1502         lock_kernel();
1503
1504         if (!vc_cons_allocated(console)) {      /* impossible? */
1505                 ret = -ENOIOCTLCMD;
1506                 goto out;
1507         }
1508
1509         /*
1510          * To have permissions to do most of the vt ioctls, we either have
1511          * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
1512          */
1513         perm = 0;
1514         if (current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG))
1515                 perm = 1;
1516
1517         kbd = kbd_table + console;
1518         switch (cmd) {
1519         /*
1520          * these need special handlers for incompatible data structures
1521          */
1522         case PIO_FONTX:
1523         case GIO_FONTX:
1524                 ret = compat_fontx_ioctl(cmd, up, perm, &op);
1525                 break;
1526
1527         case KDFONTOP:
1528                 ret = compat_kdfontop_ioctl(up, perm, &op, vc);
1529                 break;
1530
1531         case PIO_UNIMAP:
1532         case GIO_UNIMAP:
1533                 ret = do_unimap_ioctl(cmd, up, perm, vc);
1534                 break;
1535
1536         /*
1537          * all these treat 'arg' as an integer
1538          */
1539         case KIOCSOUND:
1540         case KDMKTONE:
1541 #ifdef CONFIG_X86
1542         case KDADDIO:
1543         case KDDELIO:
1544 #endif
1545         case KDSETMODE:
1546         case KDMAPDISP:
1547         case KDUNMAPDISP:
1548         case KDSKBMODE:
1549         case KDSKBMETA:
1550         case KDSKBLED:
1551         case KDSETLED:
1552         case KDSIGACCEPT:
1553         case VT_ACTIVATE:
1554         case VT_WAITACTIVE:
1555         case VT_RELDISP:
1556         case VT_DISALLOCATE:
1557         case VT_RESIZE:
1558         case VT_RESIZEX:
1559                 goto fallback;
1560
1561         /*
1562          * the rest has a compatible data structure behind arg,
1563          * but we have to convert it to a proper 64 bit pointer.
1564          */
1565         default:
1566                 arg = (unsigned long)compat_ptr(arg);
1567                 goto fallback;
1568         }
1569 out:
1570         unlock_kernel();
1571         return ret;
1572
1573 fallback:
1574         unlock_kernel();
1575         return vt_ioctl(tty, file, cmd, arg);
1576 }
1577
1578
1579 #endif /* CONFIG_COMPAT */
1580
1581
1582 /*
1583  * Performs the back end of a vt switch. Called under the console
1584  * semaphore.
1585  */
1586 static void complete_change_console(struct vc_data *vc)
1587 {
1588         unsigned char old_vc_mode;
1589         int old = fg_console;
1590
1591         last_console = fg_console;
1592
1593         /*
1594          * If we're switching, we could be going from KD_GRAPHICS to
1595          * KD_TEXT mode or vice versa, which means we need to blank or
1596          * unblank the screen later.
1597          */
1598         old_vc_mode = vc_cons[fg_console].d->vc_mode;
1599         switch_screen(vc);
1600
1601         /*
1602          * This can't appear below a successful kill_pid().  If it did,
1603          * then the *blank_screen operation could occur while X, having
1604          * received acqsig, is waking up on another processor.  This
1605          * condition can lead to overlapping accesses to the VGA range
1606          * and the framebuffer (causing system lockups).
1607          *
1608          * To account for this we duplicate this code below only if the
1609          * controlling process is gone and we've called reset_vc.
1610          */
1611         if (old_vc_mode != vc->vc_mode) {
1612                 if (vc->vc_mode == KD_TEXT)
1613                         do_unblank_screen(1);
1614                 else
1615                         do_blank_screen(1);
1616         }
1617
1618         /*
1619          * If this new console is under process control, send it a signal
1620          * telling it that it has acquired. Also check if it has died and
1621          * clean up (similar to logic employed in change_console())
1622          */
1623         if (vc->vt_mode.mode == VT_PROCESS) {
1624                 /*
1625                  * Send the signal as privileged - kill_pid() will
1626                  * tell us if the process has gone or something else
1627                  * is awry
1628                  */
1629                 if (kill_pid(vc->vt_pid, vc->vt_mode.acqsig, 1) != 0) {
1630                 /*
1631                  * The controlling process has died, so we revert back to
1632                  * normal operation. In this case, we'll also change back
1633                  * to KD_TEXT mode. I'm not sure if this is strictly correct
1634                  * but it saves the agony when the X server dies and the screen
1635                  * remains blanked due to KD_GRAPHICS! It would be nice to do
1636                  * this outside of VT_PROCESS but there is no single process
1637                  * to account for and tracking tty count may be undesirable.
1638                  */
1639                         reset_vc(vc);
1640
1641                         if (old_vc_mode != vc->vc_mode) {
1642                                 if (vc->vc_mode == KD_TEXT)
1643                                         do_unblank_screen(1);
1644                                 else
1645                                         do_blank_screen(1);
1646                         }
1647                 }
1648         }
1649
1650         /*
1651          * Wake anyone waiting for their VT to activate
1652          */
1653         vt_event_post(VT_EVENT_SWITCH, old, vc->vc_num);
1654         return;
1655 }
1656
1657 /*
1658  * Performs the front-end of a vt switch
1659  */
1660 void change_console(struct vc_data *new_vc)
1661 {
1662         struct vc_data *vc;
1663
1664         if (!new_vc || new_vc->vc_num == fg_console || vt_dont_switch)
1665                 return;
1666
1667         /*
1668          * If this vt is in process mode, then we need to handshake with
1669          * that process before switching. Essentially, we store where that
1670          * vt wants to switch to and wait for it to tell us when it's done
1671          * (via VT_RELDISP ioctl).
1672          *
1673          * We also check to see if the controlling process still exists.
1674          * If it doesn't, we reset this vt to auto mode and continue.
1675          * This is a cheap way to track process control. The worst thing
1676          * that can happen is: we send a signal to a process, it dies, and
1677          * the switch gets "lost" waiting for a response; hopefully, the
1678          * user will try again, we'll detect the process is gone (unless
1679          * the user waits just the right amount of time :-) and revert the
1680          * vt to auto control.
1681          */
1682         vc = vc_cons[fg_console].d;
1683         if (vc->vt_mode.mode == VT_PROCESS) {
1684                 /*
1685                  * Send the signal as privileged - kill_pid() will
1686                  * tell us if the process has gone or something else
1687                  * is awry.
1688                  *
1689                  * We need to set vt_newvt *before* sending the signal or we
1690                  * have a race.
1691                  */
1692                 vc->vt_newvt = new_vc->vc_num;
1693                 if (kill_pid(vc->vt_pid, vc->vt_mode.relsig, 1) == 0) {
1694                         /*
1695                          * It worked. Mark the vt to switch to and
1696                          * return. The process needs to send us a
1697                          * VT_RELDISP ioctl to complete the switch.
1698                          */
1699                         return;
1700                 }
1701
1702                 /*
1703                  * The controlling process has died, so we revert back to
1704                  * normal operation. In this case, we'll also change back
1705                  * to KD_TEXT mode. I'm not sure if this is strictly correct
1706                  * but it saves the agony when the X server dies and the screen
1707                  * remains blanked due to KD_GRAPHICS! It would be nice to do
1708                  * this outside of VT_PROCESS but there is no single process
1709                  * to account for and tracking tty count may be undesirable.
1710                  */
1711                 reset_vc(vc);
1712
1713                 /*
1714                  * Fall through to normal (VT_AUTO) handling of the switch...
1715                  */
1716         }
1717
1718         /*
1719          * Ignore all switches in KD_GRAPHICS+VT_AUTO mode
1720          */
1721         if (vc->vc_mode == KD_GRAPHICS)
1722                 return;
1723
1724         complete_change_console(new_vc);
1725 }
1726
1727 /* Perform a kernel triggered VT switch for suspend/resume */
1728
1729 static int disable_vt_switch;
1730
1731 int vt_move_to_console(unsigned int vt, int alloc)
1732 {
1733         int prev;
1734
1735         acquire_console_sem();
1736         /* Graphics mode - up to X */
1737         if (disable_vt_switch) {
1738                 release_console_sem();
1739                 return 0;
1740         }
1741         prev = fg_console;
1742
1743         if (alloc && vc_allocate(vt)) {
1744                 /* we can't have a free VC for now. Too bad,
1745                  * we don't want to mess the screen for now. */
1746                 release_console_sem();
1747                 return -ENOSPC;
1748         }
1749
1750         if (set_console(vt)) {
1751                 /*
1752                  * We're unable to switch to the SUSPEND_CONSOLE.
1753                  * Let the calling function know so it can decide
1754                  * what to do.
1755                  */
1756                 release_console_sem();
1757                 return -EIO;
1758         }
1759         release_console_sem();
1760         if (vt_waitactive(vt + 1)) {
1761                 pr_debug("Suspend: Can't switch VCs.");
1762                 return -EINTR;
1763         }
1764         return prev;
1765 }
1766
1767 /*
1768  * Normally during a suspend, we allocate a new console and switch to it.
1769  * When we resume, we switch back to the original console.  This switch
1770  * can be slow, so on systems where the framebuffer can handle restoration
1771  * of video registers anyways, there's little point in doing the console
1772  * switch.  This function allows you to disable it by passing it '0'.
1773  */
1774 void pm_set_vt_switch(int do_switch)
1775 {
1776         acquire_console_sem();
1777         disable_vt_switch = !do_switch;
1778         release_console_sem();
1779 }
1780 EXPORT_SYMBOL(pm_set_vt_switch);