On Tue, Jun 27, 2023 at 02:12:44AM +1200, Kai Huang wrote: > The TDX module uses a private KeyID as the "global KeyID" for mapping > things like the PAMT and other TDX metadata. This KeyID has already > been reserved when detecting TDX during the kernel early boot. > > After the list of "TD Memory Regions" (TDMRs) has been constructed to > cover all TDX-usable memory regions, the next step is to pass them to > the TDX module together with the global KeyID. Reviewed-by: Yuan Yao <yuan.yao@xxxxxxxxx> > > Signed-off-by: Kai Huang <kai.huang@xxxxxxxxx> > Reviewed-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > Reviewed-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > --- > > v11 -> v12: > - Added Kirill's tag > > v10 -> v11: > - No update > > v9 -> v10: > - Code change due to change static 'tdx_tdmr_list' to local 'tdmr_list'. > > v8 -> v9: > - Improved changlog to explain why initializing TDMRs can take long > time (Dave). > - Improved comments around 'next-to-initialize' address (Dave). > > v7 -> v8: (Dave) > - Changelog: > - explicitly call out this is the last step of TDX module initialization. > - Trimed down changelog by removing SEAMCALL name and details. > - Removed/trimmed down unnecessary comments. > - Other changes due to 'struct tdmr_info_list'. > > v6 -> v7: > - Removed need_resched() check. -- Andi. > > > --- > arch/x86/virt/vmx/tdx/tdx.c | 41 ++++++++++++++++++++++++++++++++++++- > arch/x86/virt/vmx/tdx/tdx.h | 2 ++ > 2 files changed, 42 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c > index 2bcace5cb25c..1992245290de 100644 > --- a/arch/x86/virt/vmx/tdx/tdx.c > +++ b/arch/x86/virt/vmx/tdx/tdx.c > @@ -26,6 +26,7 @@ > #include <linux/pfn.h> > #include <linux/align.h> > #include <linux/sort.h> > +#include <linux/log2.h> > #include <asm/msr-index.h> > #include <asm/msr.h> > #include <asm/archrandom.h> > @@ -864,6 +865,39 @@ static int construct_tdmrs(struct list_head *tmb_list, > return ret; > } > > +static int config_tdx_module(struct tdmr_info_list *tdmr_list, u64 global_keyid) > +{ > + u64 *tdmr_pa_array; > + size_t array_sz; > + int i, ret; > + > + /* > + * TDMRs are passed to the TDX module via an array of physical > + * addresses of each TDMR. The array itself also has certain > + * alignment requirement. > + */ > + array_sz = tdmr_list->nr_consumed_tdmrs * sizeof(u64); > + array_sz = roundup_pow_of_two(array_sz); > + if (array_sz < TDMR_INFO_PA_ARRAY_ALIGNMENT) > + array_sz = TDMR_INFO_PA_ARRAY_ALIGNMENT; > + > + tdmr_pa_array = kzalloc(array_sz, GFP_KERNEL); > + if (!tdmr_pa_array) > + return -ENOMEM; > + > + for (i = 0; i < tdmr_list->nr_consumed_tdmrs; i++) > + tdmr_pa_array[i] = __pa(tdmr_entry(tdmr_list, i)); > + > + ret = seamcall(TDH_SYS_CONFIG, __pa(tdmr_pa_array), > + tdmr_list->nr_consumed_tdmrs, > + global_keyid, 0, NULL, NULL); > + > + /* Free the array as it is not required anymore. */ > + kfree(tdmr_pa_array); > + > + return ret; > +} > + > static int init_tdx_module(void) > { > struct tdsysinfo_struct *sysinfo; > @@ -917,16 +951,21 @@ static int init_tdx_module(void) > if (ret) > goto out_free_tdmrs; > > + /* Pass the TDMRs and the global KeyID to the TDX module */ > + ret = config_tdx_module(&tdmr_list, tdx_global_keyid); > + if (ret) > + goto out_free_pamts; > + > /* > * TODO: > * > - * - Configure the TDMRs and the global KeyID to the TDX module. > * - Configure the global KeyID on all packages. > * - Initialize all TDMRs. > * > * Return error before all steps are done. > */ > ret = -EINVAL; > +out_free_pamts: > if (ret) > tdmrs_free_pamt_all(&tdmr_list); > else > diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h > index 9b5a65f37e8b..c386aa3afe2a 100644 > --- a/arch/x86/virt/vmx/tdx/tdx.h > +++ b/arch/x86/virt/vmx/tdx/tdx.h > @@ -24,6 +24,7 @@ > #define TDH_SYS_INFO 32 > #define TDH_SYS_INIT 33 > #define TDH_SYS_LP_INIT 35 > +#define TDH_SYS_CONFIG 45 > > struct cmr_info { > u64 base; > @@ -88,6 +89,7 @@ struct tdmr_reserved_area { > } __packed; > > #define TDMR_INFO_ALIGNMENT 512 > +#define TDMR_INFO_PA_ARRAY_ALIGNMENT 512 > > struct tdmr_info { > u64 base; > -- > 2.40.1 >