提交 66be71ff 编写于 作者: B Bob Moore 提交者: Len Brown

ACPICA: Add FADT error message for GAS BitWidth overflow

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=953Signed-off-by: NBob Moore <robert.moore@intel.com>
Signed-off-by: NLin Ming <ming.m.lin@intel.com>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 bd6f10a5
...@@ -49,9 +49,10 @@ ...@@ -49,9 +49,10 @@
ACPI_MODULE_NAME("tbfadt") ACPI_MODULE_NAME("tbfadt")
/* Local prototypes */ /* Local prototypes */
static ACPI_INLINE void static void
acpi_tb_init_generic_address(struct acpi_generic_address *generic_address, 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); static void acpi_tb_convert_fadt(void);
...@@ -182,10 +183,25 @@ static struct acpi_fadt_pm_info fadt_pm_info_table[] = { ...@@ -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, 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 * 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, ...@@ -196,7 +212,7 @@ acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
/* All other fields are byte-wide */ /* All other fields are byte-wide */
generic_address->space_id = space_id; 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->bit_offset = 0;
generic_address->access_width = 0; /* Access width ANY */ generic_address->access_width = 0; /* Access width ANY */
} }
...@@ -456,7 +472,8 @@ static void acpi_tb_convert_fadt(void) ...@@ -456,7 +472,8 @@ static void acpi_tb_convert_fadt(void)
&acpi_gbl_FADT, &acpi_gbl_FADT,
fadt_info_table fadt_info_table
[i].length), [i].length),
(u64) address32); (u64) address32,
fadt_info_table[i].name);
} }
} }
} }
...@@ -670,7 +687,8 @@ static void acpi_tb_setup_fadt_registers(void) ...@@ -670,7 +687,8 @@ static void acpi_tb_setup_fadt_registers(void)
source64->address + source64->address +
(fadt_pm_info_table[i]. (fadt_pm_info_table[i].
register_num * register_num *
pm1_register_byte_width)); pm1_register_byte_width),
"PmRegisters");
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册