monitor: union for command handlers

This commits adds a new union member to mon_cmd_t for command
handlers and convert monitor_handle_command() and qemu-monitor.hx
to use it.

This improves type safety.

Patchworks-ID: 35337
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Luiz Capitulino 2009-10-07 13:41:52 -03:00 committed by Anthony Liguori
parent 910df89d87
commit af4ce882d5
2 changed files with 63 additions and 68 deletions

View File

@ -71,11 +71,11 @@
typedef struct mon_cmd_t {
const char *name;
const char *args_type;
void *handler;
const char *params;
const char *help;
union {
void (*info)(Monitor *mon);
void (*cmd)(Monitor *mon, const QDict *qdict);
} mhandler;
} mon_cmd_t;
@ -3014,13 +3014,8 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline)
cmd = monitor_parse_command(mon, cmdline, qdict);
if (cmd) {
void (*handler)(Monitor *mon, const QDict *qdict);
qemu_errors_to_mon(mon);
handler = cmd->handler;
handler(mon, qdict);
cmd->mhandler.cmd(mon, qdict);
qemu_errors_to_previous();
}

View File

@ -12,9 +12,9 @@ ETEXI
{
.name = "help|?",
.args_type = "name:s?",
.handler = do_help_cmd,
.params = "[cmd]",
.help = "show the help",
.mhandler.cmd = do_help_cmd,
},
STEXI
@ -25,9 +25,9 @@ ETEXI
{
.name = "commit",
.args_type = "device:B",
.handler = do_commit,
.params = "device|all",
.help = "commit changes to the disk images (if -snapshot is used) or backing files",
.mhandler.cmd = do_commit,
},
STEXI
@ -38,9 +38,9 @@ ETEXI
{
.name = "info",
.args_type = "item:s?",
.handler = do_info,
.params = "[subcommand]",
.help = "show various information about the system state",
.mhandler.cmd = do_info,
},
STEXI
@ -116,9 +116,9 @@ ETEXI
{
.name = "q|quit",
.args_type = "",
.handler = do_quit,
.params = "",
.help = "quit the emulator",
.mhandler.cmd = do_quit,
},
STEXI
@ -129,9 +129,9 @@ ETEXI
{
.name = "eject",
.args_type = "force:-f,filename:B",
.handler = do_eject,
.params = "[-f] device",
.help = "eject a removable medium (use -f to force it)",
.mhandler.cmd = do_eject,
},
STEXI
@ -142,9 +142,9 @@ ETEXI
{
.name = "change",
.args_type = "device:B,target:F,arg:s?",
.handler = do_change,
.params = "device filename [format]",
.help = "change a removable medium, optional format",
.mhandler.cmd = do_change,
},
STEXI
@ -187,9 +187,9 @@ ETEXI
{
.name = "screendump",
.args_type = "filename:F",
.handler = do_screen_dump,
.params = "filename",
.help = "save screen into PPM image 'filename'",
.mhandler.cmd = do_screen_dump,
},
STEXI
@ -200,9 +200,9 @@ ETEXI
{
.name = "logfile",
.args_type = "filename:F",
.handler = do_logfile,
.params = "filename",
.help = "output logs to 'filename'",
.mhandler.cmd = do_logfile,
},
STEXI
@ -213,9 +213,9 @@ ETEXI
{
.name = "log",
.args_type = "items:s",
.handler = do_log,
.params = "item1[,...]",
.help = "activate logging of the specified items to '/tmp/qemu.log'",
.mhandler.cmd = do_log,
},
STEXI
@ -226,9 +226,9 @@ ETEXI
{
.name = "savevm",
.args_type = "name:s?",
.handler = do_savevm,
.params = "[tag|id]",
.help = "save a VM snapshot. If no tag or id are provided, a new snapshot is created",
.mhandler.cmd = do_savevm,
},
STEXI
@ -242,9 +242,9 @@ ETEXI
{
.name = "loadvm",
.args_type = "name:s",
.handler = do_loadvm,
.params = "tag|id",
.help = "restore a VM snapshot from its tag or id",
.mhandler.cmd = do_loadvm,
},
STEXI
@ -256,9 +256,9 @@ ETEXI
{
.name = "delvm",
.args_type = "name:s",
.handler = do_delvm,
.params = "tag|id",
.help = "delete a VM snapshot from its tag or id",
.mhandler.cmd = do_delvm,
},
STEXI
@ -269,9 +269,9 @@ ETEXI
{
.name = "singlestep",
.args_type = "option:s?",
.handler = do_singlestep,
.params = "[on|off]",
.help = "run emulation in singlestep mode or switch to normal mode",
.mhandler.cmd = do_singlestep,
},
STEXI
@ -283,9 +283,9 @@ ETEXI
{
.name = "stop",
.args_type = "",
.handler = do_stop,
.params = "",
.help = "stop emulation",
.mhandler.cmd = do_stop,
},
STEXI
@ -296,9 +296,9 @@ ETEXI
{
.name = "c|cont",
.args_type = "",
.handler = do_cont,
.params = "",
.help = "resume emulation",
.mhandler.cmd = do_cont,
},
STEXI
@ -309,9 +309,9 @@ ETEXI
{
.name = "gdbserver",
.args_type = "device:s?",
.handler = do_gdbserver,
.params = "[device]",
.help = "start gdbserver on given device (default 'tcp::1234'), stop with 'none'",
.mhandler.cmd = do_gdbserver,
},
STEXI
@ -322,9 +322,9 @@ ETEXI
{
.name = "x",
.args_type = "fmt:/,addr:l",
.handler = do_memory_dump,
.params = "/fmt addr",
.help = "virtual memory dump starting at 'addr'",
.mhandler.cmd = do_memory_dump,
},
STEXI
@ -335,9 +335,9 @@ ETEXI
{
.name = "xp",
.args_type = "fmt:/,addr:l",
.handler = do_physical_memory_dump,
.params = "/fmt addr",
.help = "physical memory dump starting at 'addr'",
.mhandler.cmd = do_physical_memory_dump,
},
STEXI
@ -401,9 +401,9 @@ ETEXI
{
.name = "p|print",
.args_type = "fmt:/,val:l",
.handler = do_print,
.params = "/fmt expr",
.help = "print expression value (use $reg for CPU register access)",
.mhandler.cmd = do_print,
},
STEXI
@ -416,9 +416,9 @@ ETEXI
{
.name = "i",
.args_type = "fmt:/,addr:i,index:i.",
.handler = do_ioport_read,
.params = "/fmt addr",
.help = "I/O port read",
.mhandler.cmd = do_ioport_read,
},
STEXI
@ -428,9 +428,9 @@ ETEXI
{
.name = "o",
.args_type = "fmt:/,addr:i,val:i",
.handler = do_ioport_write,
.params = "/fmt addr value",
.help = "I/O port write",
.mhandler.cmd = do_ioport_write,
},
STEXI
@ -440,9 +440,9 @@ ETEXI
{
.name = "sendkey",
.args_type = "string:s,hold_time:i?",
.handler = do_sendkey,
.params = "keys [hold_ms]",
.help = "send keys to the VM (e.g. 'sendkey ctrl-alt-f1', default hold time=100 ms)",
.mhandler.cmd = do_sendkey,
},
STEXI
@ -462,9 +462,9 @@ ETEXI
{
.name = "system_reset",
.args_type = "",
.handler = do_system_reset,
.params = "",
.help = "reset the system",
.mhandler.cmd = do_system_reset,
},
STEXI
@ -476,9 +476,9 @@ ETEXI
{
.name = "system_powerdown",
.args_type = "",
.handler = do_system_powerdown,
.params = "",
.help = "send system power down event",
.mhandler.cmd = do_system_powerdown,
},
STEXI
@ -490,9 +490,9 @@ ETEXI
{
.name = "sum",
.args_type = "start:i,size:i",
.handler = do_sum,
.params = "addr size",
.help = "compute the checksum of a memory region",
.mhandler.cmd = do_sum,
},
STEXI
@ -504,9 +504,9 @@ ETEXI
{
.name = "usb_add",
.args_type = "devname:s",
.handler = do_usb_add,
.params = "device",
.help = "add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')",
.mhandler.cmd = do_usb_add,
},
STEXI
@ -519,9 +519,9 @@ ETEXI
{
.name = "usb_del",
.args_type = "devname:s",
.handler = do_usb_del,
.params = "device",
.help = "remove USB device 'bus.addr'",
.mhandler.cmd = do_usb_del,
},
STEXI
@ -535,9 +535,9 @@ ETEXI
{
.name = "device_add",
.args_type = "config:s",
.handler = do_device_add,
.params = "device",
.help = "add device, like -device on the command line",
.mhandler.cmd = do_device_add,
},
STEXI
@ -549,9 +549,9 @@ ETEXI
{
.name = "device_del",
.args_type = "id:s",
.handler = do_device_del,
.params = "device",
.help = "remove device",
.mhandler.cmd = do_device_del,
},
STEXI
@ -563,9 +563,9 @@ ETEXI
{
.name = "cpu",
.args_type = "index:i",
.handler = do_cpu_set,
.params = "index",
.help = "set the default CPU",
.mhandler.cmd = do_cpu_set,
},
STEXI
@ -575,9 +575,9 @@ ETEXI
{
.name = "mouse_move",
.args_type = "dx_str:s,dy_str:s,dz_str:s?",
.handler = do_mouse_move,
.params = "dx dy [dz]",
.help = "send mouse move events",
.mhandler.cmd = do_mouse_move,
},
STEXI
@ -589,9 +589,9 @@ ETEXI
{
.name = "mouse_button",
.args_type = "button_state:i",
.handler = do_mouse_button,
.params = "state",
.help = "change mouse button state (1=L, 2=M, 4=R)",
.mhandler.cmd = do_mouse_button,
},
STEXI
@ -602,9 +602,9 @@ ETEXI
{
.name = "mouse_set",
.args_type = "index:i",
.handler = do_mouse_set,
.params = "index",
.help = "set which mouse device receives events",
.mhandler.cmd = do_mouse_set,
},
STEXI
@ -620,9 +620,9 @@ ETEXI
{
.name = "wavcapture",
.args_type = "path:F,freq:i?,bits:i?,nchannels:i?",
.handler = do_wav_capture,
.params = "path [frequency [bits [channels]]]",
.help = "capture audio to a wave file (default frequency=44100 bits=16 channels=2)",
.mhandler.cmd = do_wav_capture,
},
#endif
STEXI
@ -642,9 +642,9 @@ ETEXI
{
.name = "stopcapture",
.args_type = "n:i",
.handler = do_stop_capture,
.params = "capture index",
.help = "stop capture",
.mhandler.cmd = do_stop_capture,
},
#endif
STEXI
@ -658,9 +658,9 @@ ETEXI
{
.name = "memsave",
.args_type = "val:l,size:i,filename:s",
.handler = do_memory_save,
.params = "addr size file",
.help = "save to disk virtual memory dump starting at 'addr' of size 'size'",
.mhandler.cmd = do_memory_save,
},
STEXI
@ -671,9 +671,9 @@ ETEXI
{
.name = "pmemsave",
.args_type = "val:l,size:i,filename:s",
.handler = do_physical_memory_save,
.params = "addr size file",
.help = "save to disk physical memory dump starting at 'addr' of size 'size'",
.mhandler.cmd = do_physical_memory_save,
},
STEXI
@ -684,9 +684,9 @@ ETEXI
{
.name = "boot_set",
.args_type = "bootdevice:s",
.handler = do_boot_set,
.params = "bootdevice",
.help = "define new values for the boot device list",
.mhandler.cmd = do_boot_set,
},
STEXI
@ -703,9 +703,9 @@ ETEXI
{
.name = "nmi",
.args_type = "cpu_index:i",
.handler = do_inject_nmi,
.params = "cpu",
.help = "inject an NMI on the given CPU",
.mhandler.cmd = do_inject_nmi,
},
#endif
STEXI
@ -716,9 +716,9 @@ ETEXI
{
.name = "migrate",
.args_type = "detach:-d,uri:s",
.handler = do_migrate,
.params = "[-d] uri",
.help = "migrate to URI (using -d to not wait for completion)",
.mhandler.cmd = do_migrate,
},
STEXI
@ -729,9 +729,9 @@ ETEXI
{
.name = "migrate_cancel",
.args_type = "",
.handler = do_migrate_cancel,
.params = "",
.help = "cancel the current VM migration",
.mhandler.cmd = do_migrate_cancel,
},
STEXI
@ -742,9 +742,9 @@ ETEXI
{
.name = "migrate_set_speed",
.args_type = "value:s",
.handler = do_migrate_set_speed,
.params = "value",
.help = "set maximum speed (in bytes) for migrations",
.mhandler.cmd = do_migrate_set_speed,
},
STEXI
@ -755,9 +755,9 @@ ETEXI
{
.name = "migrate_set_downtime",
.args_type = "value:s",
.handler = do_migrate_set_downtime,
.params = "value",
.help = "set maximum tolerated downtime (in seconds) for migrations",
.mhandler.cmd = do_migrate_set_downtime,
},
STEXI
@ -769,13 +769,13 @@ ETEXI
{
.name = "drive_add",
.args_type = "pci_addr:s,opts:s",
.handler = drive_hot_add,
.params = "[[<domain>:]<bus>:]<slot>\n"
"[file=file][,if=type][,bus=n]\n"
"[,unit=m][,media=d][index=i]\n"
"[,cyls=c,heads=h,secs=s[,trans=t]]\n"
"[snapshot=on|off][,cache=on|off]",
.help = "add drive to PCI storage controller",
.mhandler.cmd = drive_hot_add,
},
#endif
@ -788,9 +788,9 @@ ETEXI
{
.name = "pci_add",
.args_type = "pci_addr:s,type:s,opts:s?",
.handler = pci_device_hot_add,
.params = "auto|[[<domain>:]<bus>:]<slot> nic|storage [[vlan=n][,macaddr=addr][,model=type]] [file=file][,if=type][,bus=nr]...",
.help = "hot-add PCI device",
.mhandler.cmd = pci_device_hot_add,
},
#endif
@ -803,9 +803,9 @@ ETEXI
{
.name = "pci_del",
.args_type = "pci_addr:s",
.handler = do_pci_device_hot_remove,
.params = "[[<domain>:]<bus>:]<slot>",
.help = "hot remove PCI device",
.mhandler.cmd = do_pci_device_hot_remove,
},
#endif
@ -817,9 +817,9 @@ ETEXI
{
.name = "host_net_add",
.args_type = "device:s,opts:s?",
.handler = net_host_device_add,
.params = "tap|user|socket|vde|dump [options]",
.help = "add host VLAN client",
.mhandler.cmd = net_host_device_add,
},
STEXI
@ -830,9 +830,9 @@ ETEXI
{
.name = "host_net_remove",
.args_type = "vlan_id:i,device:s",
.handler = net_host_device_remove,
.params = "vlan_id name",
.help = "remove host VLAN client",
.mhandler.cmd = net_host_device_remove,
},
STEXI
@ -844,17 +844,17 @@ ETEXI
{
.name = "hostfwd_add",
.args_type = "arg1:s,arg2:s?,arg3:s?",
.handler = net_slirp_hostfwd_add,
.params = "[vlan_id name] [tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport",
.help = "redirect TCP or UDP connections from host to guest (requires -net user)",
.mhandler.cmd = net_slirp_hostfwd_add,
},
{
.name = "hostfwd_remove",
.args_type = "arg1:s,arg2:s?,arg3:s?",
.handler = net_slirp_hostfwd_remove,
.params = "[vlan_id name] [tcp|udp]:[hostaddr]:hostport",
.help = "remove host-to-guest TCP or UDP redirection",
.mhandler.cmd = net_slirp_hostfwd_remove,
},
#endif
@ -866,9 +866,9 @@ ETEXI
{
.name = "balloon",
.args_type = "value:i",
.handler = do_balloon,
.params = "target",
.help = "request VM to change it's memory allocation (in MB)",
.mhandler.cmd = do_balloon,
},
STEXI
@ -879,9 +879,9 @@ ETEXI
{
.name = "set_link",
.args_type = "name:s,up_or_down:s",
.handler = do_set_link,
.params = "name up|down",
.help = "change the link status of a network adapter",
.mhandler.cmd = do_set_link,
},
STEXI
@ -892,9 +892,9 @@ ETEXI
{
.name = "watchdog_action",
.args_type = "action:s",
.handler = do_watchdog_action,
.params = "[reset|shutdown|poweroff|pause|debug|none]",
.help = "change watchdog action",
.mhandler.cmd = do_watchdog_action,
},
STEXI
@ -905,9 +905,9 @@ ETEXI
{
.name = "acl_show",
.args_type = "aclname:s",
.handler = do_acl_show,
.params = "aclname",
.help = "list rules in the access control list",
.mhandler.cmd = do_acl_show,
},
STEXI
@ -921,9 +921,9 @@ ETEXI
{
.name = "acl_policy",
.args_type = "aclname:s,policy:s",
.handler = do_acl_policy,
.params = "aclname allow|deny",
.help = "set default access control list policy",
.mhandler.cmd = do_acl_policy,
},
STEXI
@ -936,9 +936,9 @@ ETEXI
{
.name = "acl_add",
.args_type = "aclname:s,match:s,policy:s,index:i?",
.handler = do_acl_add,
.params = "aclname match allow|deny [index]",
.help = "add a match rule to the access control list",
.mhandler.cmd = do_acl_add,
},
STEXI
@ -954,9 +954,9 @@ ETEXI
{
.name = "acl_remove",
.args_type = "aclname:s,match:s",
.handler = do_acl_remove,
.params = "aclname match",
.help = "remove a match rule from the access control list",
.mhandler.cmd = do_acl_remove,
},
STEXI
@ -967,9 +967,9 @@ ETEXI
{
.name = "acl_reset",
.args_type = "aclname:s",
.handler = do_acl_reset,
.params = "aclname",
.help = "reset the access control list",
.mhandler.cmd = do_acl_reset,
},
STEXI
@ -983,9 +983,9 @@ ETEXI
{
.name = "mce",
.args_type = "cpu_index:i,bank:i,status:l,mcg_status:l,addr:l,misc:l",
.handler = do_inject_mce,
.params = "cpu bank status mcgstatus addr misc",
.help = "inject a MCE on the given CPU",
.mhandler.cmd = do_inject_mce,
},
#endif
@ -997,9 +997,9 @@ ETEXI
{
.name = "getfd",
.args_type = "fdname:s",
.handler = do_getfd,
.params = "getfd name",
.help = "receive a file descriptor via SCM rights and assign it a name",
.mhandler.cmd = do_getfd,
},
STEXI
@ -1012,9 +1012,9 @@ ETEXI
{
.name = "closefd",
.args_type = "fdname:s",
.handler = do_closefd,
.params = "closefd name",
.help = "close a file descriptor previously passed via SCM rights",
.mhandler.cmd = do_closefd,
},
STEXI