From: "Daniel P. Berrangé" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Laurent Vivier" <lvivier@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"David Hildenbrand" <david@redhat.com>,
"Michael Roth" <michael.roth@amd.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Yuval Shaia" <yuval.shaia.ml@gmail.com>,
"Peter Xu" <peterx@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
"Markus Armbruster" <armbru@redhat.com>
Subject: [PULL 08/18] docs/devel: add example of command returning unstructured text
Date: Tue, 2 Nov 2021 17:56:50 +0000 [thread overview]
Message-ID: <20211102175700.1175996-9-berrange@redhat.com> (raw)
In-Reply-To: <20211102175700.1175996-1-berrange@redhat.com>
This illustrates how to add a QMP command returning unstructured text,
following the guidelines added in the previous patch. The example uses
a simplified version of 'info roms'.
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
docs/devel/writing-monitor-commands.rst | 101 +++++++++++++++++++++++-
1 file changed, 100 insertions(+), 1 deletion(-)
diff --git a/docs/devel/writing-monitor-commands.rst b/docs/devel/writing-monitor-commands.rst
index 031e980bf5..b87992df91 100644
--- a/docs/devel/writing-monitor-commands.rst
+++ b/docs/devel/writing-monitor-commands.rst
@@ -374,7 +374,9 @@ best practices. An example where this approach is taken is the QMP
command "x-query-registers". This returns a formatted dump of the
architecture specific CPU state. The way the data is formatted varies
across QEMU targets, is liable to change over time, and is only
-intended to be consumed as an opaque string by machines.
+intended to be consumed as an opaque string by machines. Refer to the
+`Writing a debugging aid returning unstructured text`_ section for
+an illustration.
User Defined Types
~~~~~~~~~~~~~~~~~~
@@ -642,3 +644,100 @@ has to traverse the list, it's shown below for reference::
qapi_free_TimerAlarmMethodList(method_list);
}
+
+Writing a debugging aid returning unstructured text
+---------------------------------------------------
+
+As discussed in section `Modelling data in QAPI`_, it is required that
+commands expecting machine usage be using fine-grained QAPI data types.
+The exception to this rule applies when the command is solely intended
+as a debugging aid and allows for returning unstructured text. This is
+commonly needed for query commands that report aspects of QEMU's
+internal state that are useful to human operators.
+
+In this example we will consider a simplified variant of the HMP
+command ``info roms``. Following the earlier rules, this command will
+need to live under the ``x-`` name prefix, so its QMP implementation
+will be called ``x-query-roms``. It will have no parameters and will
+return a single text string::
+
+ { 'struct': 'HumanReadableText',
+ 'data': { 'human-readable-text': 'str' } }
+
+ { 'command': 'x-query-roms',
+ 'returns': 'HumanReadableText' }
+
+The ``HumanReadableText`` struct is intended to be used for all
+commands, under the ``x-`` name prefix that are returning unstructured
+text targetted at humans. It should never be used for commands outside
+the ``x-`` name prefix, as those should be using structured QAPI types.
+
+Implementing the QMP command
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The QMP implementation will typically involve creating a ``GString``
+object and printing formatted data into it::
+
+ HumanReadableText *qmp_x_query_roms(Error **errp)
+ {
+ g_autoptr(GString) buf = g_string_new("");
+ Rom *rom;
+
+ QTAILQ_FOREACH(rom, &roms, next) {
+ g_string_append_printf("%s size=0x%06zx name=\"%s\"\n",
+ memory_region_name(rom->mr),
+ rom->romsize,
+ rom->name);
+ }
+
+ return human_readable_text_from_str(buf);
+ }
+
+
+Implementing the HMP command
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now that the QMP command is in place, we can also make it available in
+the human monitor (HMP) as shown in previous examples. The HMP
+implementations will all look fairly similar, as all they need do is
+invoke the QMP command and then print the resulting text or error
+message. Here's the implementation of the "info roms" HMP command::
+
+ void hmp_info_roms(Monitor *mon, const QDict *qdict)
+ {
+ Error err = NULL;
+ g_autoptr(HumanReadableText) info = qmp_x_query_roms(&err);
+
+ if (hmp_handle_error(mon, err)) {
+ return;
+ }
+ monitor_printf(mon, "%s", info->human_readable_text);
+ }
+
+Also, you have to add the function's prototype to the hmp.h file.
+
+There's one last step to actually make the command available to
+monitor users, we should add it to the hmp-commands-info.hx file::
+
+ {
+ .name = "roms",
+ .args_type = "",
+ .params = "",
+ .help = "show roms",
+ .cmd = hmp_info_roms,
+ },
+
+The case of writing a HMP info handler that calls a no-parameter QMP query
+command is quite common. To simplify the implementation there is a general
+purpose HMP info handler for this scenario. All that is required to expose
+a no-parameter QMP query command via HMP is to declare it using the
+'.cmd_info_hrt' field to point to the QMP handler, and leave the '.cmd'
+field NULL::
+
+ {
+ .name = "roms",
+ .args_type = "",
+ .params = "",
+ .help = "show roms",
+ .cmd_info_hrt = qmp_x_query_roms,
+ },
--
2.31.1
next prev parent reply other threads:[~2021-11-02 18:06 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-02 17:56 [PULL 00/18] HMP-to-QMP info command patches Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 01/18] monitor: remove 'info ioapic' HMP command Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 02/18] monitor: make hmp_handle_error return a boolean Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 03/18] docs/devel: rename file for writing monitor commands Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 04/18] docs/devel: tweak headings in monitor command docs Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 05/18] docs/devel: update error handling guidance for HMP commands Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 06/18] monitor: introduce HumanReadableText and HMP support Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 07/18] docs/devel: document expectations for QAPI data modelling for QMP Daniel P. Berrangé
2021-11-02 17:56 ` Daniel P. Berrangé [this message]
2021-11-02 17:56 ` [PULL 09/18] docs/devel: document expectations for HMP commands in the future Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 10/18] qapi: introduce x-query-roms QMP command Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 11/18] qapi: introduce x-query-profile " Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 12/18] qapi: introduce x-query-numa " Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 13/18] qapi: introduce x-query-usb " Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 14/18] qapi: introduce x-query-rdma " Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 15/18] qapi: introduce x-query-ramblock " Daniel P. Berrangé
2022-06-09 10:07 ` Claudio Fontana
2022-06-09 10:19 ` Daniel P. Berrangé
2022-06-09 10:25 ` David Hildenbrand
2022-06-09 12:52 ` Dr. David Alan Gilbert
2022-06-30 10:14 ` Claudio Fontana
2022-06-30 10:20 ` Daniel P. Berrangé
2022-06-30 12:55 ` Claudio Fontana
2021-11-02 17:56 ` [PULL 16/18] qapi: introduce x-query-irq " Daniel P. Berrangé
2021-11-02 17:56 ` [PULL 17/18] qapi: introduce x-query-jit " Daniel P. Berrangé
2021-11-02 17:57 ` [PULL 18/18] qapi: introduce x-query-opcount " Daniel P. Berrangé
2021-11-03 13:30 ` [PULL 00/18] HMP-to-QMP info command patches Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211102175700.1175996-9-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=kraxel@redhat.com \
--cc=lvivier@redhat.com \
--cc=michael.roth@amd.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
--cc=yuval.shaia.ml@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).