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:
Родитель
22e38ca735
Коммит
5ddbd77181
|
@ -243,7 +243,7 @@ cleanup:
|
|||
* FUNCTION: acpi_ds_get_field_names
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* 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,
|
||||
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 */
|
||||
|
||||
if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче