summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2002-07-23 06:24:25 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-07-23 06:24:25 -0700
commit0ff21ea7187f53d3aa23950a0f6cf825b25aaa93 (patch)
treeeeefc548ab933d715d4d02831295d0fd91714eab /include
parentb066fff83faab6dd9efe93dae026f578051ee9d0 (diff)
[PATCH] M68k update (part 42)
M68k task and thread updates
Diffstat (limited to 'include')
-rw-r--r--include/asm-m68k/entry.h1
-rw-r--r--include/asm-m68k/processor.h50
-rw-r--r--include/asm-m68k/system.h18
-rw-r--r--include/asm-m68k/thread_info.h101
4 files changed, 127 insertions, 43 deletions
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 <asm/segment.h>
#include <asm/entry.h>
-#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 <asm/types.h>
+#include <asm/processor.h>
+#include <asm/page.h>
+
+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 */