| From 7c467bea138022ec6feeb6a5a459701406825592 Mon Sep 17 00:00:00 2001 |
| From: Huang Ying <ying.huang@intel.com> |
| Date: Thu, 14 Jul 2011 09:34:37 +0800 |
| Subject: [PATCH] kexec, x86: Fix incorrect jump back address if not |
| preserving context |
| |
| commit 050438ed5a05b25cdf287f5691e56a58c2606997 upstream. |
| |
| In kexec jump support, jump back address passed to the kexeced |
| kernel via function calling ABI, that is, the function call |
| return address is the jump back entry. |
| |
| Furthermore, jump back entry == 0 should be used to signal that |
| the jump back or preserve context is not enabled in the original |
| kernel. |
| |
| But in the current implementation the stack position used for |
| function call return address is not cleared context |
| preservation is disabled. The patch fixes this bug. |
| |
| Reported-and-tested-by: Yin Kangkai <kangkai.yin@intel.com> |
| Signed-off-by: Huang Ying <ying.huang@intel.com> |
| Cc: Eric W. Biederman <ebiederm@xmission.com> |
| Cc: Vivek Goyal <vgoyal@redhat.com> |
| Link: http://lkml.kernel.org/r/1310607277-25029-1-git-send-email-ying.huang@intel.com |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| arch/x86/kernel/relocate_kernel_32.S | 2 ++ |
| arch/x86/kernel/relocate_kernel_64.S | 2 ++ |
| 2 files changed, 4 insertions(+) |
| |
| diff --git a/arch/x86/kernel/relocate_kernel_32.S b/arch/x86/kernel/relocate_kernel_32.S |
| index 4123553..36818f8 100644 |
| --- a/arch/x86/kernel/relocate_kernel_32.S |
| +++ b/arch/x86/kernel/relocate_kernel_32.S |
| @@ -97,6 +97,8 @@ relocate_kernel: |
| ret |
| |
| identity_mapped: |
| + /* set return address to 0 if not preserving context */ |
| + pushl $0 |
| /* store the start address on the stack */ |
| pushl %edx |
| |
| diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S |
| index 4de8f5b..7a6f3b3 100644 |
| --- a/arch/x86/kernel/relocate_kernel_64.S |
| +++ b/arch/x86/kernel/relocate_kernel_64.S |
| @@ -100,6 +100,8 @@ relocate_kernel: |
| ret |
| |
| identity_mapped: |
| + /* set return address to 0 if not preserving context */ |
| + pushq $0 |
| /* store the start address on the stack */ |
| pushq %rdx |
| |
| -- |
| 1.7.9.6 |
| |