diff options
| -rw-r--r-- | arch/x86/kernel/relocate_kernel_64.S | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index 3ca3bf6b3f49..a95691b42c5c 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S @@ -113,8 +113,6 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)  	 * %r13 original CR4 when relocate_kernel() was invoked  	 */ -	/* set return address to 0 if not preserving context */ -	pushq	$0  	/* store the start address on the stack */  	pushq   %rdx @@ -208,12 +206,19 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)  .Lrelocate:  	popq	%rdx + +	/* Use the swap page for the callee's stack */ +	movq	kexec_pa_swap_page(%rip), %r10  	leaq	PAGE_SIZE(%r10), %rsp + +	/* push the existing entry point onto the callee's stack */ +	pushq	%rdx +  	ANNOTATE_RETPOLINE_SAFE  	call	*%rdx  	/* get the re-entry point of the peer system */ -	movq	0(%rsp), %rbp +	popq	%rbp  	leaq	relocate_kernel(%rip), %r8  	movq	kexec_pa_swap_page(%rip), %r10  	movq	pa_backup_pages_map(%rip), %rdi @@ -247,6 +252,7 @@ SYM_CODE_START_LOCAL_NOALIGN(virtual_mapped)  	lgdt    saved_context_gdt_desc(%rax)  #endif +	/* relocate_kernel() returns the re-entry point for next time */  	movq	%rbp, %rax  	popf  | 
