From: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
To: Andries Brouwer <aebr@win.tue.nl>
Cc: Norman Diamond <ndiamond@wta.att.ne.jp>,
linux-kernel@vger.kernel.org, Vojtech Pavlik <vojtech@suse.cz>
Subject: Re: Japanese keyboards broken in 2.6
Date: Wed, 23 Jul 2003 22:38:01 +0900 [thread overview]
Message-ID: <87k7a9z7ly.fsf@devron.myhome.or.jp> (raw)
In-Reply-To: <20030722172903.A12240@pclin040.win.tue.nl>
Andries Brouwer <aebr@win.tue.nl> writes:
> On Tue, Jul 22, 2003 at 10:56:33PM +0900, Norman Diamond wrote:
>
> > On a Japanese PS/2 keyboard
>
> I did not read your long message but stopped after the above words.
> Sorry if this is not an answer (ask again).
>
> For 2.6.0t1 it helps to add the line
>
> keycode 183 = backslash bar
>
> to your keymap.
I remembered this problem. At 2.4.x kbd tools use "#define NR_KEYS 128".
So, we can't set >= 128.
Currently NR_KEYS is 0x200 (KEY_MAX+1). We can't only recompile
because ->kb_index (struct kbentry) type using "unsigned char".
What do you think the following patch? (it may be needed to cleanup or
rewrite)
Thanks.
--
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
drivers/char/vt_ioctl.c | 49 +++++++++++++++++++++++++++++++++---------------
include/linux/kd.h | 14 ++++++++++---
2 files changed, 45 insertions(+), 18 deletions(-)
diff -puN drivers/char/vt_ioctl.c~kbentry-fix drivers/char/vt_ioctl.c
--- linux-2.6.0-test1/drivers/char/vt_ioctl.c~kbentry-fix 2003-07-20 00:51:05.000000000 +0900
+++ linux-2.6.0-test1-hirofumi/drivers/char/vt_ioctl.c 2003-07-20 00:51:05.000000000 +0900
@@ -75,26 +75,43 @@ asmlinkage long sys_ioperm(unsigned long
#define s (tmp.kb_table)
#define v (tmp.kb_value)
static inline int
-do_kdsk_ioctl(int cmd, struct kbentry *user_kbe, int perm, struct kbd_struct *kbd)
+do_kdsk_ioctl(int cmd, void *user_kbe, int perm, struct kbd_struct *kbd)
{
- struct kbentry tmp;
+ struct kbentry tmp, *kbe = user_kbe;
+ struct kbentry_old old, *old_kbe = user_kbe;
ushort *key_map, val, ov;
- if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry)))
- return -EFAULT;
+ if (cmd == KDGKBENT_OLD || cmd == KDSKBENT_OLD) {
+ /* backward compatibility */
+ if (copy_from_user(&old, old_kbe, sizeof(struct kbentry_old)))
+ return -EFAULT;
+
+ tmp.kb_index = old.kb_index;
+ tmp.kb_table = old.kb_table;
+ tmp.kb_value = old.kb_value;
+ } else {
+ if (copy_from_user(&tmp, kbe, sizeof(struct kbentry)))
+ return -EFAULT;
+ }
+
if (i >= NR_KEYS || s >= MAX_NR_KEYMAPS)
return -EINVAL;
switch (cmd) {
+ case KDGKBENT_OLD:
case KDGKBENT:
key_map = key_maps[s];
if (key_map) {
- val = U(key_map[i]);
- if (kbd->kbdmode != VC_UNICODE && KTYP(val) >= NR_TYPES)
- val = K_HOLE;
+ val = U(key_map[i]);
+ if (kbd->kbdmode != VC_UNICODE && KTYP(val) >= NR_TYPES)
+ val = K_HOLE;
} else
- val = (i ? K_HOLE : K_NOSUCHMAP);
- return put_user(val, &user_kbe->kb_value);
+ val = (i ? K_HOLE : K_NOSUCHMAP);
+
+ if (cmd == KDGKBENT_OLD)
+ return put_user(val, &old_kbe->kb_value);
+ return put_user(val, &kbe->kb_value);
+ case KDSKBENT_OLD:
case KDSKBENT:
if (!perm)
return -EPERM;
@@ -102,20 +119,20 @@ do_kdsk_ioctl(int cmd, struct kbentry *u
/* disallocate map */
key_map = key_maps[s];
if (s && key_map) {
- key_maps[s] = 0;
- if (key_map[0] == U(K_ALLOCATED)) {
+ key_maps[s] = 0;
+ if (key_map[0] == U(K_ALLOCATED)) {
kfree(key_map);
keymap_count--;
- }
+ }
}
break;
}
if (KTYP(v) < NR_TYPES) {
- if (KVAL(v) > max_vals[KTYP(v)])
+ if (KVAL(v) > max_vals[KTYP(v)])
return -EINVAL;
} else
- if (kbd->kbdmode != VC_UNICODE)
+ if (kbd->kbdmode != VC_UNICODE)
return -EINVAL;
/* ++Geert: non-PC keyboards may generate keycode zero */
@@ -572,9 +589,11 @@ int vt_ioctl(struct tty_struct *tty, str
perm=0;
return do_kbkeycode_ioctl(cmd, (struct kbkeycode *)arg, perm);
+ case KDGKBENT_OLD:
+ case KDSKBENT_OLD:
case KDGKBENT:
case KDSKBENT:
- return do_kdsk_ioctl(cmd, (struct kbentry *)arg, perm, kbd);
+ return do_kdsk_ioctl(cmd, (void *)arg, perm, kbd);
case KDGKBSENT:
case KDSKBSENT:
diff -puN include/linux/kd.h~kbentry-fix include/linux/kd.h
--- linux-2.6.0-test1/include/linux/kd.h~kbentry-fix 2003-07-20 00:51:05.000000000 +0900
+++ linux-2.6.0-test1-hirofumi/include/linux/kd.h 2003-07-20 00:51:05.000000000 +0900
@@ -94,18 +94,26 @@ struct unimapinit {
#define KDGKBLED 0x4B64 /* get led flags (not lights) */
#define KDSKBLED 0x4B65 /* set led flags (not lights) */
-struct kbentry {
+struct kbentry_old {
unsigned char kb_table;
unsigned char kb_index;
unsigned short kb_value;
};
+#define KDGKBENT_OLD 0x4B46 /* gets one entry in translation table (old) */
+#define KDSKBENT_OLD 0x4B47 /* sets one entry in translation table (old) */
+
+struct kbentry {
+ unsigned int kb_table;
+ unsigned int kb_index;
+ unsigned short kb_value;
+};
#define K_NORMTAB 0x00
#define K_SHIFTTAB 0x01
#define K_ALTTAB 0x02
#define K_ALTSHIFTTAB 0x03
-#define KDGKBENT 0x4B46 /* gets one entry in translation table */
-#define KDSKBENT 0x4B47 /* sets one entry in translation table */
+#define KDGKBENT 0x4B73 /* gets one entry in translation table */
+#define KDSKBENT 0x4B74 /* sets one entry in translation table */
struct kbsentry {
unsigned char kb_func;
_
next prev parent reply other threads:[~2003-07-23 13:23 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-07-22 13:56 Japanese keyboards broken in 2.6 Norman Diamond
2003-07-22 15:29 ` Andries Brouwer
2003-07-23 13:14 ` Norman Diamond
2003-07-23 13:38 ` OGAWA Hirofumi [this message]
2003-07-24 11:16 ` Hiroshi Miura
2003-07-24 14:26 ` OGAWA Hirofumi
2003-07-25 7:49 ` Clemens Schwaighofer
2003-07-25 10:30 ` Norman Diamond
2003-07-25 15:42 ` Andries Brouwer
[not found] <fa.jnbj30u.1g6me0g@ifi.uio.no>
[not found] ` <fa.d9tgtm5.1m7agi1@ifi.uio.no>
2003-07-25 1:00 ` junkio
2003-07-25 4:16 ` OGAWA Hirofumi
-- strict thread matches above, loose matches on Subject: below --
2003-07-25 9:27 John Bradford
2003-07-25 16:01 John Bradford
2003-07-25 16:09 ` Andries Brouwer
2003-07-25 16:39 John Bradford
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87k7a9z7ly.fsf@devron.myhome.or.jp \
--to=hirofumi@mail.parknet.co.jp \
--cc=aebr@win.tue.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=ndiamond@wta.att.ne.jp \
--cc=vojtech@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.