ACPICA: Add support for printing AML arguments when trace point enabled

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: 08219d91b5
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://patch.msgid.link/20250417031040.514460-1-superm1@kernel.org
Link: https://github.com/acpica/acpica/pull/1012
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Mario Limonciello
2025-04-16 22:10:36 -05:00
committed by Rafael J. Wysocki
parent 0f8af0356a
commit cde89fdfdf
3 changed files with 55 additions and 0 deletions

View File

@@ -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
*/

View File

@@ -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);

View File

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