#include "hw/sd/sd.h"
#include "qemu/module.h"
#include "qapi/error.h"
+#include "qemu/cutils.h"
#include "sdmmc-internal.h"
#include "trace.h"
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);
{
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);
{
SDState *card = get_card(sdbus);
+ sdbus_write_dump(sdbus_name(sdbus), buf, length);
if (card) {
SDCardClass *sc = SDMMC_COMMON_GET_CLASS(card);
sc->read_data(card, &value, 1);
}
- trace_sdbus_read(sdbus_name(sdbus), value);
+ sdbus_read_dump(sdbus_name(sdbus), &value, 1);
return value;
}
length -= read;
}
}
+ sdbus_read_dump(sdbus_name(sdbus), buf, length);
}
bool sdbus_receive_ready(SDBus *sdbus)
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;
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)) {
# 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"
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"