From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel@nongnu.org
Cc: "Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Richard Henderson" <rth@twiddle.net>,
"Artyom Tarasenko" <atar4qemu@gmail.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"David Gibson" <david@gibson.dropbear.id.au>,
"Igor Mammedov" <imammedo@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
qemu-ppc@nongnu.org, qemu-arm@nongnu.org,
"Markus Armbruster" <armbru@redhat.com>,
"Mark Cave-Ayland" <mark.cave-ayland@ilande.co.uk>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>
Subject: [Qemu-devel] [PATCH v2 13/18] hw/nvram/fw_cfg: Add QMP 'info fw_cfg' command
Date: Fri, 8 Mar 2019 02:32:17 +0100 [thread overview]
Message-ID: <20190308013222.12524-14-philmd@redhat.com> (raw)
In-Reply-To: <20190308013222.12524-1-philmd@redhat.com>
When debugging a paravirtualized guest firmware, it results very
useful to dump the fw_cfg table.
Add a QMP command which returns the most useful fields.
Since the QMP protocol is not designed for passing stream data,
we don't display a fw_cfg item data, only it's size:
{ "execute": "query-fw_cfg-items" }
{
"return": [
{
"architecture_specific": false,
"key": 0,
"writeable": false,
"size": 4,
"keyname": "signature"
},
{
"architecture_specific": false,
"key": 1,
"writeable": false,
"size": 4,
"keyname": "id"
},
{
"architecture_specific": false,
"key": 2,
"writeable": false,
"size": 16,
"keyname": "uuid"
},
...
{
"order": 40,
"architecture_specific": false,
"key": 36,
"writeable": false,
"path": "etc/e820",
"size": 20,
"keyname": "file"
},
{
"order": 30,
"architecture_specific": false,
"key": 37,
"writeable": false,
"path": "etc/smbios/smbios-anchor",
"size": 31,
"keyname": "file"
},
...
{
"architecture_specific": true,
"key": 3,
"writeable": false,
"size": 324,
"keyname": "e820_tables"
},
{
"architecture_specific": true,
"key": 4,
"writeable": false,
"size": 121,
"keyname": "hpet"
}
]
}
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
v2: New commit, asked by Eric/Michael, using Laszlo suggestions
---
hw/nvram/fw_cfg.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++
qapi/misc.json | 44 +++++++++++++++++++++++++++
2 files changed, 120 insertions(+)
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
index fc392cb7e0..2a8d69ba07 100644
--- a/hw/nvram/fw_cfg.c
+++ b/hw/nvram/fw_cfg.c
@@ -35,6 +35,7 @@
#include "qemu/config-file.h"
#include "qemu/cutils.h"
#include "qapi/error.h"
+#include "qapi/qapi-commands-misc.h"
#define FW_CFG_FILE_SLOTS_DFLT 0x20
@@ -1229,3 +1230,78 @@ static void fw_cfg_register_types(void)
}
type_init(fw_cfg_register_types)
+
+static FirmwareConfigurationItem *create_qmp_fw_cfg_item(FWCfgState *s,
+ FWCfgEntry *e,
+ bool is_arch_specific,
+ uint16_t key,
+ size_t hex_length)
+{
+ FirmwareConfigurationItem *item = g_malloc0(sizeof(*item));
+
+ item->key = key;
+ item->writeable = e->allow_write;
+ item->architecture_specific = is_arch_specific;
+ item->size = e->len;
+ if (hex_length) {
+ item->has_data = true;
+ item->data = qemu_strdup_hexlify(e->data, hex_length);
+ }
+
+ if (!is_arch_specific && key >= FW_CFG_FILE_FIRST) {
+ int id = key - FW_CFG_FILE_FIRST;
+ const char *path = s->files->f[id].name;
+
+ item->has_keyname = true;
+ item->keyname = g_strdup("file");
+ item->has_order = true;
+ item->order = get_fw_cfg_order(s, path);
+ item->has_path = true;
+ item->path = g_strdup(path);
+ } else {
+ const char *name;
+
+ if (is_arch_specific) {
+ key |= FW_CFG_ARCH_LOCAL;
+ }
+ name = key_name(key);
+ if (name) {
+ item->has_keyname = true;
+ item->keyname = g_strdup(name);
+ }
+ }
+ return item;
+}
+
+FirmwareConfigurationItemList *qmp_query_fw_cfg_items(Error **errp)
+{
+ FirmwareConfigurationItemList *item_list = NULL;
+ uint32_t max_entries;
+ int arch, key;
+ FWCfgState *s = fw_cfg_find();
+
+ if (s == NULL) {
+ return NULL;
+ }
+
+ max_entries = fw_cfg_max_entry(s);
+ for (arch = ARRAY_SIZE(s->entries) - 1; arch >= 0 ; --arch) {
+ for (key = max_entries - 1; key >= 0; --key) {
+ FirmwareConfigurationItemList *info;
+ FWCfgEntry *e = &s->entries[arch][key];
+ size_t qmp_hex_length = 0;
+
+ if (!e->len) {
+ continue;
+ }
+
+ info = g_malloc0(sizeof(*info));
+ info->value = create_qmp_fw_cfg_item(s, e, arch, key,
+ qmp_hex_length);
+ info->next = item_list;
+ item_list = info;
+ }
+ }
+
+ return item_list;
+}
diff --git a/qapi/misc.json b/qapi/misc.json
index 8b3ca4fdd3..9d1da7c766 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -3051,3 +3051,47 @@
'data': 'NumaOptions',
'allow-preconfig': true
}
+
+##
+# @FirmwareConfigurationItem:
+#
+# Firmware Configuration (fw_cfg) item.
+#
+# @key: The uint16 selector key.
+# @keyname: The stringified name if the selector refers to a well-known
+# numerically defined item.
+# @architecture_specific: Indicates whether the configuration setting is
+# architecture specific.
+# false: The item is a generic configuration item.
+# true: The item is specific to a particular architecture.
+# @writeable: Indicates whether the configuration setting is writeable by
+# the guest.
+# @size: The length of @data associated with the item.
+# @data: A string representating the firmware configuration data.
+# Note: This field is currently not used.
+# @path: If the key is a 'file', the named file path.
+# @order: If the key is a 'file', the named file order.
+#
+# Since 4.0
+##
+{ 'struct': 'FirmwareConfigurationItem',
+ 'data': { 'key': 'uint16',
+ '*keyname': 'str',
+ 'architecture_specific': 'bool',
+ 'writeable': 'bool',
+ '*data': 'str',
+ 'size': 'int',
+ '*path': 'str',
+ '*order': 'int' } }
+
+
+##
+# @query-fw_cfg-items:
+#
+# Returns the list of Firmware Configuration items.
+#
+# Returns: A list of @FirmwareConfigurationItem for each entry.
+#
+# Since 4.0
+##
+{ 'command': 'query-fw_cfg-items', 'returns': ['FirmwareConfigurationItem']}
--
2.20.1
next prev parent reply other threads:[~2019-03-08 1:35 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-08 1:32 [Qemu-devel] [PATCH v2 00/18] fw_cfg: reduce memleaks, add QMP/HMP info + edk2_add_host_crypto_policy Philippe Mathieu-Daudé
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 01/18] hw/arm/virt: Remove null-check in virt_build_smbios() Philippe Mathieu-Daudé
2019-03-09 14:09 ` Markus Armbruster
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 02/18] hw/i386: Remove unused include Philippe Mathieu-Daudé
2019-03-08 9:22 ` Laszlo Ersek
2019-03-08 11:32 ` [Qemu-devel] [Qemu-ppc] " Thomas Huth
2019-03-09 14:54 ` [Qemu-devel] [Qemu-trivial] " Laurent Vivier
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 03/18] cutils: Add qemu_strdup_hexlify() and qemu_strdup_unhexlify() Philippe Mathieu-Daudé
2019-03-08 9:48 ` Laszlo Ersek
2019-03-09 14:32 ` Markus Armbruster
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 04/18] hw/nvram/fw_cfg: Add trace events Philippe Mathieu-Daudé
2019-03-08 9:57 ` Laszlo Ersek
2019-03-08 10:59 ` Philippe Mathieu-Daudé
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 05/18] hw/nvram/fw_cfg: Use the ldst API Philippe Mathieu-Daudé
2019-03-08 10:02 ` Laszlo Ersek
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 06/18] hw/nvram/fw_cfg: Remove the unnecessary boot_splash_filedata_size Philippe Mathieu-Daudé
2019-03-08 6:49 ` Thomas Huth
2019-03-09 14:53 ` [Qemu-devel] [Qemu-trivial] " Laurent Vivier
2019-03-08 10:05 ` [Qemu-devel] " Laszlo Ersek
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 07/18] hw/nvram/fw_cfg: Add fw_cfg_common_unrealize() Philippe Mathieu-Daudé
2019-03-08 6:55 ` Thomas Huth
2019-03-08 10:29 ` Laszlo Ersek
2019-03-09 14:44 ` Markus Armbruster
2019-03-09 14:47 ` Markus Armbruster
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 08/18] hw/nvram/fw_cfg: Move fw_cfg_file_slots_allocate() to common_realize() Philippe Mathieu-Daudé
2019-03-08 10:19 ` Laszlo Ersek
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 09/18] hw/nvram/fw_cfg: Free file_slots in common_unrealize() Philippe Mathieu-Daudé
2019-03-08 10:31 ` Laszlo Ersek
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 10/18] hw/nvram/fw_cfg: Add reboot_timeout to FWCfgState Philippe Mathieu-Daudé
2019-03-08 11:04 ` Laszlo Ersek
2019-03-08 11:22 ` Philippe Mathieu-Daudé
2019-03-08 11:29 ` Philippe Mathieu-Daudé
2019-03-08 13:48 ` Michael S. Tsirkin
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 11/18] hw/nvram/fw_cfg: Add boot_splash.time_le16 " Philippe Mathieu-Daudé
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 12/18] hw/nvram/fw_cfg: Keep reference of file_data in FWCfgState Philippe Mathieu-Daudé
2019-03-08 7:02 ` Thomas Huth
2019-03-08 11:16 ` Laszlo Ersek
2019-03-08 1:32 ` Philippe Mathieu-Daudé [this message]
2019-03-08 2:04 ` [Qemu-devel] [PATCH v2 13/18] hw/nvram/fw_cfg: Add QMP 'info fw_cfg' command Eric Blake
2019-03-08 11:08 ` Philippe Mathieu-Daudé
2019-03-08 17:31 ` Eric Blake
2019-03-08 18:07 ` Philippe Mathieu-Daudé
2019-03-08 20:00 ` Laszlo Ersek
2019-03-08 20:18 ` Philippe Mathieu-Daudé
2019-03-09 15:04 ` Markus Armbruster
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 14/18] hw/nvram/fw_cfg: Add HMP " Philippe Mathieu-Daudé
2019-03-08 15:49 ` Dr. David Alan Gilbert
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 15/18] hw/nvram/fw_cfg: Add fw_cfg_add_file_from_host() Philippe Mathieu-Daudé
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 16/18] hw/firmware: Add Edk2Crypto and edk2_add_host_crypto_policy() Philippe Mathieu-Daudé
2019-03-08 2:16 ` Eric Blake
2019-03-09 18:08 ` Philippe Mathieu-Daudé
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 17/18] hw/i386: Use edk2_add_host_crypto_policy() Philippe Mathieu-Daudé
2019-03-08 1:32 ` [Qemu-devel] [PATCH v2 18/18] hw/arm/virt: " Philippe Mathieu-Daudé
2019-03-08 11:25 ` [Qemu-devel] [PATCH v2 00/18] fw_cfg: reduce memleaks, add QMP/HMP info + edk2_add_host_crypto_policy Laszlo Ersek
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=20190308013222.12524-14-philmd@redhat.com \
--to=philmd@redhat.com \
--cc=armbru@redhat.com \
--cc=atar4qemu@gmail.com \
--cc=berrange@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=kraxel@redhat.com \
--cc=lersek@redhat.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=rth@twiddle.net \
--cc=thuth@redhat.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).