From nobody Wed May 14 22:41:47 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1519671603016672.7895436122935; Mon, 26 Feb 2018 11:00:03 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3E4235D67A; Mon, 26 Feb 2018 17:54:05 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 037E060181; Mon, 26 Feb 2018 17:54:05 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 0C6C218033ED; Mon, 26 Feb 2018 17:54:04 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w1QHs3BE031062 for ; Mon, 26 Feb 2018 12:54:03 -0500 Received: by smtp.corp.redhat.com (Postfix) id 920755E1A3; Mon, 26 Feb 2018 17:54:03 +0000 (UTC) Received: from mx1.redhat.com (ext-mx04.extmail.prod.ext.phx2.redhat.com [10.5.110.28]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 7DCDB5C70F; Mon, 26 Feb 2018 17:54:02 +0000 (UTC) Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0082.outbound.protection.outlook.com [104.47.32.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 32D627B9A9; Mon, 26 Feb 2018 17:54:01 +0000 (UTC) Received: from wsp141597wss.amd.com (165.204.78.1) by BY2PR12MB0146.namprd12.prod.outlook.com (10.162.82.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.506.18; Mon, 26 Feb 2018 17:53:57 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=/1W3XFNjXNPCxz3h60+dIqSRbY2kaGSyPXsSr39PZL8=; b=BvkBx16z5zYzc5rYkERzh0e9VPNid9TM3lvq6/894kVXgLCv/6YowAaeM1Ohfw+lgeOJSux2pTcoU9sgrSYVZUzQAZJOOzvt+fGfIEd63UzyqnuIiHvkppFcmvD58x+q7p8GtbG4aKOXHZ5bjylfqIVSUpOCU5Ho8wB76+X60vw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=brijesh.singh@amd.com; From: Brijesh Singh To: libvir-list@redhat.com Date: Mon, 26 Feb 2018 11:53:36 -0600 Message-Id: <20180226175336.79815-5-brijesh.singh@amd.com> In-Reply-To: <20180226175336.79815-1-brijesh.singh@amd.com> References: <20180226175336.79815-1-brijesh.singh@amd.com> MIME-Version: 1.0 X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR17CA0004.namprd17.prod.outlook.com (10.173.147.14) To BY2PR12MB0146.namprd12.prod.outlook.com (10.162.82.19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 1a6d8c71-1b48-4d48-4f4d-08d57d41e980 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:BY2PR12MB0146; X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 3:WttHxd1FmDFOg7GgJiwL+In5Kpij4Sst8yMsmCcQGSX7calA2vSSlnyY0KbJCeaDThUK9yoF7qAvIo8x7j/ne9t+P5e4QDU29XxsGaGIl1M4ee7gTMh/zCVaFfRpUNHRhEO6Gpqe5ftzAAwzNugNG5qCps5n16VeOGqnRjssoojKwplEQol9/oTJOFBB0niNXR0l6K3d4tJ4xONQDBBLSNHZ6l4xr9JXqyZw6WaSFFPYsXRSjPIwEu0t1RMkP5zk; 25:R/d1lNnzxRwDQChU/UXTl6vBzCrlYBMXC48uMZPTdb5FxhMstUmDeFK4FS0urrHX85O6b25U1gMTtXGrX91iV5wOHXXL9b3VYXHhuWXHNkPKjQNm8wdbPJmWQGNKe5bQ/aB9NerjxvBx/h5hket/W60HtUSPeg7Zvcpu26znwmkTKF20wF7UK+aFoLFhYgMB4RYu8KWfTXWGF2ZfDlcCIuQXyKi8r4syD2Z7hmj7hw6o9PmtRF69EuA5jwH18uGXfUPI8mj4y8uv0WQHvbZ26E8yzL23NW8pI6ikhNOIkakVBD1H50mYiktut7vUIYpDKWfOUV1K0u4180GYJlkbDQ==; 31:5aUqNLdjkoP93njNlSBNshYurQqilcZXSaxmsIAsr8nt+8bn5y9BUL/cZW4EZsKeWe4nr8WYiqmX46Vw7/cSLOJkQNcUON/0wrInqmkROCQl5ojdWhif4OfgGu5GQSgBkBbgHyaUk4eGTLO8xIxEm1MbFSyD4HpzEFe0hRgQ8uDOUlX5DYXK+NrXew6b89UXPLU+iym9VfSvWQmBV2r1G6cBDW+HqjbTcNrWyndUah0= X-MS-TrafficTypeDiagnostic: BY2PR12MB0146: X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 20:SOFf9fhaT57molnFxEG1EWljFGGgCRleCXJcLeu41IFcrNJ5Vy+a8USJ2U8k9R+aRKDp//Bs+0ekaJTYROKDK/Ql7yKa+aJjFsVnHd6B/fEmalFTxuA3mlBjny8zHSYDrVSa5G2D78QiW1/KhSFCEleGGBG8E3QPF4+f/UsFn2koh+CvVzkQKR5py2ZDaD6VjkkfkA7lKMupDVjOyjjNluzJ0cF6GBTXW8rsmUvrGgn/5e4tU2J5SasIdwUhZ126VQ9VY9oxs6KMk3SbCu+gzoRhObBrgg2XFlCZh5pConUK5HgincDaWahG7PEwdBvJQzoXKUTj9avHyPyt1jdi6NkFF6d83hoT8ffxgXAHE+UXFMU0lZQIS+8+HLnEJoECr+QltO74rcD/D1EmJetgDxF5ZWU7Lk4FkpbIiUI0SQFlFDsLK6TYn4KuVouYYd9zGAlaqbCj/yuJpt42BLEy/wGLkVtVXmD561lnkgR+y1U2QkxE2jWlPzETL9p0mQ6z; 4:hVsQeMEoYL3wFl9XqtpncQ1TTisi7iMRvUfUbshlvtzz4JOmI1FgnUasTzhy8ISKyYgTRZCKoDWnUB4QA8c06rV3dBbUmu/nJDaZbVMfC4NT5Xt5i6Q2uTRxFmOiKfFEkTahmVhyGZ+TZ67VZQ3ZxO7KAOc8J+3omoEwiAjRiezewqPmV3nV9yLirwHUbAbxaIYnAD1gs7DRT3RcZnbswTrukJ+GMOp+LXocB0FkAKkLEw5QsOJ308tMxalfhH8jnQIKIXRg9OMGY7Z/peA9uDuWQzb5ydM9DtF+rJcES+fpZ0QRbkrCDERmhFJ40Uqa X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040501)(2401047)(8121501046)(5005006)(3002001)(3231220)(944501161)(52105095)(93006095)(93001095)(10201501046)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(6072148)(201708071742011); SRVR:BY2PR12MB0146; BCL:0; PCL:0; RULEID:; SRVR:BY2PR12MB0146; X-Forefront-PRVS: 05954A7C45 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6029001)(376002)(39380400002)(346002)(366004)(396003)(39860400002)(199004)(189003)(53416004)(76176011)(3846002)(8676002)(81156014)(68736007)(186003)(16526019)(6116002)(8936002)(66066001)(575784001)(36756003)(53936002)(86362001)(54906003)(1076002)(47776003)(26005)(50226002)(316002)(2906002)(81166006)(25786009)(5660300001)(6486002)(478600001)(97736004)(2351001)(50466002)(6916009)(39060400002)(106356001)(7696005)(2361001)(305945005)(52116002)(105586002)(59450400001)(386003)(48376002)(2950100002)(6666003)(4326008)(51416003)(7736002)(16586007); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR12MB0146; H:wsp141597wss.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR12MB0146; 23:g48LH2bT4a2Yjp9HRRnIhWRelo0FKvhA5jV1fJKWn?= =?us-ascii?Q?45C8Q+mnUVjllWPMd++SxPPOQ+g/mtN98XnmstoSHMItfJHBDdUgoAEgSpFg?= =?us-ascii?Q?fSagQYOBjX9PHKss1jBTyWwZvD3HK2LB88ih3rgSaFZIFLc28Si4sOyx1Nzf?= =?us-ascii?Q?4th3k1VBQfw0Ymj+qggzQIpEMQ6tCd9mD7J2ekPXsRdyIH5aMvS4EN1fFwTp?= =?us-ascii?Q?6a6SyL8prVZb8JCSnwzxgXqF6wI2vQhw5CzQBwYzksHkbYkpn0xch49aqutd?= =?us-ascii?Q?0UXNObx5J+NVV0B5cg/V7JV2m98nYx/zPMQ1RRXslDdLjNtonN5/ZOUkWztw?= =?us-ascii?Q?upz26UnaBPd63vxjwgjZxMGLzSV79k5tUnDrNObTaB/2aDBgSR2bEJLxBD+U?= =?us-ascii?Q?og/8Yy1s4+YwpPXOV0j82/lCaZGnnibmG4MdPnH4bNy9SBgpIjRQLSwdUBh5?= =?us-ascii?Q?8mNGGYRhl1Jlze1Hg2jn2gG4+50K6bfmA5iqAMTkpJVQAbD+ouJdlRzVE3Mm?= =?us-ascii?Q?lDKwzQildLtV6ptxLwRpiN8b2Ek4y19lmi1JQ8ubnnWty6Q3HjPJRiy4bCuO?= =?us-ascii?Q?WiQFxU+jChngWGxqHshgqwRmRZolQ6UltFqhQ5XDPvUg3FLUSGBCKeph36yH?= =?us-ascii?Q?pKMBcyYoFobBuo10OoRL/o+lbY2T9RWDjjg/erN1HUlsGDoxV0vUMMDCBlvu?= =?us-ascii?Q?9QHeI/Cs5kqmjCegP+/oPZAzSZTjtAyjwmRqeVZrMQh6l01qPn3wDve1+bX9?= =?us-ascii?Q?w5bkj0bbyjfRTH/iVQg8SIWhfyJ8HNfUpHPt9KT2ioMq5qYyJh4bQy6yIcRu?= =?us-ascii?Q?FDQJcLW506bQJRjp63SW9LSPzNO65revT6yMma/95BV0Zu3YmmSYiKLnOWSa?= =?us-ascii?Q?TWP1f23Qwe++FDF/AaUzvnOKle1i67BwyLIlV/jAHi6NGAyf/9P2yPH1t65/?= =?us-ascii?Q?hYGOr0JDu/JphRqS0W428bxL1mxgdcz+OpPtputRh4gc5uoSZFXX4Va0G+Ns?= =?us-ascii?Q?KaEmqcMRC7er+2nuCVnISbGEtrZyv0TAXJy9RKZMeJjsY7JCNAZcV2euq2Nn?= =?us-ascii?Q?M/pkrSIww4Rt8wjQPtGxWhfFqW3OprIVbPvBi8G+yWNnhCaBA8/tqA9ijaWC?= =?us-ascii?Q?ZMWkox/ZJwkwj7kZYWNsVrewhkMAhtjJ9mki/KqJZtWjcrUbvcHcvFhysuqL?= =?us-ascii?Q?6Tb2mZaLniFd96u6uaAY7AYManTbuDhP7eCHGmCCmRt18tDE0C/QKd9WOsXU?= =?us-ascii?Q?i8YafQpTEj4aFUebvAixHsBGBUQweDp++StE8Dk?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 6:UabQ0qqTD8c0Wtj7E3kuYxvg3XvK1n4QEc+T5dZwNIC4b0fKDI3GyYw/BbwOZrCHUSwU6YHeZCC1dEPl4A+MvZssDucyVwIRhWPR9cpeQZJ0MQ7qP8WiJ25eR4JYSSkfhM6/4k4f3/Vjzmu+lAfEo3WaajFlS/eJdmqBBv9ygbPTKd7+tp82oddXKXH7WDztGsZuE/ARw4EvGW6lPvKiw5xKODSQHmWgS0wSzWZdv9WJ9VOadIOjRzlFBYavXpr3rgtDQyXvfv/I+HGeTqZKRaeROlEj6yDNMSAULuayQAvnQQIMKnuQmG3+3japBXoNJXiJRd6xm0N28cYjRyApxSYawLMh3/1XfAAA1pvWmko=; 5:5BKU3sDBSPWGh4AZB2A/K8K6UhAd4cw5wLileg47M/frqZj32jc/GYePcLv7i22S+DatpXA8eo4rTybr9Cyf5IWsnMdrq/rTTit1yAPW6wF2CRzizuHCz70zsXIxyGAtCJt4ejs0ljZoWjzq3G4bSoBClU8Sxlkyc/mwuEpKv/c=; 24:fktBQenZZnpi98nfgsEA+aBvV3FQVQPnOhbLPFMWxLj9ewM1NeE7IurKh9d1S6FOSBGwemEUJ50gcppDFIANbheUAu/bmN1RCaEa1Yl2Jss=; 7:KRvVpWW5fPGJD06kd3zw99Pl6/txHFPAIPm4A1WIuU+ilhvq2P7mtWMdX0RueHzukXq3OB431Cg1uDQ90Bmxf8qy4Oox5dtl7WsCLgoAUztzrVWhSp6xilEL/kpOoi0VRlHrobuo4TSV9MV2oQrXNNytwWPN6YZ/pwYrNbah9yBCJor7u7FnpWd0SeLiYyJYMtI7/QnAJ1D9wA1Y+LDS1kroKKyBd/5FqX4RwUUUye4MHanikEG4Je1gvoRXkW0I SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 20:2/6TmHgri34GlirBpqNad0uG51HrauKpu1khKa5l1L4NC9lFP5p6z8w5ajfRdrGru7y1nHI4QPfRIteoqM6q3c9jYR1uTOg6tIlsrGt+6MCg+FFjgU4lKI5F8IIdjC7ucDyhCDQsTQlRTvuUFQmcYwa2oJQBAoz8yIdf+/jlSZaaRyYdFI3ZuNvN472+7UD8qi+dxtHzO5twgA9AbfwdE3wMMWCCNc0NucXjCzTgbraHIXEyBNwnPH0JC81VZdt6 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2018 17:53:57.6170 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1a6d8c71-1b48-4d48-4f4d-08d57d41e980 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR12MB0146 X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 26 Feb 2018 17:54:01 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 26 Feb 2018 17:54:01 +0000 (UTC) for IP:'104.47.32.82' DOMAIN:'mail-sn1nam01on0082.outbound.protection.outlook.com' HELO:'NAM01-SN1-obe.outbound.protection.outlook.com' FROM:'brijesh.singh@amd.com' RCPT:'' X-RedHat-Spam-Score: -0.031 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS) 104.47.32.82 mail-sn1nam01on0082.outbound.protection.outlook.com 104.47.32.82 mail-sn1nam01on0082.outbound.protection.outlook.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.28 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Cc: Tom Lendacky , Xiaogang Chen , Jon Grimm , brijesh.ksingh@gmail.com, Brijesh Singh Subject: [libvirt] [PATCH 4/4] libvirt-domain: add new virDomainGetSevVmMeasurement() API X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 26 Feb 2018 17:54:05 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The virDomainGetSevVmMeasurement() can be used to retrieve the measurement of encrypted VM launched using AMD SEV feature. The measurement is a signature of the memory contents that can be sent to the guest owner as an attestation that the memory was encrypted correctly by the firmware before booting the guest. Signed-off-by: Xiaogang Chen Signed-off-by: Brijesh Singh --- include/libvirt/libvirt-domain.h | 4 +++ src/driver-hypervisor.h | 4 +++ src/libvirt-domain.c | 41 +++++++++++++++++++++++++++++ src/libvirt_public.syms | 1 + src/qemu/qemu_driver.c | 57 ++++++++++++++++++++++++++++++++++++= ++++ src/qemu/qemu_monitor.c | 8 ++++++ src/qemu/qemu_monitor.h | 3 +++ src/qemu/qemu_monitor_json.c | 33 +++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 2 ++ src/remote/remote_driver.c | 3 ++- src/remote/remote_protocol.x | 17 +++++++++++- 11 files changed, 171 insertions(+), 2 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 4048acf38aaf..c0bcfea4723c 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -4756,4 +4756,8 @@ int virDomainSetLifecycleAction(virDomainPtr domain, unsigned int action, unsigned int flags); =20 +char * +virDomainGetSevVmMeasurement(virDomainPtr domain, + unsigned int flags); + #endif /* __VIR_LIBVIRT_DOMAIN_H__ */ diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index ce0e2b252552..73edcd8f059f 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1283,6 +1283,9 @@ typedef int unsigned int action, unsigned int flags); =20 +typedef char * +(*virDrvDomainGetSevVmMeasurement)(virDomainPtr dommain, + unsigned int flags); =20 typedef struct _virHypervisorDriver virHypervisorDriver; typedef virHypervisorDriver *virHypervisorDriverPtr; @@ -1528,6 +1531,7 @@ struct _virHypervisorDriver { virDrvDomainSetVcpu domainSetVcpu; virDrvDomainSetBlockThreshold domainSetBlockThreshold; virDrvDomainSetLifecycleAction domainSetLifecycleAction; + virDrvDomainGetSevVmMeasurement domainGetSevVmMeasurement; }; =20 =20 diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index eaec0979ad49..f285a3121548 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -12095,3 +12095,44 @@ int virDomainSetLifecycleAction(virDomainPtr domai= n, virDispatchError(domain->conn); return -1; } + +/** + * virDomainGetSevVmMeasurement: + * @domain: pointer to domain object + * @flags: currently unused, pass 0 + * + * Get launch measurement of SEV guest VM + * + * Returns a measurement string, or NULL in case of error. + */ +char * +virDomainGetSevVmMeasurement(virDomainPtr domain, + unsigned int flags) +{ + virConnectPtr conn; + VIR_DOMAIN_DEBUG(domain, "flags=3D0x%x", flags); + + virResetLastError(); + + virCheckDomainReturn(domain, NULL); + conn =3D domain->conn; + + virCheckReadOnlyGoto(conn->flags, error); + + if (conn->driver->domainGetSevVmMeasurement) { + char *ret; + + ret =3D conn->driver->domainGetSevVmMeasurement(domain, + flags); + if (!ret) + goto error; + + return ret; + } + + virReportUnsupportedError(); + +error: + virDispatchError(domain->conn); + return NULL; +} diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 95df3a0dbc7b..6e956d965a26 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -783,6 +783,7 @@ LIBVIRT_3.9.0 { LIBVIRT_4.1.0 { global: virStoragePoolLookupByTargetPath; + virDomainGetSevVmMeasurement; } LIBVIRT_3.9.0; =20 # .... define new API here using predicted next version number .... diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 313d730c791f..852d1f0fd2f7 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -21254,6 +21254,62 @@ qemuDomainSetLifecycleAction(virDomainPtr dom, return ret; } =20 +static char * +qemuDomainGetSevVmMeasurement(virDomainPtr dom, + unsigned int flags) +{ + virQEMUDriverPtr driver =3D dom->conn->privateData; + virDomainObjPtr vm; + char *ret =3D NULL, *tmp; + + virCheckFlags(0, NULL); + + if (!(vm =3D qemuDomObjFromDomain(dom))) + goto cleanup; + + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) + goto cleanup; + + if (!virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain is not running")); + goto endjob; + } + + if (virDomainGetSevVmMeasurementEnsureACL(dom->conn, vm->def) < 0){ + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("get sev vm measurement is not allowed")); + goto cleanup; + } + + if (vm->def->sev) { + goto endjob; + virReportError(VIR_ERR_INTERNAL_ERROR, + _("domain is not SEV guest")); + } + + if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < = 0) + goto endjob; + + VIR_DEBUG("query sev launch measurement"); + if(!(tmp =3D qemuMonitorGetSevMeasurement(QEMU_DOMAIN_PRIVATE(vm)->mon= ))){ + virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to get measurement")); + goto endjob; + } + + if (qemuDomainObjExitMonitor(driver, vm) < 0) + goto endjob; + + ret =3D tmp; + + endjob: + qemuDomainObjEndJob(driver, vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} =20 static virHypervisorDriver qemuHypervisorDriver =3D { .name =3D QEMU_DRIVER_NAME, @@ -21474,6 +21530,7 @@ static virHypervisorDriver qemuHypervisorDriver =3D= { .domainSetVcpu =3D qemuDomainSetVcpu, /* 3.1.0 */ .domainSetBlockThreshold =3D qemuDomainSetBlockThreshold, /* 3.2.0 */ .domainSetLifecycleAction =3D qemuDomainSetLifecycleAction, /* 3.9.0 */ + .domainGetSevVmMeasurement =3D qemuDomainGetSevVmMeasurement, /* 4.2.0= */ }; =20 =20 diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 195248c88ae1..e3dd078e4e73 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4400,3 +4400,11 @@ qemuMonitorSetWatchdogAction(qemuMonitorPtr mon, =20 return qemuMonitorJSONSetWatchdogAction(mon, action); } + +char * +qemuMonitorGetSevMeasurement(qemuMonitorPtr mon) +{ + QEMU_CHECK_MONITOR_NULL(mon); + + return qemuMonitorJSONGetSevMeasurement(mon); +} diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 1b2513650c58..dd0821178c47 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1176,4 +1176,7 @@ virJSONValuePtr qemuMonitorQueryNamedBlockNodes(qemuM= onitorPtr mon); =20 int qemuMonitorSetWatchdogAction(qemuMonitorPtr mon, const char *action); +char * +qemuMonitorGetSevMeasurement(qemuMonitorPtr mon); + #endif /* QEMU_MONITOR_H */ diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 4424abfa7148..1d7f0e7c168e 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -7974,3 +7974,36 @@ qemuMonitorJSONSetWatchdogAction(qemuMonitorPtr mon, virJSONValueFree(reply); return ret; } + +char * +qemuMonitorJSONGetSevMeasurement(qemuMonitorPtr mon) +{ + const char *tmp; + char *measurement =3D NULL; + virJSONValuePtr cmd; + virJSONValuePtr reply =3D NULL; + virJSONValuePtr data; + + if (!(cmd =3D qemuMonitorJSONMakeCommand("query-sev-launch-measure", N= ULL))) + return NULL; + + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) + goto cleanup; + + if (qemuMonitorJSONCheckError(cmd, reply) < 0) + goto cleanup; + + data =3D virJSONValueObjectGetObject(reply, "return"); + + if (!(tmp =3D virJSONValueObjectGetString(data, "data"))) + goto cleanup; + + if (VIR_STRDUP(measurement, tmp) < 0){ + goto cleanup; + } + +cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return measurement; +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 305f789902e9..b03b35ae0e8b 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -342,6 +342,8 @@ int qemuMonitorJSONGetBlockIoThrottle(qemuMonitorPtr mo= n, =20 int qemuMonitorJSONSystemWakeup(qemuMonitorPtr mon); =20 +char * qemuMonitorJSONGetSevMeasurement(qemuMonitorPtr mon); + int qemuMonitorJSONGetVersion(qemuMonitorPtr mon, int *major, int *minor, diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 9ea726dc45c0..080d244db156 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8497,7 +8497,8 @@ static virHypervisorDriver hypervisor_driver =3D { .domainSetGuestVcpus =3D remoteDomainSetGuestVcpus, /* 2.0.0 */ .domainSetVcpu =3D remoteDomainSetVcpu, /* 3.1.0 */ .domainSetBlockThreshold =3D remoteDomainSetBlockThreshold, /* 3.2.0 */ - .domainSetLifecycleAction =3D remoteDomainSetLifecycleAction /* 3.9.0 = */ + .domainSetLifecycleAction =3D remoteDomainSetLifecycleAction, /* 3.9.0= */ + .domainGetSevVmMeasurement =3D remoteDomainGetSevVmMeasurement /* 4.2.= 0 */ }; =20 static virNetworkDriver network_driver =3D { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 9dbd497b2fff..227ee8345683 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -3448,6 +3448,15 @@ struct remote_domain_set_lifecycle_action_args { unsigned int flags; }; =20 +struct remote_domain_get_sev_vm_measurement_args { + remote_nonnull_domain dom; + unsigned int flags; +}; + +struct remote_domain_get_sev_vm_measurement_ret { + remote_nonnull_string sev_measurement; +}; + /*----- Protocol. -----*/ =20 /* Define the program number, protocol version and procedure numbers here.= */ @@ -6135,5 +6144,11 @@ enum remote_procedure { * @priority: high * @acl: storage_pool:getattr */ - REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_TARGET_PATH =3D 391 + REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_TARGET_PATH =3D 391, + + /** + * @generate: both + * @acl: domain:read + */ + REMOTE_PROC_DOMAIN_GET_SEV_VM_MEASUREMENT =3D 392 }; --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list