qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 00/31] Add AMD Secure Nested Paging (SEV-SNP) support
@ 2024-05-30 11:16 Pankaj Gupta
  2024-05-30 11:16 ` [PATCH v4 01/31] i386/sev: Replace error_report with error_setg Pankaj Gupta
                   ` (31 more replies)
  0 siblings, 32 replies; 73+ messages in thread
From: Pankaj Gupta @ 2024-05-30 11:16 UTC (permalink / raw)
  To: qemu-devel
  Cc: brijesh.singh, dovmurik, armbru, michael.roth, xiaoyao.li,
	pbonzini, thomas.lendacky, isaku.yamahata, berrange, kvm,
	anisinha, pankaj.gupta

These patches implement SEV-SNP base support along with CPUID enforcement
support for QEMU, and are also available at:

https://github.com/pagupta/qemu/tree/snp_v4

Latest version of kvm changes are posted here [2] and also queued in kvm/next.

Patch Layout
------------
01-03: 'error_setg' independent fix, kvm/next header sync & patch from
       Xiaoyao's TDX v5 patchset.
04-29: Introduction of sev-snp-guest object and various configuration
       requirements for SNP. Support for creating a cryptographic "launch" context
       and populating various OVMF metadata pages, BIOS regions, and vCPU/VMSA
       pages with the initial encrypted/measured/validated launch data prior to
       launching the SNP guest.
30-31: Handling for KVM_HC_MAP_GPA_RANGE hypercall for userspace VMEXIT.

Testing
-------
This series has been tested against the kvm/next tree and the
AMDSEV tree [1].

[1]  https://github.com/AMDESE/linux/commits/snp-host-latest/

Below version of OVMF is used to test the changes.

  https://github.com/mdroth/edk2/commits/apic-mmio-fix1d/

A basic command-line invocation for SNP would be:

 qemu-system-x86_64 -smp 32,maxcpus=255 -cpu EPYC-Milan-v2
  -machine q35,confidential-guest-support=sev0,memory-backend=ram1
  -object memory-backend-memfd,id=ram1,size=4G,share=true,reserve=false
  -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,id-auth=
  -bios OVMF_CODE-upstream-20240410-apic-mmio-fix1d-AmdSevX64.fd

With kernel-hashing and certificate data supplied:

 qemu-system-x86_64 -smp 32,maxcpus=255 -cpu EPYC-Milan-v2
  -machine q35,confidential-guest-support=sev0,memory-backend=ram1
  -object memory-backend-memfd,id=ram1,size=4G,share=true,reserve=false
  -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,id-auth=,kernel-hashes=on
  -bios OVMF_CODE-upstream-20240410-apic-mmio-fix1d-AmdSevX64.fd
  -kernel /boot/vmlinuz-$ver
  -initrd /boot/initrd.img-$ver
  -append "root=UUID=d72a6d1c-06cf-4b79-af43-f1bac4f620f9 ro console=ttyS0,115200n8"

With standard X64 OVMF package with separate image for persistent NVRAM:

 qemu-system-x86_64 -smp 32,maxcpus=255 -cpu EPYC-Milan-v2
  -machine q35,confidential-guest-support=sev0,memory-backend=ram1
  -object memory-backend-memfd,id=ram1,size=4G,share=true,reserve=false
  -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,id-auth=
  -bios OVMF_CODE-upstream-20240410-apic-mmio-fix1d.fd 
  -drive if=pflash,format=raw,unit=0,file=OVMF_VARS-upstream-20240410-apic-mmio-fix1d.fd,readonly=off:
 
 Any comments/feedback would be very much appreciated.

[2] https://lore.kernel.org/all/20240501085210.2213060-1-michael.roth@amd.com/
--------------

Changes since rfc3:

- added class methods (SEV & SNP) for functions changes suggested in RFC v3:
  launch_start(), launch_update_data(), launch_finish(), kvm_init(), kvm_type() (Paolo) 
- improved qom.json, query-sev QAPI text suggestions (Daniel & Markus).
- moved 'pc_system_parse_sev_metadata' to 'target/i386/sev.c' (Isaku).
- moved SNP specific methods (set guest_mem_fd, no smm check, no disable block discard)
  to sev_snp_kvm_init().
- squashed qapi changes for SecCommonProperties into 'sev-guest-common' patch (Daniel, Markus)
- made legacy bios support to SNP only.
- switch to using KVM_HC_MAP_GPA_RANGE to handle page-state change
  requests rather than directly processing GHCB page-state change buffer
- drop attestation certificate support, will revisit once the KVM_EXIT_*
  event mechanism is finalized
- sync headers with kvm/next, which now contains base KVM SNP support
- some more fixes including missing 'return', length checks,
  monitor logs improvements. (Daniel, Markus)


Changes since rfc2:

- reworked on top of guest_memfd support
- added handling for various KVM_EXIT_VMGEXIT events
- various changes/considerations for PCI passthrough support
- general bugfixes/hardening/cleanups
- qapi cmdline doc fixes/rework (Dov, Markus)
- switch to qbase64_decode, more error-checking for cmdline opts (Dov)
- unset id_block_en for 0 input (Dov)
- use error_setg in snp init (Dov)
- report more info in trace_kvm_sev_init (Dov)
- rework bounds-checking for kvm_cpuid_info, rework existing checks for 
  readability, add additional checks (Dov)
- fixups for validated_ranges handling (Dov)
- rename 'policy' field to 'snp-policy' in query-sev when sev-type is SNP

Changes since rfc1:

 - rebased onto latest master
 - drop SNP config file in favor of a new 'sev-snp-guest' object where all
   SNP-related params are passed as strings/integers via command-line
 - report specific error if BIOS reports invalid address/len for
   reserved/pre-validated regions (Connor)
 - use Range helpers for handling validated region overlaps (Dave)
 - simplify error handling in sev_snp_launch_start, and report the correct
   return code when handling LAUNCH_START failures (Dov)
 - add SEV-SNP bit to CPUID 0x8000001f when SNP enabled
 - updated query-sev to handle differences between SEV and SEV-SNP
 - updated to work against v5 of SEV-SNP host kernel / hypervisor patches

Brijesh Singh (6):
  i386/sev: Introduce 'sev-snp-guest' object
  i386/sev: Add the SNP launch start context
  i386/sev: Add handling to encrypt/finalize guest launch data
  hw/i386/sev: Add function to get SEV metadata from OVMF header
  i386/sev: Add support for populating OVMF metadata pages
  hw/i386/sev: Add support to encrypt BIOS when SEV-SNP is enabled

Dov Murik (3):
  i386/sev: Extract build_kernel_loader_hashes
  i386/sev: Reorder struct declarations
  i386/sev: Allow measured direct kernel boot on SNP

Michael Roth (12):
  i386/sev: Introduce "sev-common" type to encapsulate common SEV state
  i386/sev: Add a sev_snp_enabled() helper
  i386/cpu: Set SEV-SNP CPUID bit when SNP enabled
  i386/sev: Don't return launch measurements for SEV-SNP guests
  i386/sev: Update query-sev QAPI format to handle SEV-SNP
  i386/sev: Set CPU state to protected once SNP guest payload is
    finalized
  i386/sev: Add support for SNP CPUID validation
  hw/i386/sev: Use guest_memfd for legacy ROMs
  hw/i386: Add support for loading BIOS using guest_memfd
  hw/i386/sev: Allow use of pflash in conjunction with -bios
  i386/kvm: Add KVM_EXIT_HYPERCALL handling for KVM_HC_MAP_GPA_RANGE
  i386/sev: Enable KVM_HC_MAP_GPA_RANGE hcall for SNP guests

Pankaj Gupta (9):
  i386/sev: Replace error_report with error_setg
  linux-headers: Update to current kvm/next
  i386/sev: Move sev_launch_update to separate class method
  i386/sev: Move sev_launch_finish to separate class method
  i386/sev: Add sev_kvm_init() override for SEV class
  i386/sev: Add snp_kvm_init() override for SNP class
  i386/sev: Add a class method to determine KVM VM type for SNP guests
  i386/sev: Invoke launch_updata_data() for SEV class
  i386/sev: Invoke launch_updata_data() for SNP class

Xiaoyao Li (1):
  memory: Introduce memory_region_init_ram_guest_memfd()

 docs/system/i386/amd-memory-encryption.rst |   70 +-
 hw/i386/pc.c                               |   14 +-
 hw/i386/pc_sysfw.c                         |   76 +-
 hw/i386/x86-common.c                       |   24 +-
 include/exec/memory.h                      |    6 +
 include/hw/i386/pc.h                       |   28 +
 include/hw/i386/x86.h                      |    2 +-
 linux-headers/asm-loongarch/bitsperlong.h  |   23 +
 linux-headers/asm-loongarch/kvm.h          |    4 +
 linux-headers/asm-loongarch/mman.h         |    9 +
 linux-headers/asm-riscv/kvm.h              |    1 +
 linux-headers/asm-riscv/mman.h             |   36 +-
 linux-headers/asm-s390/mman.h              |   36 +-
 linux-headers/asm-x86/kvm.h                |   52 +-
 linux-headers/linux/vhost.h                |   15 +-
 qapi/misc-target.json                      |   72 +-
 qapi/qom.json                              |   97 +-
 system/memory.c                            |   24 +
 target/i386/cpu.c                          |    1 +
 target/i386/kvm/kvm.c                      |   55 +
 target/i386/kvm/kvm_i386.h                 |    1 +
 target/i386/kvm/trace-events               |    1 +
 target/i386/sev-sysemu-stub.c              |    2 +-
 target/i386/sev.c                          | 1588 +++++++++++++++-----
 target/i386/sev.h                          |   13 +-
 target/i386/trace-events                   |    3 +
 26 files changed, 1833 insertions(+), 420 deletions(-)

-- 
2.34.1



^ permalink raw reply	[flat|nested] 73+ messages in thread

end of thread, other threads:[~2024-07-04  8:54 UTC | newest]

Thread overview: 73+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-30 11:16 [PATCH v4 00/31] Add AMD Secure Nested Paging (SEV-SNP) support Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 01/31] i386/sev: Replace error_report with error_setg Pankaj Gupta
2024-06-03 11:57   ` Daniel P. Berrangé
2024-05-30 11:16 ` [PATCH v4 02/31] linux-headers: Update to current kvm/next Pankaj Gupta
2024-05-31 14:38   ` Liam Merwick via
2024-05-31 15:37     ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 03/31] memory: Introduce memory_region_init_ram_guest_memfd() Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 04/31] i386/sev: Introduce "sev-common" type to encapsulate common SEV state Pankaj Gupta
2024-05-31 11:03   ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 05/31] i386/sev: Move sev_launch_update to separate class method Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 06/31] i386/sev: Move sev_launch_finish " Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 07/31] i386/sev: Introduce 'sev-snp-guest' object Pankaj Gupta
2024-05-31 11:06   ` Paolo Bonzini
2024-06-03 12:02   ` Daniel P. Berrangé
2024-06-03 17:48     ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 08/31] i386/sev: Add a sev_snp_enabled() helper Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 09/31] i386/sev: Add sev_kvm_init() override for SEV class Pankaj Gupta
2024-05-31 11:06   ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 10/31] i386/sev: Add snp_kvm_init() override for SNP class Pankaj Gupta
2024-05-31 11:07   ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 11/31] i386/cpu: Set SEV-SNP CPUID bit when SNP enabled Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 12/31] i386/sev: Don't return launch measurements for SEV-SNP guests Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 13/31] i386/sev: Add a class method to determine KVM VM type for SNP guests Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 14/31] i386/sev: Update query-sev QAPI format to handle SEV-SNP Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 15/31] i386/sev: Add the SNP launch start context Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 16/31] i386/sev: Add handling to encrypt/finalize guest launch data Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 17/31] i386/sev: Set CPU state to protected once SNP guest payload is finalized Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 18/31] hw/i386/sev: Add function to get SEV metadata from OVMF header Pankaj Gupta
2024-05-31 15:19   ` Liam Merwick via
2024-05-31 15:41     ` Paolo Bonzini
2024-05-31 16:41       ` Liam Merwick via
2024-05-30 11:16 ` [PATCH v4 19/31] i386/sev: Add support for populating OVMF metadata pages Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 20/31] i386/sev: Add support for SNP CPUID validation Pankaj Gupta
2024-07-02  3:07   ` Xiaoyao Li
2024-07-04  0:34     ` Michael Roth
2024-07-04  4:09       ` Xiaoyao Li
2024-07-04  5:31         ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 21/31] i386/sev: Extract build_kernel_loader_hashes Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 22/31] i386/sev: Reorder struct declarations Pankaj Gupta
2024-05-31 11:12   ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 23/31] i386/sev: Allow measured direct kernel boot on SNP Pankaj Gupta
2024-05-31 11:14   ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 24/31] hw/i386/sev: Add support to encrypt BIOS when SEV-SNP is enabled Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 25/31] i386/sev: Invoke launch_updata_data() for SEV class Pankaj Gupta
2024-05-31 11:10   ` Paolo Bonzini
2024-05-30 11:16 ` [PATCH v4 26/31] i386/sev: Invoke launch_updata_data() for SNP class Pankaj Gupta
2024-05-30 11:16 ` [PATCH v4 27/31] hw/i386/sev: Use guest_memfd for legacy ROMs Pankaj Gupta
2024-05-31 11:27   ` Paolo Bonzini
2024-06-14  8:58   ` Xiaoyao Li
2024-06-14 10:02     ` Gupta, Pankaj
2024-05-30 11:16 ` [PATCH v4 28/31] hw/i386: Add support for loading BIOS using guest_memfd Pankaj Gupta
2024-05-31 11:22   ` Paolo Bonzini
2024-06-14  8:34   ` Xiaoyao Li
2024-06-14  8:48     ` Gupta, Pankaj
2024-06-14  9:03       ` Xiaoyao Li
2024-05-30 11:16 ` [PATCH v4 29/31] hw/i386/sev: Allow use of pflash in conjunction with -bios Pankaj Gupta
2024-05-31 12:33   ` Paolo Bonzini
2024-06-03 11:55   ` Daniel P. Berrangé
2024-06-03 13:38     ` Paolo Bonzini
2024-06-04  9:03       ` Hoffmann, Gerd
2024-06-03 14:27     ` Michael Roth via
2024-06-03 14:31       ` Paolo Bonzini
2024-06-03 16:31         ` Michael Roth
2024-05-30 11:16 ` [PATCH v4 30/31] i386/kvm: Add KVM_EXIT_HYPERCALL handling for KVM_HC_MAP_GPA_RANGE Pankaj Gupta
2024-07-04  8:53   ` Binbin Wu
2024-05-30 11:16 ` [PATCH v4 31/31] i386/sev: Enable KVM_HC_MAP_GPA_RANGE hcall for SNP guests Pankaj Gupta
2024-05-31 11:20 ` [PATCH v4 00/31] Add AMD Secure Nested Paging (SEV-SNP) support Paolo Bonzini
2024-05-31 17:34   ` Paolo Bonzini
2024-05-31 17:40     ` Gupta, Pankaj
2024-05-31 17:53       ` Paolo Bonzini
2024-06-01  4:57         ` Gupta, Pankaj
2024-06-03 14:15           ` Michael Roth
2024-06-03 14:22             ` Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).