Skip to content

Commit

Permalink
qapi: introduce x-query-usb QMP command
Browse files Browse the repository at this point in the history
This is a counterpart to the HMP "info usb" command. It is being
added with an "x-" prefix because this QMP command is intended as an
adhoc debugging tool and will thus not be modelled in QAPI as fully
structured data, nor will it have long term guaranteed stability.
The existing HMP command is rewritten to call the QMP command.

Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Daniel P. Berrangé <[email protected]>
  • Loading branch information
berrange committed Nov 2, 2021
1 parent 1b8ae79 commit fc30920
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 10 deletions.
2 changes: 1 addition & 1 deletion hmp-commands-info.hx
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ ERST
.args_type = "",
.params = "",
.help = "show guest USB devices",
.cmd = hmp_info_usb,
.cmd_info_hrt = qmp_x_query_usb,
},

SRST
Expand Down
24 changes: 15 additions & 9 deletions hw/usb/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include "hw/qdev-properties.h"
#include "hw/usb.h"
#include "qapi/error.h"
#include "qapi/qapi-commands-machine.h"
#include "qapi/type-helpers.h"
#include "qemu/error-report.h"
#include "qemu/module.h"
#include "sysemu/sysemu.h"
Expand Down Expand Up @@ -631,30 +633,34 @@ static char *usb_get_fw_dev_path(DeviceState *qdev)
return fw_path;
}

void hmp_info_usb(Monitor *mon, const QDict *qdict)
HumanReadableText *qmp_x_query_usb(Error **errp)
{
g_autoptr(GString) buf = g_string_new("");
USBBus *bus;
USBDevice *dev;
USBPort *port;

if (QTAILQ_EMPTY(&busses)) {
monitor_printf(mon, "USB support not enabled\n");
return;
error_setg(errp, "USB support not enabled");
return NULL;
}

QTAILQ_FOREACH(bus, &busses, next) {
QTAILQ_FOREACH(port, &bus->used, next) {
dev = port->dev;
if (!dev)
continue;
monitor_printf(mon, " Device %d.%d, Port %s, Speed %s Mb/s, "
"Product %s%s%s\n",
bus->busnr, dev->addr, port->path,
usb_speed(dev->speed), dev->product_desc,
dev->qdev.id ? ", ID: " : "",
dev->qdev.id ?: "");
g_string_append_printf(buf,
" Device %d.%d, Port %s, Speed %s Mb/s, "
"Product %s%s%s\n",
bus->busnr, dev->addr, port->path,
usb_speed(dev->speed), dev->product_desc,
dev->qdev.id ? ", ID: " : "",
dev->qdev.id ?: "");
}
}

return human_readable_text_from_str(buf);
}

/* handle legacy -usbdevice cmd line option */
Expand Down
12 changes: 12 additions & 0 deletions qapi/machine.json
Original file line number Diff line number Diff line change
Expand Up @@ -1447,3 +1447,15 @@
##
{ 'command': 'x-query-roms',
'returns': 'HumanReadableText' }

##
# @x-query-usb:
#
# Query information on the USB devices
#
# Returns: USB device information
#
# Since: 6.2
##
{ 'command': 'x-query-usb',
'returns': 'HumanReadableText' }
8 changes: 8 additions & 0 deletions stubs/usb-dev-stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

#include "qemu/osdep.h"
#include "qemu/error-report.h"
#include "qapi/error.h"
#include "qapi/qapi-commands-machine.h"
#include "sysemu/sysemu.h"
#include "monitor/monitor.h"
#include "hw/usb.h"
Expand All @@ -19,6 +21,12 @@ USBDevice *usbdevice_create(const char *driver)
return NULL;
}

HumanReadableText *qmp_x_query_usb(Error **errp)
{
error_setg(errp, "Support for USB devices not built-in");
return NULL;
}

void hmp_info_usb(Monitor *mon, const QDict *qdict)
{
monitor_printf(mon, "Support for USB devices not built-in\n");
Expand Down
2 changes: 2 additions & 0 deletions tests/qtest/qmp-cmd-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ static int query_error_class(const char *cmd)
#ifndef CONFIG_PROFILER
{ "x-query-profile", ERROR_CLASS_GENERIC_ERROR },
#endif
/* Only valid with a USB bus added */
{ "x-query-usb", ERROR_CLASS_GENERIC_ERROR },
{ NULL, -1 }
};
int i;
Expand Down

0 comments on commit fc30920

Please sign in to comment.