ACPICA: Add FADT error message for GAS BitWidth overflow
authorBob Moore <robert.moore@intel.com>
Tue, 22 May 2012 08:35:00 +0000 (16:35 +0800)
committerLen Brown <len.brown@intel.com>
Fri, 1 Jun 2012 15:51:53 +0000 (11:51 -0400)
Error for possible overflow during conversion from 32-bit legacy
register addresses to GAS format. The GAS struct contains a
one-byte BitWidth field, meaning that the maximum length of a
register is 255 bits. ACPICA BZ 953.

https://www.acpica.org/bugzilla/show_bug.cgi?id=953

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/acpica/tbfadt.c

index 4c9c760..d919f40 100644 (file)
 ACPI_MODULE_NAME("tbfadt")
 
 /* Local prototypes */
-static ACPI_INLINE void
+static void
 acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
-                            u8 space_id, u8 byte_width, u64 address);
+                            u8 space_id,
+                            u8 byte_width, u64 address, char *register_name);
 
 static void acpi_tb_convert_fadt(void);
 
@@ -182,10 +183,25 @@ static struct acpi_fadt_pm_info fadt_pm_info_table[] = {
  *
  ******************************************************************************/
 
-static ACPI_INLINE void
+static void
 acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
-                            u8 space_id, u8 byte_width, u64 address)
+                            u8 space_id,
+                            u8 byte_width, u64 address, char *register_name)
 {
+       u8 bit_width;
+
+       /* Bit width field in the GAS is only one byte long, 255 max */
+
+       bit_width = (u8)(byte_width * 8);
+
+       if (byte_width > 31) {  /* (31*8)=248 */
+               ACPI_ERROR((AE_INFO,
+                           "%s - 32-bit FADT register is too long (%u bytes, %u bits) "
+                           "to convert to GAS struct - 255 bits max, truncating",
+                           register_name, byte_width, (byte_width * 8)));
+
+               bit_width = 255;
+       }
 
        /*
         * The 64-bit Address field is non-aligned in the byte packed
@@ -196,7 +212,7 @@ acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
        /* All other fields are byte-wide */
 
        generic_address->space_id = space_id;
-       generic_address->bit_width = (u8)ACPI_MUL_8(byte_width);
+       generic_address->bit_width = bit_width;
        generic_address->bit_offset = 0;
        generic_address->access_width = 0;      /* Access width ANY */
 }
@@ -456,7 +472,8 @@ static void acpi_tb_convert_fadt(void)
                                                                   &acpi_gbl_FADT,
                                                                   fadt_info_table
                                                                   [i].length),
-                                                    (u64) address32);
+                                                    (u64) address32,
+                                                    fadt_info_table[i].name);
                }
        }
 }
@@ -670,7 +687,8 @@ static void acpi_tb_setup_fadt_registers(void)
                                                     source64->address +
                                                     (fadt_pm_info_table[i].
                                                      register_num *
-                                                     pm1_register_byte_width));
+                                                     pm1_register_byte_width),
+                                                    "PmRegisters");
                }
        }
 }