lkml.org 
[lkml]   [2019]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 207/209] platform/x86: hp-wmi: Fix ACPI errors caused by too small buffer
    Date
    From: Hans de Goede <hdegoede@redhat.com>

    commit 16245db1489cd9aa579506f64afeeeb13d825a93 upstream.

    The HP WMI calls may take up to 128 bytes of data as input, and
    the AML methods implementing the WMI calls, declare a couple of fields for
    accessing input in different sizes, specifycally the HWMC method contains:

    CreateField (Arg1, 0x80, 0x0400, D128)

    Even though we do not use any of the WMI command-types which need a buffer
    of this size, the APCI interpreter still tries to create it as it is
    declared in generoc code at the top of the HWMC method which runs before
    the code looks at which command-type is requested.

    This results in many of these errors on many different HP laptop models:

    [ 14.459261] ACPI Error: Field [D128] at 1152 exceeds Buffer [NULL] size 160 (bits) (20170303/dsopcode-236)
    [ 14.459268] ACPI Error: Method parse/execution failed [\HWMC] (Node ffff8edcc61507f8), AE_AML_BUFFER_LIMIT (20170303/psparse-543)
    [ 14.459279] ACPI Error: Method parse/execution failed [\_SB.WMID.WMAA] (Node ffff8edcc61523c0), AE_AML_BUFFER_LIMIT (20170303/psparse-543)

    This commit increases the size of the data element of the bios_args struct
    to 128 bytes fixing these errors.

    Cc: stable@vger.kernel.org
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=197007
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=201981
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1520703
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/platform/x86/hp-wmi.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    --- a/drivers/platform/x86/hp-wmi.c
    +++ b/drivers/platform/x86/hp-wmi.c
    @@ -78,7 +78,7 @@ struct bios_args {
    u32 command;
    u32 commandtype;
    u32 datasize;
    - u32 data;
    + u8 data[128];
    };

    enum hp_wmi_commandtype {
    @@ -229,7 +229,7 @@ static int hp_wmi_perform_query(int quer
    .command = command,
    .commandtype = query,
    .datasize = insize,
    - .data = 0,
    + .data = { 0 },
    };
    struct acpi_buffer input = { sizeof(struct bios_args), &args };
    struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
    @@ -241,7 +241,7 @@ static int hp_wmi_perform_query(int quer

    if (WARN_ON(insize > sizeof(args.data)))
    return -EINVAL;
    - memcpy(&args.data, buffer, insize);
    + memcpy(&args.data[0], buffer, insize);

    wmi_evaluate_method(HPWMI_BIOS_GUID, 0, mid, &input, &output);


    \
     
     \ /
      Last update: 2019-12-04 19:20    [W:2.448 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site