提交 ddc01bf1 编写于 作者: A Anthony Liguori

Merge remote-tracking branch 'luiz/queue/qmp' into staging

# By Wenchao Xia
# Via Luiz Capitulino
* luiz/queue/qmp:
  HMP: add sub command table to info
  HMP: move define of mon_cmds
  HMP: add infrastructure for sub command
  HMP: delete info handler
  HMP: add QDict to info callback handler
...@@ -1521,7 +1521,8 @@ ETEXI ...@@ -1521,7 +1521,8 @@ ETEXI
.args_type = "item:s?", .args_type = "item:s?",
.params = "[subcommand]", .params = "[subcommand]",
.help = "show various information about the system state", .help = "show various information about the system state",
.mhandler.cmd = do_info, .mhandler.cmd = do_info_help,
.sub_table = info_cmds,
}, },
STEXI STEXI
......
...@@ -31,7 +31,7 @@ static void hmp_handle_error(Monitor *mon, Error **errp) ...@@ -31,7 +31,7 @@ static void hmp_handle_error(Monitor *mon, Error **errp)
} }
} }
void hmp_info_name(Monitor *mon) void hmp_info_name(Monitor *mon, const QDict *qdict)
{ {
NameInfo *info; NameInfo *info;
...@@ -42,7 +42,7 @@ void hmp_info_name(Monitor *mon) ...@@ -42,7 +42,7 @@ void hmp_info_name(Monitor *mon)
qapi_free_NameInfo(info); qapi_free_NameInfo(info);
} }
void hmp_info_version(Monitor *mon) void hmp_info_version(Monitor *mon, const QDict *qdict)
{ {
VersionInfo *info; VersionInfo *info;
...@@ -55,7 +55,7 @@ void hmp_info_version(Monitor *mon) ...@@ -55,7 +55,7 @@ void hmp_info_version(Monitor *mon)
qapi_free_VersionInfo(info); qapi_free_VersionInfo(info);
} }
void hmp_info_kvm(Monitor *mon) void hmp_info_kvm(Monitor *mon, const QDict *qdict)
{ {
KvmInfo *info; KvmInfo *info;
...@@ -70,7 +70,7 @@ void hmp_info_kvm(Monitor *mon) ...@@ -70,7 +70,7 @@ void hmp_info_kvm(Monitor *mon)
qapi_free_KvmInfo(info); qapi_free_KvmInfo(info);
} }
void hmp_info_status(Monitor *mon) void hmp_info_status(Monitor *mon, const QDict *qdict)
{ {
StatusInfo *info; StatusInfo *info;
...@@ -89,7 +89,7 @@ void hmp_info_status(Monitor *mon) ...@@ -89,7 +89,7 @@ void hmp_info_status(Monitor *mon)
qapi_free_StatusInfo(info); qapi_free_StatusInfo(info);
} }
void hmp_info_uuid(Monitor *mon) void hmp_info_uuid(Monitor *mon, const QDict *qdict)
{ {
UuidInfo *info; UuidInfo *info;
...@@ -98,7 +98,7 @@ void hmp_info_uuid(Monitor *mon) ...@@ -98,7 +98,7 @@ void hmp_info_uuid(Monitor *mon)
qapi_free_UuidInfo(info); qapi_free_UuidInfo(info);
} }
void hmp_info_chardev(Monitor *mon) void hmp_info_chardev(Monitor *mon, const QDict *qdict)
{ {
ChardevInfoList *char_info, *info; ChardevInfoList *char_info, *info;
...@@ -111,7 +111,7 @@ void hmp_info_chardev(Monitor *mon) ...@@ -111,7 +111,7 @@ void hmp_info_chardev(Monitor *mon)
qapi_free_ChardevInfoList(char_info); qapi_free_ChardevInfoList(char_info);
} }
void hmp_info_mice(Monitor *mon) void hmp_info_mice(Monitor *mon, const QDict *qdict)
{ {
MouseInfoList *mice_list, *mouse; MouseInfoList *mice_list, *mouse;
...@@ -131,7 +131,7 @@ void hmp_info_mice(Monitor *mon) ...@@ -131,7 +131,7 @@ void hmp_info_mice(Monitor *mon)
qapi_free_MouseInfoList(mice_list); qapi_free_MouseInfoList(mice_list);
} }
void hmp_info_migrate(Monitor *mon) void hmp_info_migrate(Monitor *mon, const QDict *qdict)
{ {
MigrationInfo *info; MigrationInfo *info;
MigrationCapabilityStatusList *caps, *cap; MigrationCapabilityStatusList *caps, *cap;
...@@ -209,7 +209,7 @@ void hmp_info_migrate(Monitor *mon) ...@@ -209,7 +209,7 @@ void hmp_info_migrate(Monitor *mon)
qapi_free_MigrationCapabilityStatusList(caps); qapi_free_MigrationCapabilityStatusList(caps);
} }
void hmp_info_migrate_capabilities(Monitor *mon) void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
{ {
MigrationCapabilityStatusList *caps, *cap; MigrationCapabilityStatusList *caps, *cap;
...@@ -228,13 +228,13 @@ void hmp_info_migrate_capabilities(Monitor *mon) ...@@ -228,13 +228,13 @@ void hmp_info_migrate_capabilities(Monitor *mon)
qapi_free_MigrationCapabilityStatusList(caps); qapi_free_MigrationCapabilityStatusList(caps);
} }
void hmp_info_migrate_cache_size(Monitor *mon) void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict)
{ {
monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n", monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
qmp_query_migrate_cache_size(NULL) >> 10); qmp_query_migrate_cache_size(NULL) >> 10);
} }
void hmp_info_cpus(Monitor *mon) void hmp_info_cpus(Monitor *mon, const QDict *qdict)
{ {
CpuInfoList *cpu_list, *cpu; CpuInfoList *cpu_list, *cpu;
...@@ -272,7 +272,7 @@ void hmp_info_cpus(Monitor *mon) ...@@ -272,7 +272,7 @@ void hmp_info_cpus(Monitor *mon)
qapi_free_CpuInfoList(cpu_list); qapi_free_CpuInfoList(cpu_list);
} }
void hmp_info_block(Monitor *mon) void hmp_info_block(Monitor *mon, const QDict *qdict)
{ {
BlockInfoList *block_list, *info; BlockInfoList *block_list, *info;
...@@ -326,7 +326,7 @@ void hmp_info_block(Monitor *mon) ...@@ -326,7 +326,7 @@ void hmp_info_block(Monitor *mon)
qapi_free_BlockInfoList(block_list); qapi_free_BlockInfoList(block_list);
} }
void hmp_info_blockstats(Monitor *mon) void hmp_info_blockstats(Monitor *mon, const QDict *qdict)
{ {
BlockStatsList *stats_list, *stats; BlockStatsList *stats_list, *stats;
...@@ -360,7 +360,7 @@ void hmp_info_blockstats(Monitor *mon) ...@@ -360,7 +360,7 @@ void hmp_info_blockstats(Monitor *mon)
qapi_free_BlockStatsList(stats_list); qapi_free_BlockStatsList(stats_list);
} }
void hmp_info_vnc(Monitor *mon) void hmp_info_vnc(Monitor *mon, const QDict *qdict)
{ {
VncInfo *info; VncInfo *info;
Error *err = NULL; Error *err = NULL;
...@@ -406,7 +406,7 @@ out: ...@@ -406,7 +406,7 @@ out:
qapi_free_VncInfo(info); qapi_free_VncInfo(info);
} }
void hmp_info_spice(Monitor *mon) void hmp_info_spice(Monitor *mon, const QDict *qdict)
{ {
SpiceChannelList *chan; SpiceChannelList *chan;
SpiceInfo *info; SpiceInfo *info;
...@@ -453,7 +453,7 @@ out: ...@@ -453,7 +453,7 @@ out:
qapi_free_SpiceInfo(info); qapi_free_SpiceInfo(info);
} }
void hmp_info_balloon(Monitor *mon) void hmp_info_balloon(Monitor *mon, const QDict *qdict)
{ {
BalloonInfo *info; BalloonInfo *info;
Error *err = NULL; Error *err = NULL;
...@@ -570,7 +570,7 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev) ...@@ -570,7 +570,7 @@ static void hmp_info_pci_device(Monitor *mon, const PciDeviceInfo *dev)
} }
} }
void hmp_info_pci(Monitor *mon) void hmp_info_pci(Monitor *mon, const QDict *qdict)
{ {
PciInfoList *info_list, *info; PciInfoList *info_list, *info;
Error *err = NULL; Error *err = NULL;
...@@ -593,7 +593,7 @@ void hmp_info_pci(Monitor *mon) ...@@ -593,7 +593,7 @@ void hmp_info_pci(Monitor *mon)
qapi_free_PciInfoList(info_list); qapi_free_PciInfoList(info_list);
} }
void hmp_info_block_jobs(Monitor *mon) void hmp_info_block_jobs(Monitor *mon, const QDict *qdict)
{ {
BlockJobInfoList *list; BlockJobInfoList *list;
Error *err = NULL; Error *err = NULL;
......
...@@ -18,24 +18,24 @@ ...@@ -18,24 +18,24 @@
#include "qapi-types.h" #include "qapi-types.h"
#include "qapi/qmp/qdict.h" #include "qapi/qmp/qdict.h"
void hmp_info_name(Monitor *mon); void hmp_info_name(Monitor *mon, const QDict *qdict);
void hmp_info_version(Monitor *mon); void hmp_info_version(Monitor *mon, const QDict *qdict);
void hmp_info_kvm(Monitor *mon); void hmp_info_kvm(Monitor *mon, const QDict *qdict);
void hmp_info_status(Monitor *mon); void hmp_info_status(Monitor *mon, const QDict *qdict);
void hmp_info_uuid(Monitor *mon); void hmp_info_uuid(Monitor *mon, const QDict *qdict);
void hmp_info_chardev(Monitor *mon); void hmp_info_chardev(Monitor *mon, const QDict *qdict);
void hmp_info_mice(Monitor *mon); void hmp_info_mice(Monitor *mon, const QDict *qdict);
void hmp_info_migrate(Monitor *mon); void hmp_info_migrate(Monitor *mon, const QDict *qdict);
void hmp_info_migrate_capabilities(Monitor *mon); void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict);
void hmp_info_migrate_cache_size(Monitor *mon); void hmp_info_migrate_cache_size(Monitor *mon, const QDict *qdict);
void hmp_info_cpus(Monitor *mon); void hmp_info_cpus(Monitor *mon, const QDict *qdict);
void hmp_info_block(Monitor *mon); void hmp_info_block(Monitor *mon, const QDict *qdict);
void hmp_info_blockstats(Monitor *mon); void hmp_info_blockstats(Monitor *mon, const QDict *qdict);
void hmp_info_vnc(Monitor *mon); void hmp_info_vnc(Monitor *mon, const QDict *qdict);
void hmp_info_spice(Monitor *mon); void hmp_info_spice(Monitor *mon, const QDict *qdict);
void hmp_info_balloon(Monitor *mon); void hmp_info_balloon(Monitor *mon, const QDict *qdict);
void hmp_info_pci(Monitor *mon); void hmp_info_pci(Monitor *mon, const QDict *qdict);
void hmp_info_block_jobs(Monitor *mon); void hmp_info_block_jobs(Monitor *mon, const QDict *qdict);
void hmp_quit(Monitor *mon, const QDict *qdict); void hmp_quit(Monitor *mon, const QDict *qdict);
void hmp_stop(Monitor *mon, const QDict *qdict); void hmp_stop(Monitor *mon, const QDict *qdict);
void hmp_system_reset(Monitor *mon, const QDict *qdict); void hmp_system_reset(Monitor *mon, const QDict *qdict);
......
...@@ -407,7 +407,7 @@ static void pic_init(PICCommonState *s) ...@@ -407,7 +407,7 @@ static void pic_init(PICCommonState *s)
qdev_init_gpio_in(&s->dev.qdev, pic_set_irq, 8); qdev_init_gpio_in(&s->dev.qdev, pic_set_irq, 8);
} }
void pic_info(Monitor *mon) void pic_info(Monitor *mon, const QDict *qdict)
{ {
int i; int i;
PICCommonState *s; PICCommonState *s;
...@@ -425,7 +425,7 @@ void pic_info(Monitor *mon) ...@@ -425,7 +425,7 @@ void pic_info(Monitor *mon)
} }
} }
void irq_info(Monitor *mon) void irq_info(Monitor *mon, const QDict *qdict)
{ {
#ifndef DEBUG_IRQ_COUNT #ifndef DEBUG_IRQ_COUNT
monitor_printf(mon, "irq statistic code not compiled.\n"); monitor_printf(mon, "irq statistic code not compiled.\n");
......
...@@ -39,7 +39,7 @@ struct LM32PicState { ...@@ -39,7 +39,7 @@ struct LM32PicState {
typedef struct LM32PicState LM32PicState; typedef struct LM32PicState LM32PicState;
static LM32PicState *pic; static LM32PicState *pic;
void lm32_do_pic_info(Monitor *mon) void lm32_do_pic_info(Monitor *mon, const QDict *qdict)
{ {
if (pic == NULL) { if (pic == NULL) {
return; return;
...@@ -49,7 +49,7 @@ void lm32_do_pic_info(Monitor *mon) ...@@ -49,7 +49,7 @@ void lm32_do_pic_info(Monitor *mon)
pic->im, pic->ip, pic->irq_state); pic->im, pic->ip, pic->irq_state);
} }
void lm32_irq_info(Monitor *mon) void lm32_irq_info(Monitor *mon, const QDict *qdict)
{ {
int i; int i;
uint32_t count; uint32_t count;
......
...@@ -8,7 +8,7 @@ uint32_t lm32_pic_get_im(DeviceState *d); ...@@ -8,7 +8,7 @@ uint32_t lm32_pic_get_im(DeviceState *d);
void lm32_pic_set_ip(DeviceState *d, uint32_t ip); void lm32_pic_set_ip(DeviceState *d, uint32_t ip);
void lm32_pic_set_im(DeviceState *d, uint32_t im); void lm32_pic_set_im(DeviceState *d, uint32_t im);
void lm32_do_pic_info(Monitor *mon); void lm32_do_pic_info(Monitor *mon, const QDict *qdict);
void lm32_irq_info(Monitor *mon); void lm32_irq_info(Monitor *mon, const QDict *qdict);
#endif /* QEMU_HW_LM32_PIC_H */ #endif /* QEMU_HW_LM32_PIC_H */
...@@ -778,7 +778,7 @@ void *rom_ptr(hwaddr addr) ...@@ -778,7 +778,7 @@ void *rom_ptr(hwaddr addr)
return rom->data + (addr - rom->addr); return rom->data + (addr - rom->addr);
} }
void do_info_roms(Monitor *mon) void do_info_roms(Monitor *mon, const QDict *qdict)
{ {
Rom *rom; Rom *rom;
......
#ifndef LOADER_H #ifndef LOADER_H
#define LOADER_H #define LOADER_H
#include "qapi/qmp/qdict.h"
/* loader.c */ /* loader.c */
int get_image_size(const char *filename); int get_image_size(const char *filename);
...@@ -30,7 +31,7 @@ int rom_load_all(void); ...@@ -30,7 +31,7 @@ int rom_load_all(void);
void rom_set_fw(void *f); void rom_set_fw(void *f);
int rom_copy(uint8_t *dest, hwaddr addr, size_t size); int rom_copy(uint8_t *dest, hwaddr addr, size_t size);
void *rom_ptr(hwaddr addr); void *rom_ptr(hwaddr addr);
void do_info_roms(Monitor *mon); void do_info_roms(Monitor *mon, const QDict *qdict);
#define rom_add_file_fixed(_f, _a, _i) \ #define rom_add_file_fixed(_f, _a, _i) \
rom_add_file(_f, NULL, _a, _i) rom_add_file(_f, NULL, _a, _i)
......
...@@ -40,8 +40,8 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq); ...@@ -40,8 +40,8 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
qemu_irq *kvm_i8259_init(ISABus *bus); qemu_irq *kvm_i8259_init(ISABus *bus);
int pic_read_irq(DeviceState *d); int pic_read_irq(DeviceState *d);
int pic_get_output(DeviceState *d); int pic_get_output(DeviceState *d);
void pic_info(Monitor *mon); void pic_info(Monitor *mon, const QDict *qdict);
void irq_info(Monitor *mon); void irq_info(Monitor *mon, const QDict *qdict);
/* Global System Interrupts */ /* Global System Interrupts */
......
...@@ -14,7 +14,7 @@ typedef struct { ...@@ -14,7 +14,7 @@ typedef struct {
void pcmcia_socket_register(PCMCIASocket *socket); void pcmcia_socket_register(PCMCIASocket *socket);
void pcmcia_socket_unregister(PCMCIASocket *socket); void pcmcia_socket_unregister(PCMCIASocket *socket);
void pcmcia_info(Monitor *mon); void pcmcia_info(Monitor *mon, const QDict *qdict);
struct PCMCIACardState { struct PCMCIACardState {
void *state; void *state;
......
...@@ -564,13 +564,13 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent) ...@@ -564,13 +564,13 @@ static void qbus_print(Monitor *mon, BusState *bus, int indent)
} }
#undef qdev_printf #undef qdev_printf
void do_info_qtree(Monitor *mon) void do_info_qtree(Monitor *mon, const QDict *qdict)
{ {
if (sysbus_get_default()) if (sysbus_get_default())
qbus_print(mon, sysbus_get_default(), 0); qbus_print(mon, sysbus_get_default(), 0);
} }
void do_info_qdm(Monitor *mon) void do_info_qdm(Monitor *mon, const QDict *qdict)
{ {
object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, NULL); object_class_foreach(qdev_print_devinfo, TYPE_DEVICE, false, NULL);
} }
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
/*** monitor commands ***/ /*** monitor commands ***/
void do_info_qtree(Monitor *mon); void do_info_qtree(Monitor *mon, const QDict *qdict);
void do_info_qdm(Monitor *mon); void do_info_qdm(Monitor *mon, const QDict *qdict);
int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data);
int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data); int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
int qdev_device_help(QemuOpts *opts); int qdev_device_help(QemuOpts *opts);
......
...@@ -216,13 +216,13 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr, ...@@ -216,13 +216,13 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr,
static DeviceState *slavio_intctl; static DeviceState *slavio_intctl;
void sun4m_pic_info(Monitor *mon) void sun4m_pic_info(Monitor *mon, const QDict *qdict)
{ {
if (slavio_intctl) if (slavio_intctl)
slavio_pic_info(mon, slavio_intctl); slavio_pic_info(mon, slavio_intctl);
} }
void sun4m_irq_info(Monitor *mon) void sun4m_irq_info(Monitor *mon, const QDict *qdict)
{ {
if (slavio_intctl) if (slavio_intctl)
slavio_irq_info(mon, slavio_intctl); slavio_irq_info(mon, slavio_intctl);
......
...@@ -27,8 +27,8 @@ void slavio_pic_info(Monitor *mon, DeviceState *dev); ...@@ -27,8 +27,8 @@ void slavio_pic_info(Monitor *mon, DeviceState *dev);
void slavio_irq_info(Monitor *mon, DeviceState *dev); void slavio_irq_info(Monitor *mon, DeviceState *dev);
/* sun4m.c */ /* sun4m.c */
void sun4m_pic_info(Monitor *mon); void sun4m_pic_info(Monitor *mon, const QDict *qdict);
void sun4m_irq_info(Monitor *mon); void sun4m_irq_info(Monitor *mon, const QDict *qdict);
/* sparc32_dma.c */ /* sparc32_dma.c */
#include "sparc32_dma.h" #include "sparc32_dma.h"
......
...@@ -435,7 +435,7 @@ int set_usb_string(uint8_t *buf, const char *str); ...@@ -435,7 +435,7 @@ int set_usb_string(uint8_t *buf, const char *str);
/* usb-linux.c */ /* usb-linux.c */
USBDevice *usb_host_device_open(USBBus *bus, const char *devname); USBDevice *usb_host_device_open(USBBus *bus, const char *devname);
int usb_host_device_close(const char *devname); int usb_host_device_close(const char *devname);
void usb_host_info(Monitor *mon); void usb_host_info(Monitor *mon, const QDict *qdict);
/* usb-bt.c */ /* usb-bt.c */
USBDevice *usb_bt_init(USBBus *bus, HCIInfo *hci); USBDevice *usb_bt_init(USBBus *bus, HCIInfo *hci);
......
...@@ -542,7 +542,7 @@ static char *usb_get_fw_dev_path(DeviceState *qdev) ...@@ -542,7 +542,7 @@ static char *usb_get_fw_dev_path(DeviceState *qdev)
return fw_path; return fw_path;
} }
void usb_info(Monitor *mon) void usb_info(Monitor *mon, const QDict *qdict)
{ {
USBBus *bus; USBBus *bus;
USBDevice *dev; USBDevice *dev;
......
...@@ -633,7 +633,7 @@ static int usb_host_info_device(void *opaque, ...@@ -633,7 +633,7 @@ static int usb_host_info_device(void *opaque,
return 0; return 0;
} }
void usb_host_info(Monitor *mon) void usb_host_info(Monitor *mon, const QDict *qdict)
{ {
usb_host_scan(mon, usb_host_info_device); usb_host_scan(mon, usb_host_info_device);
} }
......
...@@ -1998,7 +1998,7 @@ static void hex2str(int val, char *str, size_t size) ...@@ -1998,7 +1998,7 @@ static void hex2str(int val, char *str, size_t size)
} }
} }
void usb_host_info(Monitor *mon) void usb_host_info(Monitor *mon, const QDict *qdict)
{ {
struct USBAutoFilter *f; struct USBAutoFilter *f;
struct USBHostDevice *s; struct USBHostDevice *s;
......
...@@ -112,7 +112,7 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender, ...@@ -112,7 +112,7 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender,
void *opaque); void *opaque);
void print_net_client(Monitor *mon, NetClientState *nc); void print_net_client(Monitor *mon, NetClientState *nc);
void do_info_network(Monitor *mon); void do_info_network(Monitor *mon, const QDict *qdict);
/* NIC info */ /* NIC info */
......
...@@ -40,7 +40,7 @@ int net_slirp_parse_legacy(QemuOptsList *opts_list, const char *optarg, int *ret ...@@ -40,7 +40,7 @@ int net_slirp_parse_legacy(QemuOptsList *opts_list, const char *optarg, int *ret
int net_slirp_smb(const char *exported_dir); int net_slirp_smb(const char *exported_dir);
void do_info_usernet(Monitor *mon); void do_info_usernet(Monitor *mon, const QDict *qdict);
#endif #endif
......
...@@ -68,7 +68,7 @@ void qemu_add_machine_init_done_notifier(Notifier *notify); ...@@ -68,7 +68,7 @@ void qemu_add_machine_init_done_notifier(Notifier *notify);
void do_savevm(Monitor *mon, const QDict *qdict); void do_savevm(Monitor *mon, const QDict *qdict);
int load_vmstate(const char *name); int load_vmstate(const char *name);
void do_delvm(Monitor *mon, const QDict *qdict); void do_delvm(Monitor *mon, const QDict *qdict);
void do_info_snapshots(Monitor *mon); void do_info_snapshots(Monitor *mon, const QDict *qdict);
void qemu_announce_self(void); void qemu_announce_self(void);
...@@ -171,7 +171,7 @@ extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; ...@@ -171,7 +171,7 @@ extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
void do_usb_add(Monitor *mon, const QDict *qdict); void do_usb_add(Monitor *mon, const QDict *qdict);
void do_usb_del(Monitor *mon, const QDict *qdict); void do_usb_del(Monitor *mon, const QDict *qdict);
void usb_info(Monitor *mon); void usb_info(Monitor *mon, const QDict *qdict);
void rtc_change_mon_event(struct tm *tm); void rtc_change_mon_event(struct tm *tm);
......
...@@ -123,13 +123,17 @@ typedef struct mon_cmd_t { ...@@ -123,13 +123,17 @@ typedef struct mon_cmd_t {
const char *help; const char *help;
void (*user_print)(Monitor *mon, const QObject *data); void (*user_print)(Monitor *mon, const QObject *data);
union { union {
void (*info)(Monitor *mon);
void (*cmd)(Monitor *mon, const QDict *qdict); void (*cmd)(Monitor *mon, const QDict *qdict);
int (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data); int (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
int (*cmd_async)(Monitor *mon, const QDict *params, int (*cmd_async)(Monitor *mon, const QDict *params,
MonitorCompletion *cb, void *opaque); MonitorCompletion *cb, void *opaque);
} mhandler; } mhandler;
int flags; int flags;
/* @sub_table is a list of 2nd level of commands. If it do not exist,
* mhandler should be used. If it exist, sub_table[?].mhandler should be
* used, and mhandler of 1st level plays the role of help function.
*/
struct mon_cmd_t *sub_table;
} mon_cmd_t; } mon_cmd_t;
/* file descriptors passed via SCM_RIGHTS */ /* file descriptors passed via SCM_RIGHTS */
...@@ -807,28 +811,8 @@ static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd, ...@@ -807,28 +811,8 @@ static void user_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd,
} }
} }
static void do_info(Monitor *mon, const QDict *qdict) static void do_info_help(Monitor *mon, const QDict *qdict)
{ {
const mon_cmd_t *cmd;
const char *item = qdict_get_try_str(qdict, "item");
if (!item) {
goto help;
}
for (cmd = info_cmds; cmd->name != NULL; cmd++) {
if (compare_cmd(item, cmd->name))
break;
}
if (cmd->name == NULL) {
goto help;
}
cmd->mhandler.info(mon);
return;
help:
help_cmd(mon, "info"); help_cmd(mon, "info");
} }
...@@ -899,19 +883,19 @@ int monitor_get_cpu_index(void) ...@@ -899,19 +883,19 @@ int monitor_get_cpu_index(void)
return cpu->cpu_index; return cpu->cpu_index;
} }
static void do_info_registers(Monitor *mon) static void do_info_registers(Monitor *mon, const QDict *qdict)
{ {
CPUArchState *env; CPUArchState *env;
env = mon_get_cpu(); env = mon_get_cpu();
cpu_dump_state(env, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU); cpu_dump_state(env, (FILE *)mon, monitor_fprintf, CPU_DUMP_FPU);
} }
static void do_info_jit(Monitor *mon) static void do_info_jit(Monitor *mon, const QDict *qdict)
{ {
dump_exec_info((FILE *)mon, monitor_fprintf); dump_exec_info((FILE *)mon, monitor_fprintf);
} }
static void do_info_history(Monitor *mon) static void do_info_history(Monitor *mon, const QDict *qdict)
{ {
int i; int i;
const char *str; const char *str;
...@@ -930,7 +914,7 @@ static void do_info_history(Monitor *mon) ...@@ -930,7 +914,7 @@ static void do_info_history(Monitor *mon)
#if defined(TARGET_PPC) #if defined(TARGET_PPC)
/* XXX: not implemented in other targets */ /* XXX: not implemented in other targets */
static void do_info_cpu_stats(Monitor *mon) static void do_info_cpu_stats(Monitor *mon, const QDict *qdict)
{ {
CPUArchState *env; CPUArchState *env;
...@@ -939,7 +923,7 @@ static void do_info_cpu_stats(Monitor *mon) ...@@ -939,7 +923,7 @@ static void do_info_cpu_stats(Monitor *mon)
} }
#endif #endif
static void do_trace_print_events(Monitor *mon) static void do_trace_print_events(Monitor *mon, const QDict *qdict)
{ {
trace_print_events((FILE *)mon, &monitor_fprintf); trace_print_events((FILE *)mon, &monitor_fprintf);
} }
...@@ -1491,7 +1475,7 @@ static void tlb_info_64(Monitor *mon, CPUArchState *env) ...@@ -1491,7 +1475,7 @@ static void tlb_info_64(Monitor *mon, CPUArchState *env)
} }
#endif #endif
static void tlb_info(Monitor *mon) static void tlb_info(Monitor *mon, const QDict *qdict)
{ {
CPUArchState *env; CPUArchState *env;
...@@ -1714,7 +1698,7 @@ static void mem_info_64(Monitor *mon, CPUArchState *env) ...@@ -1714,7 +1698,7 @@ static void mem_info_64(Monitor *mon, CPUArchState *env)
} }
#endif #endif
static void mem_info(Monitor *mon) static void mem_info(Monitor *mon, const QDict *qdict)
{ {
CPUArchState *env; CPUArchState *env;
...@@ -1753,7 +1737,7 @@ static void print_tlb(Monitor *mon, int idx, tlb_t *tlb) ...@@ -1753,7 +1737,7 @@ static void print_tlb(Monitor *mon, int idx, tlb_t *tlb)
tlb->d, tlb->wt); tlb->d, tlb->wt);
} }
static void tlb_info(Monitor *mon) static void tlb_info(Monitor *mon, const QDict *qdict)
{ {
CPUArchState *env = mon_get_cpu(); CPUArchState *env = mon_get_cpu();
int i; int i;
...@@ -1769,7 +1753,7 @@ static void tlb_info(Monitor *mon) ...@@ -1769,7 +1753,7 @@ static void tlb_info(Monitor *mon)
#endif #endif
#if defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_XTENSA) #if defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_XTENSA)
static void tlb_info(Monitor *mon) static void tlb_info(Monitor *mon, const QDict *qdict)
{ {
CPUArchState *env1 = mon_get_cpu(); CPUArchState *env1 = mon_get_cpu();
...@@ -1777,12 +1761,12 @@ static void tlb_info(Monitor *mon) ...@@ -1777,12 +1761,12 @@ static void tlb_info(Monitor *mon)
} }
#endif #endif
static void do_info_mtree(Monitor *mon) static void do_info_mtree(Monitor *mon, const QDict *qdict)
{ {
mtree_info((fprintf_function)monitor_printf, mon); mtree_info((fprintf_function)monitor_printf, mon);
} }
static void do_info_numa(Monitor *mon) static void do_info_numa(Monitor *mon, const QDict *qdict)
{ {
int i; int i;
CPUArchState *env; CPUArchState *env;
...@@ -1808,7 +1792,7 @@ static void do_info_numa(Monitor *mon) ...@@ -1808,7 +1792,7 @@ static void do_info_numa(Monitor *mon)
int64_t qemu_time; int64_t qemu_time;
int64_t dev_time; int64_t dev_time;
static void do_info_profile(Monitor *mon) static void do_info_profile(Monitor *mon, const QDict *qdict)
{ {
int64_t total; int64_t total;
total = qemu_time; total = qemu_time;
...@@ -1822,7 +1806,7 @@ static void do_info_profile(Monitor *mon) ...@@ -1822,7 +1806,7 @@ static void do_info_profile(Monitor *mon)
dev_time = 0; dev_time = 0;
} }
#else #else
static void do_info_profile(Monitor *mon) static void do_info_profile(Monitor *mon, const QDict *qdict)
{ {
monitor_printf(mon, "Internal profiler not compiled\n"); monitor_printf(mon, "Internal profiler not compiled\n");
} }
...@@ -1831,7 +1815,7 @@ static void do_info_profile(Monitor *mon) ...@@ -1831,7 +1815,7 @@ static void do_info_profile(Monitor *mon)
/* Capture support */ /* Capture support */
static QLIST_HEAD (capture_list_head, CaptureState) capture_head; static QLIST_HEAD (capture_list_head, CaptureState) capture_head;
static void do_info_capture(Monitor *mon) static void do_info_capture(Monitor *mon, const QDict *qdict)
{ {
int i; int i;
CaptureState *s; CaptureState *s;
...@@ -2429,12 +2413,6 @@ int monitor_handle_fd_param(Monitor *mon, const char *fdname) ...@@ -2429,12 +2413,6 @@ int monitor_handle_fd_param(Monitor *mon, const char *fdname)
return fd; return fd;
} }
/* mon_cmds and info_cmds would be sorted at runtime */
static mon_cmd_t mon_cmds[] = {
#include "hmp-commands.h"
{ NULL, NULL, },
};
/* Please update hmp-commands.hx when adding or changing commands */ /* Please update hmp-commands.hx when adding or changing commands */
static mon_cmd_t info_cmds[] = { static mon_cmd_t info_cmds[] = {
{ {
...@@ -2442,63 +2420,63 @@ static mon_cmd_t info_cmds[] = { ...@@ -2442,63 +2420,63 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the version of QEMU", .help = "show the version of QEMU",
.mhandler.info = hmp_info_version, .mhandler.cmd = hmp_info_version,
}, },
{ {
.name = "network", .name = "network",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the network state", .help = "show the network state",
.mhandler.info = do_info_network, .mhandler.cmd = do_info_network,
}, },
{ {
.name = "chardev", .name = "chardev",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the character devices", .help = "show the character devices",
.mhandler.info = hmp_info_chardev, .mhandler.cmd = hmp_info_chardev,
}, },
{ {
.name = "block", .name = "block",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the block devices", .help = "show the block devices",
.mhandler.info = hmp_info_block, .mhandler.cmd = hmp_info_block,
}, },
{ {
.name = "blockstats", .name = "blockstats",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show block device statistics", .help = "show block device statistics",
.mhandler.info = hmp_info_blockstats, .mhandler.cmd = hmp_info_blockstats,
}, },
{ {
.name = "block-jobs", .name = "block-jobs",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show progress of ongoing block device operations", .help = "show progress of ongoing block device operations",
.mhandler.info = hmp_info_block_jobs, .mhandler.cmd = hmp_info_block_jobs,
}, },
{ {
.name = "registers", .name = "registers",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the cpu registers", .help = "show the cpu registers",
.mhandler.info = do_info_registers, .mhandler.cmd = do_info_registers,
}, },
{ {
.name = "cpus", .name = "cpus",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show infos for each CPU", .help = "show infos for each CPU",
.mhandler.info = hmp_info_cpus, .mhandler.cmd = hmp_info_cpus,
}, },
{ {
.name = "history", .name = "history",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the command line history", .help = "show the command line history",
.mhandler.info = do_info_history, .mhandler.cmd = do_info_history,
}, },
#if defined(TARGET_I386) || defined(TARGET_PPC) || defined(TARGET_MIPS) || \ #if defined(TARGET_I386) || defined(TARGET_PPC) || defined(TARGET_MIPS) || \
defined(TARGET_LM32) || (defined(TARGET_SPARC) && !defined(TARGET_SPARC64)) defined(TARGET_LM32) || (defined(TARGET_SPARC) && !defined(TARGET_SPARC64))
...@@ -2508,11 +2486,11 @@ static mon_cmd_t info_cmds[] = { ...@@ -2508,11 +2486,11 @@ static mon_cmd_t info_cmds[] = {
.params = "", .params = "",
.help = "show the interrupts statistics (if available)", .help = "show the interrupts statistics (if available)",
#ifdef TARGET_SPARC #ifdef TARGET_SPARC
.mhandler.info = sun4m_irq_info, .mhandler.cmd = sun4m_irq_info,
#elif defined(TARGET_LM32) #elif defined(TARGET_LM32)
.mhandler.info = lm32_irq_info, .mhandler.cmd = lm32_irq_info,
#else #else
.mhandler.info = irq_info, .mhandler.cmd = irq_info,
#endif #endif
}, },
{ {
...@@ -2521,11 +2499,11 @@ static mon_cmd_t info_cmds[] = { ...@@ -2521,11 +2499,11 @@ static mon_cmd_t info_cmds[] = {
.params = "", .params = "",
.help = "show i8259 (PIC) state", .help = "show i8259 (PIC) state",
#ifdef TARGET_SPARC #ifdef TARGET_SPARC
.mhandler.info = sun4m_pic_info, .mhandler.cmd = sun4m_pic_info,
#elif defined(TARGET_LM32) #elif defined(TARGET_LM32)
.mhandler.info = lm32_do_pic_info, .mhandler.cmd = lm32_do_pic_info,
#else #else
.mhandler.info = pic_info, .mhandler.cmd = pic_info,
#endif #endif
}, },
#endif #endif
...@@ -2534,7 +2512,7 @@ static mon_cmd_t info_cmds[] = { ...@@ -2534,7 +2512,7 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show PCI info", .help = "show PCI info",
.mhandler.info = hmp_info_pci, .mhandler.cmd = hmp_info_pci,
}, },
#if defined(TARGET_I386) || defined(TARGET_SH4) || defined(TARGET_SPARC) || \ #if defined(TARGET_I386) || defined(TARGET_SH4) || defined(TARGET_SPARC) || \
defined(TARGET_PPC) || defined(TARGET_XTENSA) defined(TARGET_PPC) || defined(TARGET_XTENSA)
...@@ -2543,7 +2521,7 @@ static mon_cmd_t info_cmds[] = { ...@@ -2543,7 +2521,7 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show virtual to physical memory mappings", .help = "show virtual to physical memory mappings",
.mhandler.info = tlb_info, .mhandler.cmd = tlb_info,
}, },
#endif #endif
#if defined(TARGET_I386) #if defined(TARGET_I386)
...@@ -2552,7 +2530,7 @@ static mon_cmd_t info_cmds[] = { ...@@ -2552,7 +2530,7 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the active virtual memory mappings", .help = "show the active virtual memory mappings",
.mhandler.info = mem_info, .mhandler.cmd = mem_info,
}, },
#endif #endif
{ {
...@@ -2560,91 +2538,91 @@ static mon_cmd_t info_cmds[] = { ...@@ -2560,91 +2538,91 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show memory tree", .help = "show memory tree",
.mhandler.info = do_info_mtree, .mhandler.cmd = do_info_mtree,
}, },
{ {
.name = "jit", .name = "jit",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show dynamic compiler info", .help = "show dynamic compiler info",
.mhandler.info = do_info_jit, .mhandler.cmd = do_info_jit,
}, },
{ {
.name = "kvm", .name = "kvm",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show KVM information", .help = "show KVM information",
.mhandler.info = hmp_info_kvm, .mhandler.cmd = hmp_info_kvm,
}, },
{ {
.name = "numa", .name = "numa",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show NUMA information", .help = "show NUMA information",
.mhandler.info = do_info_numa, .mhandler.cmd = do_info_numa,
}, },
{ {
.name = "usb", .name = "usb",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show guest USB devices", .help = "show guest USB devices",
.mhandler.info = usb_info, .mhandler.cmd = usb_info,
}, },
{ {
.name = "usbhost", .name = "usbhost",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show host USB devices", .help = "show host USB devices",
.mhandler.info = usb_host_info, .mhandler.cmd = usb_host_info,
}, },
{ {
.name = "profile", .name = "profile",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show profiling information", .help = "show profiling information",
.mhandler.info = do_info_profile, .mhandler.cmd = do_info_profile,
}, },
{ {
.name = "capture", .name = "capture",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show capture information", .help = "show capture information",
.mhandler.info = do_info_capture, .mhandler.cmd = do_info_capture,
}, },
{ {
.name = "snapshots", .name = "snapshots",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the currently saved VM snapshots", .help = "show the currently saved VM snapshots",
.mhandler.info = do_info_snapshots, .mhandler.cmd = do_info_snapshots,
}, },
{ {
.name = "status", .name = "status",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the current VM status (running|paused)", .help = "show the current VM status (running|paused)",
.mhandler.info = hmp_info_status, .mhandler.cmd = hmp_info_status,
}, },
{ {
.name = "pcmcia", .name = "pcmcia",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show guest PCMCIA status", .help = "show guest PCMCIA status",
.mhandler.info = pcmcia_info, .mhandler.cmd = pcmcia_info,
}, },
{ {
.name = "mice", .name = "mice",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show which guest mouse is receiving events", .help = "show which guest mouse is receiving events",
.mhandler.info = hmp_info_mice, .mhandler.cmd = hmp_info_mice,
}, },
{ {
.name = "vnc", .name = "vnc",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the vnc server status", .help = "show the vnc server status",
.mhandler.info = hmp_info_vnc, .mhandler.cmd = hmp_info_vnc,
}, },
#if defined(CONFIG_SPICE) #if defined(CONFIG_SPICE)
{ {
...@@ -2652,7 +2630,7 @@ static mon_cmd_t info_cmds[] = { ...@@ -2652,7 +2630,7 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the spice server status", .help = "show the spice server status",
.mhandler.info = hmp_info_spice, .mhandler.cmd = hmp_info_spice,
}, },
#endif #endif
{ {
...@@ -2660,14 +2638,14 @@ static mon_cmd_t info_cmds[] = { ...@@ -2660,14 +2638,14 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the current VM name", .help = "show the current VM name",
.mhandler.info = hmp_info_name, .mhandler.cmd = hmp_info_name,
}, },
{ {
.name = "uuid", .name = "uuid",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show the current VM UUID", .help = "show the current VM UUID",
.mhandler.info = hmp_info_uuid, .mhandler.cmd = hmp_info_uuid,
}, },
#if defined(TARGET_PPC) #if defined(TARGET_PPC)
{ {
...@@ -2675,7 +2653,7 @@ static mon_cmd_t info_cmds[] = { ...@@ -2675,7 +2653,7 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show CPU statistics", .help = "show CPU statistics",
.mhandler.info = do_info_cpu_stats, .mhandler.cmd = do_info_cpu_stats,
}, },
#endif #endif
#if defined(CONFIG_SLIRP) #if defined(CONFIG_SLIRP)
...@@ -2684,7 +2662,7 @@ static mon_cmd_t info_cmds[] = { ...@@ -2684,7 +2662,7 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show user network stack connection states", .help = "show user network stack connection states",
.mhandler.info = do_info_usernet, .mhandler.cmd = do_info_usernet,
}, },
#endif #endif
{ {
...@@ -2692,62 +2670,68 @@ static mon_cmd_t info_cmds[] = { ...@@ -2692,62 +2670,68 @@ static mon_cmd_t info_cmds[] = {
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show migration status", .help = "show migration status",
.mhandler.info = hmp_info_migrate, .mhandler.cmd = hmp_info_migrate,
}, },
{ {
.name = "migrate_capabilities", .name = "migrate_capabilities",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show current migration capabilities", .help = "show current migration capabilities",
.mhandler.info = hmp_info_migrate_capabilities, .mhandler.cmd = hmp_info_migrate_capabilities,
}, },
{ {
.name = "migrate_cache_size", .name = "migrate_cache_size",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show current migration xbzrle cache size", .help = "show current migration xbzrle cache size",
.mhandler.info = hmp_info_migrate_cache_size, .mhandler.cmd = hmp_info_migrate_cache_size,
}, },
{ {
.name = "balloon", .name = "balloon",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show balloon information", .help = "show balloon information",
.mhandler.info = hmp_info_balloon, .mhandler.cmd = hmp_info_balloon,
}, },
{ {
.name = "qtree", .name = "qtree",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show device tree", .help = "show device tree",
.mhandler.info = do_info_qtree, .mhandler.cmd = do_info_qtree,
}, },
{ {
.name = "qdm", .name = "qdm",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show qdev device model list", .help = "show qdev device model list",
.mhandler.info = do_info_qdm, .mhandler.cmd = do_info_qdm,
}, },
{ {
.name = "roms", .name = "roms",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show roms", .help = "show roms",
.mhandler.info = do_info_roms, .mhandler.cmd = do_info_roms,
}, },
{ {
.name = "trace-events", .name = "trace-events",
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "show available trace-events & their state", .help = "show available trace-events & their state",
.mhandler.info = do_trace_print_events, .mhandler.cmd = do_trace_print_events,
}, },
{ {
.name = NULL, .name = NULL,
}, },
}; };
/* mon_cmds and info_cmds would be sorted at runtime */
static mon_cmd_t mon_cmds[] = {
#include "hmp-commands.h"
{ NULL, NULL, },
};
static const mon_cmd_t qmp_cmds[] = { static const mon_cmd_t qmp_cmds[] = {
#include "qmp-commands-old.h" #include "qmp-commands-old.h"
{ /* NULL */ }, { /* NULL */ },
...@@ -3542,18 +3526,27 @@ static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table, ...@@ -3542,18 +3526,27 @@ static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
return NULL; return NULL;
} }
static const mon_cmd_t *monitor_find_command(const char *cmdname)
{
return search_dispatch_table(mon_cmds, cmdname);
}
static const mon_cmd_t *qmp_find_cmd(const char *cmdname) static const mon_cmd_t *qmp_find_cmd(const char *cmdname)
{ {
return search_dispatch_table(qmp_cmds, cmdname); return search_dispatch_table(qmp_cmds, cmdname);
} }
/*
* Parse @cmdline according to command table @table.
* If @cmdline is blank, return NULL.
* If it can't be parsed, report to @mon, and return NULL.
* Else, insert command arguments into @qdict, and return the command.
* If sub-command table exist, and if @cmdline contains addtional string for
* sub-command, this function will try search sub-command table. if no
* addtional string for sub-command exist, this function will return the found
* one in @table.
* Do not assume the returned command points into @table! It doesn't
* when the command is a sub-command.
*/
static const mon_cmd_t *monitor_parse_command(Monitor *mon, static const mon_cmd_t *monitor_parse_command(Monitor *mon,
const char *cmdline, const char *cmdline,
int start,
mon_cmd_t *table,
QDict *qdict) QDict *qdict)
{ {
const char *p, *typestr; const char *p, *typestr;
...@@ -3564,20 +3557,35 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon, ...@@ -3564,20 +3557,35 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
char *key; char *key;
#ifdef DEBUG #ifdef DEBUG
monitor_printf(mon, "command='%s'\n", cmdline); monitor_printf(mon, "command='%s', start='%d'\n", cmdline, start);
#endif #endif
/* extract the command name */ /* extract the command name */
p = get_command_name(cmdline, cmdname, sizeof(cmdname)); p = get_command_name(cmdline + start, cmdname, sizeof(cmdname));
if (!p) if (!p)
return NULL; return NULL;
cmd = monitor_find_command(cmdname); cmd = search_dispatch_table(table, cmdname);
if (!cmd) { if (!cmd) {
monitor_printf(mon, "unknown command: '%s'\n", cmdname); monitor_printf(mon, "unknown command: '%.*s'\n",
(int)(p - cmdline), cmdline);
return NULL; return NULL;
} }
/* filter out following useless space */
while (qemu_isspace(*p)) {
p++;
}
/* search sub command */
if (cmd->sub_table != NULL) {
/* check if user set additional command */
if (*p == '\0') {
return cmd;
}
return monitor_parse_command(mon, cmdline, p - cmdline,
cmd->sub_table, qdict);
}
/* parse the parameters */ /* parse the parameters */
typestr = cmd->args_type; typestr = cmd->args_type;
for(;;) { for(;;) {
...@@ -3933,7 +3941,7 @@ static void handle_user_command(Monitor *mon, const char *cmdline) ...@@ -3933,7 +3941,7 @@ static void handle_user_command(Monitor *mon, const char *cmdline)
qdict = qdict_new(); qdict = qdict_new();
cmd = monitor_parse_command(mon, cmdline, qdict); cmd = monitor_parse_command(mon, cmdline, 0, mon_cmds, qdict);
if (!cmd) if (!cmd)
goto out; goto out;
......
...@@ -852,7 +852,7 @@ void print_net_client(Monitor *mon, NetClientState *nc) ...@@ -852,7 +852,7 @@ void print_net_client(Monitor *mon, NetClientState *nc)
NetClientOptionsKind_lookup[nc->info->type], nc->info_str); NetClientOptionsKind_lookup[nc->info->type], nc->info_str);
} }
void do_info_network(Monitor *mon) void do_info_network(Monitor *mon, const QDict *qdict)
{ {
NetClientState *nc, *peer; NetClientState *nc, *peer;
NetClientOptionsKind type; NetClientOptionsKind type;
......
...@@ -670,7 +670,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str, ...@@ -670,7 +670,7 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str,
return -1; return -1;
} }
void do_info_usernet(Monitor *mon) void do_info_usernet(Monitor *mon, const QDict *qdict)
{ {
SlirpState *s; SlirpState *s;
......
...@@ -2307,7 +2307,7 @@ void do_delvm(Monitor *mon, const QDict *qdict) ...@@ -2307,7 +2307,7 @@ void do_delvm(Monitor *mon, const QDict *qdict)
} }
} }
void do_info_snapshots(Monitor *mon) void do_info_snapshots(Monitor *mon, const QDict *qdict)
{ {
BlockDriverState *bs, *bs1; BlockDriverState *bs, *bs1;
QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s; QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
......
...@@ -1449,7 +1449,7 @@ void pcmcia_socket_unregister(PCMCIASocket *socket) ...@@ -1449,7 +1449,7 @@ void pcmcia_socket_unregister(PCMCIASocket *socket)
} }
} }
void pcmcia_info(Monitor *mon) void pcmcia_info(Monitor *mon, const QDict *qdict)
{ {
struct pcmcia_socket_entry_s *iter; struct pcmcia_socket_entry_s *iter;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册