diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/acpi/acpica/nsparse.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/acpi/acpica/nsparse.c')
| -rw-r--r-- | drivers/acpi/acpica/nsparse.c | 42 | 
1 files changed, 20 insertions, 22 deletions
diff --git a/drivers/acpi/acpica/nsparse.c b/drivers/acpi/acpica/nsparse.c index 57a4cfe547e4..3736d43b18b9 100644 --- a/drivers/acpi/acpica/nsparse.c +++ b/drivers/acpi/acpica/nsparse.c @@ -70,7 +70,7 @@ acpi_ns_one_complete_parse(u32 pass_number,  {  	union acpi_parse_object *parse_root;  	acpi_status status; -       u32 aml_length; +	u32 aml_length;  	u8 *aml_start;  	struct acpi_walk_state *walk_state;  	struct acpi_table_header *table; @@ -78,6 +78,20 @@ acpi_ns_one_complete_parse(u32 pass_number,  	ACPI_FUNCTION_TRACE(ns_one_complete_parse); +	status = acpi_get_table_by_index(table_index, &table); +	if (ACPI_FAILURE(status)) { +		return_ACPI_STATUS(status); +	} + +	/* Table must consist of at least a complete header */ + +	if (table->length < sizeof(struct acpi_table_header)) { +		return_ACPI_STATUS(AE_BAD_HEADER); +	} + +	aml_start = (u8 *)table + sizeof(struct acpi_table_header); +	aml_length = table->length - sizeof(struct acpi_table_header); +  	status = acpi_tb_get_owner_id(table_index, &owner_id);  	if (ACPI_FAILURE(status)) {  		return_ACPI_STATUS(status); @@ -85,7 +99,7 @@ acpi_ns_one_complete_parse(u32 pass_number,  	/* Create and init a Root Node */ -	parse_root = acpi_ps_create_scope_op(); +	parse_root = acpi_ps_create_scope_op(aml_start);  	if (!parse_root) {  		return_ACPI_STATUS(AE_NO_MEMORY);  	} @@ -98,23 +112,12 @@ acpi_ns_one_complete_parse(u32 pass_number,  		return_ACPI_STATUS(AE_NO_MEMORY);  	} -	status = acpi_get_table_by_index(table_index, &table); +	status = acpi_ds_init_aml_walk(walk_state, parse_root, NULL, +				       aml_start, aml_length, NULL, +				       (u8)pass_number);  	if (ACPI_FAILURE(status)) {  		acpi_ds_delete_walk_state(walk_state); -		acpi_ps_free_op(parse_root); -		return_ACPI_STATUS(status); -	} - -	/* Table must consist of at least a complete header */ - -	if (table->length < sizeof(struct acpi_table_header)) { -		status = AE_BAD_HEADER; -	} else { -		aml_start = (u8 *) table + sizeof(struct acpi_table_header); -		aml_length = table->length - sizeof(struct acpi_table_header); -		status = acpi_ds_init_aml_walk(walk_state, parse_root, NULL, -					       aml_start, aml_length, NULL, -					       (u8) pass_number); +		goto cleanup;  	}  	/* Found OSDT table, enable the namespace override feature */ @@ -124,11 +127,6 @@ acpi_ns_one_complete_parse(u32 pass_number,  		walk_state->namespace_override = TRUE;  	} -	if (ACPI_FAILURE(status)) { -		acpi_ds_delete_walk_state(walk_state); -		goto cleanup; -	} -  	/* start_node is the default location to load the table */  	if (start_node && start_node != acpi_gbl_root_node) {  |