I hope this bug was not the result of my cc'ing Linus
on some emails and not on others, because this bug is a mistake
that I made a few weeks ago and then fixed when it was immediately
pointed out to me by some smart person on the acpi list.

        The test "((1 << bit_granularity) -1) & ~mask" will always
fail on x86+gcc if bit_granularity == 32, because the value of 1<<32
on x86 + gcc-2.95.2 is 1, not 0.  The value of 1<<n is not defined
in ANSI C when n >= bitsizeof(result), so we should not do this anyhow.

        Anyhow, here is a patch that should fix the problem.

-- 
Adam J. Richter     __     ______________   4880 Stevens Creek Blvd, Suite 104
[EMAIL PROTECTED]     \ /                  San Jose, California 95129-1034
+1 408 261-6630         | g g d r a s i l   United States of America
fax +1 408 261-6631      "Free Software For The Rest Of Us."
--- linux-2.4.1/drivers/acpi/interpreter/amfldio.c      Mon Jan 29 10:15:59 2001
+++ linux/drivers/acpi/interpreter/amfldio.c    Wed Jan 31 05:23:48 2001
@@ -415,7 +415,8 @@
 
                /* Check if update rule needs to be applied (not if mask is all ones) 
*/
 
-               if (((1 << bit_granularity) -1) & ~mask) {
+               /* The left shift drops the bits we want to ignore. */
+               if ((~mask << (sizeof(mask)*8 - bit_granularity)) != 0) {
                        /*
                         * Read the current contents of the byte/word/dword containing
                         * the field, and merge with the new field value.

Reply via email to