From: Dexuan Cui <decui@microsoft.com>
To: ak@linux.intel.com, arnd@arndb.de, bp@alien8.de,
brijesh.singh@amd.com, dan.j.williams@intel.com,
dave.hansen@linux.intel.com, haiyangz@microsoft.com,
hpa@zytor.com, jane.chu@oracle.com,
kirill.shutemov@linux.intel.com, kys@microsoft.com,
linux-arch@vger.kernel.org, linux-hyperv@vger.kernel.org,
luto@kernel.org, mingo@redhat.com, peterz@infradead.org,
rostedt@goodmis.org, sathyanarayanan.kuppuswamy@linux.intel.com,
seanjc@google.com, tglx@linutronix.de, tony.luck@intel.com,
wei.liu@kernel.org, x86@kernel.org
Cc: linux-kernel@vger.kernel.org, Dexuan Cui <decui@microsoft.com>
Subject: [PATCH 1/6] x86/tdx: Support hypercalls for TDX guests on Hyper-V
Date: Mon, 21 Nov 2022 11:51:46 -0800 [thread overview]
Message-ID: <20221121195151.21812-2-decui@microsoft.com> (raw)
In-Reply-To: <20221121195151.21812-1-decui@microsoft.com>
__tdx_hypercall() doesn't work for a TDX guest running on Hyper-V,
because Hyper-V uses a different calling convention, so add the
new function __tdx_ms_hv_hypercall().
Signed-off-by: Dexuan Cui <decui@microsoft.com>
---
arch/x86/coco/tdx/tdcall.S | 87 +++++++++++++++++++++++++++++++++
arch/x86/include/asm/mshyperv.h | 2 +
2 files changed, 89 insertions(+)
diff --git a/arch/x86/coco/tdx/tdcall.S b/arch/x86/coco/tdx/tdcall.S
index f9eb1134f22d..468b71738485 100644
--- a/arch/x86/coco/tdx/tdcall.S
+++ b/arch/x86/coco/tdx/tdcall.S
@@ -13,6 +13,8 @@
/*
* Bitmasks of exposed registers (with VMM).
*/
+#define TDX_RDX BIT(2)
+#define TDX_R8 BIT(8)
#define TDX_R10 BIT(10)
#define TDX_R11 BIT(11)
#define TDX_R12 BIT(12)
@@ -203,3 +205,88 @@ SYM_FUNC_START(__tdx_hypercall)
REACHABLE
jmp .Lpanic
SYM_FUNC_END(__tdx_hypercall)
+
+/*
+ * __tdx_ms_hv_hypercall() - Make hypercalls to Hype-V using TDVMCALL leaf
+ * of TDCALL instruction
+ *
+ * Transforms values in function call arguments "input control, output_addr,
+ * and input_addr" into the TDCALL register ABI. After TDCALL operation,
+ * Hyper-V has changed the memory pointed by output_addr, and R11 is the
+ * output control code. Note: before the TDCALL operation, the guest must
+ * share the memory pointed by input_addr and output_addr with Hyper-V.
+ *-------------------------------------------------------------------------
+ * TD VMCALL ABI on Hyper-V:
+ *-------------------------------------------------------------------------
+ *
+ * Input Registers:
+ *
+ * RAX - TDCALL instruction leaf number (0 - TDG.VP.VMCALL)
+ * RCX - BITMAP which controls which part of TD Guest GPR
+ * is passed as-is to the VMM and back.
+ * R10 - Set to Hyper-V hypercall input control code.
+ * Note: legal Hyper-V hypercall input control codes
+ * are always non-zero, i.e. they don't conflict with
+ * TDX_HYPERCALL_STANDARD.
+ * R8 - Output physical addr.
+ * RDX - Input physical addr.
+ *
+ * Output Registers:
+ *
+ * RAX - TDCALL instruction status (Not related to hypercall
+ * output).
+ * R11 - Output control code.
+ *
+ *-------------------------------------------------------------------------
+ *
+ * __tdx_ms_hv_hypercall() function ABI:
+ *
+ * @arg (RDI) - Input control code, moved to R10
+ * @arg (RSI) - Output address, moved to R8
+ * @arg (RDX) - Input address. RDX is passed to Hyper-V as-is.
+ *
+ * On successful completion, return the hypercall output control code.
+ */
+SYM_FUNC_START(__tdx_ms_hv_hypercall)
+ FRAME_BEGIN
+
+ /* Set TDCALL leaf ID (TDVMCALL (0)) in RAX */
+ xor %eax, %eax
+
+ /* Do not leak the value of the output-only register to Hyper-V */
+ xor %r11, %r11
+
+ /* Load input control code */
+ mov %rdi, %r10
+
+ /* Load output addr. NB: input addr is already in RDX. */
+ mov %rsi, %r8
+
+ /* Expose these registers to Hyper-V as-is */
+ mov $(TDX_RDX | TDX_R8 | TDX_R10 |TDX_R11), %ecx
+
+ tdcall
+
+ /*
+ * RAX==0 indicates a failure of the TDVMCALL mechanism itself and that
+ * something has gone horribly wrong with the TDX module.
+ *
+ * The return status of the hypercall operation is in a separate
+ * register (in R11). Hypercall errors are a part of normal operation
+ * and are handled by callers.
+ */
+ testq %rax, %rax
+ jne .Lpanic_ms_hv
+
+ /* Copy output control code as the function's return value */
+ movq %r11, %rax
+
+ FRAME_END
+
+ RET
+.Lpanic_ms_hv:
+ call __tdx_hypercall_failed
+ /* __tdx_hypercall_failed never returns */
+ REACHABLE
+ jmp .Lpanic_ms_hv
+SYM_FUNC_END(__tdx_ms_hv_hypercall)
diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index 61f0c206bff0..fc09b6739922 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -36,6 +36,8 @@ int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages);
int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id);
int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags);
+u64 __tdx_ms_hv_hypercall(u64 control, u64 output_addr, u64 input_addr);
+
static inline u64 hv_do_hypercall(u64 control, void *input, void *output)
{
u64 input_address = input ? virt_to_phys(input) : 0;
--
2.25.1
next prev parent reply other threads:[~2022-11-21 19:53 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-21 19:51 [PATCH 0/6] Support TDX guests on Hyper-V Dexuan Cui
2022-11-21 19:51 ` Dexuan Cui [this message]
2022-11-21 20:38 ` [PATCH 1/6] x86/tdx: Support hypercalls for " Dave Hansen
2022-11-21 23:52 ` Kirill A. Shutemov
2022-11-23 1:37 ` Dexuan Cui
2022-11-23 1:56 ` Dexuan Cui
2022-11-23 16:04 ` Dave Hansen
2022-11-23 18:59 ` Dexuan Cui
2022-11-23 3:52 ` Sathyanarayanan Kuppuswamy
2022-11-23 14:40 ` Kirill A. Shutemov
2022-11-23 18:55 ` Dexuan Cui
2022-11-30 19:14 ` Dexuan Cui
2022-12-02 21:47 ` 'Kirill A. Shutemov'
2022-11-23 16:03 ` Dave Hansen
2022-11-21 19:51 ` [PATCH 2/6] x86/tdx: Retry TDVMCALL_MAP_GPA() when needed Dexuan Cui
2022-11-21 20:55 ` Dave Hansen
2022-11-23 2:55 ` Dexuan Cui
2022-11-22 0:01 ` Kirill A. Shutemov
2022-11-23 3:27 ` Dexuan Cui
2022-11-23 13:30 ` Michael Kelley (LINUX)
2022-11-28 0:07 ` Dexuan Cui
2022-11-21 19:51 ` [PATCH 3/6] x86/tdx: Support vmalloc() for tdx_enc_status_changed() Dexuan Cui
2022-11-21 21:00 ` Dave Hansen
2022-11-23 4:01 ` Dexuan Cui
2022-11-22 0:24 ` Kirill A. Shutemov
2022-11-23 23:51 ` Dexuan Cui
2022-11-24 7:51 ` Kirill A. Shutemov
2022-11-27 20:27 ` Dexuan Cui
2022-11-21 19:51 ` [PATCH 4/6] x86/hyperv: Add hv_isolation_type_tdx() to detect TDX guests Dexuan Cui
2022-11-21 21:01 ` Dave Hansen
2022-11-21 21:48 ` Borislav Petkov
2022-11-22 0:32 ` Sathyanarayanan Kuppuswamy
2022-11-23 19:13 ` Dexuan Cui
2022-11-21 19:51 ` [PATCH 5/6] x86/hyperv: Support hypercalls for " Dexuan Cui
2022-11-21 20:05 ` Dave Hansen
2022-11-23 2:14 ` Dexuan Cui
2022-11-23 14:47 ` Kirill A. Shutemov
2022-11-23 18:13 ` Dexuan Cui
2022-11-23 18:18 ` Sathyanarayanan Kuppuswamy
2022-11-23 19:07 ` Dexuan Cui
2022-11-23 14:45 ` Michael Kelley (LINUX)
2022-11-28 0:58 ` Dexuan Cui
2022-11-28 1:20 ` Michael Kelley (LINUX)
2022-11-28 1:36 ` Dexuan Cui
2022-11-28 1:21 ` Sathyanarayanan Kuppuswamy
2022-11-28 1:55 ` Dexuan Cui
2022-11-28 15:22 ` Dave Hansen
2022-11-28 19:03 ` Dexuan Cui
2022-11-28 19:11 ` Dave Hansen
2022-11-28 19:37 ` Dexuan Cui
2022-11-28 19:48 ` Dave Hansen
2022-11-28 20:36 ` Dexuan Cui
2022-11-28 21:15 ` Dave Hansen
2022-11-28 21:53 ` Dexuan Cui
2022-11-21 19:51 ` [PATCH 6/6] Drivers: hv: vmbus: Support " Dexuan Cui
2023-01-06 11:00 ` Zhi Wang
2023-01-09 6:59 ` Dexuan Cui
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=20221121195151.21812-2-decui@microsoft.com \
--to=decui@microsoft.com \
--cc=ak@linux.intel.com \
--cc=arnd@arndb.de \
--cc=bp@alien8.de \
--cc=brijesh.singh@amd.com \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=jane.chu@oracle.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kys@microsoft.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sathyanarayanan.kuppuswamy@linux.intel.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=wei.liu@kernel.org \
--cc=x86@kernel.org \
/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;
as well as URLs for NNTP newsgroup(s).