linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Kai Huang <kai.huang@intel.com>
To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Cc: linux-mm@kvack.org, x86@kernel.org, dave.hansen@intel.com,
	kirill.shutemov@linux.intel.com, tony.luck@intel.com,
	peterz@infradead.org, tglx@linutronix.de, bp@alien8.de,
	mingo@redhat.com, hpa@zytor.com, seanjc@google.com,
	pbonzini@redhat.com, david@redhat.com, dan.j.williams@intel.com,
	rafael.j.wysocki@intel.com, ashok.raj@intel.com,
	reinette.chatre@intel.com, len.brown@intel.com,
	ak@linux.intel.com, isaku.yamahata@intel.com,
	ying.huang@intel.com, chao.gao@intel.com,
	sathyanarayanan.kuppuswamy@linux.intel.com, nik.borisov@suse.com,
	bagasdotme@gmail.com, sagis@google.com, imammedo@redhat.com,
	kai.huang@intel.com
Subject: [PATCH v12 05/22] x86/virt/tdx: Add SEAMCALL infrastructure
Date: Tue, 27 Jun 2023 02:12:35 +1200	[thread overview]
Message-ID: <b2a875fd855145728744617ac4425a06d8b46c90.1687784645.git.kai.huang@intel.com> (raw)
In-Reply-To: <cover.1687784645.git.kai.huang@intel.com>

TDX introduces a new CPU mode: Secure Arbitration Mode (SEAM).  This
mode runs only the TDX module itself or other code to load the TDX
module.

The host kernel communicates with SEAM software via a new SEAMCALL
instruction.  This is conceptually similar to a guest->host hypercall,
except it is made from the host to SEAM software instead.  The TDX
module establishes a new SEAMCALL ABI which allows the host to
initialize the module and to manage VMs.

Add infrastructure to make SEAMCALLs.  The SEAMCALL ABI is very similar
to the TDCALL ABI and leverages much TDCALL infrastructure.

Also add a wrapper function of SEAMCALL to convert SEAMCALL error code
to the kernel error code, and print out SEAMCALL error code to help the
user to understand what went wrong.

Signed-off-by: Kai Huang <kai.huang@intel.com>
Reviewed-by: Isaku Yamahata <isaku.yamahata@intel.com>
---

v11 -> v12:
 - Moved _ASM_EXT_TABLE() for #UD/#GP to a later patch for better patch
   review, and removed related part from changelog.
 - Minor code changes in seamcall() (David)
 - Added Isaku's tag

v10 -> v11:
 - No update

v9 -> v10:
 - Make the TDX_SEAMCALL_{GP|UD} error codes unconditional but doesn't
   define them when INTEL_TDX_HOST is enabled. (Dave)
 - Slightly improved changelog to explain why add assembly code to handle
   #UD and #GP.

v8 -> v9:
 - Changed patch title (Dave).
 - Enhanced seamcall() to include the cpu id to the error message when
   SEAMCALL fails.

v7 -> v8:
 - Improved changelog (Dave):
   - Trim down some sentences (Dave).
   - Removed __seamcall() and seamcall() function name and changed
     accordingly (Dave).
   - Improved the sentence explaining why to handle #GP (Dave).
 - Added code to print out error message in seamcall(), following
   the idea that tdx_enable() to return universal error and print out
   error message to make clear what's going wrong (Dave).  Also mention
   this in changelog.

v6 -> v7:
 - No change.

v5 -> v6:
 - Added code to handle #UD and #GP (Dave).
 - Moved the seamcall() wrapper function to this patch, and used a
   temporary __always_unused to avoid compile warning (Dave).

- v3 -> v5 (no feedback on v4):
 - Explicitly tell TDX_SEAMCALL_VMFAILINVALID is returned if the
   SEAMCALL itself fails.
 - Improve the changelog.


---
 arch/x86/virt/vmx/tdx/Makefile   |  2 +-
 arch/x86/virt/vmx/tdx/seamcall.S | 52 ++++++++++++++++++++++++++++++++
 arch/x86/virt/vmx/tdx/tdx.c      | 42 ++++++++++++++++++++++++++
 arch/x86/virt/vmx/tdx/tdx.h      | 10 ++++++
 4 files changed, 105 insertions(+), 1 deletion(-)
 create mode 100644 arch/x86/virt/vmx/tdx/seamcall.S
 create mode 100644 arch/x86/virt/vmx/tdx/tdx.h

diff --git a/arch/x86/virt/vmx/tdx/Makefile b/arch/x86/virt/vmx/tdx/Makefile
index 93ca8b73e1f1..38d534f2c113 100644
--- a/arch/x86/virt/vmx/tdx/Makefile
+++ b/arch/x86/virt/vmx/tdx/Makefile
@@ -1,2 +1,2 @@
 # SPDX-License-Identifier: GPL-2.0-only
-obj-y += tdx.o
+obj-y += tdx.o seamcall.o
diff --git a/arch/x86/virt/vmx/tdx/seamcall.S b/arch/x86/virt/vmx/tdx/seamcall.S
new file mode 100644
index 000000000000..f81be6b9c133
--- /dev/null
+++ b/arch/x86/virt/vmx/tdx/seamcall.S
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#include <linux/linkage.h>
+#include <asm/frame.h>
+
+#include "tdxcall.S"
+
+/*
+ * __seamcall() - Host-side interface functions to SEAM software module
+ *		  (the P-SEAMLDR or the TDX module).
+ *
+ * Transform function call register arguments into the SEAMCALL register
+ * ABI.  Return TDX_SEAMCALL_VMFAILINVALID if the SEAMCALL itself fails,
+ * or the completion status of the SEAMCALL leaf function.  Additional
+ * output operands are saved in @out (if it is provided by the caller).
+ *
+ *-------------------------------------------------------------------------
+ * SEAMCALL ABI:
+ *-------------------------------------------------------------------------
+ * Input Registers:
+ *
+ * RAX                 - SEAMCALL Leaf number.
+ * RCX,RDX,R8-R9       - SEAMCALL Leaf specific input registers.
+ *
+ * Output Registers:
+ *
+ * RAX                 - SEAMCALL completion status code.
+ * RCX,RDX,R8-R11      - SEAMCALL Leaf specific output registers.
+ *
+ *-------------------------------------------------------------------------
+ *
+ * __seamcall() function ABI:
+ *
+ * @fn  (RDI)          - SEAMCALL Leaf number, moved to RAX
+ * @rcx (RSI)          - Input parameter 1, moved to RCX
+ * @rdx (RDX)          - Input parameter 2, moved to RDX
+ * @r8  (RCX)          - Input parameter 3, moved to R8
+ * @r9  (R8)           - Input parameter 4, moved to R9
+ *
+ * @out (R9)           - struct tdx_module_output pointer
+ *			 stored temporarily in R12 (not
+ *			 used by the P-SEAMLDR or the TDX
+ *			 module). It can be NULL.
+ *
+ * Return (via RAX) the completion status of the SEAMCALL, or
+ * TDX_SEAMCALL_VMFAILINVALID.
+ */
+SYM_FUNC_START(__seamcall)
+	FRAME_BEGIN
+	TDX_MODULE_CALL host=1
+	FRAME_END
+	RET
+SYM_FUNC_END(__seamcall)
diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 908590e85749..f8233cba5931 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -12,14 +12,56 @@
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/printk.h>
+#include <linux/smp.h>
 #include <asm/msr-index.h>
 #include <asm/msr.h>
 #include <asm/tdx.h>
+#include "tdx.h"
 
 static u32 tdx_global_keyid __ro_after_init;
 static u32 tdx_guest_keyid_start __ro_after_init;
 static u32 tdx_nr_guest_keyids __ro_after_init;
 
+/*
+ * Wrapper of __seamcall() to convert SEAMCALL leaf function error code
+ * to kernel error code.  @seamcall_ret and @out contain the SEAMCALL
+ * leaf function return code and the additional output respectively if
+ * not NULL.
+ */
+static int __always_unused seamcall(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9,
+				    u64 *seamcall_ret,
+				    struct tdx_module_output *out)
+{
+	u64 sret;
+	int cpu;
+
+	/* Need a stable CPU id for printing error message */
+	cpu = get_cpu();
+	sret = __seamcall(fn, rcx, rdx, r8, r9, out);
+	put_cpu();
+
+	/* Save SEAMCALL return code if the caller wants it */
+	if (seamcall_ret)
+		*seamcall_ret = sret;
+
+	switch (sret) {
+	case 0:
+		/* SEAMCALL was successful */
+		return 0;
+	case TDX_SEAMCALL_VMFAILINVALID:
+		pr_err_once("module is not loaded.\n");
+		return -ENODEV;
+	default:
+		pr_err_once("SEAMCALL failed: CPU %d: leaf %llu, error 0x%llx.\n",
+				cpu, fn, sret);
+		if (out)
+			pr_err_once("additional output: rcx 0x%llx, rdx 0x%llx, r8 0x%llx, r9 0x%llx, r10 0x%llx, r11 0x%llx.\n",
+					out->rcx, out->rdx, out->r8,
+					out->r9, out->r10, out->r11);
+		return -EIO;
+	}
+}
+
 static int __init record_keyid_partitioning(u32 *tdx_keyid_start,
 					    u32 *nr_tdx_keyids)
 {
diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h
new file mode 100644
index 000000000000..48ad1a1ba737
--- /dev/null
+++ b/arch/x86/virt/vmx/tdx/tdx.h
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _X86_VIRT_TDX_H
+#define _X86_VIRT_TDX_H
+
+#include <linux/types.h>
+
+struct tdx_module_output;
+u64 __seamcall(u64 fn, u64 rcx, u64 rdx, u64 r8, u64 r9,
+	       struct tdx_module_output *out);
+#endif
-- 
2.40.1



  parent reply	other threads:[~2023-06-26 14:14 UTC|newest]

Thread overview: 159+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-26 14:12 [PATCH v12 00/22] TDX host kernel support Kai Huang
2023-06-26 14:12 ` [PATCH v12 01/22] x86/tdx: Define TDX supported page sizes as macros Kai Huang
2023-06-26 14:12 ` [PATCH v12 02/22] x86/virt/tdx: Detect TDX during kernel boot Kai Huang
2023-06-26 14:12 ` [PATCH v12 03/22] x86/virt/tdx: Make INTEL_TDX_HOST depend on X86_X2APIC Kai Huang
2023-06-26 14:12 ` [PATCH v12 04/22] x86/cpu: Detect TDX partial write machine check erratum Kai Huang
2023-06-29 11:22   ` David Hildenbrand
2023-06-26 14:12 ` Kai Huang [this message]
2023-06-27  9:48   ` [PATCH v12 05/22] x86/virt/tdx: Add SEAMCALL infrastructure kirill.shutemov
2023-06-27 10:28     ` Huang, Kai
2023-06-27 11:36       ` kirill.shutemov
2023-06-28  0:19       ` Isaku Yamahata
2023-06-28  3:09   ` Chao Gao
2023-06-28  3:34     ` Huang, Kai
2023-06-28 11:50       ` kirill.shutemov
2023-06-28 23:31         ` Huang, Kai
2023-06-29 11:25       ` David Hildenbrand
2023-06-28 12:58   ` Peter Zijlstra
2023-06-28 13:54     ` Peter Zijlstra
2023-06-28 23:25       ` Huang, Kai
2023-06-29 10:15       ` kirill.shutemov
2023-06-28 23:21     ` Huang, Kai
2023-06-29  3:40       ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 06/22] x86/virt/tdx: Handle SEAMCALL running out of entropy error Kai Huang
2023-06-28 13:02   ` Peter Zijlstra
2023-06-28 23:30     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 07/22] x86/virt/tdx: Add skeleton to enable TDX on demand Kai Huang
2023-06-26 21:21   ` Sathyanarayanan Kuppuswamy
2023-06-27 10:37     ` Huang, Kai
2023-06-27  9:50   ` kirill.shutemov
2023-06-27 10:34     ` Huang, Kai
2023-06-27 12:18       ` kirill.shutemov
2023-06-27 22:37         ` Huang, Kai
2023-06-28  0:28           ` Huang, Kai
2023-06-28 11:55             ` kirill.shutemov
2023-06-28 13:35             ` Peter Zijlstra
2023-06-29  0:15               ` Huang, Kai
2023-06-30  9:22                 ` Peter Zijlstra
2023-06-30 10:09                   ` Huang, Kai
2023-06-30 18:42                     ` Isaku Yamahata
2023-07-01  8:15                     ` Huang, Kai
2023-06-28  0:31           ` Isaku Yamahata
2023-06-28 13:04   ` Peter Zijlstra
2023-06-29  0:00     ` Huang, Kai
2023-06-30  9:25       ` Peter Zijlstra
2023-06-30  9:48         ` Huang, Kai
2023-06-28 13:08   ` Peter Zijlstra
2023-06-29  0:08     ` Huang, Kai
2023-06-28 13:17   ` Peter Zijlstra
2023-06-29  0:10     ` Huang, Kai
2023-06-30  9:26       ` Peter Zijlstra
2023-06-30  9:55         ` Huang, Kai
2023-06-30 18:30           ` Peter Zijlstra
2023-06-30 19:05             ` Isaku Yamahata
2023-06-30 21:24               ` Sean Christopherson
2023-06-30 21:58                 ` Dan Williams
2023-06-30 23:13                 ` Dave Hansen
2023-07-03 10:38                   ` Peter Zijlstra
2023-07-03 10:49                 ` Peter Zijlstra
2023-07-03 14:40                   ` Dave Hansen
2023-07-03 15:03                     ` Peter Zijlstra
2023-07-03 15:26                       ` Dave Hansen
2023-07-03 17:55                       ` kirill.shutemov
2023-07-03 18:26                         ` Dave Hansen
2023-07-05  7:14                         ` Peter Zijlstra
2023-07-04 16:58                 ` Peter Zijlstra
2023-07-04 21:50                   ` Huang, Kai
2023-07-05  7:16                     ` Peter Zijlstra
2023-07-05  7:54                       ` Huang, Kai
2023-07-05 14:34                   ` Dave Hansen
2023-07-05 14:57                     ` Peter Zijlstra
2023-07-06 14:49                       ` Dave Hansen
2023-07-10 17:58                         ` Sean Christopherson
2023-06-29 11:31   ` David Hildenbrand
2023-06-29 22:58     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 08/22] x86/virt/tdx: Get information about TDX module and TDX-capable memory Kai Huang
2023-06-27  9:51   ` kirill.shutemov
2023-06-27 10:45     ` Huang, Kai
2023-06-27 11:37       ` kirill.shutemov
2023-06-27 11:46         ` Huang, Kai
2023-06-28 14:10   ` Peter Zijlstra
2023-06-29  9:15     ` Huang, Kai
2023-06-30  9:34       ` Peter Zijlstra
2023-06-30  9:58         ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 09/22] x86/virt/tdx: Use all system memory when initializing TDX module as TDX memory Kai Huang
2023-06-28 14:17   ` Peter Zijlstra
2023-06-29  0:57     ` Huang, Kai
2023-07-11 11:38   ` David Hildenbrand
2023-07-11 12:27     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 10/22] x86/virt/tdx: Add placeholder to construct TDMRs to cover all TDX memory regions Kai Huang
2023-06-26 14:12 ` [PATCH v12 11/22] x86/virt/tdx: Fill out " Kai Huang
2023-07-04  7:28   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 12/22] x86/virt/tdx: Allocate and set up PAMTs for TDMRs Kai Huang
2023-06-27  9:51   ` kirill.shutemov
2023-07-04  7:40   ` Yuan Yao
2023-07-04  8:59     ` Huang, Kai
2023-07-11 11:42   ` David Hildenbrand
2023-07-11 11:49     ` Huang, Kai
2023-07-11 11:55       ` David Hildenbrand
2023-06-26 14:12 ` [PATCH v12 13/22] x86/virt/tdx: Designate reserved areas for all TDMRs Kai Huang
2023-07-05  5:29   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 14/22] x86/virt/tdx: Configure TDX module with the TDMRs and global KeyID Kai Huang
2023-07-05  6:49   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 15/22] x86/virt/tdx: Configure global KeyID on all packages Kai Huang
2023-07-05  8:13   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 16/22] x86/virt/tdx: Initialize all TDMRs Kai Huang
2023-07-06  5:31   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 17/22] x86/kexec: Flush cache of TDX private memory Kai Huang
2023-06-26 14:12 ` [PATCH v12 18/22] x86/virt/tdx: Keep TDMRs when module initialization is successful Kai Huang
2023-06-28  9:04   ` Nikolay Borisov
2023-06-29  1:03     ` Huang, Kai
2023-06-28 12:23   ` kirill.shutemov
2023-06-28 12:48     ` Nikolay Borisov
2023-06-29  0:24       ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 19/22] x86/kexec(): Reset TDX private memory on platforms with TDX erratum Kai Huang
2023-06-28  9:20   ` Nikolay Borisov
2023-06-29  0:32     ` Dave Hansen
2023-06-29  0:58       ` Huang, Kai
2023-06-29  3:19     ` Huang, Kai
2023-06-29  5:38       ` Huang, Kai
2023-06-29  9:45         ` Huang, Kai
2023-06-29  9:48           ` Nikolay Borisov
2023-06-28 12:29   ` kirill.shutemov
2023-06-29  0:27     ` Huang, Kai
2023-07-07  4:01   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 20/22] x86/virt/tdx: Allow SEAMCALL to handle #UD and #GP Kai Huang
2023-06-28 12:32   ` kirill.shutemov
2023-06-28 15:29   ` Peter Zijlstra
2023-06-28 20:38     ` Peter Zijlstra
2023-06-28 21:11       ` Peter Zijlstra
2023-06-28 21:16         ` Peter Zijlstra
2023-06-30  9:03           ` kirill.shutemov
2023-06-30 10:02             ` Huang, Kai
2023-06-30 10:22               ` kirill.shutemov
2023-06-30 11:06                 ` Huang, Kai
2023-06-29 10:33       ` Huang, Kai
2023-06-30 10:06         ` Peter Zijlstra
2023-06-30 10:18           ` Huang, Kai
2023-06-30 15:16             ` Dave Hansen
2023-07-01  8:16               ` Huang, Kai
2023-06-30 10:21           ` Peter Zijlstra
2023-06-30 11:05             ` Huang, Kai
2023-06-30 12:06             ` Peter Zijlstra
2023-06-30 15:14               ` Peter Zijlstra
2023-07-03 12:15               ` Huang, Kai
2023-07-05 10:21                 ` Peter Zijlstra
2023-07-05 11:34                   ` Huang, Kai
2023-07-05 12:19                     ` Peter Zijlstra
2023-07-05 12:53                       ` Huang, Kai
2023-07-05 20:56                         ` Isaku Yamahata
2023-07-05 12:21                     ` Peter Zijlstra
2023-06-29 11:16       ` kirill.shutemov
2023-06-29 10:00     ` Huang, Kai
2023-06-26 14:12 ` [PATCH v12 21/22] x86/mce: Improve error log of kernel space TDX #MC due to erratum Kai Huang
2023-06-28 12:38   ` kirill.shutemov
2023-07-07  7:26   ` Yuan Yao
2023-06-26 14:12 ` [PATCH v12 22/22] Documentation/x86: Add documentation for TDX host support Kai Huang
2023-06-28  7:04 ` [PATCH v12 00/22] TDX host kernel support Yuan Yao
2023-06-28  8:12   ` Huang, Kai
2023-06-29  1:01     ` Yuan Yao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b2a875fd855145728744617ac4425a06d8b46c90.1687784645.git.kai.huang@intel.com \
    --to=kai.huang@intel.com \
    --cc=ak@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=bagasdotme@gmail.com \
    --cc=bp@alien8.de \
    --cc=chao.gao@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=david@redhat.com \
    --cc=hpa@zytor.com \
    --cc=imammedo@redhat.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mingo@redhat.com \
    --cc=nik.borisov@suse.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=reinette.chatre@intel.com \
    --cc=sagis@google.com \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    --cc=ying.huang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox