diff options
author | Boris Ostrovsky <boris.ostrovsky@oracle.com> | 2014-04-10 12:17:09 -0400 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2014-04-15 15:00:14 +0100 |
commit | 4461bbc05bf11fa4251acded60e4645863a4158a (patch) | |
tree | 170e93580f872fdb8e781bb83f6b1999322fbc7c /arch/x86/xen/smp.c | |
parent | d06eb3ee9b09d753dc0883cc388d9a503839d6ca (diff) | |
download | linux-4461bbc05bf11fa4251acded60e4645863a4158a.tar.gz linux-4461bbc05bf11fa4251acded60e4645863a4158a.tar.bz2 linux-4461bbc05bf11fa4251acded60e4645863a4158a.zip |
x86/xen: Fix 32-bit PV guests's usage of kernel_stack
Commit 198d208df4371734ac4728f69cb585c284d20a15 ("x86: Keep
thread_info on thread stack in x86_32") made 32-bit kernels use
kernel_stack to point to thread_info. That change missed a couple of
updates needed by Xen's 32-bit PV guests:
1. kernel_stack needs to be initialized for secondary CPUs
2. GET_THREAD_INFO() now uses %fs register which may not be the
kernel's version when executing xen_iret().
With respect to the second issue, we don't need GET_THREAD_INFO()
anymore: we used it as an intermediate step to get to per_cpu xen_vcpu
and avoid referencing %fs. Now that we are going to use %fs anyway we
may as well go directly to xen_vcpu.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Diffstat (limited to 'arch/x86/xen/smp.c')
-rw-r--r-- | arch/x86/xen/smp.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index a18eadd8bb40..7005974c3ff3 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -441,10 +441,11 @@ static int xen_cpu_up(unsigned int cpu, struct task_struct *idle) irq_ctx_init(cpu); #else clear_tsk_thread_flag(idle, TIF_FORK); +#endif per_cpu(kernel_stack, cpu) = (unsigned long)task_stack_page(idle) - KERNEL_STACK_OFFSET + THREAD_SIZE; -#endif + xen_setup_runstate_info(cpu); xen_setup_timer(cpu); xen_init_lock_cpu(cpu); |