From patchwork Fri Mar 8 01:32:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 1053331 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44Fr2m3DK5z9s9N for ; Fri, 8 Mar 2019 12:46:56 +1100 (AEDT) Received: from localhost ([127.0.0.1]:34730 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h24b8-0005O2-BE for incoming@patchwork.ozlabs.org; Thu, 07 Mar 2019 20:46:54 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58914) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h24Q7-0004AZ-Fj for qemu-devel@nongnu.org; Thu, 07 Mar 2019 20:35:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h24Q3-00034I-Ho for qemu-devel@nongnu.org; Thu, 07 Mar 2019 20:35:29 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59282) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h24Pv-0002q2-KT; Thu, 07 Mar 2019 20:35:21 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8DDA9B0ADA; Fri, 8 Mar 2019 01:35:15 +0000 (UTC) Received: from x1w.redhat.com (unknown [10.40.206.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 300FD60BE5; Fri, 8 Mar 2019 01:35:07 +0000 (UTC) From: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= To: Laszlo Ersek , Gerd Hoffmann , "Michael S. Tsirkin" , qemu-devel@nongnu.org Date: Fri, 8 Mar 2019 02:32:17 +0100 Message-Id: <20190308013222.12524-14-philmd@redhat.com> In-Reply-To: <20190308013222.12524-1-philmd@redhat.com> References: <20190308013222.12524-1-philmd@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 08 Mar 2019 01:35:15 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 13/18] hw/nvram/fw_cfg: Add QMP 'info fw_cfg' command X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Thomas Huth , Eduardo Habkost , Mark Cave-Ayland , "Dr. David Alan Gilbert" , Markus Armbruster , qemu-arm@nongnu.org, qemu-ppc@nongnu.org, Igor Mammedov , Paolo Bonzini , David Gibson , =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= , Artyom Tarasenko , Richard Henderson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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é --- 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']}