Lines Matching +full:p +full:- +full:384
1 // SPDX-License-Identifier: GPL-2.0
37 255, ARRAY_SIZE(func_table) - 1, NR_FN_HANDLER - 1, 0,
38 NR_DEAD - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
62 '-', /* dead_stroke */
83 kbd->key_maps = kzalloc(sizeof(ebc_key_maps), GFP_KERNEL); in kbd_alloc()
84 if (!kbd->key_maps) in kbd_alloc()
88 kbd->key_maps[i] = kmemdup(ebc_key_maps[i], in kbd_alloc()
91 if (!kbd->key_maps[i]) in kbd_alloc()
95 kbd->func_table = kzalloc(sizeof(ebc_func_table), GFP_KERNEL); in kbd_alloc()
96 if (!kbd->func_table) in kbd_alloc()
100 kbd->func_table[i] = kstrdup(ebc_func_table[i], in kbd_alloc()
102 if (!kbd->func_table[i]) in kbd_alloc()
106 kbd->fn_handler = in kbd_alloc()
108 if (!kbd->fn_handler) in kbd_alloc()
110 kbd->accent_table = kmemdup(ebc_accent_table, in kbd_alloc()
113 if (!kbd->accent_table) in kbd_alloc()
115 kbd->accent_table_size = ebc_accent_table_size; in kbd_alloc()
119 kfree(kbd->fn_handler); in kbd_alloc()
122 kfree(kbd->func_table[i]); in kbd_alloc()
123 kfree(kbd->func_table); in kbd_alloc()
126 kfree(kbd->key_maps[i]); in kbd_alloc()
127 kfree(kbd->key_maps); in kbd_alloc()
139 kfree(kbd->accent_table); in kbd_free()
140 kfree(kbd->fn_handler); in kbd_free()
142 kfree(kbd->func_table[i]); in kbd_free()
143 kfree(kbd->func_table); in kbd_free()
145 kfree(kbd->key_maps[i]); in kbd_free()
146 kfree(kbd->key_maps); in kbd_free()
151 * Generate ascii -> ebcdic translation table from kbd_data.
161 keymap = kbd->key_maps[i]; in kbd_ascebc()
178 * Generate ebcdic -> ascii translation table from kbd_data.
188 keymap = kbd->key_maps[i];
216 d = kbd->diacr; in handle_diacr()
217 kbd->diacr = 0; in handle_diacr()
219 for (i = 0; i < kbd->accent_table_size; i++) { in handle_diacr()
220 if (kbd->accent_table[i].diacr == d && in handle_diacr()
221 kbd->accent_table[i].base == ch) in handle_diacr()
222 return kbd->accent_table[i].result; in handle_diacr()
228 kbd_put_queue(kbd->port, d); in handle_diacr()
239 kbd->diacr = (kbd->diacr ? handle_diacr(kbd, value) : value); in k_dead()
248 if (kbd->diacr) in k_self()
250 kbd_put_queue(kbd->port, value); in k_self()
267 if (kbd->func_table[value]) in k_fn()
268 kbd_puts_queue(kbd->port, kbd->func_table[value]); in k_fn()
276 if (kbd->fn_handler[value]) in k_spec()
277 kbd->fn_handler[value](kbd); in k_spec()
282 * UTF-8 is defined for words of up to 31 bits,
315 if (keycode >= 384) in kbd_keycode()
316 keysym = kbd->key_maps[5][keycode - 384]; in kbd_keycode()
318 keysym = kbd->key_maps[4][keycode - 256]; in kbd_keycode()
320 keysym = kbd->key_maps[1][keycode - 128]; in kbd_keycode()
322 keysym = kbd->key_maps[0][keycode]; in kbd_keycode()
326 type -= 0xf0; in kbd_keycode()
331 if (kbd->sysrq) { in kbd_keycode()
332 if (kbd->sysrq == K(KT_LATIN, '-')) { in kbd_keycode()
333 kbd->sysrq = 0; in kbd_keycode()
337 if (value == '-') { in kbd_keycode()
338 kbd->sysrq = K(KT_LATIN, '-'); in kbd_keycode()
342 (*k_handler[KTYP(kbd->sysrq)])(kbd, KVAL(kbd->sysrq)); in kbd_keycode()
343 kbd->sysrq = 0; in kbd_keycode()
346 kbd->sysrq = K(type, value); in kbd_keycode()
352 to_utf8(kbd->port, keysym); in kbd_keycode()
367 return -EFAULT; in do_kdsk_ioctl()
371 return -EINVAL; in do_kdsk_ioctl()
376 return -EINVAL; in do_kdsk_ioctl()
382 key_map = kbd->key_maps[kb_table]; in do_kdsk_ioctl()
389 return put_user(val, &user_kbe->kb_value); in do_kdsk_ioctl()
392 return -EPERM; in do_kdsk_ioctl()
395 key_map = kbd->key_maps[kb_table]; in do_kdsk_ioctl()
397 kbd->key_maps[kb_table] = NULL; in do_kdsk_ioctl()
404 return -EINVAL; in do_kdsk_ioctl()
406 return -EINVAL; in do_kdsk_ioctl()
408 if (!(key_map = kbd->key_maps[kb_table])) { in do_kdsk_ioctl()
414 return -ENOMEM; in do_kdsk_ioctl()
415 kbd->key_maps[kb_table] = key_map; in do_kdsk_ioctl()
427 return -EPERM; in do_kdsk_ioctl()
439 char *p; in do_kdgkb_ioctl() local
442 /* Get u_kbs->kb_func. */ in do_kdgkb_ioctl()
443 if (get_user(kb_func, &u_kbs->kb_func)) in do_kdgkb_ioctl()
444 return -EFAULT; in do_kdgkb_ioctl()
447 return -EINVAL; in do_kdgkb_ioctl()
452 p = kbd->func_table[kb_func]; in do_kdgkb_ioctl()
453 if (p) { in do_kdgkb_ioctl()
454 len = strlen(p); in do_kdgkb_ioctl()
455 if (len >= sizeof(u_kbs->kb_string)) in do_kdgkb_ioctl()
456 len = sizeof(u_kbs->kb_string) - 1; in do_kdgkb_ioctl()
457 if (copy_to_user(u_kbs->kb_string, p, len)) in do_kdgkb_ioctl()
458 return -EFAULT; in do_kdgkb_ioctl()
461 if (put_user('\0', u_kbs->kb_string + len)) in do_kdgkb_ioctl()
462 return -EFAULT; in do_kdgkb_ioctl()
466 return -EPERM; in do_kdgkb_ioctl()
467 p = strndup_user(u_kbs->kb_string, sizeof(u_kbs->kb_string)); in do_kdgkb_ioctl()
468 if (IS_ERR(p)) in do_kdgkb_ioctl()
469 return PTR_ERR(p); in do_kdgkb_ioctl()
470 kfree(kbd->func_table[kb_func]); in do_kdgkb_ioctl()
471 kbd->func_table[kb_func] = p; in do_kdgkb_ioctl()
490 tty = tty_port_tty_get(kbd->port); in kbd_ioctl()
492 perm = current->signal->tty == tty || capable(CAP_SYS_TTY_CONFIG); in kbd_ioctl()
509 if (put_user(kbd->accent_table_size, &a->kb_cnt)) in kbd_ioctl()
510 return -EFAULT; in kbd_ioctl()
511 for (i = 0; i < kbd->accent_table_size; i++) { in kbd_ioctl()
512 diacr.diacr = kbd->accent_table[i].diacr; in kbd_ioctl()
513 diacr.base = kbd->accent_table[i].base; in kbd_ioctl()
514 diacr.result = kbd->accent_table[i].result; in kbd_ioctl()
515 if (copy_to_user(a->kbdiacr + i, &diacr, sizeof(struct kbdiacr))) in kbd_ioctl()
516 return -EFAULT; in kbd_ioctl()
524 ct = kbd->accent_table_size; in kbd_ioctl()
525 if (put_user(ct, &a->kb_cnt)) in kbd_ioctl()
526 return -EFAULT; in kbd_ioctl()
527 if (copy_to_user(a->kbdiacruc, kbd->accent_table, in kbd_ioctl()
529 return -EFAULT; in kbd_ioctl()
539 return -EPERM; in kbd_ioctl()
540 if (get_user(ct, &a->kb_cnt)) in kbd_ioctl()
541 return -EFAULT; in kbd_ioctl()
543 return -EINVAL; in kbd_ioctl()
544 kbd->accent_table_size = ct; in kbd_ioctl()
546 if (copy_from_user(&diacr, a->kbdiacr + i, sizeof(struct kbdiacr))) in kbd_ioctl()
547 return -EFAULT; in kbd_ioctl()
548 kbd->accent_table[i].diacr = diacr.diacr; in kbd_ioctl()
549 kbd->accent_table[i].base = diacr.base; in kbd_ioctl()
550 kbd->accent_table[i].result = diacr.result; in kbd_ioctl()
559 return -EPERM; in kbd_ioctl()
560 if (get_user(ct, &a->kb_cnt)) in kbd_ioctl()
561 return -EFAULT; in kbd_ioctl()
563 return -EINVAL; in kbd_ioctl()
564 kbd->accent_table_size = ct; in kbd_ioctl()
565 if (copy_from_user(kbd->accent_table, a->kbdiacruc, in kbd_ioctl()
567 return -EFAULT; in kbd_ioctl()
571 return -ENOIOCTLCMD; in kbd_ioctl()