diff options
Diffstat (limited to 'arch/x86/mm/pat/set_memory.c')
| -rw-r--r-- | arch/x86/mm/pat/set_memory.c | 31 | 
1 files changed, 14 insertions, 17 deletions
diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c index b4072115c8ef..abf5ed76e4b7 100644 --- a/arch/x86/mm/pat/set_memory.c +++ b/arch/x86/mm/pat/set_memory.c @@ -1989,6 +1989,7 @@ int set_memory_global(unsigned long addr, int numpages)   */  static int __set_memory_enc_pgtable(unsigned long addr, int numpages, bool enc)  { +	pgprot_t empty = __pgprot(0);  	struct cpa_data cpa;  	int ret; @@ -1999,18 +2000,20 @@ static int __set_memory_enc_pgtable(unsigned long addr, int numpages, bool enc)  	memset(&cpa, 0, sizeof(cpa));  	cpa.vaddr = &addr;  	cpa.numpages = numpages; -	cpa.mask_set = enc ? __pgprot(_PAGE_ENC) : __pgprot(0); -	cpa.mask_clr = enc ? __pgprot(0) : __pgprot(_PAGE_ENC); +	cpa.mask_set = enc ? pgprot_encrypted(empty) : pgprot_decrypted(empty); +	cpa.mask_clr = enc ? pgprot_decrypted(empty) : pgprot_encrypted(empty);  	cpa.pgd = init_mm.pgd;  	/* Must avoid aliasing mappings in the highmem code */  	kmap_flush_unused();  	vm_unmap_aliases(); -	/* -	 * Before changing the encryption attribute, we need to flush caches. -	 */ -	cpa_flush(&cpa, !this_cpu_has(X86_FEATURE_SME_COHERENT)); +	/* Flush the caches as needed before changing the encryption attribute. */ +	if (x86_platform.guest.enc_tlb_flush_required(enc)) +		cpa_flush(&cpa, x86_platform.guest.enc_cache_flush_required()); + +	/* Notify hypervisor that we are about to set/clr encryption attribute. */ +	x86_platform.guest.enc_status_change_prepare(addr, numpages, enc);  	ret = __change_page_attr_set_clr(&cpa, 1); @@ -2023,11 +2026,11 @@ static int __set_memory_enc_pgtable(unsigned long addr, int numpages, bool enc)  	 */  	cpa_flush(&cpa, 0); -	/* -	 * Notify hypervisor that a given memory range is mapped encrypted -	 * or decrypted. -	 */ -	notify_range_enc_status_changed(addr, numpages, enc); +	/* Notify hypervisor that we have successfully set/clr encryption attribute. */ +	if (!ret) { +		if (!x86_platform.guest.enc_status_change_finish(addr, numpages, enc)) +			ret = -EIO; +	}  	return ret;  } @@ -2121,12 +2124,6 @@ int set_pages_array_wc(struct page **pages, int numpages)  }  EXPORT_SYMBOL(set_pages_array_wc); -int set_pages_array_wt(struct page **pages, int numpages) -{ -	return _set_pages_array(pages, numpages, _PAGE_CACHE_MODE_WT); -} -EXPORT_SYMBOL_GPL(set_pages_array_wt); -  int set_pages_wb(struct page *page, int numpages)  {  	unsigned long addr = (unsigned long)page_address(page);  |