From: Christian Speich <[email protected]>

After switching sdbuf and sdcard over to use buf+len instead of single
byte operation, the trace events need to be updated.

This patch updates sdbus_{read,write} and sdcard_write_data to output the
buffer that is worked on.

sdcard_read_data is left unchanged, as it did not print the read byte
before anyways.

Signed-off-by: Christian Speich <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Message-ID: <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
 hw/sd/core.c       | 27 +++++++++++++++++++++++++--
 hw/sd/sd.c         | 18 +++++++++++++++---
 hw/sd/trace-events |  6 +++---
 3 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/hw/sd/core.c b/hw/sd/core.c
index 594c5e011ba..eaa186fbfca 100644
--- a/hw/sd/core.c
+++ b/hw/sd/core.c
@@ -24,6 +24,7 @@
 #include "hw/sd/sd.h"
 #include "qemu/module.h"
 #include "qapi/error.h"
+#include "qemu/cutils.h"
 #include "sdmmc-internal.h"
 #include "trace.h"
 
@@ -43,6 +44,26 @@ static SDState *get_card(SDBus *sdbus)
     return SDMMC_COMMON(kid->child);
 }
 
+static void sdbus_write_dump(const char *bus_name, const void *buf, size_t len)
+{
+    g_autoptr(GString) str = NULL;
+
+    if (trace_event_get_state_backends(TRACE_SDBUS_WRITE)) {
+        str = qemu_hexdump_line(NULL, buf, len, 8, 0);
+        trace_sdbus_write(bus_name, str->str);
+    }
+}
+
+static void sdbus_read_dump(const char *bus_name, const void *buf, size_t len)
+{
+    g_autoptr(GString) str = NULL;
+
+    if (trace_event_get_state_backends(TRACE_SDBUS_READ)) {
+        str = qemu_hexdump_line(NULL, buf, len, 8, 0);
+        trace_sdbus_read(bus_name, str->str);
+    }
+}
+
 uint8_t sdbus_get_dat_lines(SDBus *sdbus)
 {
     SDState *slave = get_card(sdbus);
@@ -109,7 +130,7 @@ void sdbus_write_byte(SDBus *sdbus, uint8_t value)
 {
     SDState *card = get_card(sdbus);
 
-    trace_sdbus_write(sdbus_name(sdbus), value);
+    sdbus_write_dump(sdbus_name(sdbus), &value, 1);
     if (card) {
         SDCardClass *sc = SDMMC_COMMON_GET_CLASS(card);
 
@@ -121,6 +142,7 @@ void sdbus_write_data(SDBus *sdbus, const void *buf, size_t 
length)
 {
     SDState *card = get_card(sdbus);
 
+    sdbus_write_dump(sdbus_name(sdbus), buf, length);
     if (card) {
         SDCardClass *sc = SDMMC_COMMON_GET_CLASS(card);
 
@@ -145,7 +167,7 @@ uint8_t sdbus_read_byte(SDBus *sdbus)
 
         sc->read_data(card, &value, 1);
     }
-    trace_sdbus_read(sdbus_name(sdbus), value);
+    sdbus_read_dump(sdbus_name(sdbus), &value, 1);
 
     return value;
 }
@@ -166,6 +188,7 @@ void sdbus_read_data(SDBus *sdbus, void *buf, size_t length)
             length -= read;
         }
     }
+    sdbus_read_dump(sdbus_name(sdbus), buf, length);
 }
 
 bool sdbus_receive_ready(SDBus *sdbus)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index b49b83b96e8..92cf8aed58f 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -2647,6 +2647,18 @@ static bool sd_generic_read_data(SDState *sd, void *buf, 
size_t *len)
     return false;
 }
 
+static void sdcard_write_data_dump(const char *proto, const char *cmd_desc,
+                                   uint8_t cmd, uint32_t offset,
+                                   const void *buf, size_t len)
+{
+    g_autoptr(GString) str = NULL;
+
+    if (trace_event_get_state_backends(TRACE_SDCARD_WRITE_DATA)) {
+        str = qemu_hexdump_line(NULL, buf, len, 8, 0);
+        trace_sdcard_write_data(proto, cmd_desc, cmd, offset, str->str);
+    }
+}
+
 static size_t sd_write_data(SDState *sd, const void *buf, size_t length)
 {
     unsigned int partition_access;
@@ -2666,9 +2678,9 @@ static size_t sd_write_data(SDState *sd, const void *buf, 
size_t length)
     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
         return length;
 
-    trace_sdcard_write_data(sd->proto->name,
-                            sd->last_cmd_name,
-                            sd->current_cmd, sd->data_offset, value[0]);
+    sdcard_write_data_dump(sd->proto->name,
+                           sd->last_cmd_name,
+                           sd->current_cmd, sd->data_offset, buf, length);
     switch (sd->current_cmd) {
     case 24:  /* CMD24:  WRITE_SINGLE_BLOCK */
         if (sd_generic_write_data(sd, buf, &length)) {
diff --git a/hw/sd/trace-events b/hw/sd/trace-events
index 4ec52d2a819..c6811f3a08e 100644
--- a/hw/sd/trace-events
+++ b/hw/sd/trace-events
@@ -15,8 +15,8 @@ bcm2835_sdhost_update_irq(uint32_t irq) "IRQ bits 0x%x"
 
 # core.c
 sdbus_command(const char *bus_name, uint8_t cmd, uint32_t arg) "@%s CMD%02d 
arg 0x%08x"
-sdbus_read(const char *bus_name, uint8_t value) "@%s value 0x%02x"
-sdbus_write(const char *bus_name, uint8_t value) "@%s value 0x%02x"
+sdbus_read(const char *bus_name, const char *hexdump) "@%s data %s"
+sdbus_write(const char *bus_name, const char *hexdump) "@%s data %s"
 sdbus_set_voltage(const char *bus_name, uint16_t millivolts) "@%s %u (mV)"
 sdbus_get_dat_lines(const char *bus_name, uint8_t dat_lines) "@%s dat_lines: 
%u"
 sdbus_get_cmd_line(const char *bus_name, bool cmd_line) "@%s cmd_line: %u"
@@ -54,7 +54,7 @@ sdcard_unlock(void) ""
 sdcard_req_addr(uint32_t req_arg, uint64_t addr) "req 0x%" PRIx32 " addr 0x%" 
PRIx64
 sdcard_read_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
 sdcard_write_block(uint64_t addr, uint32_t len) "addr 0x%" PRIx64 " size 0x%x"
-sdcard_write_data(const char *proto, const char *cmd_desc, uint8_t cmd, 
uint32_t offset, uint8_t value) "%s %20s/ CMD%02d ofs %"PRIu32" value 0x%02x"
+sdcard_write_data(const char *proto, const char *cmd_desc, uint8_t cmd, 
uint32_t offset, const char *hexdump) "%s %20s/ CMD%02d ofs %"PRIu32" data %s"
 sdcard_read_data(const char *proto, const char *cmd_desc, uint8_t cmd, 
uint32_t offset, uint64_t size, uint32_t blklen) "%s %20s/ CMD%02d ofs 
%"PRIu32" size %"PRIu64" blklen %" PRIu32
 sdcard_set_voltage(uint16_t millivolts) "%u mV"
 sdcard_ext_csd_update(unsigned index, uint8_t oval, uint8_t nval) "index %u: 
0x%02x -> 0x%02x"
-- 
2.53.0


Reply via email to