Add trace events for the command dispatch and for the read, write,
get-key-type and get-key-by-index handlers, so the sequence of commands
and keys a guest issues can be observed with

  -trace 'applesmc*'

This is how the exact set of commands and keys a macOS guest relies on
was determined, and it stays useful for debugging future guests and key
probes.

Signed-off-by: Daniel Golle <[email protected]>
---
 hw/misc/applesmc.c   | 14 ++++++++++++++
 hw/misc/trace-events | 10 ++++++++++
 2 files changed, 24 insertions(+)

diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c
index d2f292f10e..4a82a36a2a 100644
--- a/hw/misc/applesmc.c
+++ b/hw/misc/applesmc.c
@@ -40,6 +40,7 @@
 #include "qemu/timer.h"
 #include "qom/object.h"
 #include "hw/acpi/acpi_aml_interface.h"
+#include "trace.h"
 
 /* #define DEBUG_SMC */
 
@@ -138,6 +139,7 @@ static void applesmc_io_cmd_write(void *opaque, hwaddr 
addr, uint64_t val,
         if (status == APPLESMC_ST_CMD_DONE || status == APPLESMC_ST_NEW_CMD) {
             s->cmd = val;
             s->status = APPLESMC_ST_NEW_CMD | APPLESMC_ST_ACK;
+            trace_applesmc_cmd(val);
         } else {
             smc_debug("ERROR: previous command interrupted!\n");
             s->status = APPLESMC_ST_NEW_CMD;
@@ -147,6 +149,7 @@ static void applesmc_io_cmd_write(void *opaque, hwaddr 
addr, uint64_t val,
     default:
         qemu_log_mask(LOG_GUEST_ERROR,
                       "applesmc: unexpected CMD 0x%02x\n", (uint8_t)val);
+        trace_applesmc_cmd_bad(val);
         s->status = APPLESMC_ST_NEW_CMD;
         s->status_1e = APPLESMC_ST_1E_BAD_CMD;
     }
@@ -189,6 +192,8 @@ static void applesmc_io_data_write(void *opaque, hwaddr 
addr, uint64_t val,
                 s->data_pos = 0;
                 s->status = APPLESMC_ST_ACK | APPLESMC_ST_DATA_READY;
                 s->status_1e = APPLESMC_ST_CMD_DONE;
+                trace_applesmc_read(s->key[0], s->key[1], s->key[2], s->key[3],
+                                    d->len);
             } else {
                 /*
                  * Return zeros for unknown keys instead of NOEXIST. Early
@@ -200,6 +205,8 @@ static void applesmc_io_data_write(void *opaque, hwaddr 
addr, uint64_t val,
                               "applesmc: READ unknown key '%c%c%c%c' len=%d\n",
                               s->key[0], s->key[1], s->key[2], s->key[3],
                               (uint8_t)val);
+                trace_applesmc_read_unknown(s->key[0], s->key[1],
+                                            s->key[2], s->key[3]);
                 memset(s->data, 0, APPLESMC_MAX_DATA_LENGTH);
                 s->data_len = (uint8_t)val;
                 s->data_pos = 0;
@@ -234,6 +241,8 @@ static void applesmc_io_data_write(void *opaque, hwaddr 
addr, uint64_t val,
                                   "applesmc: WRITE key '%c%c%c%c' len=%d\n",
                                   s->key[0], s->key[1], s->key[2], s->key[3],
                                   s->data_len);
+                    trace_applesmc_write(s->key[0], s->key[1], s->key[2],
+                                         s->key[3], s->data_len);
                     s->status = APPLESMC_ST_CMD_DONE;
                     s->status_1e = APPLESMC_ST_CMD_DONE;
                 } else {
@@ -298,6 +307,8 @@ static void applesmc_io_data_write(void *opaque, hwaddr 
addr, uint64_t val,
             s->data_pos = 0;
             s->status = APPLESMC_ST_ACK | APPLESMC_ST_DATA_READY;
             s->status_1e = APPLESMC_ST_CMD_DONE;
+            trace_applesmc_key_type(s->key[0], s->key[1], s->key[2],
+                                    s->key[3], s->data[4]);
         }
         s->read_pos++;
         break;
@@ -341,9 +352,12 @@ static void applesmc_io_data_write(void *opaque, hwaddr 
addr, uint64_t val,
                 s->data_len = 0;
                 s->status_1e = APPLESMC_ST_1E_BAD_INDEX;
                 s->status = APPLESMC_ST_CMD_DONE;
+                trace_applesmc_key_by_index_end(idx);
                 s->read_pos++;
                 break;
             }
+            trace_applesmc_key_by_index(idx, def->key[0], def->key[1],
+                                        def->key[2], def->key[3]);
             s->status = APPLESMC_ST_ACK | APPLESMC_ST_DATA_READY;
             s->status_1e = APPLESMC_ST_CMD_DONE;
         }
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
index c9a868b3ef..5b823182c9 100644
--- a/hw/misc/trace-events
+++ b/hw/misc/trace-events
@@ -37,6 +37,16 @@ allwinner_sid_write(uint64_t offset, uint64_t data, unsigned 
size) "offset 0x%"
 allwinner_sramc_read(uint64_t offset, uint64_t data) "offset 0x%" PRIx64 " 
data 0x%" PRIx64
 allwinner_sramc_write(uint64_t offset, uint64_t data) "offset 0x%" PRIx64 " 
data 0x%" PRIx64
 
+# applesmc.c
+applesmc_cmd(uint8_t cmd) "cmd 0x%02x"
+applesmc_cmd_bad(uint8_t cmd) "unsupported cmd 0x%02x"
+applesmc_read(char k0, char k1, char k2, char k3, uint8_t len) "READ 
'%c%c%c%c' len %u"
+applesmc_read_unknown(char k0, char k1, char k2, char k3) "READ unknown key 
'%c%c%c%c'"
+applesmc_write(char k0, char k1, char k2, char k3, uint8_t len) "WRITE 
'%c%c%c%c' len %u"
+applesmc_key_type(char k0, char k1, char k2, char k3, uint8_t len) 
"GET_KEY_TYPE '%c%c%c%c' size %u"
+applesmc_key_by_index(uint32_t idx, char k0, char k1, char k2, char k3) 
"GET_KEY_BY_INDEX %u -> '%c%c%c%c'"
+applesmc_key_by_index_end(uint32_t idx) "GET_KEY_BY_INDEX %u past end"
+
 # avr_power.c
 avr_power_read(uint8_t value) "power_reduc read value:%u"
 avr_power_write(uint8_t value) "power_reduc write value:%u"
-- 
2.55.0

Reply via email to