lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.5 237/542] ACPICA: Disassembler: create buffer fields in ACPI_PARSE_LOAD_PASS1
    Date
    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 faa38a22263ad..ae713d746c8b8 100644
    --- a/drivers/acpi/acpica/dsfield.c
    +++ b/drivers/acpi/acpica/dsfield.c
    @@ -243,7 +243,7 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
    * 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 c88fd31208a5b..4bcf15bf03ded 100644
    --- a/drivers/acpi/acpica/dswload.c
    +++ b/drivers/acpi/acpica/dswload.c
    @@ -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))) {
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 19:41    [W:4.831 / U:1.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site