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 2/6] x86/tdx: Retry TDVMCALL_MAP_GPA() when needed
Date: Mon, 21 Nov 2022 11:51:47 -0800 [thread overview]
Message-ID: <20221121195151.21812-3-decui@microsoft.com> (raw)
In-Reply-To: <20221121195151.21812-1-decui@microsoft.com>
GHCI spec for TDX 1.0 says that the MapGPA call may fail with the R10
error code = TDG.VP.VMCALL_RETRY (1), and the guest must retry this
operation for the pages in the region starting at the GPA specified
in R11.
When a TDX guest runs on Hyper-V, Hyper-V returns the retry error
when hyperv_init() -> swiotlb_update_mem_attributes() ->
set_memory_decrypted() decrypts up to 1GB of swiotlb bounce buffers.
Signed-off-by: Dexuan Cui <decui@microsoft.com>
---
arch/x86/coco/tdx/tdx.c | 65 +++++++++++++++++++++++++++++++++++++----
1 file changed, 59 insertions(+), 6 deletions(-)
diff --git a/arch/x86/coco/tdx/tdx.c b/arch/x86/coco/tdx/tdx.c
index 3fee96931ff5..46971cc7d006 100644
--- a/arch/x86/coco/tdx/tdx.c
+++ b/arch/x86/coco/tdx/tdx.c
@@ -20,6 +20,8 @@
/* TDX hypercall Leaf IDs */
#define TDVMCALL_MAP_GPA 0x10001
+#define TDVMCALL_STATUS_RETRY 1
+
/* MMIO direction */
#define EPT_READ 0
#define EPT_WRITE 1
@@ -52,6 +54,25 @@ static inline u64 _tdx_hypercall(u64 fn, u64 r12, u64 r13, u64 r14, u64 r15)
return __tdx_hypercall(&args, 0);
}
+static inline u64 _tdx_hypercall_output_r11(u64 fn, u64 r12, u64 r13, u64 r14,
+ u64 r15, u64 *r11)
+{
+ struct tdx_hypercall_args args = {
+ .r10 = TDX_HYPERCALL_STANDARD,
+ .r11 = fn,
+ .r12 = r12,
+ .r13 = r13,
+ .r14 = r14,
+ .r15 = r15,
+ };
+
+ u64 ret;
+
+ ret = __tdx_hypercall(&args, TDX_HCALL_HAS_OUTPUT);
+ *r11 = args.r11;
+ return ret;
+}
+
/* Called from __tdx_hypercall() for unrecoverable failure */
void __tdx_hypercall_failed(void)
{
@@ -691,6 +712,43 @@ static bool try_accept_one(phys_addr_t *start, unsigned long len,
return true;
}
+/*
+ * Notify the VMM about page mapping conversion. More info about ABI
+ * can be found in TDX Guest-Host-Communication Interface (GHCI),
+ * section "TDG.VP.VMCALL<MapGPA>"
+ */
+static bool tdx_map_gpa(phys_addr_t start, phys_addr_t end, bool enc)
+{
+ u64 ret, r11;
+
+ while (1) {
+ ret = _tdx_hypercall_output_r11(TDVMCALL_MAP_GPA, start,
+ end - start, 0, 0, &r11);
+ if (!ret)
+ break;
+
+ if (ret != TDVMCALL_STATUS_RETRY)
+ break;
+
+ /*
+ * The guest must retry the operation for the pages in the
+ * region starting at the GPA specified in R11. Make sure R11
+ * contains a sane value.
+ */
+ if ((r11 & ~cc_mkdec(0)) < (start & ~cc_mkdec(0)) ||
+ (r11 & ~cc_mkdec(0)) >= (end & ~cc_mkdec(0)))
+ return false;
+
+ start = r11;
+
+ /* Set the shared (decrypted) bit. */
+ if (!enc)
+ start |= cc_mkdec(0);
+ }
+
+ return !ret;
+}
+
/*
* Inform the VMM of the guest's intent for this physical page: shared with
* the VMM or private to the guest. The VMM is expected to change its mapping
@@ -707,12 +765,7 @@ static bool tdx_enc_status_changed(unsigned long vaddr, int numpages, bool enc)
end |= cc_mkdec(0);
}
- /*
- * Notify the VMM about page mapping conversion. More info about ABI
- * can be found in TDX Guest-Host-Communication Interface (GHCI),
- * section "TDG.VP.VMCALL<MapGPA>"
- */
- if (_tdx_hypercall(TDVMCALL_MAP_GPA, start, end - start, 0, 0))
+ if (!tdx_map_gpa(start, end, enc))
return false;
/* private->shared conversion requires only MapGPA call */
--
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 ` [PATCH 1/6] x86/tdx: Support hypercalls for " Dexuan Cui
2022-11-21 20:38 ` 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 ` Dexuan Cui [this message]
2022-11-21 20:55 ` [PATCH 2/6] x86/tdx: Retry TDVMCALL_MAP_GPA() when needed 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-3-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.