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: Greg Ungerer <gerg@uclinux.org>
This commit is contained in:
parent
8d362b0dea
commit
d25ba98afc
@ -88,14 +88,12 @@ struct thread_struct {
|
|||||||
unsigned long fp[8*3];
|
unsigned long fp[8*3];
|
||||||
unsigned long fpcntl[3]; /* fp control regs */
|
unsigned long fpcntl[3]; /* fp control regs */
|
||||||
unsigned char fpstate[FPSTATESIZE]; /* floating point state */
|
unsigned char fpstate[FPSTATESIZE]; /* floating point state */
|
||||||
struct thread_info info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
.ksp = sizeof(init_stack) + (unsigned long) init_stack, \
|
.ksp = sizeof(init_stack) + (unsigned long) init_stack, \
|
||||||
.sr = PS_S, \
|
.sr = PS_S, \
|
||||||
.fs = __KERNEL_DS, \
|
.fs = __KERNEL_DS, \
|
||||||
.info = INIT_THREAD_INFO(init_task), \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
|
@ -47,34 +47,6 @@ struct thread_info {
|
|||||||
|
|
||||||
#define init_stack (init_thread_union.stack)
|
#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__
|
#ifndef __ASSEMBLY__
|
||||||
/* how to get the thread information struct from C */
|
/* how to get the thread information struct from C */
|
||||||
static inline struct thread_info *current_thread_info(void)
|
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)
|
#define init_thread_info (init_thread_union.thread_info)
|
||||||
|
|
||||||
#endif /* CONFIG_MMU */
|
|
||||||
|
|
||||||
/* entry.S relies on these definitions!
|
/* entry.S relies on these definitions!
|
||||||
* bits 0-7 are tested at every exception exit
|
* bits 0-7 are tested at every exception exit
|
||||||
* bits 8-15 are also tested at syscall exit
|
* bits 8-15 are also tested at syscall exit
|
||||||
|
@ -24,7 +24,7 @@ int main(void)
|
|||||||
/* offsets into the task struct */
|
/* offsets into the task struct */
|
||||||
DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
|
DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
|
||||||
DEFINE(TASK_MM, offsetof(struct task_struct, mm));
|
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 */
|
/* offsets into the thread struct */
|
||||||
DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
|
DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
|
||||||
|
@ -99,7 +99,8 @@ do_trace_exit:
|
|||||||
jra .Lret_from_exception
|
jra .Lret_from_exception
|
||||||
|
|
||||||
ENTRY(ret_from_signal)
|
ENTRY(ret_from_signal)
|
||||||
tstb %curptr@(TASK_INFO+TINFO_FLAGS+2)
|
movel %curptr@(TASK_STACK),%a1
|
||||||
|
tstb %a1@(TINFO_FLAGS+2)
|
||||||
jge 1f
|
jge 1f
|
||||||
jbsr syscall_trace
|
jbsr syscall_trace
|
||||||
1: RESTORE_SWITCH_STACK
|
1: RESTORE_SWITCH_STACK
|
||||||
@ -120,11 +121,13 @@ ENTRY(system_call)
|
|||||||
SAVE_ALL_SYS
|
SAVE_ALL_SYS
|
||||||
|
|
||||||
GET_CURRENT(%d1)
|
GET_CURRENT(%d1)
|
||||||
|
movel %d1,%a1
|
||||||
|
|
||||||
| save top of frame
|
| save top of frame
|
||||||
movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
|
movel %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
|
||||||
|
|
||||||
| syscall trace?
|
| syscall trace?
|
||||||
tstb %curptr@(TASK_INFO+TINFO_FLAGS+2)
|
tstb %a1@(TINFO_FLAGS+2)
|
||||||
jmi do_trace_entry
|
jmi do_trace_entry
|
||||||
cmpl #NR_syscalls,%d0
|
cmpl #NR_syscalls,%d0
|
||||||
jcc badsys
|
jcc badsys
|
||||||
@ -133,7 +136,8 @@ syscall:
|
|||||||
movel %d0,%sp@(PT_OFF_D0) | save the return value
|
movel %d0,%sp@(PT_OFF_D0) | save the return value
|
||||||
ret_from_syscall:
|
ret_from_syscall:
|
||||||
|oriw #0x0700,%sr
|
|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
|
jne syscall_exit_work
|
||||||
1: RESTORE_ALL
|
1: RESTORE_ALL
|
||||||
|
|
||||||
@ -159,7 +163,8 @@ ENTRY(ret_from_exception)
|
|||||||
andw #ALLOWINT,%sr
|
andw #ALLOWINT,%sr
|
||||||
|
|
||||||
resume_userspace:
|
resume_userspace:
|
||||||
moveb %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
|
movel %curptr@(TASK_STACK),%a1
|
||||||
|
moveb %a1@(TINFO_FLAGS+3),%d0
|
||||||
jne exit_work
|
jne exit_work
|
||||||
1: RESTORE_ALL
|
1: RESTORE_ALL
|
||||||
|
|
||||||
@ -199,7 +204,8 @@ do_delayed_trace:
|
|||||||
ENTRY(auto_inthandler)
|
ENTRY(auto_inthandler)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
GET_CURRENT(%d0)
|
GET_CURRENT(%d0)
|
||||||
addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
|
movel %d0,%a1
|
||||||
|
addqb #1,%a1@(TINFO_PREEMPT+1)
|
||||||
| put exception # in d0
|
| put exception # in d0
|
||||||
bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0
|
bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0
|
||||||
subw #VEC_SPUR,%d0
|
subw #VEC_SPUR,%d0
|
||||||
@ -211,7 +217,8 @@ auto_irqhandler_fixup = . + 2
|
|||||||
addql #8,%sp | pop parameters off stack
|
addql #8,%sp | pop parameters off stack
|
||||||
|
|
||||||
ret_from_interrupt:
|
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
|
jeq ret_from_last_interrupt
|
||||||
2: RESTORE_ALL
|
2: RESTORE_ALL
|
||||||
|
|
||||||
@ -232,7 +239,8 @@ ret_from_last_interrupt:
|
|||||||
ENTRY(user_inthandler)
|
ENTRY(user_inthandler)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
GET_CURRENT(%d0)
|
GET_CURRENT(%d0)
|
||||||
addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
|
movel %d0,%a1
|
||||||
|
addqb #1,%a1@(TINFO_PREEMPT+1)
|
||||||
| put exception # in d0
|
| put exception # in d0
|
||||||
bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0
|
bfextu %sp@(PT_OFF_FORMATVEC){#4,#10},%d0
|
||||||
user_irqvec_fixup = . + 2
|
user_irqvec_fixup = . + 2
|
||||||
@ -243,7 +251,8 @@ user_irqvec_fixup = . + 2
|
|||||||
jsr do_IRQ | process the IRQ
|
jsr do_IRQ | process the IRQ
|
||||||
addql #8,%sp | pop parameters off stack
|
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
|
jeq ret_from_last_interrupt
|
||||||
RESTORE_ALL
|
RESTORE_ALL
|
||||||
|
|
||||||
@ -252,13 +261,15 @@ user_irqvec_fixup = . + 2
|
|||||||
ENTRY(bad_inthandler)
|
ENTRY(bad_inthandler)
|
||||||
SAVE_ALL_INT
|
SAVE_ALL_INT
|
||||||
GET_CURRENT(%d0)
|
GET_CURRENT(%d0)
|
||||||
addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1)
|
movel %d0,%a1
|
||||||
|
addqb #1,%a1@(TINFO_PREEMPT+1)
|
||||||
|
|
||||||
movel %sp,%sp@-
|
movel %sp,%sp@-
|
||||||
jsr handle_badint
|
jsr handle_badint
|
||||||
addql #4,%sp
|
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
|
jeq ret_from_last_interrupt
|
||||||
RESTORE_ALL
|
RESTORE_ALL
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user