From 0ff21ea7187f53d3aa23950a0f6cf825b25aaa93 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Tue, 23 Jul 2002 06:24:25 -0700 Subject: [PATCH] M68k update (part 42) M68k task and thread updates --- include/asm-m68k/entry.h | 1 + include/asm-m68k/processor.h | 50 +++++++------------- include/asm-m68k/system.h | 18 ++++---- include/asm-m68k/thread_info.h | 101 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 43 deletions(-) create mode 100644 include/asm-m68k/thread_info.h (limited to 'include') diff --git a/include/asm-m68k/entry.h b/include/asm-m68k/entry.h index c35ec2e45aa6..ab9cd8c80af2 100644 --- a/include/asm-m68k/entry.h +++ b/include/asm-m68k/entry.h @@ -111,6 +111,7 @@ PT_DTRACE_BIT = 2 movel %sp,\reg andw #-THREAD_SIZE,\reg movel \reg,%curptr + movel %curptr@,%curptr .endm #else /* C source */ diff --git a/include/asm-m68k/processor.h b/include/asm-m68k/processor.h index 7ba60318ce28..864e69653644 100644 --- a/include/asm-m68k/processor.h +++ b/include/asm-m68k/processor.h @@ -59,11 +59,16 @@ extern inline void wrusp(unsigned long usp) { #define EISA_bus 0 #define MCA_bus 0 -/* - * if you change this structure, you must change the code and offsets - * in m68k/machasm.S - */ - +struct task_work { + unsigned char sigpending; + unsigned char notify_resume; /* request for notification on + userspace execution resumption */ + char need_resched; + unsigned char delayed_trace; /* single step a syscall */ + unsigned char syscall_trace; /* count of syscall interceptors */ + unsigned char pad[3]; +}; + struct thread_struct { unsigned long ksp; /* kernel stack pointer */ unsigned long usp; /* user stack pointer */ @@ -76,11 +81,13 @@ struct thread_struct { unsigned long fp[8*3]; unsigned long fpcntl[3]; /* fp control regs */ unsigned char fpstate[FPSTATESIZE]; /* floating point state */ + struct task_work work; }; -#define INIT_THREAD { \ - sizeof(init_stack) + (unsigned long) init_stack, 0, \ - PS_S, __KERNEL_DS, \ +#define INIT_THREAD { \ + ksp: sizeof(init_stack) + (unsigned long) init_stack, \ + sr: PS_S, \ + fs: __KERNEL_DS, \ } /* @@ -117,21 +124,7 @@ static inline void exit_thread(void) { } -/* - * Return saved PC of a blocked thread. - */ -extern inline unsigned long thread_saved_pc(struct thread_struct *t) -{ - extern void scheduling_functions_start_here(void); - extern void scheduling_functions_end_here(void); - struct switch_stack *sw = (struct switch_stack *)t->ksp; - /* Check whether the thread is blocked in resume() */ - if (sw->retpc > (unsigned long)scheduling_functions_start_here && - sw->retpc < (unsigned long)scheduling_functions_end_here) - return ((unsigned long *)sw->a6)[1]; - else - return sw->retpc; -} +extern unsigned long thread_saved_pc(struct task_struct *tsk); unsigned long get_wchan(struct task_struct *p); @@ -144,17 +137,6 @@ unsigned long get_wchan(struct task_struct *p); eip; }) #define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp) -#define THREAD_SIZE (2*PAGE_SIZE) - -/* Allocation and freeing of basic task resources. */ -#define alloc_task_struct() \ - ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) -#define free_task_struct(p) free_pages((unsigned long)(p),1) -#define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) - -#define init_task (init_task_union.task) -#define init_stack (init_task_union.stack) - #define cpu_relax() do { } while (0) #endif diff --git a/include/asm-m68k/system.h b/include/asm-m68k/system.h index efc5ab8ff507..cead336436ca 100644 --- a/include/asm-m68k/system.h +++ b/include/asm-m68k/system.h @@ -7,7 +7,10 @@ #include #include -#define prepare_to_switch() do { } while(0) +#define prepare_arch_schedule(prev) do { } while(0) +#define finish_arch_schedule(prev) do { } while(0) +#define prepare_arch_switch(rq) do { } while(0) +#define finish_arch_switch(rq) spin_unlock_irq(&(rq)->lock) /* * switch_to(n) should switch tasks to task ptr, first checking that @@ -32,19 +35,16 @@ * 02/17/96 - Jes Sorensen (jds@kom.auc.dk) * * Changed 96/09/19 by Andreas Schwab - * pass prev in a0, next in a1, offset of tss in d1, and whether - * the mm structures are shared in d2 (to avoid atc flushing). + * pass prev in a0, next in a1 */ asmlinkage void resume(void); -#define switch_to(prev,next,last) { \ +#define switch_to(prev,next,last) do { \ register void *_prev __asm__ ("a0") = (prev); \ register void *_next __asm__ ("a1") = (next); \ - register void *_last __asm__ ("d1"); \ __asm__ __volatile__("jbsr resume" \ - : "=d" (_last) : "a" (_prev), "a" (_next) \ - : "d0", /* "d1", */ "d2", "d3", "d4", "d5", "a0", "a1"); \ - (last) = _last; \ -} + : : "a" (_prev), "a" (_next) \ + : "d0", "d1", "d2", "d3", "d4", "d5", "a0", "a1"); \ +} while (0) /* interrupt control.. */ diff --git a/include/asm-m68k/thread_info.h b/include/asm-m68k/thread_info.h new file mode 100644 index 000000000000..64c9f51e0c63 --- /dev/null +++ b/include/asm-m68k/thread_info.h @@ -0,0 +1,101 @@ +#ifndef _ASM_M68K_THREAD_INFO_H +#define _ASM_M68K_THREAD_INFO_H + +#include +#include +#include + +struct thread_info { + struct task_struct *task; /* main task structure */ + struct exec_domain *exec_domain; /* execution domain */ + __s32 preempt_count; /* 0 => preemptable, <0 => BUG */ + __u32 cpu; /* should always be 0 on m68k */ + + __u8 supervisor_stack[0]; +}; + +#define PREEMPT_ACTIVE 0x4000000 + +#define INIT_THREAD_INFO(tsk) \ +{ \ + task: &tsk, \ + exec_domain: &default_exec_domain, \ +} + +/* THREAD_SIZE should be 8k, so handle differently for 4k and 8k machines */ +#if PAGE_SHIFT == 13 /* 8k machines */ +#define alloc_thread_info() ((struct thread_info *)__get_free_pages(GFP_KERNEL,0)) +#define free_thread_info(ti) free_pages((unsigned long)(ti),0) +#else /* otherwise assume 4k pages */ +#define alloc_thread_info() ((struct thread_info *)__get_free_pages(GFP_KERNEL,1)) +#define free_thread_info(ti) free_pages((unsigned long)(ti),1) +#endif /* PAGE_SHIFT == 13 */ + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) + +#define current_thread_info() (current->thread_info) + + +#define __HAVE_THREAD_FUNCTIONS + +#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ +#define TIF_DELAYED_TRACE 1 /* single step a syscall */ +#define TIF_NOTIFY_RESUME 2 /* resumption notification requested */ +#define TIF_SIGPENDING 3 /* signal pending */ +#define TIF_NEED_RESCHED 4 /* rescheduling necessary */ + +extern int thread_flag_fixme(void); + +/* + * flag set/clear/test wrappers + * - pass TIF_xxxx constants to these functions + */ + +#define __set_tsk_thread_flag(tsk, flag, val) ({ \ + switch (flag) { \ + case TIF_SIGPENDING: \ + tsk->thread.work.sigpending = val; \ + break; \ + case TIF_NEED_RESCHED: \ + tsk->thread.work.need_resched = val; \ + break; \ + default: \ + thread_flag_fixme(); \ + } \ +}) + +#define __get_tsk_thread_flag(tsk, flag) ({ \ + int ___res; \ + switch (flag) { \ + case TIF_SIGPENDING: \ + ___res = tsk->thread.work.sigpending; \ + break; \ + case TIF_NEED_RESCHED: \ + ___res = tsk->thread.work.need_resched; \ + break; \ + default: \ + ___res = thread_flag_fixme(); \ + } \ + ___res; \ +}) + +#define __get_set_tsk_thread_flag(tsk, flag, val) ({ \ + int __res = __get_tsk_thread_flag(tsk, flag); \ + __set_tsk_thread_flag(tsk, flag, val); \ + __res; \ +}) + +#define set_tsk_thread_flag(tsk, flag) __set_tsk_thread_flag(tsk, flag, ~0) +#define clear_tsk_thread_flag(tsk, flag) __set_tsk_thread_flag(tsk, flag, 0) +#define test_and_set_tsk_thread_flag(tsk, flag) __get_set_tsk_thread_flag(tsk, flag, ~0) +#define test_tsk_thread_flag(tsk, flag) __get_tsk_thread_flag(tsk, flag) + +#define set_thread_flag(flag) set_tsk_thread_flag(current, flag) +#define clear_thread_flag(flag) clear_tsk_thread_flag(current, flag) +#define test_thread_flag(flag) test_tsk_thread_flag(current, flag) + +#define set_need_resched() set_thread_flag(TIF_NEED_RESCHED) +#define clear_need_resched() clear_thread_flag(TIF_NEED_RESCHED) + +#endif /* _ASM_M68K_THREAD_INFO_H */ -- cgit v1.2.3