Blame SOURCES/kvm-docs-Add-SEV-ES-documentation-to-amd-memory-encrypti.patch

a83cc2
From 1bd5660666d2a1f704ebabeed8a2bbfa02410f41 Mon Sep 17 00:00:00 2001
a83cc2
From: Connor Kuehl <ckuehl@redhat.com>
a83cc2
Date: Tue, 22 Jun 2021 20:00:21 -0400
a83cc2
Subject: [PATCH 09/12] docs: Add SEV-ES documentation to
a83cc2
 amd-memory-encryption.txt
a83cc2
MIME-Version: 1.0
a83cc2
Content-Type: text/plain; charset=UTF-8
a83cc2
Content-Transfer-Encoding: 8bit
a83cc2
a83cc2
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
RH-MergeRequest: 16: Synchronize with RHEL-AV 8.5 release 21 to RHEL 9
a83cc2
RH-Commit: [7/8] 36e49577484813866132b90c64cf99779326db74 (mrezanin/centos-src-qemu-kvm)
a83cc2
RH-Bugzilla: 1957194
a83cc2
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
a83cc2
RH-Acked-by: Daniel P. Berrangé <berrange@redhat.com>
a83cc2
a83cc2
From: Tom Lendacky <thomas.lendacky@amd.com>
a83cc2
a83cc2
Update the amd-memory-encryption.txt file with information about SEV-ES,
a83cc2
including how to launch an SEV-ES guest and some of the differences
a83cc2
between SEV and SEV-ES guests in regards to launching and measuring the
a83cc2
guest.
a83cc2
a83cc2
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
a83cc2
Acked-by: Laszlo Ersek <lersek@redhat.com>
a83cc2
Reviewed-by: Connor Kuehl <ckuehl@redhat.com>
a83cc2
Message-Id: <fa1825a5eb0290eac4712cde75ba4c6829946eac.1619208498.git.thomas.lendacky@amd.com>
a83cc2
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
a83cc2
(cherry picked from commit 61b7d7098cd53dd386939610d534f8bd79240881)
a83cc2
Signed-off-by: Connor Kuehl <ckuehl@redhat.com>
a83cc2
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
a83cc2
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
a83cc2
---
a83cc2
 docs/amd-memory-encryption.txt | 54 +++++++++++++++++++++++++++++-----
a83cc2
 1 file changed, 47 insertions(+), 7 deletions(-)
a83cc2
a83cc2
diff --git a/docs/amd-memory-encryption.txt b/docs/amd-memory-encryption.txt
a83cc2
index ed85159ea7..ffca382b5f 100644
a83cc2
--- a/docs/amd-memory-encryption.txt
a83cc2
+++ b/docs/amd-memory-encryption.txt
a83cc2
@@ -15,6 +15,13 @@ includes commands for launching, snapshotting, migrating and debugging the
a83cc2
 encrypted guest. These SEV commands can be issued via KVM_MEMORY_ENCRYPT_OP
a83cc2
 ioctls.
a83cc2
 
a83cc2
+Secure Encrypted Virtualization - Encrypted State (SEV-ES) builds on the SEV
a83cc2
+support to additionally protect the guest register state. In order to allow a
a83cc2
+hypervisor to perform functions on behalf of a guest, there is architectural
a83cc2
+support for notifying a guest's operating system when certain types of VMEXITs
a83cc2
+are about to occur. This allows the guest to selectively share information with
a83cc2
+the hypervisor to satisfy the requested function.
a83cc2
+
a83cc2
 Launching
a83cc2
 ---------
a83cc2
 Boot images (such as bios) must be encrypted before a guest can be booted. The
a83cc2
@@ -24,6 +31,9 @@ together generate a fresh memory encryption key for the VM, encrypt the boot
a83cc2
 images and provide a measurement than can be used as an attestation of a
a83cc2
 successful launch.
a83cc2
 
a83cc2
+For a SEV-ES guest, the LAUNCH_UPDATE_VMSA command is also used to encrypt the
a83cc2
+guest register state, or VM save area (VMSA), for all of the guest vCPUs.
a83cc2
+
a83cc2
 LAUNCH_START is called first to create a cryptographic launch context within
a83cc2
 the firmware. To create this context, guest owner must provide a guest policy,
a83cc2
 its public Diffie-Hellman key (PDH) and session parameters. These inputs
a83cc2
@@ -40,6 +50,12 @@ The guest policy can be provided via the 'policy' property (see below)
a83cc2
 # ${QEMU} \
a83cc2
    sev-guest,id=sev0,policy=0x1...\
a83cc2
 
a83cc2
+Setting the "SEV-ES required" policy bit (bit 2) will launch the guest as a
a83cc2
+SEV-ES guest (see below)
a83cc2
+
a83cc2
+# ${QEMU} \
a83cc2
+   sev-guest,id=sev0,policy=0x5...\
a83cc2
+
a83cc2
 The guest owner provided DH certificate and session parameters will be used to
a83cc2
 establish a cryptographic session with the guest owner to negotiate keys used
a83cc2
 for the attestation.
a83cc2
@@ -55,13 +71,19 @@ created via the LAUNCH_START command. If required, this command can be called
a83cc2
 multiple times to encrypt different memory regions. The command also calculates
a83cc2
 the measurement of the memory contents as it encrypts.
a83cc2
 
a83cc2
-LAUNCH_MEASURE can be used to retrieve the measurement of encrypted memory.
a83cc2
-This measurement is a signature of the memory contents that can be sent to the
a83cc2
-guest owner as an attestation that the memory was encrypted correctly by the
a83cc2
-firmware. The guest owner may wait to provide the guest confidential information
a83cc2
-until it can verify the attestation measurement. Since the guest owner knows the
a83cc2
-initial contents of the guest at boot, the attestation measurement can be
a83cc2
-verified by comparing it to what the guest owner expects.
a83cc2
+LAUNCH_UPDATE_VMSA encrypts all the vCPU VMSAs for a SEV-ES guest using the
a83cc2
+cryptographic context created via the LAUNCH_START command. The command also
a83cc2
+calculates the measurement of the VMSAs as it encrypts them.
a83cc2
+
a83cc2
+LAUNCH_MEASURE can be used to retrieve the measurement of encrypted memory and,
a83cc2
+for a SEV-ES guest, encrypted VMSAs. This measurement is a signature of the
a83cc2
+memory contents and, for a SEV-ES guest, the VMSA contents, that can be sent
a83cc2
+to the guest owner as an attestation that the memory and VMSAs were encrypted
a83cc2
+correctly by the firmware. The guest owner may wait to provide the guest
a83cc2
+confidential information until it can verify the attestation measurement.
a83cc2
+Since the guest owner knows the initial contents of the guest at boot, the
a83cc2
+attestation measurement can be verified by comparing it to what the guest owner
a83cc2
+expects.
a83cc2
 
a83cc2
 LAUNCH_FINISH finalizes the guest launch and destroys the cryptographic
a83cc2
 context.
a83cc2
@@ -75,6 +97,22 @@ To launch a SEV guest
a83cc2
     -machine ...,confidential-guest-support=sev0 \
a83cc2
     -object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1
a83cc2
 
a83cc2
+To launch a SEV-ES guest
a83cc2
+
a83cc2
+# ${QEMU} \
a83cc2
+    -machine ...,confidential-guest-support=sev0 \
a83cc2
+    -object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1,policy=0x5
a83cc2
+
a83cc2
+An SEV-ES guest has some restrictions as compared to a SEV guest. Because the
a83cc2
+guest register state is encrypted and cannot be updated by the VMM/hypervisor,
a83cc2
+a SEV-ES guest:
a83cc2
+ - Does not support SMM - SMM support requires updating the guest register
a83cc2
+   state.
a83cc2
+ - Does not support reboot - a system reset requires updating the guest register
a83cc2
+   state.
a83cc2
+ - Requires in-kernel irqchip - the burden is placed on the hypervisor to
a83cc2
+   manage booting APs.
a83cc2
+
a83cc2
 Debugging
a83cc2
 -----------
a83cc2
 Since the memory contents of a SEV guest are encrypted, hypervisor access to
a83cc2
@@ -101,8 +139,10 @@ Secure Encrypted Virtualization Key Management:
a83cc2
 
a83cc2
 KVM Forum slides:
a83cc2
 http://www.linux-kvm.org/images/7/74/02x08A-Thomas_Lendacky-AMDs_Virtualizatoin_Memory_Encryption_Technology.pdf
a83cc2
+https://www.linux-kvm.org/images/9/94/Extending-Secure-Encrypted-Virtualization-with-SEV-ES-Thomas-Lendacky-AMD.pdf
a83cc2
 
a83cc2
 AMD64 Architecture Programmer's Manual:
a83cc2
    http://support.amd.com/TechDocs/24593.pdf
a83cc2
    SME is section 7.10
a83cc2
    SEV is section 15.34
a83cc2
+   SEV-ES is section 15.35
a83cc2
-- 
a83cc2
2.27.0
a83cc2