From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=39241 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PGZNU-0001sp-2V for qemu-devel@nongnu.org; Thu, 11 Nov 2010 10:47:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PGZNS-0004Gs-NN for qemu-devel@nongnu.org; Thu, 11 Nov 2010 10:47:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:27398) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PGZNS-0004GU-FZ for qemu-devel@nongnu.org; Thu, 11 Nov 2010 10:47:54 -0500 From: Markus Armbruster Subject: Re: [Qemu-devel] [PATCH 2/3] QMP: Introduce Human Monitor passthrough command References: <1289415546-19105-1-git-send-email-lcapitulino@redhat.com> <1289415546-19105-3-git-send-email-lcapitulino@redhat.com> Date: Thu, 11 Nov 2010 16:47:52 +0100 In-Reply-To: <1289415546-19105-3-git-send-email-lcapitulino@redhat.com> (Luiz Capitulino's message of "Wed, 10 Nov 2010 16:59:05 -0200") Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Luiz Capitulino Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org Luiz Capitulino 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 > --- > 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 > =================