From: Kai Huang <kai.huang@intel.com>
To: dave.hansen@intel.com, kirill.shutemov@linux.intel.com,
tglx@linutronix.de, bp@alien8.de, peterz@infradead.org,
mingo@redhat.com, hpa@zytor.com, dan.j.williams@intel.com,
seanjc@google.com, pbonzini@redhat.com
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
kvm@vger.kernel.org, rick.p.edgecombe@intel.com,
isaku.yamahata@intel.com, adrian.hunter@intel.com,
nik.borisov@suse.com, kai.huang@intel.com
Subject: [PATCH v7 07/10] x86/virt/tdx: Trim away tail null CMRs
Date: Mon, 11 Nov 2024 23:39:43 +1300 [thread overview]
Message-ID: <fba5b229f4e0a80aa8bb1001c1aa27fddec5f172.1731318868.git.kai.huang@intel.com> (raw)
In-Reply-To: <cover.1731318868.git.kai.huang@intel.com>
TDX architecturally supports up to 32 CMRs. The global metadata field
"NUM_CMRS" reports the number of CMR entries that can be read by the
kernel. However, that field may just report the maximum number of CMRs
albeit the actual number of CMRs is smaller, in which case there are
tail null CMRs (size is 0).
Trim away those null CMRs, and print valid CMRs since they are useful
at least to developers.
More information about CMR can be found at "Intel TDX ISA Background:
Convertible Memory Ranges (CMRs)" in TDX 1.5 base spec [1], and
"CMR_INFO" in TDX 1.5 ABI spec [2].
Now get_tdx_sys_info() just reads kernel-needed global metadata to
kernel structure, and it is auto-generated. Add a wrapper function
init_tdx_sys_info() to invoke get_tdx_sys_info() and provide room to do
additional things like dealing with CMRs.
Link: https://cdrdv2.intel.com/v1/dl/getContent/733575 [1]
Link: https://cdrdv2.intel.com/v1/dl/getContent/733579 [2]
Signed-off-by: Kai Huang <kai.huang@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
---
arch/x86/virt/vmx/tdx/tdx.c | 56 ++++++++++++++++++++++++++++++++++++-
1 file changed, 55 insertions(+), 1 deletion(-)
diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 43ec56db5084..e81bdcfc20bf 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -272,6 +272,60 @@ static int read_sys_metadata_field(u64 field_id, u64 *data)
#include "tdx_global_metadata.c"
+/* Update the @sysinfo_cmr->num_cmrs to trim tail null CMRs */
+static void trim_null_tail_cmrs(struct tdx_sys_info_cmr *sysinfo_cmr)
+{
+ int i;
+
+ /*
+ * The TDX module may report the maximum number of CMRs that
+ * TDX architecturally supports as the actual number of CMRs,
+ * despite the latter is smaller. In this case some tail
+ * CMR(s) will be null (size is 0). Trim them away.
+ *
+ * Note the CMRs are generated by the BIOS, but the MCHECK
+ * verifies CMRs before enabling TDX on hardware. Skip other
+ * sanity checks (e.g., verify CMR is 4KB aligned) but trust
+ * MCHECK to work properly.
+ *
+ * The spec doesn't say whether it's legal to have null CMRs
+ * in the middle of valid CMRs. For now assume no sane BIOS
+ * would do that (even MCHECK allows).
+ */
+ for (i = 0; i < sysinfo_cmr->num_cmrs; i++)
+ if (!sysinfo_cmr->cmr_size[i])
+ break;
+
+ sysinfo_cmr->num_cmrs = i;
+}
+
+static void print_cmrs(struct tdx_sys_info_cmr *sysinfo_cmr)
+{
+ int i;
+
+ for (i = 0; i < sysinfo_cmr->num_cmrs; i++) {
+ u64 cmr_base = sysinfo_cmr->cmr_base[i];
+ u64 cmr_size = sysinfo_cmr->cmr_size[i];
+
+ pr_info("CMR[%d]: [0x%llx, 0x%llx)\n", i, cmr_base,
+ cmr_base + cmr_size);
+ }
+}
+
+static int init_tdx_sys_info(struct tdx_sys_info *sysinfo)
+{
+ int ret;
+
+ ret = get_tdx_sys_info(sysinfo);
+ if (ret)
+ return ret;
+
+ trim_null_tail_cmrs(&sysinfo->cmr);
+ print_cmrs(&sysinfo->cmr);
+
+ return 0;
+}
+
/* Calculate the actual TDMR size */
static int tdmr_size_single(u16 max_reserved_per_tdmr)
{
@@ -1051,7 +1105,7 @@ static int init_tdx_module(void)
struct tdx_sys_info sysinfo;
int ret;
- ret = get_tdx_sys_info(&sysinfo);
+ ret = init_tdx_sys_info(&sysinfo);
if (ret)
return ret;
--
2.46.2
next prev parent reply other threads:[~2024-11-11 10:40 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-11 10:39 [PATCH v7 00/10] TDX host: metadata reading tweaks, bug fix and info dump Kai Huang
2024-11-11 10:39 ` [PATCH v7 01/10] x86/virt/tdx: Rename 'struct tdx_tdmr_sysinfo' to reflect the spec better Kai Huang
2024-11-11 10:39 ` [PATCH v7 02/10] x86/virt/tdx: Start to track all global metadata in one structure Kai Huang
2024-11-11 10:39 ` [PATCH v7 03/10] x86/virt/tdx: Use auto-generated code to read global metadata Kai Huang
2024-11-11 10:39 ` [PATCH v7 04/10] x86/virt/tdx: Use dedicated struct members for PAMT entry sizes Kai Huang
2024-11-11 10:39 ` [PATCH v7 05/10] x86/virt/tdx: Add missing header file inclusion to local tdx.h Kai Huang
2024-11-11 10:39 ` [PATCH v7 06/10] x86/virt/tdx: Switch to use auto-generated global metadata reading code Kai Huang
2024-11-11 10:39 ` Kai Huang [this message]
2024-11-11 16:32 ` [PATCH v7 07/10] x86/virt/tdx: Trim away tail null CMRs Nikolay Borisov
2024-11-11 19:30 ` Huang, Kai
2024-11-11 19:41 ` Dave Hansen
2024-11-11 20:22 ` Huang, Kai
2024-11-11 10:39 ` [PATCH v7 08/10] x86/virt/tdx: Reduce TDMR's reserved areas by using CMRs to find memory holes Kai Huang
2024-11-11 10:39 ` [PATCH v7 09/10] x86/virt/tdx: Require the module to assert it has the NO_RBP_MOD mitigation Kai Huang
2024-11-11 10:39 ` [PATCH v7 10/10] x86/virt/tdx: Print TDX module version Kai Huang
2024-11-11 20:33 ` [PATCH v7 00/10] TDX host: metadata reading tweaks, bug fix and info dump Dave Hansen
2024-11-11 20:49 ` Huang, Kai
2024-11-11 21:00 ` Dave Hansen
2024-11-11 21:28 ` Huang, Kai
2024-11-13 11:26 ` Huang, Kai
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=fba5b229f4e0a80aa8bb1001c1aa27fddec5f172.1731318868.git.kai.huang@intel.com \
--to=kai.huang@intel.com \
--cc=adrian.hunter@intel.com \
--cc=bp@alien8.de \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=isaku.yamahata@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=nik.borisov@suse.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--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
all inboxes | Powered by JetHome®