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