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 > >