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

Commit d25ba98a authored by Greg Ungerer's avatar Greg Ungerer
Browse files

m68k: remove thread_info struct from thread struct



Currently on m68k we have a comeplete thread_info structure stored inside
of the thread_struct, and we also have it in the initial part of the kernel
stack. Mostly the code currently uses the one inside of the thread_struct,
only using the "task" pointer from the stack based one.

This is wasteful and confusing, we should only have the single instance of
thread_info inside the stack page. And this is the norm for all other
architectures.

This change makes m68k handle thread_info consistently on both MMU enabled
and non-MMU setups.

Signed-off-by: default avatarGreg Ungerer <gerg@uclinux.org>
parent 8d362b0d
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -88,14 +88,12 @@ struct thread_struct {
	unsigned long  fp[8*3];
	unsigned long  fpcntl[3];	/* fp control regs */
	unsigned char  fpstate[FPSTATESIZE];  /* floating point state */
	struct thread_info info;
};

#define INIT_THREAD  {							\
	.ksp	= sizeof(init_stack) + (unsigned long) init_stack,	\
	.sr	= PS_S,							\
	.fs	= __KERNEL_DS,						\
	.info	= INIT_THREAD_INFO(init_task),				\
}

#ifdef CONFIG_MMU
+0 −30
Original line number Diff line number Diff line
@@ -47,34 +47,6 @@ struct thread_info {

#define init_stack		(init_thread_union.stack)

#ifdef CONFIG_MMU

#ifndef __ASSEMBLY__
#include <asm/current.h>
#endif

#ifdef ASM_OFFSETS_C
#define task_thread_info(tsk)	((struct thread_info *) NULL)
#else
#include <asm/asm-offsets.h>
#define task_thread_info(tsk)	((struct thread_info *)((char *)tsk+TASK_INFO))
#endif

#define init_thread_info	(init_task.thread.info)
#define task_stack_page(tsk)	((tsk)->stack)
#define current_thread_info()	task_thread_info(current)

#define __HAVE_THREAD_FUNCTIONS

#define setup_thread_stack(p, org) ({			\
	*(struct task_struct **)(p)->stack = (p);	\
	task_thread_info(p)->task = (p);		\
})

#define end_of_stack(p)		((unsigned long *)(p)->stack + 1)

#else /* !CONFIG_MMU */

#ifndef __ASSEMBLY__
/* how to get the thread information struct from C */
static inline struct thread_info *current_thread_info(void)
@@ -92,8 +64,6 @@ static inline struct thread_info *current_thread_info(void)

#define init_thread_info	(init_thread_union.thread_info)

#endif /* CONFIG_MMU */

/* entry.S relies on these definitions!
 * bits 0-7 are tested at every exception exit
 * bits 8-15 are also tested at syscall exit
+1 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ int main(void)
	/* offsets into the task struct */
	DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
	DEFINE(TASK_MM, offsetof(struct task_struct, mm));
	DEFINE(TASK_INFO, offsetof(struct task_struct, thread.info));
	DEFINE(TASK_STACK, offsetof(struct task_struct, stack));

	/* offsets into the thread struct */
	DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
+21 −10
Original line number Diff line number Diff line
@@ -99,7 +99,8 @@ do_trace_exit:
	jra	.Lret_from_exception

ENTRY(ret_from_signal)
	tstb	%curptr@(TASK_INFO+TINFO_FLAGS+2)
	movel	%curptr@(TASK_STACK),%a1
	tstb	%a1@(TINFO_FLAGS+2)
	jge	1f
	jbsr	syscall_trace
1:	RESTORE_SWITCH_STACK
@@ -120,11 +121,13 @@ ENTRY(system_call)
	SAVE_ALL_SYS

	GET_CURRENT(%d1)
	movel	%d1,%a1

	| save top of frame
	movel	%sp,%curptr@(TASK_THREAD+THREAD_ESP0)

	| syscall trace?
	tstb	%curptr@(TASK_INFO+TINFO_FLAGS+2)
	tstb	%a1@(TINFO_FLAGS+2)
	jmi	do_trace_entry
	cmpl	#NR_syscalls,%d0
	jcc	badsys
@@ -133,7 +136,8 @@ syscall:
	movel	%d0,%sp@(PT_OFF_D0)	| save the return value
ret_from_syscall:
	|oriw	#0x0700,%sr
	movew	%curptr@(TASK_INFO+TINFO_FLAGS+2),%d0
	movel	%curptr@(TASK_STACK),%a1
	movew	%a1@(TINFO_FLAGS+2),%d0
	jne	syscall_exit_work
1:	RESTORE_ALL

@@ -159,7 +163,8 @@ ENTRY(ret_from_exception)
	andw	#ALLOWINT,%sr

resume_userspace:
	moveb	%curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
	movel	%curptr@(TASK_STACK),%a1
	moveb	%a1@(TINFO_FLAGS+3),%d0
	jne	exit_work
1:	RESTORE_ALL

@@ -199,7 +204,8 @@ do_delayed_trace:
ENTRY(auto_inthandler)
	SAVE_ALL_INT
	GET_CURRENT(%d0)
	addqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
	movel	%d0,%a1
	addqb	#1,%a1@(TINFO_PREEMPT+1)
					|  put exception # in d0
	bfextu	%sp@(PT_OFF_FORMATVEC){#4,#10},%d0
	subw	#VEC_SPUR,%d0
@@ -211,7 +217,8 @@ auto_irqhandler_fixup = . + 2
	addql	#8,%sp			|  pop parameters off stack

ret_from_interrupt:
	subqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
	movel	%curptr@(TASK_STACK),%a1
	subqb	#1,%a1@(TINFO_PREEMPT+1)
	jeq	ret_from_last_interrupt
2:	RESTORE_ALL

@@ -232,7 +239,8 @@ ret_from_last_interrupt:
ENTRY(user_inthandler)
	SAVE_ALL_INT
	GET_CURRENT(%d0)
	addqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
	movel	%d0,%a1
	addqb	#1,%a1@(TINFO_PREEMPT+1)
					|  put exception # in d0
	bfextu	%sp@(PT_OFF_FORMATVEC){#4,#10},%d0
user_irqvec_fixup = . + 2
@@ -243,7 +251,8 @@ user_irqvec_fixup = . + 2
	jsr	do_IRQ			|  process the IRQ
	addql	#8,%sp			|  pop parameters off stack

	subqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
	movel	%curptr@(TASK_STACK),%a1
	subqb	#1,%a1@(TINFO_PREEMPT+1)
	jeq	ret_from_last_interrupt
	RESTORE_ALL

@@ -252,13 +261,15 @@ user_irqvec_fixup = . + 2
ENTRY(bad_inthandler)
	SAVE_ALL_INT
	GET_CURRENT(%d0)
	addqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
	movel	%d0,%a1
	addqb	#1,%a1@(TINFO_PREEMPT+1)

	movel	%sp,%sp@-
	jsr	handle_badint
	addql	#4,%sp

	subqb	#1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
	movel	%curptr@(TASK_STACK),%a1
	subqb	#1,%a1@(TINFO_PREEMPT+1)
	jeq	ret_from_last_interrupt
	RESTORE_ALL