[PATCH] resolve ACPI oops on boot

From: Dominik Brodowski (devel@brodo.de)
Date: Thu Jul 18 2002 - 16:15:09 EST


An u8 was casted into an u32, then all 32 bits were set to zero, this
causing another variable - in my case, processor flags - to be corrupted.

Dominik

--- linux/drivers/acpi-original/ec.c Fri Jul 12 22:43:11 2002
+++ linux/drivers/acpi/ec.c Fri Jul 12 23:28:14 2002
@@ -134,7 +134,7 @@
 acpi_ec_read (
         struct acpi_ec *ec,
         u8 address,
- u8 *data)
+ u32 *data)
 {
         acpi_status status = AE_OK;
         int result = 0;
@@ -167,7 +167,7 @@
                 goto end;
 
 
- acpi_hw_low_level_read(8, (u32*) data, &ec->data_addr, 0);
+ acpi_hw_low_level_read(8, data, &ec->data_addr, 0);
 
         ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
                 *data, address));
@@ -237,7 +237,7 @@
 static int
 acpi_ec_query (
         struct acpi_ec *ec,
- u8 *data)
+ u32 *data)
 {
         int result = 0;
         acpi_status status = AE_OK;
@@ -269,7 +269,7 @@
         if (result)
                 goto end;
         
- acpi_hw_low_level_read(8, (u32*) data, &ec->data_addr, 0);
+ acpi_hw_low_level_read(8, data, &ec->data_addr, 0);
         if (!*data)
                 result = -ENODATA;
 
@@ -328,7 +328,7 @@
 {
         acpi_status status = AE_OK;
         struct acpi_ec *ec = (struct acpi_ec *) data;
- u8 value = 0;
+ u32 value = 0;
         unsigned long flags = 0;
         struct acpi_ec_query_data *query_data = NULL;
 
@@ -336,7 +336,7 @@
                 return;
 
         spin_lock_irqsave(&ec->lock, flags);
- acpi_hw_low_level_read(8, (u32*) &value, &ec->command_addr, 0);
+ acpi_hw_low_level_read(8, &value, &ec->command_addr, 0);
         spin_unlock_irqrestore(&ec->lock, flags);
 
         /* TBD: Implement asynch events!
@@ -398,6 +398,7 @@
 {
         int result = 0;
         struct acpi_ec *ec = NULL;
+ u32 tmp = 0;
 
         ACPI_FUNCTION_TRACE("acpi_ec_space_handler");
 
@@ -408,7 +409,8 @@
 
         switch (function) {
         case ACPI_READ:
- result = acpi_ec_read(ec, (u8) address, (u8*) value);
+ result = acpi_ec_read(ec, (u8) address, &tmp);
+ *value = (acpi_integer) tmp;
                 break;
         case ACPI_WRITE:
                 result = acpi_ec_write(ec, (u8) address, (u8) *value);

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



This archive was generated by hypermail 2b29 : Tue Jul 23 2002 - 22:00:28 EST