diff options
Diffstat (limited to 'arch/x86/kernel/relocate_kernel_64.S')
| -rw-r--r-- | arch/x86/kernel/relocate_kernel_64.S | 13 | 
1 files changed, 10 insertions, 3 deletions
| diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index 26e945f85d19..11e20bb13aca 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S @@ -198,14 +198,21 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)  	movq	%r9, %cr3  	/* +	 * If the memory cache is in incoherent state, e.g., due to +	 * memory encryption, do WBINVD to flush cache. +	 *  	 * If SME is active, there could be old encrypted cache line  	 * entries that will conflict with the now unencrypted memory  	 * used by kexec. Flush the caches before copying the kernel. +	 * +	 * Note SME sets this flag to true when the platform supports +	 * SME, so the WBINVD is performed even SME is not activated +	 * by the kernel.  But this has no harm.  	 */ -	testb	$RELOC_KERNEL_HOST_MEM_ENC_ACTIVE, %r11b -	jz .Lsme_off +	testb	$RELOC_KERNEL_CACHE_INCOHERENT, %r11b +	jz .Lnowbinvd  	wbinvd -.Lsme_off: +.Lnowbinvd:  	call	swap_pages | 
