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
