[PATCH v4 00/15] Provide SEV-SNP support for running under an SVSM

Tom Lendacky posted 15 patches 1 week, 2 days ago
Documentation/ABI/testing/configfs-tsm        |  63 +++
.../arch/x86/amd-memory-encryption.rst        |  22 +
arch/x86/boot/compressed/sev.c                | 258 ++++++-----
arch/x86/include/asm/cpufeatures.h            |   1 +
arch/x86/include/asm/msr-index.h              |   2 +
arch/x86/include/asm/sev-common.h             |  18 +
arch/x86/include/asm/sev.h                    | 116 ++++-
arch/x86/include/uapi/asm/svm.h               |   1 +
arch/x86/kernel/sev-shared.c                  | 354 ++++++++++++++-
arch/x86/kernel/sev.c                         | 421 +++++++++++++++---
arch/x86/mm/mem_encrypt_amd.c                 |   8 +-
drivers/virt/coco/sev-guest/sev-guest.c       | 210 ++++++++-
drivers/virt/coco/tdx-guest/tdx-guest.c       |  29 +-
drivers/virt/coco/tsm.c                       | 173 +++++--
fs/configfs/dir.c                             |  20 +
include/linux/configfs.h                      |   3 +
include/linux/tsm.h                           |  62 ++-
17 files changed, 1533 insertions(+), 228 deletions(-)
[PATCH v4 00/15] Provide SEV-SNP support for running under an SVSM
Posted by Tom Lendacky 1 week, 2 days ago
This series adds SEV-SNP support for running Linux under an Secure VM
Service Module (SVSM) at a less privileged VM Privilege Level (VMPL).
By running at a less priviledged VMPL, the SVSM can be used to provide
services, e.g. a virtual TPM, for Linux within the SEV-SNP confidential
VM (CVM) rather than trust such services from the hypervisor.

Currently, a Linux guest expects to run at the highest VMPL, VMPL0, and
there are certain SNP related operations that require that VMPL level.
Specifically, the PVALIDATE instruction and the RMPADJUST instruction
when setting the VMSA attribute of a page (used when starting APs).

If Linux is to run at a less privileged VMPL, e.g. VMPL2, then it must
use an SVSM (which is running at VMPL0) to perform the operations that
it is no longer able to perform.

How Linux interacts with and uses the SVSM is documented in the SVSM
specification [1] and the GHCB specification [2].

This series introduces support to run Linux under an SVSM. It consists
of:
  - Detecting the presence of an SVSM
  - When not running at VMPL0, invoking the SVSM for page validation and
    VMSA page creation/deletion
  - Adding a sysfs entry that specifies the Linux VMPL
  - Modifying the sev-guest driver to use the VMPCK key associated with
    the Linux VMPL
  - Expanding the config-fs TSM support to request attestation reports
    from the SVSM and allowing attributes to be hidden
  - Detecting and allowing Linux to run in a VMPL other than 0 when an
    SVSM is present

The series is based off of and tested against the tip tree:
  https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git master

  4e2b6e891aae ("Merge branch into tip/master: 'x86/shstk'")

[1] https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/58019.pdf
[2] https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56421.pdf

Cc: Joel Becker <jlbec@evilplan.org>
Cc: Christoph Hellwig <hch@lst.de>

---

Changes in v4:
- Add a pre-patch to rename the struct snp_secrets_page_layout to just
  snp_secrets_page.
- Move the config-fs visibility support to be group based and referenced
  by an index. Remove the macro changes that set the visibility function
  for an entry.
- Make the TSM visibility support vendor specific via an ops callback.
- Use the rmpadjust() function directly and remove the enforce_vmpl0()
  function.
- Consolidate common variables into arch/x86/kernel/sev-shared.c.

Changes in v3:
- Rename decompresor snp_setup() to early_snp_setup() to better indicate
  when it is called.
- Rename the "svsm" config-fs attribute into the more generic
  "service_provider" attribute that takes a name as input.
- Change config-fs visibility function to be a simple bool return type
  instead of returning the mode.
- Switch to using new RIP_REL_REF() macro and __head notation where
  appropriate.

Changes in v2:
- Define X86_FEATURE_SVSM_PRESENT and set the bit in the CPUID table,
  removing the need to set the CPUID bit in the #VC handler.
- Rename the TSM service_version attribute to service_manifest_version.
- Add support to config-fs to hide attributes and hide the SVSM attributes
  when an SVSM is not present.


Tom Lendacky (15):
  x86/sev: Shorten snp_secrets_page_layout to snp_secrets_page
  x86/sev: Rename snp_init() in the boot/compressed/sev.c file
  x86/sev: Make the VMPL0 checking more straight forward
  x86/sev: Check for the presence of an SVSM in the SNP Secrets page
  x86/sev: Use kernel provided SVSM Calling Areas
  x86/sev: Perform PVALIDATE using the SVSM when not at VMPL0
  x86/sev: Use the SVSM to create a vCPU when not in VMPL0
  x86/sev: Provide SVSM discovery support
  x86/sev: Provide guest VMPL level to userspace
  virt: sev-guest: Choose the VMPCK key based on executing VMPL
  configfs-tsm: Allow the privlevel_floor attribute to be updated
  fs/configfs: Add a callback to determine attribute visibility
  x86/sev: Take advantage of configfs visibility support in TSM
  x86/sev: Extend the config-fs attestation support for an SVSM
  x86/sev: Allow non-VMPL0 execution when an SVSM is present

 Documentation/ABI/testing/configfs-tsm        |  63 +++
 .../arch/x86/amd-memory-encryption.rst        |  22 +
 arch/x86/boot/compressed/sev.c                | 258 ++++++-----
 arch/x86/include/asm/cpufeatures.h            |   1 +
 arch/x86/include/asm/msr-index.h              |   2 +
 arch/x86/include/asm/sev-common.h             |  18 +
 arch/x86/include/asm/sev.h                    | 116 ++++-
 arch/x86/include/uapi/asm/svm.h               |   1 +
 arch/x86/kernel/sev-shared.c                  | 354 ++++++++++++++-
 arch/x86/kernel/sev.c                         | 421 +++++++++++++++---
 arch/x86/mm/mem_encrypt_amd.c                 |   8 +-
 drivers/virt/coco/sev-guest/sev-guest.c       | 210 ++++++++-
 drivers/virt/coco/tdx-guest/tdx-guest.c       |  29 +-
 drivers/virt/coco/tsm.c                       | 173 +++++--
 fs/configfs/dir.c                             |  20 +
 include/linux/configfs.h                      |   3 +
 include/linux/tsm.h                           |  62 ++-
 17 files changed, 1533 insertions(+), 228 deletions(-)

-- 
2.43.2
Re: [svsm-devel] [PATCH v4 00/15] Provide SEV-SNP support for running under an SVSM
Posted by Jörg Rödel 21 hours ago
On Wed, Apr 24, 2024 at 10:57:56AM -0500, Tom Lendacky wrote:
> Tom Lendacky (15):
>   x86/sev: Shorten snp_secrets_page_layout to snp_secrets_page
>   x86/sev: Rename snp_init() in the boot/compressed/sev.c file
>   x86/sev: Make the VMPL0 checking more straight forward
>   x86/sev: Check for the presence of an SVSM in the SNP Secrets page
>   x86/sev: Use kernel provided SVSM Calling Areas
>   x86/sev: Perform PVALIDATE using the SVSM when not at VMPL0
>   x86/sev: Use the SVSM to create a vCPU when not in VMPL0
>   x86/sev: Provide SVSM discovery support
>   x86/sev: Provide guest VMPL level to userspace
>   virt: sev-guest: Choose the VMPCK key based on executing VMPL
>   configfs-tsm: Allow the privlevel_floor attribute to be updated
>   fs/configfs: Add a callback to determine attribute visibility
>   x86/sev: Take advantage of configfs visibility support in TSM
>   x86/sev: Extend the config-fs attestation support for an SVSM
>   x86/sev: Allow non-VMPL0 execution when an SVSM is present

I tested these on latest COCONUT-SVSM upstream and found no issues.

Tested-by: Joerg Roedel <jroedel@suse.de>