Luiz Capitulino <lcapitul...@redhat.com> writes: > This command allows QMP clients to execute HMP commands. > > Please, check the documentation added to the qmp-commands.hx file > for additional details about the interface and its limitations. > > Signed-off-by: Luiz Capitulino <lcapitul...@redhat.com> > --- > monitor.c | 39 +++++++++++++++++++++++++++++++++++++++ > qmp-commands.hx | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 84 insertions(+), 0 deletions(-) > > diff --git a/monitor.c b/monitor.c > index 8cee35d..89513be 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -491,6 +491,45 @@ static int do_qmp_capabilities(Monitor *mon, const QDict > *params, > return 0; > } > > +static int mon_set_cpu(int cpu_index); > +static void handle_user_command(Monitor *mon, const char *cmdline); > + > +static int do_hmp_passthrough(Monitor *mon, const QDict *params, > + QObject **ret_data) > +{ > + int ret = 0; > + QString *qs; > + Monitor *old_mon, hmp; > + CharDriverState memchr;
Uh, let's not shadow memchr() from string.h. > + > + memset(&hmp, 0, sizeof(hmp)); > + hmp.chr = &memchr; > + qemu_chr_init_mem(hmp.chr); > + > + old_mon = cur_mon; > + cur_mon = &hmp; > + > + if (qdict_haskey(params, "cpu-index")) { > + ret = mon_set_cpu(qdict_get_int(params, "cpu-index")); > + if (ret < 0) { > + qerror_report(QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU > number"); > + goto out; > + } > + } > + > + handle_user_command(&hmp, qdict_get_str(params, "command-line")); It would sure be nice if handle_user_command() returned status... But fixing that is out of this patch series' scope. > + > + qs = qemu_chr_mem_to_qs(hmp.chr); > + if (qs) { > + *ret_data = QOBJECT(qs); > + } Conditional goes away when qemu_chr_mem_to_qs() is changed not to return NULL for empty character device. > + > +out: > + cur_mon = old_mon; > + qemu_chr_close_mem(hmp.chr); > + return ret; > +} > + > static int compare_cmd(const char *name, const char *list) > { > const char *p, *pstart; > diff --git a/qmp-commands.hx b/qmp-commands.hx > index 793cf1c..b344096 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -761,6 +761,51 @@ Example: > > Note: This command must be issued before issuing any other command. > > +EQMP > + > + { > + .name = "hmp_passthrough", > + .args_type = "command-line:s,cpu-index:i?", > + .params = "", > + .help = "", > + .user_print = monitor_user_noop, > + .mhandler.cmd_new = do_hmp_passthrough, > + }, > + > +SQMP > +hmp_passthrough > +--------------- > + > +Execute a Human Monitor command. > + > +Arguments: > + > +- command-line: the command name and its arguments, just like the > + Human Monitor's shell (json-string) > +- cpu-index: select the CPU number to be used by commands which access CPU > + data, like 'info registers'. The Monitor selects CPU 0 if this > + argument is not provided (json-int, optional) > + > +Example: > + > +-> { "execute": "hmp_passthrough", "arguments": { "command-line": "info kvm" > } } > +<- { "return": "kvm support: enabled\r\n" } > + > +Notes: > + > +(1) The Human Monitor is NOT an stable interface, this means that command > + names, arguments and responses can change or be removed at ANY time. > + Applications that rely on long term stability guarantees should NOT > + use this command > + > +(2) Limitations: > + > + o This command is stateless, this means that commands that depend > + on state information (such as getfd) might not work > + > + o Commands that prompt the user for data (eg. 'cont' when the block > + device is encrypted) don't currently work > + > 3. Query Commands > =================