diff options
author | Hans de Goede <j.w.r.degoede@hhs.nl> | 2006-08-15 06:09:27 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-08-15 15:53:09 -0400 |
commit | e0e92632715f08dddeddb72b76e04c20126e1f67 (patch) | |
tree | 4b596e9b32a58f7c2db6e8a123f4d02007c539c0 /scripts/mod | |
parent | 80914d97aa0c61fbfd8eadd120c863b6229f0809 (diff) |
[PATCH] PATCH: 1 line 2.6.18 bugfix: modpost-64bit-fix.patch
There is a small but annoying bug in scripts/mod/file2alias.c which causes
it to generate invalid aliases for input devices on 64 bit archs. This causes
joydev.ko to not be automaticly loaded when inserting a joystick, resulting in
a non working joystick (for the average user).
In scripts/mod/file2alias.c is the following code for generating the input
aliases:
static void do_input(char *alias,
kernel_ulong_t *arr, unsigned int min, unsigned int max)
{
unsigned int i;
for (i = min; i < max; i++)
if (arr[i / BITS_PER_LONG] & (1 << (i%BITS_PER_LONG)))
sprintf(alias + strlen(alias), "%X,*", i);
}
On 32 bits systems, this correctly generates "0,*" for the first alias, "8,*"
for the second etc.
However on 64 bits it generates: "0,*20,*" resp "8,*28,*" Notice how it adds 20
+ first entry (hex) ! to the list of hex codes, which is 32 more then the first
entry, thus is because the bit test above wraps at 32 bits instead of 64.
scripts/mod/file2alias.c, line 379 reads:
if (arr[i / BITS_PER_LONG] & (1 << (i%BITS_PER_LONG)))
That should be:
if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG)))
Notice the added 'L' after the 1, otherwise that is an 32 bit int instead of a
64 bit long, and when that int gets shifted >= 32 times, appearantly the number
by which to shift is wrapped at 5 bits ( % 32) causing it to test a bit 32 bits
too low.
The patch below makes the nescesarry 1 char change :)
Signed-off-by: Hans de Goede <j.w.r.degoede@hhs.nl>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'scripts/mod')
-rw-r--r-- | scripts/mod/file2alias.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 44312926b849..e2de650d3dbf 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -391,7 +391,7 @@ static void do_input(char *alias, | |||
391 | unsigned int i; | 391 | unsigned int i; |
392 | 392 | ||
393 | for (i = min; i < max; i++) | 393 | for (i = min; i < max; i++) |
394 | if (arr[i / BITS_PER_LONG] & (1 << (i%BITS_PER_LONG))) | 394 | if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG))) |
395 | sprintf(alias + strlen(alias), "%X,*", i); | 395 | sprintf(alias + strlen(alias), "%X,*", i); |
396 | } | 396 | } |
397 | 397 | ||