From nobody Wed May 14 22:40:41 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 1519667671947602.5841476894575; Mon, 26 Feb 2018 09:54:31 -0800 (PST) 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 EC4D081DE9; Mon, 26 Feb 2018 17:54:27 +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 B499160C95; Mon, 26 Feb 2018 17:54:27 +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 81F9A18033F0; Mon, 26 Feb 2018 17:54:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w1QHs4Kn031076 for ; Mon, 26 Feb 2018 12:54:04 -0500 Received: by smtp.corp.redhat.com (Postfix) id 469DB60C95; Mon, 26 Feb 2018 17:54:04 +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 251B460BE6; Mon, 26 Feb 2018 17:54:01 +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 B34707B9A0; Mon, 26 Feb 2018 17:53:59 +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:56 +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=tvhcWJbbyvvvVQc2oQAVuzhKfMDkMSRsce2u+mifNjA=; b=3SnSuFoq5I/kq/CNGAoP2V+Qg9+eK3PZF1GQZ8Ca1HWS0nkKUtOT8LJPogUdGU7oS7K23xsPZoXmy0FT1kFAu2+2hKt2wGyD//BWpOnfQO2J7b/aK+y78xfcQxySQXjbYT6hx3uOPXGnLVASdX7j8UefhnMruXG8VcHAPKFKu9c= 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:35 -0600 Message-Id: <20180226175336.79815-4-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: e2d7e832-4525-4c7e-6d27-08d57d41e89b 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:vQmzt+QkFN2bi5eqgrKY3zEtqGUkaev1oQWcvjIuR4Oj9oDG80FFhx43GCXiC2sGq2a5P+7YaN/rDD4riTzOnbFGGeIq6wvh+5YGyUoWS3dC8Ovz+wFeqUQMKybcJwtiRhCgn+LIBv36jE7Pz/zsKGCPIMm7X7XZdYUnguOhfGxg+2O0jwOUSJsQeMDNEbKyb47l9u05fsIeXAlZXFTKQm/hwgd+oRtFoK6gW1RB0C9gcN3wHQkWebgEU6AYt6Yu; 25:8DNk3N5ga5k91LAWSr0sVn9o08aJ1bntUI5BqP7ihhv8Leqj3s66IlTWfQeY4m4M9RfXUHGDniI8DHmKOjeJUEqo/VWrrtRn2bi5YMIajf1brFSKxKaFcyn9KotgmqhPIGidD+8g2w7WGZGywXRTPRi+f+Mfc/dYi3OIUxVA/JIqOw5Bu/2EfvzY/7wtArGHbR2Hd2fcx0COzgM4OCzK5FVNPjzCKJOLLCecVHxawP3gYPzyuQMFDTXPHAllCXNyp6D6rPnDF3tjqpbHkW617TrloX4JbGsRN1pB6MFjsDZypCqRqjEpxqGxlRWU/+2Mnn34NoI1/QNXGkK2xOXn+A==; 31:Sd6OlZbIjkJWa7FT6ByAY538NjGPtpLVczqqNUTh4pOFmWoDR1ydXeXL7aoR+qpIKs00Hz6EbYFlmZSm7zpv+pml5dJETwNVXgs8VpHoWKv21kmq2AAoZBgWeopMBKafsSly2THstUjsDAJdym8yZW/BLfDLqw/ytGcySomTGmltXi86wNkiH7604GZj+RxKxgZ2TSSSXvVq7fjhhJPj/sD93qpNP9NHnis7xkSYjPA= X-MS-TrafficTypeDiagnostic: BY2PR12MB0146: X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 20:MIJQMcGAFd/DQNShD6DAt7ylLiaAfer+yG9chOl4RJX8TFG5lHaPAM1vqWcfGmwTsEsGcm3NTL54c9XEJVvuVK8lfwHRQWxTL0PdxMHVMbT6qZ8WDm2mSHgD9gekNEUxA0Y+wuqm1F3FG+s47H990gmvJmJ5G468A5BvQyRqExZiiXFCkr88PTLHHAjaqST17t6NGN5Gs6dK3IPG3va9Nvbb5hZZ2K0GjKG7LuljHLbSWydSRzOGtG7mS9cXm9rQ6+H4cvSDWshjBn1yCy+a8HRah1IJZd53QZrxXWo50NrvduirdScSppxkffcdd5bLanqGyl+qt9DK110RMzrecGpiVDlHeJj7yeQwEm9cMaGo0NlzQ6a/5t7IXbPhlByPjs2RsEbr3cgajv8YufvcRPI4E1tMWR+tMaowPSLl42YG2WRkJ4UAa9el1imGOxBf18LhahYnljwwti4+Voyrp1BsqLHhuC00QX/pFVNou+DfbgAkq3D+OVBteG9WObTJ; 4:RYZFTXR655N122KT8MkMVVJEdrNWXw1iyKUKs8/PLAiOLDYIInDYJD5nn5R8ioaFMrJLWvlURKmZfEYq5D7d0cnE40GJ0CKC//ZHO9tA48DTylRBaTijKEvALBMqsR3Tm1g9+3Ah1xsnKlET5l6GnnDdvZfvdFrcVotynTZTrrn/2zp0ira70Tu2ylojgp04ks2duzybB2waGFrwfaqp/HBKCNJIEvTu/gM9P7OEpVB+RPxmzr/lJNN5i9ya/6RLStO8D4FAAQE/22qcDgOeY4zsjjjTrLWpfNqwGD0FhHWze9F2PtfKNNqK+7oK6xDm 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)(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:BLniQOspdT9OYe46oxzogTNvZLEYitYyqF2zDeS87?= =?us-ascii?Q?SInfFXBTDdlOQvnpfKlZlKqOKgaq0/VMUgC08C2ROCgV3vW0U36DfC0jc2eZ?= =?us-ascii?Q?HzQtfCj018HH1TVINPZfR1eMsqvdM/2qno1/N6a6HoyxCupCnXWOjOkUKwpS?= =?us-ascii?Q?M0o/CRzHyO66+IfAkf53+iNmo3i+uH6AWoZ3fxUT13B1vKHQBYRh2Z3xZ41W?= =?us-ascii?Q?0ppoUdaxSAKBmJXMJjNe2bQDVSBbA/vvDPVNM253AlZ6mpTyrBDnCVpu2G2l?= =?us-ascii?Q?MrxfZ/sIeirSLEk44VKuEJnPfT8MC0IuBhBIr1y/M8yS+mUEASTetWb3YBW4?= =?us-ascii?Q?kp8WDFRaoxpl2XnGlvjGdvq/3cTcFpdgf6hppkQUsi57Bhv70nBVmKyRv5nC?= =?us-ascii?Q?r9qN/fUSo8HQDsTt2Hm3vFlopeu8jP5GOrFTcSHKT5U68/pUZOb7Qit3DXE+?= =?us-ascii?Q?oXAGFZXlFwhN9iiBK5hiICvCDFcDZIZ0H2bzjt6ZELvkYG/nQKCtZZfB5jC5?= =?us-ascii?Q?yQp9PjULo8eGn2OGgbwV/ePiQFr9nKPzB3YcPaxKlxPTtXtqCvysx5AuMGBl?= =?us-ascii?Q?Mv4jGJ5/XY6T+wDBfTPwkiGRfS9n7cf3STtS1WHWxiRb1GzHEJwA04Vg4kiU?= =?us-ascii?Q?Dlav0fwj47VylurcujH+4l+AR60eBJHFDgNNgH2B08I3DobFi2E4J/NLwxI5?= =?us-ascii?Q?Bc4jb7+sOCj4ivTy/zICDFYmu8sldb9nZbabFuXpGq9C48nBTTfPJrIl/x/p?= =?us-ascii?Q?lokDra+Urce4O/Q01bOEZR4OXuBSgzKY3t8/UwV8+YbNkC9cQ1S8DcfbmP7c?= =?us-ascii?Q?lXFWqzZsXMbFVZsLItLtUfO+XoXcMsTcbKXZRmBy1N4TBLY/WB+S1ZBN1eEc?= =?us-ascii?Q?igqixep1LRUFAsmyl6j7MEK8JDoGx/amqFbn2r8pBjMvzyQ6jOkhIK7mpm9Z?= =?us-ascii?Q?l9fuDACZFDrCzAnEM+m3W8EqZBwSDA5k4ZpLWrbhjf2/6Wv92E1YcCPw9xqG?= =?us-ascii?Q?yztGWwfzJ2ExWNZGaPe6gL11uxHjg4Ql+Tx38UDOKU+qX3uyuBIbHu0/MpWJ?= =?us-ascii?Q?2BDEpV4Are4CuGHIvuCWKt7p/IFHWb4JRXJqKCgYBgATPEP6aXPgZyYEEVfh?= =?us-ascii?Q?wqIdMk/nGgJzacyFFeXTcjnNhQjXhoTyraE4oaAJ3rqnqpBkNYmI48fq8eIn?= =?us-ascii?Q?RO61N4VU+xnR0xzDuweZOM4dm8PfqXZuGEOTyf9dll5qG5FsFgngH2tg748J?= =?us-ascii?Q?R+RSKIh9EoTjT/M7yg=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 6:n45kXmB9MBSkFfAUo6VZPVAlhb3LwQvYcoJRfZc9F7++ow1KHMqaemMCzrZGUU+XisgpI6aUgh7LklcNKDxuNFulHo/OYuUMBYAydQpZuuxu+tbb9yE6dU8lDQGBOFTD3ombkJ6dMDzfVnOFz11dTbI/w+XUJX8Gp4n9DPu7VAZ5QPet26FZyWinrx1wJB4Qas/zW/i5djzYBaexNwpthVFDcskrh+giQijgawwVtJ+K4Gxx+JL/X+RvAy++U4i09nrk8Bg8/zI4btyuik4KSJJqnTL3REuV8awpemlrqPehUdcXtLjE0yeDNb3IzXXIUa54S8K2iZZad/DQ8etuY8oQ9D1jbZD/YXtmLxj3qB0=; 5:AVAUpIFTpmNVHJ3j9m6rMcDzvt1Lm0eBEylXTShi8ccWcexzLkxwGGbXfb1fWyx8HVHLoiMBD83S3aAcGIsfQuOi+cPaflQubV5LIMI4sUL2P2d4nxBtZI/rL1Xdj83HyxFUYpPEgdw9R48DQNUeYzTf2CW3gQuMmqtjpKKFeJo=; 24:hM3fOMe9L8km8f5yj/giOUM/HYgQ+uO1IPsUWyxiyrL3wf6bgu8eUuUD69Fh1cE1BQd/rzFJiJUbwOE9QfQ6/qDNd0FGQ5+gtoSSa470nMU=; 7:amdsGEukymPAUsGRRP3i6c92hGpZtDhoVZomZw8CJAlFX8r6d4Ryst1yfOrLAY/tyOyO7sX1MVqrWHFhoagICAOdmogYpeKH/UUPFbfQAoButffII2Pt3ECse2zSJkRq/tUnINe0XEvtUbjwr/DE0G5bgu3rFQgsA1PlJI2IHh99E6RgrPwIz4P9JcgxuehKcIE9NwxS781v7kjEQK6g/fQoHKGH4EA0POAZiisDNkCBBcugX6G36gQpu93JZvyt SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR12MB0146; 20:LUHfe9R4b2UX6WE4Ld0v4l3ryZ6ZatLCPuIDPENNms+NfgTF0PnW08XI4ZfrIIF4rNbHPzS//NU4Cdy5uBZEYRVtBvGd+oNuObKYOq082V1z5s2yQDF5y8/R04h9st935N8pm7qnj6s0Cocl/zD4d0eVS9DDU8UVpjLzjxDiN+Zp6R/5RXYS+o1WdRWX4oKvsXJfKnD7UTYyZTjFJIaG4uhgN1/7T8YIwbZIT+J70ljpbaamqUPStZiaQgUcK4xe X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2018 17:53:56.1483 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e2d7e832-4525-4c7e-6d27-08d57d41e89b 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:53:59 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 26 Feb 2018 17:53:59 +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.12 X-loop: libvir-list@redhat.com Cc: Tom Lendacky , Xiaogang Chen , Jon Grimm , brijesh.ksingh@gmail.com, Brijesh Singh Subject: [libvirt] [PATCH 3/4] conf: introduce sev element in domain 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 26 Feb 2018 17:54:28 +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" Secure Encrypted Virtualization (sev) element is used to provide the guest owners input parameters used for creating an encrypted VM using AMD SEV feature. SEV feature supports running encrypted VM under the control of KVM. Encrypted VMs have their pages (code and data) secured such that only the guest itself has access to the unencrypted version. Each encrypted VM is associated with a unique encryption key; if its data is accessed to a different entity using a different key the encrypted guests data will be incorrectly decrypted, leading to unintelligible data. QEMU >=3D 2.12 provides 'sev-guest' object which supports launching encrypt= ed VMs. A typical command line # $QEMU ... \ -machine memory-encryption=3Dsev0 \ -object sev-guest,id=3Dsev0,cbitpos=3D47,reduced-phys-bits=3D5 \ ... Signed-off-by: Brijesh Singh --- docs/formatdomain.html.in | 71 +++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.c | 64 +++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 18 +++++++++++ src/qemu/qemu_command.c | 77 +++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 230 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 6fd2189cd2f4..d18e3fb1d976 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -8195,6 +8195,77 @@ qemu-kvm -net nic,model=3D? /dev/null =20

Note: DEA/TDEA is synonymous with DES/TDES.

=20 +

Secure Encrypted Virtualization (SEV)

+ +

+ The contents of the sev element is used to provide the + guest owners input used for creating an encrypted VM using the AMD + Secure Encrypted Virtualization (SEV) feature. + + SEV is an extension to the AMD-V architecture which supports running + encrypted virtual machine (VMs) under the control of KVM. Encrypted + VMs have their pages (code and data) secured such that only the gue= st + itself has access to the unencrypted version. Each encrypted VM is + associated with a unique encryption key; if its data is accessed to= a + different entity using a different key the encrypted guests data wi= ll + be incorrectly decrypted, leading to unintelligible data. +

+
+<domain>
+  ...
+  <sev>
+    <policy> 1 </policy>
+    <cbitpos> 47 </cbitpos>
+    <reduced-phys-bits> 5 </reduced-phys-bits>
+    <session> ... </session>
+    <dh-cert> ... </dh>
+  </sev>
+  ...
+</domain>
+
+ +

+ A least cbitpos and reduced-phys-bits must b= e nested + within the sev element. +

+
+
cbitpos
+
The cbitpos attribute provides the C-bit (aka encry= ption bit) + location in guest page table entry. The value of cbitpos is + hypervisor dependent and can be obtained through the sev element + from domaincapabilities. +
+
reduced-phys-bits
+
The reduced-phys-bits attribute provides the physic= al + address bit reducation. Similar to cbitpos the value of= + reduced-phys-bit is hypervisor dependent and can be obtained + through the sev element from domaincapabilities. +
+
policy
+
The policy attribute provides the guest policy whic= h must + be maintained by the SEV firmware. This policy is enforced by the fi= rmware + and restricts what configuration and operational commands can be per= formed + on this guest by the hypervisor. The guest policy provided during gu= est + launch is bound to the guest and cannot be changed throughout the li= fetime + of the guest. The policy is also transmitted during snapshot and mig= ration + flows and enforced on the destination platform. +
+
dh-cert
+
The dh-cert attribute provides the guest owners pub= lic + Diffie-Hellman (DH) key. The key is used to negotiate a master secret + key between the SEV firmware and guest owner. This master secret key= is + then used to establish a trusted channel between SEV firmware and gu= est + owner. The value must be encoded in base64. +
+
session
+
The session attribute provides the guest owners ses= sion + blob defined in SEV API spec. The value must be encoded in base64. +
+
+ +

Note: More information about policy bit definition, + dh and session is available in SEV API spec.

+

Example configs

=20

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d96b012b98f0..4c9921b5dca6 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -15539,6 +15539,61 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node, return ret; } =20 +static void +virDomainSevDefFree(virDomainSevDefPtr def) +{ + VIR_FREE(def->dh_cert); + VIR_FREE(def->session); + + VIR_FREE(def); +} + +static virDomainSevDefPtr +virDomainSevDefParseXML(xmlNodePtr sevNode, + xmlXPathContextPtr ctxt) +{ + char *tmp =3D NULL; + xmlNodePtr save =3D ctxt->node; + virDomainSevDefPtr def; + unsigned long policy; + + ctxt->node =3D sevNode; + + if (VIR_ALLOC(def) < 0) + return NULL; + + if ((tmp =3D virXPathString("string(./dh-cert)", ctxt))) { + if (VIR_STRDUP(def->dh_cert, tmp) < 0) + goto error; + + VIR_FREE(tmp); + } + + if ((tmp =3D virXPathString("string(./session)", ctxt))) { + if (VIR_STRDUP(def->session, tmp) < 0) + goto error; + + VIR_FREE(tmp); + } + + if (virXPathULongHex("string(./policy)", ctxt, &policy) =3D=3D 0) { + def->policy =3D policy; + } else { + def->policy =3D -1; + } + + virXPathInt("string(./cbitpos)", ctxt, &def->cbitpos); + virXPathInt("string(./reduced-phys-bits)", ctxt, &def->reduced_phys_bi= ts); + + ctxt->node =3D save; + return def; + +error: + VIR_FREE(tmp); + virDomainSevDefFree(def); + ctxt->node =3D save; + return NULL; +} =20 static virDomainMemoryDefPtr virDomainMemoryDefParseXML(virDomainXMLOptionPtr xmlopt, @@ -20212,6 +20267,15 @@ virDomainDefParseXML(xmlDocPtr xml, ctxt->node =3D node; VIR_FREE(nodes); =20 + /* Check for SEV feature */ + if ((n =3D virXPathNodeSet("./sev", ctxt, &nodes)) < 0) + goto error; + + if (n) { + def->sev =3D virDomainSevDefParseXML(nodes[0], ctxt); + VIR_FREE(nodes); + } + /* analysis of memory devices */ if ((n =3D virXPathNodeSet("./devices/memory", ctxt, &nodes)) < 0) goto error; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 368f16f3fbf9..f0f267b28f40 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -142,6 +142,9 @@ typedef virDomainPanicDef *virDomainPanicDefPtr; typedef struct _virDomainMemoryDef virDomainMemoryDef; typedef virDomainMemoryDef *virDomainMemoryDefPtr; =20 +typedef struct _virDomainSevDef virDomainSevDef; +typedef virDomainSevDef *virDomainSevDefPtr; + /* forward declarations virDomainChrSourceDef, required by * virDomainNetDef */ @@ -2289,6 +2292,18 @@ struct _virDomainKeyWrapDef { int dea; /* enum virTristateSwitch */ }; =20 +typedef struct _virDomainSevDef virDomainSevDef; +typedef virDomainSevDef *virDomainSevDefPtr; + +struct _virDomainSevDef { + char *dh_cert; + char *session; + int policy; + int cbitpos; + int reduced_phys_bits; +}; + + typedef enum { VIR_DOMAIN_IOMMU_MODEL_INTEL, =20 @@ -2454,6 +2469,9 @@ struct _virDomainDef { =20 virDomainKeyWrapDefPtr keywrap; =20 + /* SEV-specific domain */ + virDomainSevDefPtr sev; + /* Application-specific custom metadata */ xmlNodePtr metadata; =20 diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fa0aa5d5c3d4..653bbe154332 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -9663,6 +9663,80 @@ qemuBuildTPMCommandLine(virCommandPtr cmd, return 0; } =20 +static char * +qemuBuildSevCreateFile(const virDomainDef *def, const char *name, char *da= ta) +{ + char *base =3D virGetUserConfigDirectory(); + char *configDir, *configFile; + char uuidstr[VIR_UUID_STRING_BUFLEN]; + + virUUIDFormat(def->uuid, uuidstr); + + if (virAsprintf(&configDir, "%s/sev/%s", base, uuidstr) < 0) + goto error; + VIR_FREE(base); + + if (virFileMakePathWithMode(configDir, S_IRWXU) < 0) { + virReportSystemError(errno, _("cannot create config directory '%s'= "), + configDir); + goto error; + } + + if (!(configFile =3D virFileBuildPath(configDir, name, ".base64"))) + goto error; + + if (virFileRewriteStr(configFile, S_IRUSR | S_IWUSR, data) < 0) { + virReportSystemError(errno, _("failed to write data to config '%s'= "), + configFile); + goto error; + } + + return configFile; + +error: + return NULL; +} + +static int +qemuBuildSevCommandLine(virCommandPtr cmd, + const virDomainDef *def) +{ + virDomainSevDefPtr sev =3D def->sev; + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + virBuffer obj =3D VIR_BUFFER_INITIALIZER; + char *dh_cert_file =3D NULL; + char *session_file =3D NULL; + + /* qemu accepts DH and session blob as file, create a temporary file */ + if (sev->dh_cert && + !(dh_cert_file =3D qemuBuildSevCreateFile(def, "dh_cert", sev->dh_= cert))) + return -1; + + if (sev->session && + !(session_file =3D qemuBuildSevCreateFile(def, "session", sev->ses= sion))) + return -1; + + virCommandAddArg(cmd, "-machine"); + virBufferAddLit(&buf, "memory-encryption=3Dsev0"); + virCommandAddArgBuffer(cmd, &buf); + + virCommandAddArg(cmd, "-object"); + virBufferAddLit(&obj, "sev-guest,id=3Dsev0"); + if (sev->policy > 0) + virBufferAsprintf(&obj, ",policy=3D0x%x", sev->policy); + virBufferAsprintf(&obj, ",cbitpos=3D%d", sev->cbitpos); + virBufferAsprintf(&obj, ",reduced-phys-bits=3D%d", sev->reduced_phys_b= its); + if (dh_cert_file) + virBufferAsprintf(&obj, ",dh-cert-file=3D%s", dh_cert_file); + if (session_file) + virBufferAsprintf(&obj, ",session-file=3D%s", session_file); + virCommandAddArgBuffer(cmd, &obj); + + VIR_DEBUG("policy=3D0x%x cbitpos=3D%d reduced_phys_bits=3D%d dh=3D%s s= ession=3D%s", + sev->policy, sev->cbitpos, sev->reduced_phys_bits, dh_cert_fi= le, + session_file); + return 0; +} =20 static int qemuBuildVMCoreInfoCommandLine(virCommandPtr cmd, @@ -10108,6 +10182,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, if (qemuBuildVMCoreInfoCommandLine(cmd, def, qemuCaps) < 0) goto error; =20 + if (def->sev && qemuBuildSevCommandLine(cmd, def) < 0) + goto error; + if (snapshot) virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); =20 --=20 2.14.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list