mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 10:56:14 +00:00
ACPICA: Disassembler: create buffer fields in ACPI_PARSE_LOAD_PASS1
ACPICA commit 29cc8dbc5463a93625bed87d7550a8bed8913bf4 create_buffer_field is a deferred op that is typically processed in load pass 2. However, disassembly of control method contents walk the parse tree with ACPI_PARSE_LOAD_PASS1 and AML_CREATE operators are processed in a later walk. This is a problem when there is a control method that has the same name as the AML_CREATE object. In this case, any use of the name segment will be detected as a method call rather than a reference to a buffer field. If this is detected as a method call, it can result in a mal-formed parse tree if the control methods have parameters. This change in processing AML_CREATE ops earlier solves this issue by inserting the named object in the ACPI namespace so that references to this name would be detected as a name string rather than a method call. Link: https://github.com/acpica/acpica/commit/29cc8dbc Reported-by: Elia Geretto <elia.f.geretto@gmail.com> Tested-by: Elia Geretto <elia.f.geretto@gmail.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Erik Kaneda <erik.kaneda@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
22e38ca735
commit
5ddbd77181
@ -243,7 +243,7 @@ cleanup:
|
|||||||
* FUNCTION: acpi_ds_get_field_names
|
* FUNCTION: acpi_ds_get_field_names
|
||||||
*
|
*
|
||||||
* PARAMETERS: info - create_field info structure
|
* PARAMETERS: info - create_field info structure
|
||||||
* ` walk_state - Current method state
|
* walk_state - Current method state
|
||||||
* arg - First parser arg for the field name list
|
* arg - First parser arg for the field name list
|
||||||
*
|
*
|
||||||
* RETURN: Status
|
* RETURN: Status
|
||||||
|
@ -410,6 +410,27 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
|
|||||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
|
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
|
||||||
walk_state));
|
walk_state));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disassembler: handle create field operators here.
|
||||||
|
*
|
||||||
|
* create_buffer_field is a deferred op that is typically processed in load
|
||||||
|
* pass 2. However, disassembly of control method contents walk the parse
|
||||||
|
* tree with ACPI_PARSE_LOAD_PASS1 and AML_CREATE operators are processed
|
||||||
|
* in a later walk. This is a problem when there is a control method that
|
||||||
|
* has the same name as the AML_CREATE object. In this case, any use of the
|
||||||
|
* name segment will be detected as a method call rather than a reference
|
||||||
|
* to a buffer field.
|
||||||
|
*
|
||||||
|
* This earlier creation during disassembly solves this issue by inserting
|
||||||
|
* the named object in the ACPI namespace so that references to this name
|
||||||
|
* would be a name string rather than a method call.
|
||||||
|
*/
|
||||||
|
if ((walk_state->parse_flags & ACPI_PARSE_DISASSEMBLE) &&
|
||||||
|
(walk_state->op_info->flags & AML_CREATE)) {
|
||||||
|
status = acpi_ds_create_buffer_field(op, walk_state);
|
||||||
|
return_ACPI_STATUS(status);
|
||||||
|
}
|
||||||
|
|
||||||
/* We are only interested in opcodes that have an associated name */
|
/* We are only interested in opcodes that have an associated name */
|
||||||
|
|
||||||
if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
|
if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user