diff options
| author | Michael Ellerman <michael@ellerman.id.au> | 2008-04-30 13:21:45 +1000 | 
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-04-30 19:49:48 +1000 | 
| commit | 3243d87441bf7f97c5c9f7dd46b35f5783ec6740 (patch) | |
| tree | 7765277523d0146bccb5bde64df67b13723211a9 | |
| parent | 595f403c1af37b1339e64b89040528b8cd48c5a3 (diff) | |
| download | olio-linux-3.10-3243d87441bf7f97c5c9f7dd46b35f5783ec6740.tar.xz olio-linux-3.10-3243d87441bf7f97c5c9f7dd46b35f5783ec6740.zip  | |
[POWERPC] Make emergency stack safe for current_thread_info() use
The current_thread_info() macro, used by preempt_count(), assumes the
base address and size of the stack are THREAD_SIZE aligned.
The emergency stack currently isn't either of these things, which
could potentially cause problems anytime we're running on the
emergency stack.  That includes when we detect a bad kernel stack
pointer, and also during early_setup_secondary().
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
| -rw-r--r-- | arch/powerpc/kernel/setup_64.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index dff6308d1b5..25e3fd8606a 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c @@ -487,9 +487,12 @@ static void __init emergency_stack_init(void)  	 */  	limit = min(0x10000000UL, lmb.rmo_size); -	for_each_possible_cpu(i) -		paca[i].emergency_sp = -		__va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE; +	for_each_possible_cpu(i) { +		unsigned long sp; +		sp  = lmb_alloc_base(THREAD_SIZE, THREAD_SIZE, limit); +		sp += THREAD_SIZE; +		paca[i].emergency_sp = __va(sp); +	}  }  /*  |