diff options
| -rw-r--r-- | arch/x86/include/asm/tdx.h | 3 | ||||
| -rw-r--r-- | arch/x86/virt/vmx/tdx/tdx.c | 51 | ||||
| -rw-r--r-- | arch/x86/virt/vmx/tdx/tdx.h | 3 | 
3 files changed, 57 insertions, 0 deletions
| diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 5950e0a092ca..6ba3b806e880 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -129,8 +129,11 @@ struct tdx_td {  	struct page **tdcs_pages;  }; +u64 tdh_mng_addcx(struct tdx_td *td, struct page *tdcs_page);  u64 tdh_mng_key_config(struct tdx_td *td); +u64 tdh_mng_create(struct tdx_td *td, u16 hkid);  u64 tdh_mng_key_freeid(struct tdx_td *td); +u64 tdh_mng_init(struct tdx_td *td, u64 td_params, u64 *extended_err);  #else  static inline void tdx_init(void) { }  static inline int tdx_cpu_enable(void) { return -ENODEV; } diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index 1ffbdb840004..ce4b1e96c5b0 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -1462,6 +1462,29 @@ static inline u64 tdx_tdr_pa(struct tdx_td *td)  	return page_to_phys(td->tdr_page);  } +/* + * The TDX module exposes a CLFLUSH_BEFORE_ALLOC bit to specify whether + * a CLFLUSH of pages is required before handing them to the TDX module. + * Be conservative and make the code simpler by doing the CLFLUSH + * unconditionally. + */ +static void tdx_clflush_page(struct page *page) +{ +	clflush_cache_range(page_to_virt(page), PAGE_SIZE); +} + +u64 tdh_mng_addcx(struct tdx_td *td, struct page *tdcs_page) +{ +	struct tdx_module_args args = { +		.rcx = page_to_phys(tdcs_page), +		.rdx = tdx_tdr_pa(td), +	}; + +	tdx_clflush_page(tdcs_page); +	return seamcall(TDH_MNG_ADDCX, &args); +} +EXPORT_SYMBOL_GPL(tdh_mng_addcx); +  u64 tdh_mng_key_config(struct tdx_td *td)  {  	struct tdx_module_args args = { @@ -1472,6 +1495,18 @@ u64 tdh_mng_key_config(struct tdx_td *td)  }  EXPORT_SYMBOL_GPL(tdh_mng_key_config); +u64 tdh_mng_create(struct tdx_td *td, u16 hkid) +{ +	struct tdx_module_args args = { +		.rcx = tdx_tdr_pa(td), +		.rdx = hkid, +	}; + +	tdx_clflush_page(td->tdr_page); +	return seamcall(TDH_MNG_CREATE, &args); +} +EXPORT_SYMBOL_GPL(tdh_mng_create); +  u64 tdh_mng_key_freeid(struct tdx_td *td)  {  	struct tdx_module_args args = { @@ -1481,3 +1516,19 @@ u64 tdh_mng_key_freeid(struct tdx_td *td)  	return seamcall(TDH_MNG_KEY_FREEID, &args);  }  EXPORT_SYMBOL_GPL(tdh_mng_key_freeid); + +u64 tdh_mng_init(struct tdx_td *td, u64 td_params, u64 *extended_err) +{ +	struct tdx_module_args args = { +		.rcx = tdx_tdr_pa(td), +		.rdx = td_params, +	}; +	u64 ret; + +	ret = seamcall_ret(TDH_MNG_INIT, &args); + +	*extended_err = args.rcx; + +	return ret; +} +EXPORT_SYMBOL_GPL(tdh_mng_init); diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index 5579317f67ab..0861c3f09576 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -15,8 +15,11 @@  /*   * TDX module SEAMCALL leaf functions   */ +#define TDH_MNG_ADDCX			1  #define TDH_MNG_KEY_CONFIG		8 +#define TDH_MNG_CREATE			9  #define TDH_MNG_KEY_FREEID		20 +#define TDH_MNG_INIT			21  #define TDH_PHYMEM_PAGE_RDMD		24  #define TDH_SYS_KEY_CONFIG		31  #define TDH_SYS_INIT			33 | 
