diff options
| -rw-r--r-- | Documentation/kernel-parameters.txt | 5 | ||||
| -rw-r--r-- | drivers/acpi/bus.c | 3 | ||||
| -rw-r--r-- | drivers/acpi/tables.c | 23 | 
3 files changed, 31 insertions, 0 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 60a278948652..4b7cc1481436 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -214,6 +214,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.  			unusable.  The "log_buf_len" parameter may be useful  			if you need to capture more output. +	acpi_force_table_verification	[HW,ACPI] +			Enable table checksum verification during early stage. +			By default, this is disabled due to x86 early mapping +			size limitation. +  	acpi_irq_balance [HW,ACPI]  			ACPI will balance active IRQs  			default in APIC mode diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index cf925c4f36b7..cf0b5ecf55b6 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -466,6 +466,9 @@ void __init acpi_early_init(void)  	printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION); +	/* It's safe to verify table checksums during late stage */ +	acpi_gbl_verify_table_checksum = TRUE; +  	/* enable workarounds, unless strict ACPI spec. compliance */  	if (!acpi_strict)  		acpi_gbl_enable_interpreter_slack = TRUE; diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 21782290df41..05550ba44d32 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c @@ -44,6 +44,12 @@ static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata;  static int acpi_apic_instance __initdata; +/* + * Disable table checksum verification for the early stage due to the size + * limitation of the current x86 early mapping implementation. + */ +static bool acpi_verify_table_checksum __initdata = false; +  void acpi_table_print_madt_entry(struct acpi_subtable_header *header)  {  	if (!header) @@ -333,6 +339,14 @@ int __init acpi_table_init(void)  {  	acpi_status status; +	if (acpi_verify_table_checksum) { +		pr_info("Early table checksum verification enabled\n"); +		acpi_gbl_verify_table_checksum = TRUE; +	} else { +		pr_info("Early table checksum verification disabled\n"); +		acpi_gbl_verify_table_checksum = FALSE; +	} +  	status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);  	if (ACPI_FAILURE(status))  		return -EINVAL; @@ -354,3 +368,12 @@ static int __init acpi_parse_apic_instance(char *str)  }  early_param("acpi_apic_instance", acpi_parse_apic_instance); + +static int __init acpi_force_table_verification_setup(char *s) +{ +	acpi_verify_table_checksum = true; + +	return 0; +} + +early_param("acpi_force_table_verification", acpi_force_table_verification_setup);  | 

