Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cb7bfeb authored by David Gibson's avatar David Gibson Committed by Paul Mackerras
Browse files

[PATCH] powerpc: Merge thread_info.h



Merge ppc32 and ppc64 versions of thread_info.h.  They were pretty
similar already, the chief changes are:

	- Instead of inline asm to implement current_thread_info(),
which needs to be different for ppc32 and ppc64, we use C with an
asm("r1") register variable.  gcc turns it into the same asm as we
used to have for both platforms.
	- We replace ppc32's 'local_flags' with the ppc64
'syscall_noerror' field.  The noerror flag was in fact the only thing
in the local_flags field anyway, so the ppc64 approach is simpler, and
means we only need a load-immediate/store instead of load/mask/store
when clearing the flag.
	- In readiness for 64k pages, when THREAD_SIZE will be less
than a page, ppc64 used kmalloc() rather than get_free_pages() to
allocate the kernel stack.  With this patch we do the same for ppc32,
since there's no strong reason not to.
	- For ppc64, we no longer export THREAD_SHIFT and THREAD_SIZE
via asm-offsets, thread_info.h can now be safely included in asm, as
on ppc32.

Built and booted on G4 Powerbook (ARCH=ppc and ARCH=powerpc) and
Power5 (ARCH=ppc64 and ARCH=powerpc).

Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent b0faa284
Loading
Loading
Loading
Loading
+1 −5
Original line number Original line Diff line number Diff line
@@ -56,8 +56,6 @@ int main(void)
	DEFINE(THREAD, offsetof(struct task_struct, thread));
	DEFINE(THREAD, offsetof(struct task_struct, thread));
	DEFINE(MM, offsetof(struct task_struct, mm));
	DEFINE(MM, offsetof(struct task_struct, mm));
#ifdef CONFIG_PPC64
#ifdef CONFIG_PPC64
	DEFINE(THREAD_SHIFT, THREAD_SHIFT);
	DEFINE(THREAD_SIZE, THREAD_SIZE);
	DEFINE(AUDITCONTEXT, offsetof(struct task_struct, audit_context));
	DEFINE(AUDITCONTEXT, offsetof(struct task_struct, audit_context));
#else
#else
	DEFINE(THREAD_INFO, offsetof(struct task_struct, thread_info));
	DEFINE(THREAD_INFO, offsetof(struct task_struct, thread_info));
@@ -94,12 +92,10 @@ int main(void)


	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
	DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
	DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
#ifdef CONFIG_PPC64
	DEFINE(TI_SC_NOERR, offsetof(struct thread_info, syscall_noerror));
	DEFINE(TI_SC_NOERR, offsetof(struct thread_info, syscall_noerror));
#else
#ifdef CONFIG_PPC32
	DEFINE(TI_TASK, offsetof(struct thread_info, task));
	DEFINE(TI_TASK, offsetof(struct thread_info, task));
	DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
	DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
	DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
#endif /* CONFIG_PPC64 */
#endif /* CONFIG_PPC64 */


+12 −13
Original line number Original line Diff line number Diff line
@@ -199,10 +199,9 @@ _GLOBAL(DoSyscall)
#ifdef SHOW_SYSCALLS
#ifdef SHOW_SYSCALLS
	bl	do_show_syscall
	bl	do_show_syscall
#endif /* SHOW_SYSCALLS */
#endif /* SHOW_SYSCALLS */
	rlwinm	r10,r1,0,0,18	/* current_thread_info() */
	rlwinm	r10,r1,0,0,(31-THREAD_SHIFT)	/* current_thread_info() */
	lwz	r11,TI_LOCAL_FLAGS(r10)
	li	r11,0
	rlwinm	r11,r11,0,~_TIFL_FORCE_NOERROR
	stb	r11,TI_SC_NOERR(r10)
	stw	r11,TI_LOCAL_FLAGS(r10)
	lwz	r11,TI_FLAGS(r10)
	lwz	r11,TI_FLAGS(r10)
	andi.	r11,r11,_TIF_SYSCALL_T_OR_A
	andi.	r11,r11,_TIF_SYSCALL_T_OR_A
	bne-	syscall_dotrace
	bne-	syscall_dotrace
@@ -225,10 +224,10 @@ ret_from_syscall:
	mr	r6,r3
	mr	r6,r3
	li	r11,-_LAST_ERRNO
	li	r11,-_LAST_ERRNO
	cmplw	0,r3,r11
	cmplw	0,r3,r11
	rlwinm	r12,r1,0,0,18	/* current_thread_info() */
	rlwinm	r12,r1,0,0,(31-THREAD_SHIFT)	/* current_thread_info() */
	blt+	30f
	blt+	30f
	lwz	r11,TI_LOCAL_FLAGS(r12)
	lbz	r11,TI_SC_NOERR(r12)
	andi.	r11,r11,_TIFL_FORCE_NOERROR
	cmpwi	r11,0
	bne	30f
	bne	30f
	neg	r3,r3
	neg	r3,r3
	lwz	r10,_CCR(r1)	/* Set SO bit in CR */
	lwz	r10,_CCR(r1)	/* Set SO bit in CR */
@@ -315,7 +314,7 @@ syscall_exit_work:
	LOAD_MSR_KERNEL(r10,MSR_KERNEL)	/* doesn't include MSR_EE */
	LOAD_MSR_KERNEL(r10,MSR_KERNEL)	/* doesn't include MSR_EE */
	SYNC
	SYNC
	MTMSRD(r10)		/* disable interrupts again */
	MTMSRD(r10)		/* disable interrupts again */
	rlwinm	r12,r1,0,0,18	/* current_thread_info() */
	rlwinm	r12,r1,0,0,(31-THREAD_SHIFT)	/* current_thread_info() */
	lwz	r9,TI_FLAGS(r12)
	lwz	r9,TI_FLAGS(r12)
5:
5:
	andi.	r0,r9,_TIF_NEED_RESCHED
	andi.	r0,r9,_TIF_NEED_RESCHED
@@ -630,7 +629,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_601)
	.globl	sigreturn_exit
	.globl	sigreturn_exit
sigreturn_exit:
sigreturn_exit:
	subi	r1,r3,STACK_FRAME_OVERHEAD
	subi	r1,r3,STACK_FRAME_OVERHEAD
	rlwinm	r12,r1,0,0,18	/* current_thread_info() */
	rlwinm	r12,r1,0,0,(31-THREAD_SHIFT)	/* current_thread_info() */
	lwz	r9,TI_FLAGS(r12)
	lwz	r9,TI_FLAGS(r12)
	andi.	r0,r9,_TIF_SYSCALL_T_OR_A
	andi.	r0,r9,_TIF_SYSCALL_T_OR_A
	beq+	ret_from_except_full
	beq+	ret_from_except_full
@@ -657,7 +656,7 @@ ret_from_except:


user_exc_return:		/* r10 contains MSR_KERNEL here */
user_exc_return:		/* r10 contains MSR_KERNEL here */
	/* Check current_thread_info()->flags */
	/* Check current_thread_info()->flags */
	rlwinm	r9,r1,0,0,18
	rlwinm	r9,r1,0,0,(31-THREAD_SHIFT)
	lwz	r9,TI_FLAGS(r9)
	lwz	r9,TI_FLAGS(r9)
	andi.	r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED)
	andi.	r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED)
	bne	do_work
	bne	do_work
@@ -677,7 +676,7 @@ restore_user:
/* N.B. the only way to get here is from the beq following ret_from_except. */
/* N.B. the only way to get here is from the beq following ret_from_except. */
resume_kernel:
resume_kernel:
	/* check current_thread_info->preempt_count */
	/* check current_thread_info->preempt_count */
	rlwinm	r9,r1,0,0,18
	rlwinm	r9,r1,0,0,(31-THREAD_SHIFT)
	lwz	r0,TI_PREEMPT(r9)
	lwz	r0,TI_PREEMPT(r9)
	cmpwi	0,r0,0		/* if non-zero, just restore regs and return */
	cmpwi	0,r0,0		/* if non-zero, just restore regs and return */
	bne	restore
	bne	restore
@@ -687,7 +686,7 @@ resume_kernel:
	andi.	r0,r3,MSR_EE	/* interrupts off? */
	andi.	r0,r3,MSR_EE	/* interrupts off? */
	beq	restore		/* don't schedule if so */
	beq	restore		/* don't schedule if so */
1:	bl	preempt_schedule_irq
1:	bl	preempt_schedule_irq
	rlwinm	r9,r1,0,0,18
	rlwinm	r9,r1,0,0,(31-THREAD_SHIFT)
	lwz	r3,TI_FLAGS(r9)
	lwz	r3,TI_FLAGS(r9)
	andi.	r0,r3,_TIF_NEED_RESCHED
	andi.	r0,r3,_TIF_NEED_RESCHED
	bne-	1b
	bne-	1b
@@ -889,7 +888,7 @@ recheck:
	LOAD_MSR_KERNEL(r10,MSR_KERNEL)
	LOAD_MSR_KERNEL(r10,MSR_KERNEL)
	SYNC
	SYNC
	MTMSRD(r10)		/* disable interrupts */
	MTMSRD(r10)		/* disable interrupts */
	rlwinm	r9,r1,0,0,18
	rlwinm	r9,r1,0,0,(31-THREAD_SHIFT)
	lwz	r9,TI_FLAGS(r9)
	lwz	r9,TI_FLAGS(r9)
	andi.	r0,r9,_TIF_NEED_RESCHED
	andi.	r0,r9,_TIF_NEED_RESCHED
	bne-	do_resched
	bne-	do_resched
+1 −0
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@
#include <asm/setup.h>
#include <asm/setup.h>
#include <asm/hvcall.h>
#include <asm/hvcall.h>
#include <asm/iSeries/LparMap.h>
#include <asm/iSeries/LparMap.h>
#include <asm/thread_info.h>


#ifdef CONFIG_PPC_ISERIES
#ifdef CONFIG_PPC_ISERIES
#define DO_SOFT_DISABLE
#define DO_SOFT_DISABLE
+1 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@
#include <asm/ppc_asm.h>
#include <asm/ppc_asm.h>
#include <asm/asm-offsets.h>
#include <asm/asm-offsets.h>
#include <asm/cputable.h>
#include <asm/cputable.h>
#include <asm/thread_info.h>


	.text
	.text


+1 −1
Original line number Original line Diff line number Diff line
@@ -130,10 +130,10 @@ main(void)
	DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
	DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
	DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
	DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));


	DEFINE(TI_SC_NOERR, offsetof(struct thread_info, syscall_noerror));
	DEFINE(TI_TASK, offsetof(struct thread_info, task));
	DEFINE(TI_TASK, offsetof(struct thread_info, task));
	DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
	DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
	DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
	DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
	DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));


Loading