Re: [PATCH v2] ACPICA: Add support for printing AML arguments when trace point enabled

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Apr 17, 2025 at 5:10 AM Mario Limonciello <superm1@xxxxxxxxxx> wrote:
>
> From: Mario Limonciello <mario.limonciello@xxxxxxx>
>
> When debug level is set to `ACPI_LV_TRACE_POINT` method start and
> exit are emitted into the debug logs. This can be useful to understand
> call paths, however none of the arguments for the method calls are
> populated even when turning up other debug levels.
>
> This can be useful for BIOSes that contain debug strings to see those
> strings. When `ACPI_LV_TRACE_POINT` is set also output all of the arguments
> for a given method call.
>
> This enables this type of debugging:
>
> ```
> extrace-0138 ex_trace_point        : Method Begin [0x0000000096b240c4:\M460] execution.
> extrace-0173 ex_trace_args         :  "  POST CODE: %X  ACPI TIMER: %X  TIME: %d.%d ms\n", b0003f53, 1a26a8b2, 0, 15e, 0, 0
> extrace-0138 ex_trace_point        : Method End [0x0000000096b240c4:\M460] execution.
> ```
>
> Link: https://github.com/acpica/acpica/commit/08219d91b5678ae2fae6e4f208df790a4e108c1c

The link doesn't work.

> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> ---
> This is a backport from upstream ACPICA.  I'm not sure if there is a script
> that converts code style, so I just manually adjusted to kernel code style.
> It is really useful for me for debugging; so I would ideally like to see it
> go for 6.16 if possible.
>
> v2:
>  * handle non-CONFIG_ACPI_DEBUG W=1 build
> ---
>  drivers/acpi/acpica/acinterp.h |  3 ++
>  drivers/acpi/acpica/dsmthdat.c |  1 +
>  drivers/acpi/acpica/extrace.c  | 51 ++++++++++++++++++++++++++++++++++
>  3 files changed, 55 insertions(+)
>
> diff --git a/drivers/acpi/acpica/acinterp.h b/drivers/acpi/acpica/acinterp.h
> index 955114c926bd0..d02779ee92103 100644
> --- a/drivers/acpi/acpica/acinterp.h
> +++ b/drivers/acpi/acpica/acinterp.h
> @@ -120,6 +120,9 @@ void
>  acpi_ex_trace_point(acpi_trace_event_type type,
>                     u8 begin, u8 *aml, char *pathname);
>
> +void
> +acpi_ex_trace_args(union acpi_operand_object **params, u32 count);
> +
>  /*
>   * exfield - ACPI AML (p-code) execution - field manipulation
>   */
> diff --git a/drivers/acpi/acpica/dsmthdat.c b/drivers/acpi/acpica/dsmthdat.c
> index eca50517ad824..5393de4dbc4ca 100644
> --- a/drivers/acpi/acpica/dsmthdat.c
> +++ b/drivers/acpi/acpica/dsmthdat.c
> @@ -188,6 +188,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
>
>                 index++;
>         }
> +       acpi_ex_trace_args(params, index);
>
>         ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%u args passed to method\n", index));
>         return_ACPI_STATUS(AE_OK);
> diff --git a/drivers/acpi/acpica/extrace.c b/drivers/acpi/acpica/extrace.c
> index b5e4bb4ae3ce6..e4721504c390d 100644
> --- a/drivers/acpi/acpica/extrace.c
> +++ b/drivers/acpi/acpica/extrace.c
> @@ -147,6 +147,57 @@ acpi_ex_trace_point(acpi_trace_event_type type,
>         }
>  }
>
> +/*******************************************************************************
> + *
> + * FUNCTION:    acpi_ex_trace_args
> + *
> + * PARAMETERS:  params            - AML method arguments
> + *              count             - numer of method arguments
> + *
> + * RETURN:      None
> + *
> + * DESCRIPTION: Trace any arguments
> + *
> + ******************************************************************************/
> +
> +void
> +acpi_ex_trace_args(union acpi_operand_object **params, u32 count)
> +{
> +       u32 i;
> +
> +       ACPI_FUNCTION_NAME(ex_trace_args);
> +
> +       for (i = 0; i < count; i++) {
> +               union acpi_operand_object *obj_desc = params[i];
> +
> +               if (!i) {
> +                       ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT, " "));
> +               }
> +
> +               switch (obj_desc->common.type) {
> +               case ACPI_TYPE_INTEGER:
> +                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_TRACE_POINT, "%llx", obj_desc->integer.value));
> +                       break;
> +               case ACPI_TYPE_STRING:
> +                       if (!obj_desc->string.length) {
> +                               ACPI_DEBUG_PRINT_RAW((ACPI_DB_TRACE_POINT, "NULL"));
> +                               continue;
> +                       }
> +                       if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_TRACE_POINT, _COMPONENT))
> +                               acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
> +                       break;
> +               default:
> +                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_TRACE_POINT, "Unknown"));
> +                       break;
> +               }
> +               if (i+1 == count) {
> +                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_TRACE_POINT, "\n"));
> +               } else {
> +                       ACPI_DEBUG_PRINT_RAW((ACPI_DB_TRACE_POINT, ", "));
> +               }
> +       }
> +}
> +
>  /*******************************************************************************
>   *
>   * FUNCTION:    acpi_ex_start_trace_method
> --
> 2.43.0
>
>





[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux