From nobody Wed May 15 10:36:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513542409667803.5510131522026; Sun, 17 Dec 2017 12:26:49 -0800 (PST) Received: from localhost ([::1]:55383 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfWK-0006CQ-AZ for importer@patchew.org; Sun, 17 Dec 2017 15:26:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55207) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfUR-00059b-FD for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:24:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eQfUM-000343-Pv for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:24:51 -0500 Received: from mail-eopbgr50113.outbound.protection.outlook.com ([40.107.5.113]:42048 helo=EUR03-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eQfUM-00033J-AY; Sun, 17 Dec 2017 15:24:46 -0500 Received: from localhost.localdomain (194.28.30.174) by HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Sun, 17 Dec 2017 20:24:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=10y+W1vAjAv66QeHIMZDtF5y4cXYwTL0UNyu2Gx13U8=; b=S4SjVO5WjSTabc8d9vGR5N2IOSxepdJlYRIhRo8XXYCwkyyqOrRRLKnzcxPjzGZXzvv8kKuW/JwHItaPWN9MpEh5EiftSqJ/a+BcNITl0wz3kFgvUkgAx/lWrro3uoWj8VlJ9k1QiidoSVOC/wr+ui8AHQYQzoxiDNi3NyPlHSQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=jan.dakinevich@virtuozzo.com; From: Jan Dakinevich To: qemu-devel@nongnu.org Date: Sun, 17 Dec 2017 23:25:54 +0300 Message-Id: <1513542355-28203-2-git-send-email-jan.dakinevich@virtuozzo.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> References: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [194.28.30.174] X-ClientProxiedBy: VI1PR0202CA0006.eurprd02.prod.outlook.com (2603:10a6:803:14::19) To HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f8e33aab-c80d-44aa-3b52-08d5458c3506 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603307); SRVR:HE1PR0801MB2746; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 3:hNwC9zqMHTyTtDYmkLeSSBH+eLcl2RDag+1yM8Nb4K+EUl92M9fCCPMhS/TqaGWPZoQXw2ghDmDhnOHfezCRYbbpDhxtrW+rIfv47WnT5wsYPPAeFismaWJvGVcg0i9T/0gkxeSMDfclrnfRZT7HqDYlpxffncDXCqSfuDQxkKwiIdSZpCUobTMYTarEhkBcR3tJjG1ViSCfdPShsKpnS7tlOiZ6Wn4k/TYrdr8kDQxnkOIQ1Fd63Km3Wi2QDSo2; 25:jE4xRMhFXrKtdOq33MybSoYUMIEVXeEg3H5E1SZbbWs8TxiPgXBf7W1NaLtVsvEwMxxhytQtteLGJWpqJYIKH0qYbz3DRWbwGWxLEu6gJTdhouDVD6HYWb3vNbEopBNsL3wF/xbgknZl70XF9Ia9uZ5q8TgZgYFQtblQPA4ifIZ0nO7R3bolRMRkeCg78uuuhQSrV+6D/z85eeaVMuaLuD/lM+iSJTt4Dj/Gx9VV3ypCMIUvlQ3CejQHt86POd1QmI6HQV2WTU4HVZ0HOxAn9hOeKq1rK6eZShFg2nh9YQYXhXfJnaQvAVKvL5LX76Y03D2Tl11BNZeKJtfFIxhulw==; 31:igKoS5FU0RRJJji1eGugy11qsCJkrI7+Ok1uJESJ9G8DRxLoa27pjFroWpNk1Hb8LcFWtMdKV/EBHm6jW2+83kW8P9cfNo2pMfwcMIPEDENbcMsHKatkAwMkrjNF6cJd36pn0UW3WejGoq5fyJL3yGtO5rz3OOQnmc36sLf6v22eFWJex48/K8Zu7fpgzxjOXgiPtgkrFINgsOjJW8fyIjlKGfDShiETAe2yCHJiz7w= X-MS-TrafficTypeDiagnostic: HE1PR0801MB2746: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:qLv/2L9thpFuf1llP18xBT2TBZkySKEsgKwe/uHC1hghUYhY1/BkfAXGWMb9yqad0uAeRoOKF/K2ZazuNGRC9enBRWoYNBaDeyzTIq++dAVKQ827c01NUWmFgbK4flUs1eq4SMGu+7ZO9mKiT15Lx2E0JaoRYu1r48LuPQb1XL6wZa4tjo7aAsTR1s71fBtMqZWrOlYVXPq1GvcEV0rIUALci81cXdgUq4oCTSCeUB8KGVyfybm1Wg9dKgS9fSntRcZiLlufay+0gs5FdbOjf6KaMuSszojURjDvCVd61SYIqp61USD/xkriNEer0+9ryhFQmcuH2UQdIpP0jUvbWSLyOHizNo3w2weWrTCRtyks3pxx0cHiRifBl3ldhL+dn6ICQskFe2rv///G7yccLHIDulnTaSthpvTlJS9zuYQ=; 4:pYcfjZ2MG3TizrAjdGf9JlkM5t+axSH+7hHLt45QyqT0CNXi+EndBuCI2akoCJLeeqPqDIDnv+tGZrq8/2bma5bJz9hH6YNv4mkqkEzKl1Xg3jj4pt8vGSQPsJyOyFspVlLzlb2t5gCzwxkhQlFgIlgGiA87RWFrrmgTjgytFi8nmIotI6fdRNxeH0340qUH3CgjHYlhWgPNlqeP0nNa0dgQO+OPoRBPLVUn7vYL3wb7DSTjqzpUSBHUC+Qk4Jd3kbZU+OUYyARXGi5tr22eUw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231023)(93006095)(93001095)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:HE1PR0801MB2746; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:HE1PR0801MB2746; X-Forefront-PRVS: 05245CA661 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(376002)(366004)(396003)(39840400004)(199004)(189003)(478600001)(25786009)(6916009)(2950100002)(97736004)(6666003)(105586002)(4326008)(86362001)(47776003)(66066001)(5660300001)(53936002)(6506007)(59450400001)(386003)(7416002)(575784001)(6116002)(3846002)(2906002)(81156014)(48376002)(68736007)(36756003)(8676002)(51416003)(7736002)(16526018)(6486002)(8936002)(16586007)(6512007)(54906003)(81166006)(76176011)(52116002)(2361001)(2351001)(106356001)(5890100001)(305945005)(50226002)(50466002)(316002)(81973001); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB2746; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0801MB2746; 23:vWnddDHa7jEua9cqbil5fgUx4OFnDhze0uQ6D+0?= =?us-ascii?Q?O12NLML3EBlK7tNSMyy9EIInD0WT2JJqnLw/tPIbejQL1qp3AFxYDbH1CW81?= =?us-ascii?Q?ANqM8G42sjEDC1wb9XeYJQO16RJr08p6QU7Xjpy3hIODtpYyEutSaK/FU3ZN?= =?us-ascii?Q?EZzswlmA0ThvSE95g8y6YvHt/9cTOab7L+jVpTU6VxJLsptiQtoahOoSQNDn?= =?us-ascii?Q?CGDeHVQtOTGb02+4O3sSfwQXVydAG7kttiCuyE3Aaz9gl0JiMdsXonhL0SAR?= =?us-ascii?Q?I4+h0BcJuyEWCmQPcl6clDE+tMylpZguq3g74M+44MP4YS9dpAF42XVpOp1A?= =?us-ascii?Q?sGBcc9jflpU7SQL7MrnriqPzg9ofVVDH/XxoMRsvJLwt+432dZ7IBxi4MAj7?= =?us-ascii?Q?Gx2iibQ5O9TWPp5IzyaSida6dAcSDNu85JuVoRQ7Fp86luyANaN5+0lPFwHX?= =?us-ascii?Q?BzFJ8nnc4050+zcB8QFrFH9I3p36rzBJ6U5UBtNLOAAerSb5e3D3cJL8itEV?= =?us-ascii?Q?+w8AWxRH/MmBkVY/zil2ydD4Xr/lM+j6GXicSCTpUj98TdrAFhOtnM2ePA/c?= =?us-ascii?Q?1yMaTLqrjLNKV6+F3kBLejo+U7RRHn/BTzKXXIvG5ScIE/4iwgQa2dYh7Oka?= =?us-ascii?Q?rdrCThyTwSblqt8rhy8euctQ7lcxLL2l/ICic0p/uDPHe5d0uviycPHMMimu?= =?us-ascii?Q?UA1R10aJS/8V9LqXsZBoCBWP1OfKoltuMoMYGkdtLbGJ09siSzMhzdOPSYEe?= =?us-ascii?Q?zxnbBtsuLXVkMs6hCdKqgyNgImHOwwW/EO/g/mK26y84ixSnZmHt/FXH3uRW?= =?us-ascii?Q?F8UsiDBEdcl3XI5Ouwl06Sygn+KNnCMpt5wfVgOQ2vRSNHRd+BE9cI62n7+T?= =?us-ascii?Q?Rfk6T7JAFkzXCE1lYoS3gYhBeI7luqMkUbJEB9Rvz6NiRvdZac5lHW9+D2qN?= =?us-ascii?Q?GltptqlmZeLfIT+HV9BfzivwPH2aDQnQ+5+ksofH6fY9dYNu1OiFwWVriNoJ?= =?us-ascii?Q?FKUWBPyV4zRDES44tIVOlb0CknTkggl8X4U0SSELzWDr95qFZ33VAaA2o+lw?= =?us-ascii?Q?+Hurjf2lCDKqthPdPyGpP7Ac97bQ9sV5WuHSdw9aFvsYSr6by0xgMUQwdSlS?= =?us-ascii?Q?E+sJypx+X3dB35SV3SGvN9CAMCf1BN8BaX49FxUEyi0q92FxPKpyVdIC3NfA?= =?us-ascii?Q?wdTRsEScRUu33uPy+POzZydkQEOtYlAF0Rlx1AJIqaoJSh4tClUc5LHlsFh8?= =?us-ascii?Q?60mSzj8++HNsmtHtxKQc=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 6:C6bePrvysM5rvKJkifvVkqODozkYrCD2n4WbxkA3+MCKpQoFkfOtCPFe2hazzPDuHiS24uIARPR4oMj3cgtiHTqum/H8z+76mHSU0U+WJkGzS0VV2hbrq2An5o6aygPwgtCY3MXTw0fv66WS2ZLTj3h9LVqDR7OvlkPfxtDr36t/KUSZrAvDfgyV0+IDRdt23jRLFGdQ3ZuUqbYE6BQFUTrfqfzsxNEZGnkOi3/9u85zz0M4tCAQD14WEKYhNF3ldzhz8EF4r1+PBhgWvR0dmIkZJ+/qqMIHWuv+6gq07gVG3HDTgdns0UyiRKsjr784GG9YcXon4k+ggdWI3rdjxJ+Rln8/mA8JKeZRnhbP8N4=; 5:9xl09jMU+ewKhs1FU/jVn4WQz1b4EyHNU1wydXR+HzNjHxm2z2Yg0bHybs+oPZfVIvYMxAfygGFpd9SBRRs6hkfNnzeOuApkxIXisO6GeB43n9QxkKadQqZIYSKKBBTMxIN/3nuyn9u7LaMtkPxPZ7v7izjrL0I/Be5aoOhbew4=; 24:YPk5tgXmT9urVkWFu94ciDK2hSH5h5eYnmBBs8uEfPwYvI+WbL4Mk6Ni2xFhFXCHMoLUhbGADaWB/BlidDCXSzWd85A0hi10gGylSScnxbQ=; 7:ChEBKzN2vuJMtZe+GWJYyjYqBviYygXjfc2btU+bnkZ+3GSJsC3DmTr4pLeXJcPOaNdS6OHpdERjLfs0R8DimGerJzft+6DoVN60KRDPjVwjksqPjafmQKYbuFa9fd5n5pTYhDrO2WqMFqzWtpkAryNz6sP4UVIKr5ZunhNBxIFl8H2/V1bJABjdrR/TfoIPXHVby4FEHLDsD4marpyaE2O90aSQYcy/MtMBMvIjfYZa0OPyb40N+JF35BMynSnt SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:c9tuRs6B7uRBzf3mMl+IpF6VuLb4bQX3iINMLpZoHs5FHaUCdN3wjjsujG+fHf1LnLpfQMdCItbgWeIvhLSqXxqyomPqZ7pqH3sL8XQLlyfzxyxvruPG4GPkjnZbP2S+1wB9zCRpoirsL4hn/Ysk9nW9AVD8OykhPbOLgOeVRKY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Dec 2017 20:24:41.0131 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f8e33aab-c80d-44aa-3b52-08d5458c3506 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2746 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.5.113 Subject: [Qemu-devel] [RFC v6 1/2] virtio: introduce `query-virtio' QMP 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: Kevin Wolf , "Denis V. Lunev" , qemu-block@nongnu.org, Amit Shah , Jason Wang , Cornelia Huck , "Dr. David Alan Gilbert" , Markus Armbruster , Jan Dakinevich , "Michael S. Tsirkin" , Stefan Hajnoczi , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @virtuozzo.com) X-ZohoMail: RDKM_0 RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The command is intended for gathering virtio information such as status, feature bits, negotiation status. It is convenient and useful for debug purpose. The commands returns generic virtio information for virtio such as common feature names and status bits names and information for all attached to current machine devices. To retrieve names of device-specific features `tell_feature_name' callback in VirtioDeviceClass also was introduced. Cc: Denis V. Lunev Signed-off-by: Jan Dakinevich --- hw/block/virtio-blk.c | 20 +++++++ hw/char/virtio-serial-bus.c | 14 +++++ hw/display/virtio-gpu.c | 12 ++++ hw/net/virtio-net.c | 34 +++++++++++ hw/scsi/virtio-scsi.c | 15 +++++ hw/virtio/Makefile.objs | 3 + hw/virtio/virtio-balloon.c | 14 +++++ hw/virtio/virtio-qmp.c | 134 ++++++++++++++++++++++++++++++++++++++++= ++++ hw/virtio/virtio-stub.c | 9 +++ hw/virtio/virtio.c | 41 ++++++++++++++ include/hw/virtio/virtio.h | 6 ++ qapi-schema.json | 70 +++++++++++++++++++++++ 12 files changed, 372 insertions(+) create mode 100644 hw/virtio/virtio-qmp.c create mode 100644 hw/virtio/virtio-stub.c diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 05d1440..2ffd949 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -1017,6 +1017,25 @@ static Property virtio_blk_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static const char *virtio_blk_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_BLK_F_BARRIER); + FBIT(VIRTIO_BLK_F_SIZE_MAX); + FBIT(VIRTIO_BLK_F_SEG_MAX); + FBIT(VIRTIO_BLK_F_RO); + FBIT(VIRTIO_BLK_F_BLK_SIZE); + FBIT(VIRTIO_BLK_F_SCSI); + FBIT(VIRTIO_BLK_F_TOPOLOGY); + FBIT(VIRTIO_BLK_F_FLUSH); + FBIT(VIRTIO_BLK_F_MQ); + } +#undef FBIT + return NULL; +} + static void virtio_blk_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -1030,6 +1049,7 @@ static void virtio_blk_class_init(ObjectClass *klass,= void *data) vdc->get_config =3D virtio_blk_update_config; vdc->set_config =3D virtio_blk_set_config; vdc->get_features =3D virtio_blk_get_features; + vdc->tell_feature_name =3D virtio_blk_tell_feature_name; vdc->set_status =3D virtio_blk_set_status; vdc->reset =3D virtio_blk_reset; vdc->save =3D virtio_blk_save_device; diff --git a/hw/char/virtio-serial-bus.c b/hw/char/virtio-serial-bus.c index 9470bd7..1d4678b 100644 --- a/hw/char/virtio-serial-bus.c +++ b/hw/char/virtio-serial-bus.c @@ -1156,6 +1156,19 @@ static Property virtio_serial_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static const char *virtio_serial_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_CONSOLE_F_SIZE); + FBIT(VIRTIO_CONSOLE_F_MULTIPORT); + FBIT(VIRTIO_CONSOLE_F_EMERG_WRITE); + }; +#undef FBIT + return NULL; +} + static void virtio_serial_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -1170,6 +1183,7 @@ static void virtio_serial_class_init(ObjectClass *kla= ss, void *data) vdc->realize =3D virtio_serial_device_realize; vdc->unrealize =3D virtio_serial_device_unrealize; vdc->get_features =3D get_features; + vdc->tell_feature_name =3D virtio_serial_tell_feature_name; vdc->get_config =3D get_config; vdc->set_config =3D set_config; vdc->set_status =3D set_status; diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 274e365..1906b68 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -1317,6 +1317,17 @@ static Property virtio_gpu_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static const char *virtio_gpu_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_GPU_F_VIRGL); + }; +#undef FBIT + return NULL; +} + static void virtio_gpu_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -1327,6 +1338,7 @@ static void virtio_gpu_class_init(ObjectClass *klass,= void *data) vdc->get_config =3D virtio_gpu_get_config; vdc->set_config =3D virtio_gpu_set_config; vdc->get_features =3D virtio_gpu_get_features; + vdc->tell_feature_name =3D virtio_gpu_tell_feature_name; vdc->set_features =3D virtio_gpu_set_features; =20 vdc->reset =3D virtio_gpu_reset; diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 38674b0..0fbd055 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -2163,6 +2163,39 @@ static Property virtio_net_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static const char *virtio_net_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_NET_F_CSUM); + FBIT(VIRTIO_NET_F_GUEST_CSUM); + FBIT(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS); + FBIT(VIRTIO_NET_F_MTU); + FBIT(VIRTIO_NET_F_MAC); + FBIT(VIRTIO_NET_F_GSO); + FBIT(VIRTIO_NET_F_GUEST_TSO4); + FBIT(VIRTIO_NET_F_GUEST_TSO6); + FBIT(VIRTIO_NET_F_GUEST_ECN); + FBIT(VIRTIO_NET_F_GUEST_UFO); + FBIT(VIRTIO_NET_F_HOST_TSO4); + FBIT(VIRTIO_NET_F_HOST_TSO6); + FBIT(VIRTIO_NET_F_HOST_ECN); + FBIT(VIRTIO_NET_F_HOST_UFO); + FBIT(VIRTIO_NET_F_MRG_RXBUF); + FBIT(VIRTIO_NET_F_STATUS); + FBIT(VIRTIO_NET_F_CTRL_VQ); + FBIT(VIRTIO_NET_F_CTRL_RX); + FBIT(VIRTIO_NET_F_CTRL_VLAN); + FBIT(VIRTIO_NET_F_CTRL_RX_EXTRA); + FBIT(VIRTIO_NET_F_GUEST_ANNOUNCE); + FBIT(VIRTIO_NET_F_MQ); + FBIT(VIRTIO_NET_F_CTRL_MAC_ADDR); + }; +#undef FBIT + return NULL; +} + static void virtio_net_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -2178,6 +2211,7 @@ static void virtio_net_class_init(ObjectClass *klass,= void *data) vdc->get_features =3D virtio_net_get_features; vdc->set_features =3D virtio_net_set_features; vdc->bad_features =3D virtio_net_bad_features; + vdc->tell_feature_name =3D virtio_net_tell_feature_name; vdc->reset =3D virtio_net_reset; vdc->set_status =3D virtio_net_set_status; vdc->guest_notifier_mask =3D virtio_net_guest_notifier_mask; diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c index 3aa9971..4be5df8 100644 --- a/hw/scsi/virtio-scsi.c +++ b/hw/scsi/virtio-scsi.c @@ -942,6 +942,20 @@ static const VMStateDescription vmstate_virtio_scsi = =3D { }, }; =20 +static const char *virtio_scsi_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_SCSI_F_INOUT); + FBIT(VIRTIO_SCSI_F_HOTPLUG); + FBIT(VIRTIO_SCSI_F_CHANGE); + FBIT(VIRTIO_SCSI_F_T10_PI); + }; +#undef FBIT + return NULL; +} + static void virtio_scsi_common_class_init(ObjectClass *klass, void *data) { VirtioDeviceClass *vdc =3D VIRTIO_DEVICE_CLASS(klass); @@ -964,6 +978,7 @@ static void virtio_scsi_class_init(ObjectClass *klass, = void *data) vdc->unrealize =3D virtio_scsi_device_unrealize; vdc->set_config =3D virtio_scsi_set_config; vdc->get_features =3D virtio_scsi_get_features; + vdc->tell_feature_name =3D virtio_scsi_tell_feature_name; vdc->reset =3D virtio_scsi_reset; vdc->start_ioeventfd =3D virtio_scsi_dataplane_start; vdc->stop_ioeventfd =3D virtio_scsi_dataplane_stop; diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs index 765d363..3524aa7 100644 --- a/hw/virtio/Makefile.objs +++ b/hw/virtio/Makefile.objs @@ -3,12 +3,15 @@ common-obj-y +=3D virtio-rng.o common-obj-$(CONFIG_VIRTIO_PCI) +=3D virtio-pci.o common-obj-y +=3D virtio-bus.o common-obj-y +=3D virtio-mmio.o +common-obj-y +=3D virtio-qmp.o =20 obj-y +=3D virtio.o virtio-balloon.o=20 obj-$(CONFIG_LINUX) +=3D vhost.o vhost-backend.o vhost-user.o obj-$(CONFIG_VHOST_VSOCK) +=3D vhost-vsock.o obj-y +=3D virtio-crypto.o obj-$(CONFIG_VIRTIO_PCI) +=3D virtio-crypto-pci.o +else +obj-y +=3D virtio-stub.o endif =20 common-obj-$(call lnot,$(CONFIG_LINUX)) +=3D vhost-stub.o diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 37cde38..d97c8ce 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -509,6 +509,19 @@ static Property virtio_balloon_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static const char *virtio_balloon_tell_feature_name(VirtIODevice *vdev, + unsigned fbit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_BALLOON_F_MUST_TELL_HOST); + FBIT(VIRTIO_BALLOON_F_STATS_VQ); + FBIT(VIRTIO_BALLOON_F_DEFLATE_ON_OOM); + }; +#undef FBIT + return NULL; +} + static void virtio_balloon_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -523,6 +536,7 @@ static void virtio_balloon_class_init(ObjectClass *klas= s, void *data) vdc->get_config =3D virtio_balloon_get_config; vdc->set_config =3D virtio_balloon_set_config; vdc->get_features =3D virtio_balloon_get_features; + vdc->tell_feature_name =3D virtio_balloon_tell_feature_name; vdc->set_status =3D virtio_balloon_set_status; vdc->vmsd =3D &vmstate_virtio_balloon_device; } diff --git a/hw/virtio/virtio-qmp.c b/hw/virtio/virtio-qmp.c new file mode 100644 index 0000000..6eaef9a --- /dev/null +++ b/hw/virtio/virtio-qmp.c @@ -0,0 +1,134 @@ +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "qmp-commands.h" + +#include "hw/virtio/virtio.h" + +static VirtioInfoList *qmp_query_virtio_one(VirtIODevice *vdev) +{ + VirtioInfoList *info_list; + VirtioInfo *info; + unsigned int idx; + + info_list =3D g_new0(VirtioInfoList, 1); + info_list->value =3D g_new0(VirtioInfo, 1); + + info =3D info_list->value; + info->qom_path =3D object_get_canonical_path(OBJECT(vdev)); + info->status =3D vdev->status; + info->host_features =3D vdev->host_features; + info->guest_features =3D vdev->guest_features; + + for (idx =3D 8; idx--; ) { + const char *name =3D virtio_tell_status_name(vdev, idx); + strList *status; + + if (!name) { + continue; + } + if (!(vdev->status & (1 << idx))) { + continue; + } + + status =3D g_new(strList, 1); + status->value =3D g_strdup(name); + + status->next =3D info->status_names; + info->status_names =3D status; + } + + for (idx =3D 64; idx--; ) { + const char *name =3D virtio_tell_device_feature_name(vdev, idx); + VirtioFeatureList **head =3D &info->device_features_names; + VirtioFeatureList *feature; + + if (!name) { + name =3D virtio_tell_common_feature_name(vdev, idx); + head =3D &info->common_features_names; + } + if (!name) { + continue; + } + if (!virtio_host_has_feature(vdev, idx)) { + continue; + } + + feature =3D g_new0(VirtioFeatureList, 1); + feature->value =3D g_new0(VirtioFeature, 1); + + feature->value->name =3D g_strdup(name); + feature->value->acked =3D virtio_vdev_has_feature(vdev, idx); + + feature->next =3D *head; + *head =3D feature; + } + + return info_list; +} + +typedef struct QueryVirtioEntry { + VirtIODevice *vdev; + QTAILQ_ENTRY(QueryVirtioEntry) link; +} QueryVirtioEntry; + +typedef QTAILQ_HEAD(, QueryVirtioEntry) QueryVirtioHead; + +static void qmp_query_virtio_recursive(QueryVirtioHead *head, BusState *bu= s) +{ + BusChild *kid; + + QTAILQ_FOREACH(kid, &bus->children, sibling) { + DeviceState *dev =3D kid->child; + BusState *child; + + if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_DEVICE)) { + QueryVirtioEntry *entry =3D g_new0(QueryVirtioEntry, 1); + + entry->vdev =3D VIRTIO_DEVICE(dev); + QTAILQ_INSERT_TAIL(head, entry, link); + } + QLIST_FOREACH(child, &dev->child_bus, sibling) { + qmp_query_virtio_recursive(head, child); + } + } +} + +VirtioInfoList *qmp_query_virtio(bool has_path, const char *path, Error **= errp) +{ + BusState *bus =3D sysbus_get_default(); + VirtioInfoList *list =3D NULL; + + if (!bus) { + return NULL; + } + + if (has_path) { + Object *obj =3D object_resolve_path(path, NULL); + if (!obj) { + return NULL; + } + if (!object_dynamic_cast(OBJECT(obj), TYPE_VIRTIO_DEVICE)) { + return NULL; + } + + list =3D qmp_query_virtio_one(VIRTIO_DEVICE(obj)); + } else { + QueryVirtioHead head; + QueryVirtioEntry *query, *tmp; + + QTAILQ_INIT(&head); + qmp_query_virtio_recursive(&head, bus); + + QTAILQ_FOREACH_SAFE(query, &head, link, tmp) { + VirtioInfoList *entry =3D qmp_query_virtio_one(query->vdev); + + QTAILQ_REMOVE(&head, query, link); + g_free(query); + + entry->next =3D list; + list =3D entry; + } + } + + return list; +} diff --git a/hw/virtio/virtio-stub.c b/hw/virtio/virtio-stub.c new file mode 100644 index 0000000..185d4bd --- /dev/null +++ b/hw/virtio/virtio-stub.c @@ -0,0 +1,9 @@ +#include "qemu/osdep.h" +#include "qmp-commands.h" +#include "qapi/qmp/qerror.h" + +VirtioInfoList *qmp_query_virtio(bool has_path, const char *path, Error **= errp) +{ + error_setg(errp, QERR_UNSUPPORTED); + return NULL; +} diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index ad564b0..23b33db 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -2198,6 +2198,47 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int= version_id) return 0; } =20 +const char *virtio_tell_status_name(VirtIODevice *vdev, unsigned sbit) +{ +#define SBIT(sbit) case sbit: return #sbit + switch (1 << sbit) { + SBIT(VIRTIO_CONFIG_S_ACKNOWLEDGE); + SBIT(VIRTIO_CONFIG_S_DRIVER); + SBIT(VIRTIO_CONFIG_S_DRIVER_OK); + SBIT(VIRTIO_CONFIG_S_FEATURES_OK); + SBIT(VIRTIO_CONFIG_S_NEEDS_RESET); + SBIT(VIRTIO_CONFIG_S_FAILED); + } +#undef SBIT + return NULL; +} + +const char *virtio_tell_common_feature_name(VirtIODevice *vdev, unsigned f= bit) +{ +#define FBIT(fbit) case fbit: return #fbit + switch (fbit) { + FBIT(VIRTIO_F_NOTIFY_ON_EMPTY); + FBIT(VIRTIO_F_ANY_LAYOUT); + FBIT(VIRTIO_RING_F_INDIRECT_DESC); + FBIT(VIRTIO_RING_F_EVENT_IDX); + FBIT(VIRTIO_F_BAD_FEATURE); + FBIT(VIRTIO_F_VERSION_1); + FBIT(VIRTIO_F_IOMMU_PLATFORM); + } +#undef FBIT + return NULL; +} + +const char *virtio_tell_device_feature_name(VirtIODevice *vdev, unsigned f= bit) +{ + VirtioDeviceClass *vdc =3D VIRTIO_DEVICE_GET_CLASS(vdev); + + if (vdc->tell_feature_name) { + return vdc->tell_feature_name(vdev, fbit); + } + return NULL; +} + void virtio_cleanup(VirtIODevice *vdev) { qemu_del_vm_change_state_handler(vdev->vmstate); diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 098bdaa..25f47da 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -141,6 +141,8 @@ typedef struct VirtioDeviceClass { void (*save)(VirtIODevice *vdev, QEMUFile *f); int (*load)(VirtIODevice *vdev, QEMUFile *f, int version_id); const VMStateDescription *vmsd; + /* Tells the name of device specific feature */ + const char *(*tell_feature_name)(VirtIODevice *vdev, unsigned fbit); } VirtioDeviceClass; =20 void virtio_instance_init_common(Object *proxy_obj, void *data, @@ -292,6 +294,10 @@ void virtio_queue_aio_set_host_notifier_handler(VirtQu= eue *vq, AioContext *ctx, VirtQueue *virtio_vector_first_queue(VirtIODevice *vdev, uint16_t vector); VirtQueue *virtio_vector_next_queue(VirtQueue *vq); =20 +const char *virtio_tell_status_name(VirtIODevice *vdev, unsigned sbit); +const char *virtio_tell_common_feature_name(VirtIODevice *vdev, unsigned f= bit); +const char *virtio_tell_device_feature_name(VirtIODevice *vdev, unsigned f= bit); + static inline void virtio_add_feature(uint64_t *features, unsigned int fbi= t) { assert(fbit < 64); diff --git a/qapi-schema.json b/qapi-schema.json index 1845795..51cd0f3 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3200,3 +3200,73 @@ # Since: 2.11 ## { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} } + +## +# @VirtioFeature: +# +# Virtio feature bit with negotiation status +# +# @name: name of feature bit +# +# @acked: negotiation status, `true' if guest acknowledged the feature +# +# Since: 2.12 +## +{ + 'struct': 'VirtioFeature', + 'data': { + 'name': 'str', + 'acked': 'bool' + } +} + +## +# @VirtioInfo: +# +# Information about virtio device +# +# @qom-path: QOM path of the device +# +# @status: status bitmask +# +# @host-features: bitmask of features, exposed by device +# +# @guest-features: bitmask of features, acknowledged by guest +# +# @status-names: names of checked bits in status bitmask +# +# @common-features-names: names exposed features and negotiation status, +# that are common to all devices +# +# @device-features-names: names exposed features and negotiation status, +# that are specific to this device +# +# Since: 2.12 +## +{ + 'struct': 'VirtioInfo', + 'data': { + 'qom-path': 'str', + + 'status': 'uint8', + 'host-features': 'uint64', + 'guest-features': 'uint64', + + 'status-names': ['str'], + 'common-features-names': ['VirtioFeature'], + 'device-features-names': ['VirtioFeature'] + } +} + +## +# @query-virtio: +# +# Returns virtio information such as device status and features +# +# Since: 2.12 +## +{ + 'command': 'query-virtio', + 'data': {'*path': 'str'}, + 'returns': ['VirtioInfo'] +} --=20 2.1.4 From nobody Wed May 15 10:36:38 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513542407502666.0606786964678; Sun, 17 Dec 2017 12:26:47 -0800 (PST) Received: from localhost ([::1]:55382 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfWI-0006Ax-DI for importer@patchew.org; Sun, 17 Dec 2017 15:26:46 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55223) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQfUV-0005CH-9s for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:25:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eQfUQ-00036C-Md for qemu-devel@nongnu.org; Sun, 17 Dec 2017 15:24:55 -0500 Received: from mail-eopbgr50129.outbound.protection.outlook.com ([40.107.5.129]:59082 helo=EUR03-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eQfUQ-00035K-A8; Sun, 17 Dec 2017 15:24:50 -0500 Received: from localhost.localdomain (194.28.30.174) by HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.323.15; Sun, 17 Dec 2017 20:24:45 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Mo6LWgc2kEgw66EF6EOq417d9bycjedJHXWEHt3lwnY=; b=JniHIfzWEkxjxMrvforicmi3C/XoaDUAJ1Q14PIiYyEWJY+GtGWoFTKFgnuGaVdpVrGgq4WheXyCyV/WkBMid0bq3JnRyilb2DFLbHHnfi2umdrbONwRMJtJG20/zp0DQ78M9qgh5TAaXkxZPES6RP8/henVKhu2jcKhfWHqpzE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=jan.dakinevich@virtuozzo.com; From: Jan Dakinevich To: qemu-devel@nongnu.org Date: Sun, 17 Dec 2017 23:25:55 +0300 Message-Id: <1513542355-28203-3-git-send-email-jan.dakinevich@virtuozzo.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> References: <1513542355-28203-1-git-send-email-jan.dakinevich@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [194.28.30.174] X-ClientProxiedBy: VI1PR0202CA0006.eurprd02.prod.outlook.com (2603:10a6:803:14::19) To HE1PR0801MB2746.eurprd08.prod.outlook.com (2a01:111:e400:7baf::26) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2a22e956-84c4-453a-0ec9-08d5458c377e X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(5600026)(4604075)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603307); SRVR:HE1PR0801MB2746; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 3:HJTD8iJAQgLBKoYTWAk127dz2GQuf+I1XguarP9tw3H5NyGZYgSE4m7tCWFY4uvHeH4FeaVRuc1VCfJhhB3i8MEP+PQlesHzgPHIkfL8kYMwWrcSV+VG6h9hkXEOPkgI3WOBv372pR0jjsntS3w5F6I1bRWVNDwTa9xCaT7RSuw1xrllAGII4fH+Qa1CUN6d+nw2SJzM7H12KCGEN6yMCevTmRl+OkIOkL4jymnC9T6YmQBLgPg1VIM2lbFAuSEM; 25:F65s4AGrfBgXmSNmjN3Q+qbBTTj8zpGb3Y1Zi5STp6ZT36YsV2bCWo/ocMZMbpurrhKj6h/YhhPGfdJN1Sd4HGeCSG5m3aRFfCiAVMK5h8MEXjA7dKw+JNI+D/nlBHFUrVbz8g0Bb+NqxmEezlXdmk+NpZ7AOw8csPVH9VNsrP2yr2QpidmzQTIOXNNxlWArDrdENeW2Pb/pcXspDW4VdeL/GJb+5Q+yXhpNrA+67Zg+7X1rnqOozjiS2kCD940+wpSgr40hBquwyot4hotWkw9YFJyiAgrnij5GiuiuL4vc7k94Mu4bLpVe244emOL4VbEQtp+spsqXPRdHBQ7h2w==; 31:8DAUs0NozU25pSrYX5hAY+9HNzTJOpmMLPmQvvN7K7/wMV5hwymu/90sUEKhY+eEknsS2+XO5L+zjjH1OrretanKt0HfNOyVqf9HQHIzaRjvlcZYwCPYBMoLxNAM2ZTxhBBLI7jXN+9vIVLwczbtPeNnTKhbJ40OpZtb5N8SRcJnaJFeAP2yrCPrlWS7ceuOwCMaQ/nOkcLfXZWnRFEMGyCWAxG0YbflfSoQPkmEaMk= X-MS-TrafficTypeDiagnostic: HE1PR0801MB2746: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:FwdscpsRXokH4TmYFnsB2/7aQlCGbH3pusmzGlrCFcFgcfoZmrKwLxt+3FWfVIuvtjflozoVu9Jr2b8RW9RHdVc2Vrb7FRuGV9pzuX9xNro/B7OZDY6fY4r8ESAsJUDct5KcPqZOp/Tt253PX3YsQiOAzojoOeWI4uJi0RI2EwAISrZI4FFMb7h2sRJJqH93WNVqW9aF/C99/nPVVGGFn4oK3NZvM2TQjhEoZVTZYSR8+lq85uoUy2AyGVvzZdoMyqMTF7UTKFsxoSE9uwr8T0CXI8kImPXeA+ZWGtxe2GXWEfGriQ2yxcryY/Q1WqWBdZtSfakmSSyDoDcoyhd95j0szg6al/ahaw8oJlZUOJKFpWS5FRtwyexEBrLxe7nCB7MrVTd8ELxP7f6pPBIEpy3VBVL4ayqBRpgadmKKTG0=; 4:7by6xkT+ftyxTAbmgK990Z8fkbU2HQm2wg38U5q5cXJ3w92E6173L+IVCgvhc+lbdetImWAzPNrLHt4JPwJPkMF0xkbUUaGZQaUbZ2p0yYTTXDffbi9hD1RZc7Y7h6y8h4LIOHODle/tvpoQZzpDVgVPIzTKjZ1G04vx0SYkWIkv4plLqTSn1Q2cSg4P7lIQVmwclrcZC0wphQvJ0rhP3zjW4U6txu8/xDuOf4gPrLh2oFBTAGnsZMbvvcDvDALTJP2zp48dX2SyM2jsXlR1Ww== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(2401047)(5005006)(8121501046)(3002001)(10201501046)(3231023)(93006095)(93001095)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:HE1PR0801MB2746; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:HE1PR0801MB2746; X-Forefront-PRVS: 05245CA661 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6069001)(346002)(376002)(366004)(396003)(39840400004)(199004)(189003)(478600001)(25786009)(6916009)(2950100002)(97736004)(6666003)(105586002)(4326008)(86362001)(47776003)(66066001)(5660300001)(53936002)(6506007)(386003)(7416002)(6116002)(3846002)(2906002)(81156014)(48376002)(68736007)(36756003)(8676002)(51416003)(7736002)(16526018)(6486002)(8936002)(16586007)(6512007)(54906003)(81166006)(76176011)(52116002)(2361001)(2351001)(106356001)(305945005)(50226002)(50466002)(316002)(81973001); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB2746; H:localhost.localdomain; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0801MB2746; 23:gJLUA60mEFtzE6m6cC10SBGcr8/ZJlmJXDz3IEp?= =?us-ascii?Q?vcoivMrY1dmu2NGeAfOnwNhE178OjBu3A8v3slxZmQFnN8/q2i+75YliC5MM?= =?us-ascii?Q?D6gdfhpUNEjLEDlRXsAYtXEJGHRE2yQlmsqQZs3IuzkjmcxESD7TTN0TXSBX?= =?us-ascii?Q?J8ESarb9U+ffKDYWnVgGVe7zp/lPFK+yFR+YMyj+WilMG7sScwfybj4alkXa?= =?us-ascii?Q?kycZ4Eqj0h1mATKma3GjLlnbIFqbun4oe9EaFX5lv1klgt7nB0uQvtbnmJPB?= =?us-ascii?Q?REWuIKuttnbqJ7OoWgTJhnjrFEj6dNgDfAAI9F0DK4wQ1i3dHdwudOQfGzIv?= =?us-ascii?Q?BoGbNhz0lT3QR+xNJpyEPfecTqj2kzq+qoGAAz0xEvGes1ktmmuZ34zmTSW2?= =?us-ascii?Q?FchdNVdLUVtS2iosttD5PI4OqcQdGc/Oj9qPysYC2uReZJB8Z8P/30WDrN2S?= =?us-ascii?Q?zpTNe0dmFfyAwbrsZnLW1ChplkzF25bg3ODL66c6A/MhNLfYzNzdO56OGvuw?= =?us-ascii?Q?DdTW0fZNrjlObW/ieln3rzJ1KLZmpBIdOGuy0G9S6t4Tpe4R71/KfNwUOKMZ?= =?us-ascii?Q?vDiZaSFQor0p4EnRye0MVKFmwreeaLlGFPgysLaT1dG1k0rgmfMg0FBiPrWX?= =?us-ascii?Q?ulh6s64JN+05YItslCAR+QAU4suSjttEwvR7C0dR6Pj+eRxkfqY7RnO8e37F?= =?us-ascii?Q?VYAV1aE6RKd1kXEW0RuI8mtyMpYEvmRtifHlXwIlp+N0qnwkLGnngm5T2IiD?= =?us-ascii?Q?UaPhyxAPlwymIWnDRv0I08PWOrNybKOg0biE89kk0X2+pKShpxBk6BRPUYGi?= =?us-ascii?Q?ApCCV61fr6gDjNF7YueXm8cwpfEx9klIGkoFkd6lPX5Cf6IGjSD+vCUjXgby?= =?us-ascii?Q?v2HgTBZnz9tIh4Yv4hjTlZjtbOt+MiXsBS9V0zZxEYfViwhyTZSCyAqWF3YS?= =?us-ascii?Q?Rn18sBTdhM0L0x1Bn1VAcNRXt8QzxMd3xcair8IPZt2g3/HV/tMkjnzL+uWw?= =?us-ascii?Q?3hPo8pe92wwmonHo0pZatfY2Meft5SwxslRAdkLSwyMl+JIQAAzI8h6sdw/N?= =?us-ascii?Q?+I7eHNzNil5pDAHrSCYsjy+R8/KslxBG9Lvwh9Kl7ObgwVo+aN2rneAMU/TK?= =?us-ascii?Q?Txst8hyTyS0lv58oZNb8CyYK50+QUaUD2KNQLccAQMgBVQHLugD/fmg=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 6:Oumduu5vkRfDGg3um+88oaT0Be4nhu2mcppSp7ItSurQUaSA44RZe7O/7jU/Kuc/o7sMCgzPQuJ3difNMLiSNHUi9lS/lvGMavQ657kzQKcEBMuzE9kA3gmF+rUSp2ftnerNe4Ib8bi/Nl17OlRh1iEGAOAKCpMaGApNUOEQfzsDLxtnRrx6EexHK4LtAOw8kKSOt4G/MykUmyi4YrhuxUoKy8+a755wm0rpPttL9y0NMhKVxQ3ljg6di2FHHNtxNfAdVPAiLYBetbeclhnVgNydWDGgET+jYxM1vAHH6h+Fh1wVk0vbPyVZrVvaey4MGm2K2+FIlwzQDUwY0cXd+St/CacOfte32ejTvS0HmeU=; 5:1yzf4rfENI91BurWRNXIluxhjKGHDh3k5ePH8oE9YdQ0jzIJnlvAJoBztoXQVzga2p575z8GwzbPJtPBkr9iVKxbMt2WFVFbmFDTfhXCrHVeLW00m85FHx1ZG//fJRB8t5X3X0N3x20xAozPO4xiSx/3c+sI7y3rt5F9DLETpsg=; 24:vz1CZMFzYM0IqifDK9zihJWC2yTSNQ5PybGCkibhA7uQgGsqleZAtcXviEtsU1B5kQtPfqIOrK8XJU7gzivi9s6RBFzY3gwOzge8rsza63A=; 7:p1FABcePGYRxiNAdGZdtokLzIqBWCry6H6RB8SmDANlPm7RcY+DBF59JL0IHgOoqRtBY2qPFvgVovoetcdXWm8qDr/PTx9d/OHIeRdW2PkQQJb6AJe/e8xwVqhK18OzE1E57Um1yPeAPQUYyzwLr8PS8roOn5PE9nBJAzg66H9/TvuaBhBcH9fHk7XXYmp/toUqNR75HYeLU2r9GfX8dyaPzxHpNzhjGS73HCtsf//JIN1ykUaYChSz9O9do4DWx SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB2746; 20:2jxzAyUKTFfejZppAMLs6xkTMjgMlkHB3f14DCBpVkG1hVVWaLLzT6Ebo69gfZJFkd2l6yGDEJYGGnz6t6T1VQNGOSshMSA0HLptAg4Xw+YI9fT7WcK/ztGUiZJlz8vMRBWGcGOwtm0tQ86Cg6OCK/7DicInVfDeHGATb/98EWI= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Dec 2017 20:24:45.2320 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2a22e956-84c4-453a-0ec9-08d5458c377e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2746 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.5.129 Subject: [Qemu-devel] [RFC v6 2/2] virtio: add `info virtio' HMP 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: Kevin Wolf , "Denis V. Lunev" , qemu-block@nongnu.org, Amit Shah , Jason Wang , Cornelia Huck , "Dr. David Alan Gilbert" , Markus Armbruster , Jan Dakinevich , "Michael S. Tsirkin" , Stefan Hajnoczi , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @virtuozzo.com) X-ZohoMail: RDKM_0 RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The command prints data from `query-virtio' QMP in human-readable format. Cc: Denis V. Lunev Signed-off-by: Jan Dakinevich --- hmp-commands-info.hx | 14 ++++++++++ hmp.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ hmp.h | 1 + 3 files changed, 89 insertions(+) diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx index 54c3e5e..292280a 100644 --- a/hmp-commands-info.hx +++ b/hmp-commands-info.hx @@ -868,6 +868,20 @@ enabled) memory in bytes. ETEXI =20 STEXI +@item info virtio +@findex virtio +Display guest and host fetures for all virtio devices. +ETEXI + + { + .name =3D "virtio", + .args_type =3D "path:s?", + .params =3D "[path]", + .help =3D "show virtio info", + .cmd =3D hmp_info_virtio, + }, + +STEXI @end table ETEXI =20 diff --git a/hmp.c b/hmp.c index 35a7041..786782b 100644 --- a/hmp.c +++ b/hmp.c @@ -43,6 +43,7 @@ #include "hw/intc/intc.h" #include "migration/snapshot.h" #include "migration/misc.h" +#include "hw/virtio/virtio.h" =20 #ifdef CONFIG_SPICE #include @@ -2918,3 +2919,76 @@ void hmp_info_memory_size_summary(Monitor *mon, cons= t QDict *qdict) } hmp_handle_error(mon, &err); } + +#define HMP_INFO_VIRTIO_INDENT 2 +#define HMP_INFO_VIRTIO_FEATURE 40 + +static void hmp_info_virtio_print(Monitor *mon, VirtioInfo *info) +{ + Object *obj =3D object_resolve_path(info->qom_path, NULL); + char *path =3D qdev_get_dev_path(DEVICE(obj)); + VirtioFeatureList *feat; + strList *status; + + monitor_printf(mon, "%s at %s\n", object_get_typename(obj), path); + g_free(path); + + monitor_printf(mon, "%*sQOM path: %s\n", + HMP_INFO_VIRTIO_INDENT, "", info->qom_path); + + /* device status */ + monitor_printf(mon, "%*sstatus: 0x%02"PRIx8"\n", + HMP_INFO_VIRTIO_INDENT, "", info->status); + for (status =3D info->status_names; status; status =3D status->next) { + monitor_printf(mon, "%*s%s\n", + HMP_INFO_VIRTIO_INDENT * 2, "", status->value); + } + + + /* host and guest feature */ + monitor_printf(mon, "%*shost features: 0x%016"PRIx64"\n", + HMP_INFO_VIRTIO_INDENT, "", info->host_features); + monitor_printf(mon, "%*sguest features: 0x%016"PRIx64"\n", + HMP_INFO_VIRTIO_INDENT, "", info->guest_features); + + /* common features */ + monitor_printf(mon, "%*scommon features:%s\n", + HMP_INFO_VIRTIO_INDENT, "", + info->common_features_names ? "" : " (none)"); + for (feat =3D info->common_features_names; feat; feat =3D feat->next) { + monitor_printf(mon, "%*s%-*s%s\n", + HMP_INFO_VIRTIO_INDENT * 2, "", + HMP_INFO_VIRTIO_FEATURE, feat->value->name, + feat->value->acked ? " acked" : ""); + } + + /* device features */ + monitor_printf(mon, "%*sdevice features:%s\n", + HMP_INFO_VIRTIO_INDENT, "", + info->device_features_names ? "" : " (none)"); + for (feat =3D info->device_features_names; feat; feat =3D feat->next) { + monitor_printf(mon, "%*s%-*s%s\n", + HMP_INFO_VIRTIO_INDENT * 2, "", + HMP_INFO_VIRTIO_FEATURE, feat->value->name, + feat->value->acked ? " acked" : ""); + } +} + +void hmp_info_virtio(Monitor *mon, const QDict *qdict) +{ + const char *path =3D qdict_get_try_str(qdict, "path"); + Error *err =3D NULL; + VirtioInfoList *head, *info; + + + head =3D qmp_query_virtio(!!path, path, &err); + if (err) { + return; + } + + for (info =3D head; info; info =3D info->next) { + hmp_info_virtio_print(mon, info->value); + } + + qapi_free_VirtioInfoList(head); +} diff --git a/hmp.h b/hmp.h index a6f56b1..156293e 100644 --- a/hmp.h +++ b/hmp.h @@ -147,5 +147,6 @@ void hmp_info_ramblock(Monitor *mon, const QDict *qdict= ); void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict); void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict); void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict); +void hmp_info_virtio(Monitor *mon, const QDict *qdict); =20 #endif --=20 2.1.4