lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8c53e2fd-c97e-7968-130f-8b5728e20cab@c-s.fr>
Date:   Wed, 3 Oct 2018 07:49:44 +0200
From:   Christophe LEROY <christophe.leroy@....fr>
To:     Nicholas Piggin <npiggin@...il.com>
Cc:     Benjamin Herrenschmidt <benh@...nel.crashing.org>,
        Paul Mackerras <paulus@...ba.org>,
        Michael Ellerman <mpe@...erman.id.au>,
        aneesh.kumar@...ux.vnet.ibm.com, linux-kernel@...r.kernel.org,
        linuxppc-dev@...ts.ozlabs.org
Subject: Re: [RFC PATCH v3 2/7] powerpc: Prepare for moving thread_info into
 task_struct



Le 03/10/2018 à 07:02, Nicholas Piggin a écrit :
> On Mon,  1 Oct 2018 12:30:21 +0000 (UTC)
> Christophe Leroy <christophe.leroy@....fr> wrote:
> 
>> This patch cleans the powerpc kernel before activating
>> CONFIG_THREAD_INFO_IN_TASK:
>> - The purpose of the pointer given to call_do_softirq() and
>> call_do_irq() is to point the new stack ==> change it to void*
>> - Don't use CURRENT_THREAD_INFO() to locate the stack.
>> - Fixed a few comments.
>> - TI_CPU is only used when CONFIG_SMP is set.
>> - Replace current_thread_info()->task by current
>> - Remove unnecessary casts to thread_info, as they'll become invalid
>> once thread_info is not in stack anymore.
>> - Ensure task_struct 'cpu' fields is not used directly out of SMP code
>> - Rename THREAD_INFO to TASK_STASK: As it is in fact the offset of the
>> pointer to the stack in task_struct, this pointer will not be impacted
>> by the move of THREAD_INFO.
>> - Makes TASK_STACK available to PPC64 which will need it to the get
>> stack pointer from current once the thread_info have been moved.
>>
>> Signed-off-by: Christophe Leroy <christophe.leroy@....fr>
>> ---
>>   arch/powerpc/include/asm/irq.h       |  4 ++--
>>   arch/powerpc/include/asm/livepatch.h |  2 +-
>>   arch/powerpc/include/asm/processor.h |  4 ++--
>>   arch/powerpc/include/asm/reg.h       |  2 +-
>>   arch/powerpc/kernel/asm-offsets.c    |  2 +-
>>   arch/powerpc/kernel/entry_32.S       |  2 +-
>>   arch/powerpc/kernel/entry_64.S       |  2 +-
>>   arch/powerpc/kernel/head_32.S        |  4 ++--
>>   arch/powerpc/kernel/head_40x.S       |  4 ++--
>>   arch/powerpc/kernel/head_44x.S       |  2 +-
>>   arch/powerpc/kernel/head_8xx.S       |  2 +-
>>   arch/powerpc/kernel/head_booke.h     |  4 ++--
>>   arch/powerpc/kernel/head_fsl_booke.S |  6 ++++--
>>   arch/powerpc/kernel/irq.c            |  2 +-
>>   arch/powerpc/kernel/misc_32.S        |  8 ++++++--
>>   arch/powerpc/kernel/process.c        |  6 +++---
>>   arch/powerpc/kernel/setup_32.c       | 15 +++++----------
>>   arch/powerpc/kernel/smp.c            |  4 +++-
>>   arch/powerpc/xmon/xmon.c             |  2 +-
>>   19 files changed, 40 insertions(+), 37 deletions(-)
>>
>> diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
>> index ee39ce56b2a2..8108d1fe33ca 100644
>> --- a/arch/powerpc/include/asm/irq.h
>> +++ b/arch/powerpc/include/asm/irq.h
>> @@ -63,8 +63,8 @@ extern struct thread_info *hardirq_ctx[NR_CPUS];
>>   extern struct thread_info *softirq_ctx[NR_CPUS];
>>   
>>   extern void irq_ctx_init(void);
>> -extern void call_do_softirq(struct thread_info *tp);
>> -extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
>> +extern void call_do_softirq(void *tp);
>> +extern void call_do_irq(struct pt_regs *regs, void *tp);
> 
> void *sp for these ?

Yes, why not but it means changing the code. I wanted to minimise the 
changes and avoid cosmetic. Or maybe should add a cosmetic patch at the 
end ?

> 
> This all seems okay to me except the 32-bit code which I don't know.
> Would it be any trouble for you to put the TI_CPU bits into their own
> patch?

No problem, I can put the TI_CPU bits in a separate patch.

> 
> Reviewed-by: Nicholas Piggin <npiggin@...il.com>
> 

Thanks
Christophe

> 
>>   extern void do_IRQ(struct pt_regs *regs);
>>   extern void __init init_IRQ(void);
>>   extern void __do_irq(struct pt_regs *regs);
>> diff --git a/arch/powerpc/include/asm/livepatch.h b/arch/powerpc/include/asm/livepatch.h
>> index 47a03b9b528b..818451bf629c 100644
>> --- a/arch/powerpc/include/asm/livepatch.h
>> +++ b/arch/powerpc/include/asm/livepatch.h
>> @@ -49,7 +49,7 @@ static inline void klp_init_thread_info(struct thread_info *ti)
>>   	ti->livepatch_sp = (unsigned long *)(ti + 1) + 1;
>>   }
>>   #else
>> -static void klp_init_thread_info(struct thread_info *ti) { }
>> +static inline void klp_init_thread_info(struct thread_info *ti) { }
>>   #endif /* CONFIG_LIVEPATCH */
>>   
>>   #endif /* _ASM_POWERPC_LIVEPATCH_H */
>> diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
>> index 353879db3e98..31873614392f 100644
>> --- a/arch/powerpc/include/asm/processor.h
>> +++ b/arch/powerpc/include/asm/processor.h
>> @@ -40,7 +40,7 @@
>>   
>>   #ifndef __ASSEMBLY__
>>   #include <linux/types.h>
>> -#include <asm/thread_info.h>
>> +#include <linux/thread_info.h>
>>   #include <asm/ptrace.h>
>>   #include <asm/hw_breakpoint.h>
>>   
>> @@ -333,7 +333,7 @@ struct thread_struct {
>>   
>>   #define INIT_SP		(sizeof(init_stack) + (unsigned long) &init_stack)
>>   #define INIT_SP_LIMIT \
>> -	(_ALIGN_UP(sizeof(init_thread_info), 16) + (unsigned long) &init_stack)
>> +	(_ALIGN_UP(sizeof(struct thread_info), 16) + (unsigned long) &init_stack)
>>   
>>   #ifdef CONFIG_SPE
>>   #define SPEFSCR_INIT \
>> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
>> index e5b314ed054e..f3a9cf19a986 100644
>> --- a/arch/powerpc/include/asm/reg.h
>> +++ b/arch/powerpc/include/asm/reg.h
>> @@ -1053,7 +1053,7 @@
>>    *	- SPRG9 debug exception scratch
>>    *
>>    * All 32-bit:
>> - *	- SPRG3 current thread_info pointer
>> + *	- SPRG3 current thread_struct physical addr pointer
>>    *        (virtual on BookE, physical on others)
>>    *
>>    * 32-bit classic:
>> diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
>> index ba9d0fc98730..d1f161e48945 100644
>> --- a/arch/powerpc/kernel/asm-offsets.c
>> +++ b/arch/powerpc/kernel/asm-offsets.c
>> @@ -85,10 +85,10 @@ int main(void)
>>   	DEFINE(NMI_MASK, NMI_MASK);
>>   	OFFSET(TASKTHREADPPR, task_struct, thread.ppr);
>>   #else
>> -	OFFSET(THREAD_INFO, task_struct, stack);
>>   	DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
>>   	OFFSET(KSP_LIMIT, thread_struct, ksp_limit);
>>   #endif /* CONFIG_PPC64 */
>> +	OFFSET(TASK_STACK, task_struct, stack);
>>   
>>   #ifdef CONFIG_LIVEPATCH
>>   	OFFSET(TI_livepatch_sp, thread_info, livepatch_sp);
>> diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
>> index e58c3f467db5..12c0721f65ea 100644
>> --- a/arch/powerpc/kernel/entry_32.S
>> +++ b/arch/powerpc/kernel/entry_32.S
>> @@ -1166,7 +1166,7 @@ ret_from_debug_exc:
>>   	mfspr	r9,SPRN_SPRG_THREAD
>>   	lwz	r10,SAVED_KSP_LIMIT(r1)
>>   	stw	r10,KSP_LIMIT(r9)
>> -	lwz	r9,THREAD_INFO-THREAD(r9)
>> +	lwz	r9,TASK_STACK-THREAD(r9)
>>   	CURRENT_THREAD_INFO(r10, r1)
>>   	lwz	r10,TI_PREEMPT(r10)
>>   	stw	r10,TI_PREEMPT(r9)
>> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
>> index 77a888bfcb53..697406572592 100644
>> --- a/arch/powerpc/kernel/entry_64.S
>> +++ b/arch/powerpc/kernel/entry_64.S
>> @@ -680,7 +680,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
>>   2:
>>   #endif /* CONFIG_PPC_BOOK3S_64 */
>>   
>> -	CURRENT_THREAD_INFO(r7, r8)  /* base of new stack */
>> +	clrrdi	r7, r8, THREAD_SHIFT	/* base of new stack */
>>   	/* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
>>   	   because we don't need to leave the 288-byte ABI gap at the
>>   	   top of the kernel stack. */
>> diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
>> index 61ca27929355..dce6f2ff07e5 100644
>> --- a/arch/powerpc/kernel/head_32.S
>> +++ b/arch/powerpc/kernel/head_32.S
>> @@ -261,7 +261,7 @@ __secondary_hold_acknowledge:
>>   	tophys(r11,r1);			/* use tophys(r1) if kernel */ \
>>   	beq	1f;		\
>>   	mfspr	r11,SPRN_SPRG_THREAD;	\
>> -	lwz	r11,THREAD_INFO-THREAD(r11);	\
>> +	lwz	r11,TASK_STACK-THREAD(r11);	\
>>   	addi	r11,r11,THREAD_SIZE;	\
>>   	tophys(r11,r11);	\
>>   1:	subi	r11,r11,INT_FRAME_SIZE	/* alloc exc. frame */
>> @@ -841,7 +841,7 @@ __secondary_start:
>>   	bl	init_idle_6xx
>>   #endif /* CONFIG_6xx */
>>   
>> -	/* get current_thread_info and current */
>> +	/* get current's stack and current */
>>   	lis	r1,secondary_ti@ha
>>   	tophys(r1,r1)
>>   	lwz	r1,secondary_ti@l(r1)
>> diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
>> index b19d78410511..3088c9f29f5e 100644
>> --- a/arch/powerpc/kernel/head_40x.S
>> +++ b/arch/powerpc/kernel/head_40x.S
>> @@ -115,7 +115,7 @@ _ENTRY(saved_ksp_limit)
>>   	andi.	r11,r11,MSR_PR;						     \
>>   	beq	1f;							     \
>>   	mfspr	r1,SPRN_SPRG_THREAD;	/* if from user, start at top of   */\
>> -	lwz	r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack   */\
>> +	lwz	r1,TASK_STACK-THREAD(r1); /* this thread's kernel stack   */\
>>   	addi	r1,r1,THREAD_SIZE;					     \
>>   1:	subi	r1,r1,INT_FRAME_SIZE;	/* Allocate an exception frame     */\
>>   	tophys(r11,r1);							     \
>> @@ -158,7 +158,7 @@ _ENTRY(saved_ksp_limit)
>>   	beq	1f;							     \
>>   	/* COMING FROM USER MODE */					     \
>>   	mfspr	r11,SPRN_SPRG_THREAD;	/* if from user, start at top of   */\
>> -	lwz	r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
>> +	lwz	r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
>>   1:	addi	r11,r11,THREAD_SIZE-INT_FRAME_SIZE; /* Alloc an excpt frm  */\
>>   	tophys(r11,r11);						     \
>>   	stw	r10,_CCR(r11);          /* save various registers	   */\
>> diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
>> index 37e4a7cf0065..15d39b2499de 100644
>> --- a/arch/powerpc/kernel/head_44x.S
>> +++ b/arch/powerpc/kernel/head_44x.S
>> @@ -1020,7 +1020,7 @@ _GLOBAL(start_secondary_47x)
>>   
>>   	/* Now we can get our task struct and real stack pointer */
>>   
>> -	/* Get current_thread_info and current */
>> +	/* Get current's stack and current */
>>   	lis	r1,secondary_ti@ha
>>   	lwz	r1,secondary_ti@l(r1)
>>   	lwz	r2,TI_TASK(r1)
>> diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
>> index 6582f824d620..e56e36aa2b3d 100644
>> --- a/arch/powerpc/kernel/head_8xx.S
>> +++ b/arch/powerpc/kernel/head_8xx.S
>> @@ -124,7 +124,7 @@ turn_on_mmu:
>>   	tophys(r11,r1);			/* use tophys(r1) if kernel */ \
>>   	beq	1f;		\
>>   	mfspr	r11,SPRN_SPRG_THREAD;	\
>> -	lwz	r11,THREAD_INFO-THREAD(r11);	\
>> +	lwz	r11,TASK_STACK-THREAD(r11);	\
>>   	addi	r11,r11,THREAD_SIZE;	\
>>   	tophys(r11,r11);	\
>>   1:	subi	r11,r11,INT_FRAME_SIZE	/* alloc exc. frame */
>> diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
>> index d0862a100d29..20fe0c93a0bd 100644
>> --- a/arch/powerpc/kernel/head_booke.h
>> +++ b/arch/powerpc/kernel/head_booke.h
>> @@ -44,7 +44,7 @@
>>   	mr	r11, r1;						     \
>>   	beq	1f;							     \
>>   	/* if from user, start at top of this thread's kernel stack */       \
>> -	lwz	r11, THREAD_INFO-THREAD(r10);				     \
>> +	lwz	r11, TASK_STACK-THREAD(r10);				     \
>>   	ALLOC_STACK_FRAME(r11, THREAD_SIZE);				     \
>>   1 :	subi	r11, r11, INT_FRAME_SIZE; /* Allocate exception frame */     \
>>   	stw	r13, _CCR(r11);		/* save various registers */	     \
>> @@ -130,7 +130,7 @@
>>   	DO_KVM	BOOKE_INTERRUPT_##intno exc_level_srr1;		             \
>>   	andi.	r11,r11,MSR_PR;						     \
>>   	mfspr	r11,SPRN_SPRG_THREAD;	/* if from user, start at top of   */\
>> -	lwz	r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
>> +	lwz	r11,TASK_STACK-THREAD(r11); /* this thread's kernel stack */\
>>   	addi	r11,r11,EXC_LVL_FRAME_OVERHEAD;	/* allocate stack frame    */\
>>   	beq	1f;							     \
>>   	/* COMING FROM USER MODE */					     \
>> diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
>> index e2750b856c8f..239ad8a4754e 100644
>> --- a/arch/powerpc/kernel/head_fsl_booke.S
>> +++ b/arch/powerpc/kernel/head_fsl_booke.S
>> @@ -243,8 +243,10 @@ set_ivor:
>>   	li	r0,0
>>   	stwu	r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
>>   
>> +#ifdef CONFIG_SMP
>>   	CURRENT_THREAD_INFO(r22, r1)
>>   	stw	r24, TI_CPU(r22)
>> +#endif
>>   
>>   	bl	early_init
>>   
>> @@ -702,7 +704,7 @@ finish_tlb_load:
>>   
>>   	/* Get the next_tlbcam_idx percpu var */
>>   #ifdef CONFIG_SMP
>> -	lwz	r12, THREAD_INFO-THREAD(r12)
>> +	lwz	r12, TASK_STACK-THREAD(r12)
>>   	lwz	r15, TI_CPU(r12)
>>   	lis     r14, __per_cpu_offset@h
>>   	ori     r14, r14, __per_cpu_offset@l
>> @@ -1074,7 +1076,7 @@ __secondary_start:
>>   	mr	r4,r24		/* Why? */
>>   	bl	call_setup_cpu
>>   
>> -	/* get current_thread_info and current */
>> +	/* get current's stack and current */
>>   	lis	r1,secondary_ti@ha
>>   	lwz	r1,secondary_ti@l(r1)
>>   	lwz	r2,TI_TASK(r1)
>> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
>> index 916ddc4aac44..aa53db3ba6e7 100644
>> --- a/arch/powerpc/kernel/irq.c
>> +++ b/arch/powerpc/kernel/irq.c
>> @@ -663,7 +663,7 @@ void do_IRQ(struct pt_regs *regs)
>>   	struct thread_info *curtp, *irqtp, *sirqtp;
>>   
>>   	/* Switch to the irq stack to handle this */
>> -	curtp = current_thread_info();
>> +	curtp = (void*)(current_stack_pointer() & ~(THREAD_SIZE - 1));
>>   	irqtp = hardirq_ctx[raw_smp_processor_id()];
>>   	sirqtp = softirq_ctx[raw_smp_processor_id()];
>>   
>> diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
>> index 695b24a2d954..24a7f18ea10c 100644
>> --- a/arch/powerpc/kernel/misc_32.S
>> +++ b/arch/powerpc/kernel/misc_32.S
>> @@ -60,7 +60,7 @@ _GLOBAL(call_do_softirq)
>>   	blr
>>   
>>   /*
>> - * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp);
>> + * void call_do_irq(struct pt_regs *regs, void *irqtp);
>>    */
>>   _GLOBAL(call_do_irq)
>>   	mflr	r0
>> @@ -183,10 +183,14 @@ _GLOBAL(low_choose_750fx_pll)
>>   	or	r4,r4,r5
>>   	mtspr	SPRN_HID1,r4
>>   
>> +#ifdef CONFIG_SMP
>>   	/* Store new HID1 image */
>>   	CURRENT_THREAD_INFO(r6, r1)
>>   	lwz	r6,TI_CPU(r6)
>>   	slwi	r6,r6,2
>> +#else
>> +	li	r6, 0
>> +#endif
>>   	addis	r6,r6,nap_save_hid1@ha
>>   	stw	r4,nap_save_hid1@l(r6)
>>   
>> @@ -599,7 +603,7 @@ EXPORT_SYMBOL(__bswapdi2)
>>   #ifdef CONFIG_SMP
>>   _GLOBAL(start_secondary_resume)
>>   	/* Reset stack */
>> -	CURRENT_THREAD_INFO(r1, r1)
>> +	rlwinm	r1, r1, 0, 0, 31 - THREAD_SHIFT
>>   	addi	r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
>>   	li	r3,0
>>   	stw	r3,0(r1)		/* Zero the stack frame pointer	*/
>> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
>> index 03c2e1f134bc..111abb4df2ec 100644
>> --- a/arch/powerpc/kernel/process.c
>> +++ b/arch/powerpc/kernel/process.c
>> @@ -1240,8 +1240,8 @@ struct task_struct *__switch_to(struct task_struct *prev,
>>   		batch->active = 1;
>>   	}
>>   
>> -	if (current_thread_info()->task->thread.regs) {
>> -		restore_math(current_thread_info()->task->thread.regs);
>> +	if (current->thread.regs) {
>> +		restore_math(current->thread.regs);
>>   
>>   		/*
>>   		 * The copy-paste buffer can only store into foreign real
>> @@ -1251,7 +1251,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
>>   		 * mappings, we must issue a cp_abort to clear any state and
>>   		 * prevent snooping, corruption or a covert channel.
>>   		 */
>> -		if (current_thread_info()->task->thread.used_vas)
>> +		if (current->thread.used_vas)
>>   			asm volatile(PPC_CP_ABORT);
>>   	}
>>   #endif /* CONFIG_PPC_BOOK3S_64 */
>> diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
>> index 8c507be12c3c..81ebf7d6f526 100644
>> --- a/arch/powerpc/kernel/setup_32.c
>> +++ b/arch/powerpc/kernel/setup_32.c
>> @@ -205,10 +205,8 @@ void __init irqstack_early_init(void)
>>   	/* interrupt stacks must be in lowmem, we get that for free on ppc32
>>   	 * as the memblock is limited to lowmem by default */
>>   	for_each_possible_cpu(i) {
>> -		softirq_ctx[i] = (struct thread_info *)
>> -			__va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> -		hardirq_ctx[i] = (struct thread_info *)
>> -			__va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> +		softirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> +		hardirq_ctx[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>   	}
>>   }
>>   
>> @@ -226,13 +224,10 @@ void __init exc_lvl_early_init(void)
>>   		hw_cpu = 0;
>>   #endif
>>   
>> -		critirq_ctx[hw_cpu] = (struct thread_info *)
>> -			__va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> +		critirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>   #ifdef CONFIG_BOOKE
>> -		dbgirq_ctx[hw_cpu] = (struct thread_info *)
>> -			__va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> -		mcheckirq_ctx[hw_cpu] = (struct thread_info *)
>> -			__va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> +		dbgirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>> +		mcheckirq_ctx[hw_cpu] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE));
>>   #endif
>>   	}
>>   }
>> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
>> index 61c1fadbc644..19dd0ea55714 100644
>> --- a/arch/powerpc/kernel/smp.c
>> +++ b/arch/powerpc/kernel/smp.c
>> @@ -20,6 +20,7 @@
>>   #include <linux/kernel.h>
>>   #include <linux/export.h>
>>   #include <linux/sched/mm.h>
>> +#include <linux/sched/task_stack.h>
>>   #include <linux/sched/topology.h>
>>   #include <linux/smp.h>
>>   #include <linux/interrupt.h>
>> @@ -812,7 +813,8 @@ static void cpu_idle_thread_init(unsigned int cpu, struct task_struct *idle)
>>   
>>   #ifdef CONFIG_PPC64
>>   	paca_ptrs[cpu]->__current = idle;
>> -	paca_ptrs[cpu]->kstack = (unsigned long)ti + THREAD_SIZE - STACK_FRAME_OVERHEAD;
>> +	paca_ptrs[cpu]->kstack = (unsigned long)task_stack_page(idle) +
>> +				  THREAD_SIZE - STACK_FRAME_OVERHEAD;
>>   #endif
>>   	ti->cpu = cpu;
>>   	secondary_ti = current_set[cpu] = ti;
>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>> index 694c1d92e796..0d8d6fee892a 100644
>> --- a/arch/powerpc/xmon/xmon.c
>> +++ b/arch/powerpc/xmon/xmon.c
>> @@ -2988,7 +2988,7 @@ static void show_task(struct task_struct *tsk)
>>   	printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
>>   		tsk->thread.ksp,
>>   		tsk->pid, tsk->parent->pid,
>> -		state, task_thread_info(tsk)->cpu,
>> +		state, task_cpu(tsk),
>>   		tsk->comm);
>>   }
>>   
>> -- 
>> 2.13.3
>>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ