| From b8176770140aa3f66a8c675f8f9c3277d55f4039 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 17 Dec 2019 11:35:20 -0800 |
| Subject: ACPICA: Disassembler: create buffer fields in ACPI_PARSE_LOAD_PASS1 |
| |
| From: Erik Kaneda <erik.kaneda@intel.com> |
| |
| [ Upstream commit 5ddbd77181dfca61b16d2e2222382ea65637f1b9 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/acpi/acpica/dsfield.c | 2 +- |
| drivers/acpi/acpica/dswload.c | 21 +++++++++++++++++++++ |
| 2 files changed, 22 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c |
| index 30fe89545d6ab..bcc6a7acc5762 100644 |
| --- a/drivers/acpi/acpica/dsfield.c |
| +++ b/drivers/acpi/acpica/dsfield.c |
| @@ -244,7 +244,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 |
| diff --git a/drivers/acpi/acpica/dswload.c b/drivers/acpi/acpica/dswload.c |
| index d06c414462822..ba53662f12179 100644 |
| --- a/drivers/acpi/acpica/dswload.c |
| +++ b/drivers/acpi/acpica/dswload.c |
| @@ -412,6 +412,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))) { |
| -- |
| 2.20.1 |
| |