On Thu, 2007-10-18 at 23:33 +0100, Samuel Thibault wrote:
> Hi,
> 
> Mike Galbraith, le Thu 18 Oct 2007 19:56:38 +0200, a écrit :
> > The winner of a very long git bisect session:
> > 
> >     unicode diacritics support
> 
> Uh, I fail to see how that could have an impact, I've again checked the
> boundaries, it looks fine, please people have a look.

I too was reluctant to believe the bisect result.  But...

> Could you try something odd?  On your tree that has the change reverted,
> please try the attached patch, which makes the array the same size at it
> would be with the change, possibly triggering bugs in completely other
> parts of the kernel.

That didn't break my box.  However, removing your test patch and
re-applying the revert I generated between git tree and working tree
brought it right back.  With the below applied, diff says there is no
difference between working tree and git tree (except for
vsyscall_32.lds, which is a generated file kbuild leaves lying around).
Per gitk, the git repository is at
d85714d81cc0408daddb68c10f7fd69eafe7c213

diff -uprNX /root/dontdiff git/linux-2.6/drivers/acorn/char/defkeymap-l7200.c 
linux-2.6.23.git/drivers/acorn/char/defkeymap-l7200.c
--- git/linux-2.6/drivers/acorn/char/defkeymap-l7200.c  2007-10-18 
18:55:53.000000000 +0200
+++ linux-2.6.23.git/drivers/acorn/char/defkeymap-l7200.c       2007-10-18 
19:02:12.000000000 +0200
@@ -346,7 +346,7 @@ char *func_table[MAX_NR_FUNC] = {
        0,
 };
 
-struct kbdiacruc accent_table[MAX_DIACR] = {
+struct kbdiacr accent_table[MAX_DIACR] = {
        {'`', 'A', '\300'},     {'`', 'a', '\340'},
        {'\'', 'A', '\301'},    {'\'', 'a', '\341'},
        {'^', 'A', '\302'},     {'^', 'a', '\342'},
diff -uprNX /root/dontdiff git/linux-2.6/drivers/char/consolemap.c 
linux-2.6.23.git/drivers/char/consolemap.c
--- git/linux-2.6/drivers/char/consolemap.c     2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/drivers/char/consolemap.c  2007-10-18 19:02:12.000000000 
+0200
@@ -669,29 +669,19 @@ void con_protect_unimap(struct vc_data *
                p->readonly = rdonly;
 }
 
-/*
- * Always use USER_MAP. These functions are used by the keyboard,
- * which shouldn't be affected by G0/G1 switching, etc.
- * If the user map still contains default values, i.e. the
- * direct-to-font mapping, then assume user is using Latin1.
- */
 /* may be called during an interrupt */
 u32 conv_8bit_to_uni(unsigned char c)
 {
+       /*
+        * Always use USER_MAP. This function is used by the keyboard,
+        * which shouldn't be affected by G0/G1 switching, etc.
+        * If the user map still contains default values, i.e. the
+        * direct-to-font mapping, then assume user is using Latin1.
+        */
        unsigned short uni = translations[USER_MAP][c];
        return uni == (0xf000 | c) ? c : uni;
 }
 
-int conv_uni_to_8bit(u32 uni)
-{
-       int c;
-       for (c = 0; c < 0x100; c++)
-               if (translations[USER_MAP][c] == uni ||
-                  (translations[USER_MAP][c] == (c | 0xf000) && uni == c))
-                       return c;
-       return -1;
-}
-
 int
 conv_uni_to_pc(struct vc_data *conp, long ucs) 
 {
diff -uprNX /root/dontdiff git/linux-2.6/drivers/char/keyboard.c 
linux-2.6.23.git/drivers/char/keyboard.c
--- git/linux-2.6/drivers/char/keyboard.c       2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/drivers/char/keyboard.c    2007-10-18 19:02:19.000000000 
+0200
@@ -38,7 +38,6 @@
 #include <linux/kbd_kern.h>
 #include <linux/kbd_diacr.h>
 #include <linux/vt_kern.h>
-#include <linux/consolemap.h>
 #include <linux/sysrq.h>
 #include <linux/input.h>
 #include <linux/reboot.h>
@@ -404,12 +403,9 @@ static unsigned int handle_diacr(struct 
                return d;
 
        if (kbd->kbdmode == VC_UNICODE)
-               to_utf8(vc, d);
-       else {
-               int c = conv_uni_to_8bit(d);
-               if (c != -1)
-                       put_queue(vc, c);
-       }
+               to_utf8(vc, conv_8bit_to_uni(d));
+       else if (d < 0x100)
+               put_queue(vc, d);
 
        return ch;
 }
@@ -421,12 +417,9 @@ static void fn_enter(struct vc_data *vc)
 {
        if (diacr) {
                if (kbd->kbdmode == VC_UNICODE)
-                       to_utf8(vc, diacr);
-               else {
-                       int c = conv_uni_to_8bit(diacr);
-                       if (c != -1)
-                               put_queue(vc, c);
-               }
+                       to_utf8(vc, conv_8bit_to_uni(diacr));
+               else if (diacr < 0x100)
+                       put_queue(vc, diacr);
                diacr = 0;
        }
        put_queue(vc, 13);
@@ -634,12 +627,9 @@ static void k_unicode(struct vc_data *vc
                return;
        }
        if (kbd->kbdmode == VC_UNICODE)
-               to_utf8(vc, value);
-       else {
-               int c = conv_uni_to_8bit(value);
-               if (c != -1)
-                       put_queue(vc, c);
-       }
+               to_utf8(vc, conv_8bit_to_uni(value));
+       else if (value < 0x100)
+               put_queue(vc, value);
 }
 
 /*
@@ -656,12 +646,7 @@ static void k_deadunicode(struct vc_data
 
 static void k_self(struct vc_data *vc, unsigned char value, char up_flag)
 {
-       unsigned int uni;
-       if (kbd->kbdmode == VC_UNICODE)
-               uni = value;
-       else
-               uni = conv_8bit_to_uni(value);
-       k_unicode(vc, uni, up_flag);
+       k_unicode(vc, value, up_flag);
 }
 
 static void k_dead2(struct vc_data *vc, unsigned char value, char up_flag)
diff -uprNX /root/dontdiff git/linux-2.6/drivers/char/vt_ioctl.c 
linux-2.6.23.git/drivers/char/vt_ioctl.c
--- git/linux-2.6/drivers/char/vt_ioctl.c       2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/drivers/char/vt_ioctl.c    2007-10-18 19:02:19.000000000 
+0200
@@ -23,7 +23,6 @@
 #include <linux/major.h>
 #include <linux/fs.h>
 #include <linux/console.h>
-#include <linux/consolemap.h>
 #include <linux/signal.h>
 #include <linux/timex.h>
 
@@ -583,27 +582,10 @@ int vt_ioctl(struct tty_struct *tty, str
        case KDGKBDIACR:
        {
                struct kbdiacrs __user *a = up;
-               struct kbdiacr diacr;
-               int i;
 
                if (put_user(accent_table_size, &a->kb_cnt))
                        return -EFAULT;
-               for (i = 0; i < accent_table_size; i++) {
-                       diacr.diacr = conv_uni_to_8bit(accent_table[i].diacr);
-                       diacr.base = conv_uni_to_8bit(accent_table[i].base);
-                       diacr.result = conv_uni_to_8bit(accent_table[i].result);
-                       if (copy_to_user(a->kbdiacr + i, &diacr, sizeof(struct 
kbdiacr)))
-                               return -EFAULT;
-               }
-               return 0;
-       }
-       case KDGKBDIACRUC:
-       {
-               struct kbdiacrsuc __user *a = up;
-
-               if (put_user(accent_table_size, &a->kb_cnt))
-                       return -EFAULT;
-               if (copy_to_user(a->kbdiacruc, accent_table, 
accent_table_size*sizeof(struct kbdiacruc)))
+               if (copy_to_user(a->kbdiacr, accent_table, 
accent_table_size*sizeof(struct kbdiacr)))
                        return -EFAULT;
                return 0;
        }
@@ -611,30 +593,6 @@ int vt_ioctl(struct tty_struct *tty, str
        case KDSKBDIACR:
        {
                struct kbdiacrs __user *a = up;
-               struct kbdiacr diacr;
-               unsigned int ct;
-               int i;
-
-               if (!perm)
-                       return -EPERM;
-               if (get_user(ct,&a->kb_cnt))
-                       return -EFAULT;
-               if (ct >= MAX_DIACR)
-                       return -EINVAL;
-               accent_table_size = ct;
-               for (i = 0; i < ct; i++) {
-                       if (copy_from_user(&diacr, a->kbdiacr + i, 
sizeof(struct kbdiacr)))
-                               return -EFAULT;
-                       accent_table[i].diacr = conv_8bit_to_uni(diacr.diacr);
-                       accent_table[i].base = conv_8bit_to_uni(diacr.base);
-                       accent_table[i].result = conv_8bit_to_uni(diacr.result);
-               }
-               return 0;
-       }
-
-       case KDSKBDIACRUC:
-       {
-               struct kbdiacrsuc __user *a = up;
                unsigned int ct;
 
                if (!perm)
@@ -644,7 +602,7 @@ int vt_ioctl(struct tty_struct *tty, str
                if (ct >= MAX_DIACR)
                        return -EINVAL;
                accent_table_size = ct;
-               if (copy_from_user(accent_table, a->kbdiacruc, ct*sizeof(struct 
kbdiacruc)))
+               if (copy_from_user(accent_table, a->kbdiacr, ct*sizeof(struct 
kbdiacr)))
                        return -EFAULT;
                return 0;
        }
diff -uprNX /root/dontdiff git/linux-2.6/drivers/s390/char/keyboard.c 
linux-2.6.23.git/drivers/s390/char/keyboard.c
--- git/linux-2.6/drivers/s390/char/keyboard.c  2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/drivers/s390/char/keyboard.c       2007-10-18 
19:02:21.000000000 +0200
@@ -11,7 +11,6 @@
 #include <linux/sched.h>
 #include <linux/sysrq.h>
 
-#include <linux/consolemap.h>
 #include <linux/kbd_kern.h>
 #include <linux/kbd_diacr.h>
 #include <asm/uaccess.h>
@@ -83,11 +82,11 @@ kbd_alloc(void) {
        if (!kbd->fn_handler)
                goto out_func;
        kbd->accent_table =
-               kmalloc(sizeof(struct kbdiacruc)*MAX_DIACR, GFP_KERNEL);
+               kmalloc(sizeof(struct kbdiacr)*MAX_DIACR, GFP_KERNEL);
        if (!kbd->accent_table)
                goto out_fn_handler;
        memcpy(kbd->accent_table, accent_table,
-              sizeof(struct kbdiacruc)*MAX_DIACR);
+              sizeof(struct kbdiacr)*MAX_DIACR);
        kbd->accent_table_size = accent_table_size;
        return kbd;
 
@@ -184,8 +183,8 @@ kbd_ebcasc(struct kbd_data *kbd, unsigne
  * Otherwise, conclude that DIACR was not combining after all,
  * queue it and return CH.
  */
-static unsigned int
-handle_diacr(struct kbd_data *kbd, unsigned int ch)
+static unsigned char
+handle_diacr(struct kbd_data *kbd, unsigned char ch)
 {
        int i, d;
 
@@ -461,6 +460,7 @@ int
 kbd_ioctl(struct kbd_data *kbd, struct file *file,
          unsigned int cmd, unsigned long arg)
 {
+       struct kbdiacrs __user *a;
        void __user *argp;
        int ct, perm;
 
@@ -481,40 +481,17 @@ kbd_ioctl(struct kbd_data *kbd, struct f
        case KDSKBSENT:
                return do_kdgkb_ioctl(kbd, argp, cmd, perm);
        case KDGKBDIACR:
-       {
-               struct kbdiacrs __user *a = argp;
-               struct kbdiacr diacr;
-               int i;
+               a = argp;
 
                if (put_user(kbd->accent_table_size, &a->kb_cnt))
                        return -EFAULT;
-               for (i = 0; i < kbd->accent_table_size; i++) {
-                       diacr.diacr = kbd->accent_table[i].diacr;
-                       diacr.base = kbd->accent_table[i].base;
-                       diacr.result = kbd->accent_table[i].result;
-                       if (copy_to_user(a->kbdiacr + i, &diacr, sizeof(struct 
kbdiacr)))
-                       return -EFAULT;
-               }
-               return 0;
-       }
-       case KDGKBDIACRUC:
-       {
-               struct kbdiacrsuc __user *a = argp;
-
                ct = kbd->accent_table_size;
-               if (put_user(ct, &a->kb_cnt))
-                       return -EFAULT;
-               if (copy_to_user(a->kbdiacruc, kbd->accent_table,
-                                ct * sizeof(struct kbdiacruc)))
+               if (copy_to_user(a->kbdiacr, kbd->accent_table,
+                                ct * sizeof(struct kbdiacr)))
                        return -EFAULT;
                return 0;
-       }
        case KDSKBDIACR:
-       {
-               struct kbdiacrs __user *a = argp;
-               struct kbdiacr diacr;
-               int i;
-
+               a = argp;
                if (!perm)
                        return -EPERM;
                if (get_user(ct, &a->kb_cnt))
@@ -522,31 +499,10 @@ kbd_ioctl(struct kbd_data *kbd, struct f
                if (ct >= MAX_DIACR)
                        return -EINVAL;
                kbd->accent_table_size = ct;
-               for (i = 0; i < ct; i++) {
-                       if (copy_from_user(&diacr, a->kbdiacr + i, 
sizeof(struct kbdiacr)))
-                               return -EFAULT;
-                       kbd->accent_table[i].diacr = diacr.diacr;
-                       kbd->accent_table[i].base = diacr.base;
-                       kbd->accent_table[i].result = diacr.result;
-               }
-               return 0;
-       }
-       case KDSKBDIACRUC:
-       {
-               struct kbdiacrsuc __user *a = argp;
-
-               if (!perm)
-                       return -EPERM;
-               if (get_user(ct, &a->kb_cnt))
-                       return -EFAULT;
-               if (ct >= MAX_DIACR)
-                       return -EINVAL;
-               kbd->accent_table_size = ct;
-               if (copy_from_user(kbd->accent_table, a->kbdiacruc,
-                                  ct * sizeof(struct kbdiacruc)))
+               if (copy_from_user(kbd->accent_table, a->kbdiacr,
+                                  ct * sizeof(struct kbdiacr)))
                        return -EFAULT;
                return 0;
-       }
        default:
                return -ENOIOCTLCMD;
        }
diff -uprNX /root/dontdiff git/linux-2.6/drivers/s390/char/keyboard.h 
linux-2.6.23.git/drivers/s390/char/keyboard.h
--- git/linux-2.6/drivers/s390/char/keyboard.h  2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/drivers/s390/char/keyboard.h       2007-10-18 
19:02:21.000000000 +0200
@@ -25,9 +25,9 @@ struct kbd_data {
        unsigned short **key_maps;
        char **func_table;
        fn_handler_fn **fn_handler;
-       struct kbdiacruc *accent_table;
+       struct kbdiacr *accent_table;
        unsigned int accent_table_size;
-       unsigned int diacr;
+       unsigned char diacr;
        unsigned short sysrq;
 };
 
diff -uprNX /root/dontdiff git/linux-2.6/include/linux/consolemap.h 
linux-2.6.23.git/include/linux/consolemap.h
--- git/linux-2.6/include/linux/consolemap.h    2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/include/linux/consolemap.h 2007-10-18 19:02:34.000000000 
+0200
@@ -16,5 +16,4 @@ extern u16 inverse_translate(struct vc_d
 extern unsigned short *set_translate(int m, struct vc_data *vc);
 extern int conv_uni_to_pc(struct vc_data *conp, long ucs);
 extern u32 conv_8bit_to_uni(unsigned char c);
-extern int conv_uni_to_8bit(u32 uni);
 void console_map_init(void);
diff -uprNX /root/dontdiff git/linux-2.6/include/linux/kbd_diacr.h 
linux-2.6.23.git/include/linux/kbd_diacr.h
--- git/linux-2.6/include/linux/kbd_diacr.h     2007-10-18 18:55:53.000000000 
+0200
+++ linux-2.6.23.git/include/linux/kbd_diacr.h  2007-10-18 19:02:34.000000000 
+0200
@@ -2,7 +2,7 @@
 #define _DIACR_H
 #include <linux/kd.h>
 
-extern struct kbdiacruc accent_table[];
+extern struct kbdiacr accent_table[];
 extern unsigned int accent_table_size;
 
 #endif /* _DIACR_H */
diff -uprNX /root/dontdiff git/linux-2.6/include/linux/kd.h 
linux-2.6.23.git/include/linux/kd.h
--- git/linux-2.6/include/linux/kd.h    2007-10-18 18:55:53.000000000 +0200
+++ linux-2.6.23.git/include/linux/kd.h 2007-10-18 19:02:34.000000000 +0200
@@ -125,16 +125,6 @@ struct kbdiacrs {
 #define KDGKBDIACR      0x4B4A  /* read kernel accent table */
 #define KDSKBDIACR      0x4B4B  /* write kernel accent table */
 
-struct kbdiacruc {
-        __u32 diacr, base, result;
-};
-struct kbdiacrsuc {
-        unsigned int kb_cnt;    /* number of entries in following array */
-       struct kbdiacruc kbdiacruc[256];    /* MAX_DIACR from keyboard.h */
-};
-#define KDGKBDIACRUC    0x4BFA  /* read kernel accent table - UCS */
-#define KDSKBDIACRUC    0x4BFB  /* write kernel accent table - UCS */
-
 struct kbkeycode {
        unsigned int scancode, keycode;
 };


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to