]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPICA: Add support for printing AML arguments when trace point enabled
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 17 Apr 2025 03:10:36 +0000 (22:10 -0500)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 24 Apr 2025 20:01:18 +0000 (22:01 +0200)
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", b0003f531a26a8b2, 0, 15e, 0, 0
extrace-0138 ex_trace_point        : Method End [0x0000000096b240c4:\M460] execution.
```

Link: https://github.com/acpica/acpica/commit/08219d91b5678ae2fae6e4f208df790a4e108c1c
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>
drivers/acpi/acpica/acinterp.h
drivers/acpi/acpica/dsmthdat.c
drivers/acpi/acpica/extrace.c

index 955114c926bd0c2fa3ddbcf0dc00e9326d7a071a..d02779ee92103357440268a13b096d992af48cfb 100644 (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
  */
index eca50517ad824bd6d5ab60d01c90dc67f533e812..5393de4dbc4cadb9562143006c9ca941ddabaeda 100644 (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);
index f1730221ff132b3eaa5429a80884e4c06d7b4a46..08fb94eb78707ba792a842f4391620831e080c10 100644 (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