Merge tag 'tsm-for-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 5 Nov 2023 01:58:13 +0000 (15:58 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 5 Nov 2023 01:58:13 +0000 (15:58 -1000)
Pull unified attestation reporting from Dan Williams:
 "In an ideal world there would be a cross-vendor standard attestation
  report format for confidential guests along with a common device
  definition to act as the transport.

  In the real world the situation ended up with multiple platform
  vendors inventing their own attestation report formats with the
  SEV-SNP implementation being a first mover to define a custom
  sev-guest character device and corresponding ioctl(). Later, this
  configfs-tsm proposal intercepted an attempt to add a tdx-guest
  character device and a corresponding new ioctl(). It also anticipated
  ARM and RISC-V showing up with more chardevs and more ioctls().

  The proposal takes for granted that Linux tolerates the vendor report
  format differentiation until a standard arrives. From talking with
  folks involved, it sounds like that standardization work is unlikely
  to resolve anytime soon. It also takes the position that kernfs ABIs
  are easier to maintain than ioctl(). The result is a shared configfs
  mechanism to return per-vendor report-blobs with the option to later
  support a standard when that arrives.

  Part of the goal here also is to get the community into the
  "uncomfortable, but beneficial to the long term maintainability of the
  kernel" state of talking to each other about their differentiation and
  opportunities to collaborate. Think of this like the device-driver
  equivalent of the common memory-management infrastructure for
  confidential-computing being built up in KVM.

  As for establishing an "upstream path for cross-vendor
  confidential-computing device driver infrastructure" this is something
  I want to discuss at Plumbers. At present, the multiple vendor
  proposals for assigning devices to confidential computing VMs likely
  needs a new dedicated repository and maintainer team, but that is a
  discussion for v6.8.

  For now, Greg and Thomas have acked this approach and this is passing
  is AMD, Intel, and Google tests.

  Summary:

   - Introduce configfs-tsm as a shared ABI for confidential computing
     attestation reports

   - Convert sev-guest to additionally support configfs-tsm alongside
     its vendor specific ioctl()

   - Added signed attestation report retrieval to the tdx-guest driver
     forgoing a new vendor specific ioctl()

   - Misc cleanups and a new __free() annotation for kvfree()"

* tag 'tsm-for-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/linux:
  virt: tdx-guest: Add Quote generation support using TSM_REPORTS
  virt: sevguest: Add TSM_REPORTS support for SNP_GET_EXT_REPORT
  mm/slab: Add __free() support for kvfree
  virt: sevguest: Prep for kernel internal get_ext_report()
  configfs-tsm: Introduce a shared ABI for attestation reports
  virt: coco: Add a coco/Makefile and coco/Kconfig
  virt: sevguest: Fix passing a stack buffer as a scatterlist target

1  2 
MAINTAINERS
arch/x86/coco/tdx/tdx.c
arch/x86/include/asm/shared/tdx.h
arch/x86/include/asm/tdx.h
include/linux/slab.h

diff --cc MAINTAINERS
Simple merge
index d11206ceff3b1668b474f227a7965bcfafc157f9,752867b1d11bc214527897b5deb2f634749c7959..1b5d17a9f70dde9f711c53ea2db97762d73eadf3
@@@ -106,9 -104,30 +106,30 @@@ int tdx_mcall_get_report0(u8 *reportdat
  }
  EXPORT_SYMBOL_GPL(tdx_mcall_get_report0);
  
+ /**
+  * tdx_hcall_get_quote() - Wrapper to request TD Quote using GetQuote
+  *                         hypercall.
+  * @buf: Address of the directly mapped shared kernel buffer which
+  *       contains TDREPORT. The same buffer will be used by VMM to
+  *       store the generated TD Quote output.
+  * @size: size of the tdquote buffer (4KB-aligned).
+  *
+  * Refer to section titled "TDG.VP.VMCALL<GetQuote>" in the TDX GHCI
+  * v1.0 specification for more information on GetQuote hypercall.
+  * It is used in the TDX guest driver module to get the TD Quote.
+  *
+  * Return 0 on success or error code on failure.
+  */
+ u64 tdx_hcall_get_quote(u8 *buf, size_t size)
+ {
+       /* Since buf is a shared memory, set the shared (decrypted) bits */
+       return _tdx_hypercall(TDVMCALL_GET_QUOTE, cc_mkdec(virt_to_phys(buf)), size, 0, 0);
+ }
+ EXPORT_SYMBOL_GPL(tdx_hcall_get_quote);
  static void __noreturn tdx_panic(const char *msg)
  {
 -      struct tdx_hypercall_args args = {
 +      struct tdx_module_args args = {
                .r10 = TDX_HYPERCALL_STANDARD,
                .r11 = TDVMCALL_REPORT_FATAL_ERROR,
                .r12 = 0, /* Error code: 0 is Panic */
index f74695dea2176b4cd76340b7f6f03fa430c78829,9eab19950f395ef0d49dfa7c000d38c1f28551d1..ccce7ebd8677287359c4de9271fe29ecf6793d31
  
  /* TDX hypercall Leaf IDs */
  #define TDVMCALL_MAP_GPA              0x10001
+ #define TDVMCALL_GET_QUOTE            0x10002
  #define TDVMCALL_REPORT_FATAL_ERROR   0x10003
  
 +#define TDVMCALL_STATUS_RETRY         1
 +
 +/*
 + * Bitmasks of exposed registers (with VMM).
 + */
 +#define TDX_RDX               BIT(2)
 +#define TDX_RBX               BIT(3)
 +#define TDX_RSI               BIT(6)
 +#define TDX_RDI               BIT(7)
 +#define TDX_R8                BIT(8)
 +#define TDX_R9                BIT(9)
 +#define TDX_R10               BIT(10)
 +#define TDX_R11               BIT(11)
 +#define TDX_R12               BIT(12)
 +#define TDX_R13               BIT(13)
 +#define TDX_R14               BIT(14)
 +#define TDX_R15               BIT(15)
 +
 +/*
 + * These registers are clobbered to hold arguments for each
 + * TDVMCALL. They are safe to expose to the VMM.
 + * Each bit in this mask represents a register ID. Bit field
 + * details can be found in TDX GHCI specification, section
 + * titled "TDCALL [TDG.VP.VMCALL] leaf".
 + */
 +#define TDVMCALL_EXPOSE_REGS_MASK     \
 +      (TDX_RDX | TDX_RBX | TDX_RSI | TDX_RDI | TDX_R8  | TDX_R9  | \
 +       TDX_R10 | TDX_R11 | TDX_R12 | TDX_R13 | TDX_R14 | TDX_R15)
 +
  #ifndef __ASSEMBLY__
  
 +#include <linux/compiler_attributes.h>
 +
  /*
 - * Used in __tdx_hypercall() to pass down and get back registers' values of
 - * the TDCALL instruction when requesting services from the VMM.
 - *
 - * This is a software only structure and not part of the TDX module/VMM ABI.
 + * Used in __tdcall*() to gather the input/output registers' values of the
 + * TDCALL instruction when requesting services from the TDX module. This is a
 + * software only structure and not part of the TDX module/VMM ABI
   */
 -struct tdx_hypercall_args {
 +struct tdx_module_args {
 +      /* callee-clobbered */
 +      u64 rcx;
 +      u64 rdx;
        u64 r8;
        u64 r9;
 +      /* extra callee-clobbered */
        u64 r10;
        u64 r11;
 +      /* callee-saved + rdi/rsi */
        u64 r12;
        u64 r13;
        u64 r14;
Simple merge
Simple merge