Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66be71ff authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

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=953



Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent bd6f10a5
Loading
Loading
Loading
Loading
+25 −7
Original line number Diff line number Diff line
@@ -49,9 +49,10 @@
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");
		}
	}
}