On Tue, Jan 07, 2025 at 03:21:40AM +0800, Edgecombe, Rick P wrote: > On Mon, 2025-01-06 at 13:50 +0800, Yan Zhao wrote: > > > I think we should try to keep it as simple as possible for now. > > Yeah. > > So, do you think we need to have tdh_mem_page_aug() to support 4K level page > > only and ask for Dave's review again for huge page? > > > > Do we need to add param "level" ? > > - if yes, "struct page" looks not fit. > > - if not, hardcode it as 0 in the wrapper and convert "pfn" to "struct page"? > > My thoughts would be we should export just what is needed for today to keep > things simple and speedy (skip level arg, support order 0 only), especially if > we can drop all folio checks. The SEAMCALL wrappers will not be set in stone and > it will be easier to review huge page required stuff in the context of already > settled 4k support. Ok. Attached the new diff for tdh_mem_page_aug() to support 4K only. Have compiled and tested in my local env. (I kept the tdx_level in tdh_mem_range_block() and tdh_mem_page_remove() in later patches). diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h index 787c359a5fc9..1db93e4886df 100644 --- a/arch/x86/include/asm/tdx.h +++ b/arch/x86/include/asm/tdx.h @@ -144,9 +144,14 @@ struct tdx_vp { }; u64 tdh_mng_addcx(struct tdx_td *td, struct page *tdcs_page); +u64 tdh_mem_page_add(struct tdx_td *td, gfn_t gfn, struct page *private_page, + struct page *source_page, u64 *extended_err1, u64 *extended_err2); u64 tdh_mem_sept_add(struct tdx_td *td, gfn_t gfn, int tdx_level, struct page *sept_page, u64 *extended_err1, u64 *extended_err2); u64 tdh_vp_addcx(struct tdx_vp *vp, struct page *tdcx_page); +struct folio; +u64 tdh_mem_page_aug(struct tdx_td *td, gfn_t gfn, struct page *private_page, + u64 *extended_err1, u64 *extended_err2); u64 tdh_mng_key_config(struct tdx_td *td); u64 tdh_mng_create(struct tdx_td *td, u64 hkid); u64 tdh_vp_create(struct tdx_td *td, struct tdx_vp *vp); diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index adb2059b6b5f..cfedff43e1e0 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -1583,6 +1583,28 @@ u64 tdh_mng_addcx(struct tdx_td *td, struct page *tdcs_page) } EXPORT_SYMBOL_GPL(tdh_mng_addcx); +u64 tdh_mem_page_add(struct tdx_td *td, gfn_t gfn, struct page *private_page, + struct page *source_page, u64 *extended_err1, u64 *extended_err2) +{ + union tdx_sept_gpa_mapping_info gpa_info = { .level = 0, .gfn = gfn, }; + struct tdx_module_args args = { + .rcx = gpa_info.full, + .rdx = tdx_tdr_pa(td), + .r8 = page_to_phys(private_page), + .r9 = page_to_phys(source_page), + }; + u64 ret; + + tdx_clflush_page(private_page); + ret = seamcall_ret(TDH_MEM_PAGE_ADD, &args); + + *extended_err1 = args.rcx; + *extended_err2 = args.rdx; + + return ret; +} +EXPORT_SYMBOL_GPL(tdh_mem_page_add); + u64 tdh_mem_sept_add(struct tdx_td *td, gfn_t gfn, int tdx_level, struct page *sept_page, u64 *extended_err1, u64 *extended_err2) { @@ -1616,6 +1638,28 @@ u64 tdh_vp_addcx(struct tdx_vp *vp, struct page *tdcx_page) } EXPORT_SYMBOL_GPL(tdh_vp_addcx); +u64 tdh_mem_page_aug(struct tdx_td *td, gfn_t gfn, struct page *private_page, + u64 *extended_err1, u64 *extended_err2) +{ + union tdx_sept_gpa_mapping_info gpa_info = { .level = 0, .gfn = gfn, }; + struct tdx_module_args args = { + .rcx = gpa_info.full, + .rdx = tdx_tdr_pa(td), + .r8 = page_to_phys(private_page), + }; + u64 ret; + + tdx_clflush_page(private_page); + + ret = seamcall_ret(TDH_MEM_PAGE_AUG, &args); + + *extended_err1 = args.rcx; + *extended_err2 = args.rdx; + + return ret; +} +EXPORT_SYMBOL_GPL(tdh_mem_page_aug); + u64 tdh_mng_key_config(struct tdx_td *td) { struct tdx_module_args args = { diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index 0d1ba0d0ac82..8a56e790f64d 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -18,8 +18,10 @@ * TDX module SEAMCALL leaf functions */ #define TDH_MNG_ADDCX 1 +#define TDH_MEM_PAGE_ADD 2 #define TDH_MEM_SEPT_ADD 3 #define TDH_VP_ADDCX 4 +#define TDH_MEM_PAGE_AUG 6 #define TDH_MNG_KEY_CONFIG 8 #define TDH_MNG_CREATE 9 #define TDH_MNG_RD 11