vt.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:31k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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