diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-22 18:23:49 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-01 00:59:09 -0400 |
commit | 5687580bcb758ddc95be9894f592a65034e77401 (patch) | |
tree | 46e8da685de52b6a72f83d857dd5aaced2657520 | |
parent | 680a14535c330481517d3f95b2277353a14b8442 (diff) | |
download | op-kernel-dev-5687580bcb758ddc95be9894f592a65034e77401.zip op-kernel-dev-5687580bcb758ddc95be9894f592a65034e77401.tar.gz |
c6x: switch to generic kernel_thread()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | arch/c6x/Kconfig | 1 | ||||
-rw-r--r-- | arch/c6x/include/asm/processor.h | 2 | ||||
-rw-r--r-- | arch/c6x/kernel/process.c | 24 |
3 files changed, 6 insertions, 21 deletions
diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index 983c859..45268b5 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -17,6 +17,7 @@ config C6X select OF select OF_EARLY_FLATTREE select GENERIC_CLOCKEVENTS + select GENERIC_KERNEL_THREAD config MMU def_bool n diff --git a/arch/c6x/include/asm/processor.h b/arch/c6x/include/asm/processor.h index c50af7e..b9eb3da 100644 --- a/arch/c6x/include/asm/processor.h +++ b/arch/c6x/include/asm/processor.h @@ -92,8 +92,6 @@ static inline void release_thread(struct task_struct *dead_task) { } -extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); - #define copy_segments(tsk, mm) do { } while (0) #define release_segments(mm) do { } while (0) diff --git a/arch/c6x/kernel/process.c b/arch/c6x/kernel/process.c index f98616d..2770d9a 100644 --- a/arch/c6x/kernel/process.c +++ b/arch/c6x/kernel/process.c @@ -104,22 +104,6 @@ void machine_power_off(void) halt_loop(); } -/* - * Create a kernel thread - */ -int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -{ - struct pt_regs regs = { - .a0 = (unsigned long)fn, - .a1 = (unsigned long)arg, - .tsr = 0, /* kernel mode */ - }; - - /* Ok, create the new process.. */ - return do_fork(flags | CLONE_VM | CLONE_UNTRACED, -1, ®s, - 0, NULL, NULL); -} - void flush_thread(void) { } @@ -177,14 +161,16 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, childregs = task_pt_regs(p); - *childregs = *regs; - - if (usp == -1) { + if (!regs) { /* case of __kernel_thread: we return to supervisor space */ + memset(childregs, 0, sizeof(struct pt_regs)); childregs->sp = (unsigned long)(childregs + 1); p->thread.pc = (unsigned long) ret_from_kernel_thread; + childregs->a0 = usp; /* function */ + childregs->a1 = ustk_size; /* argument */ } else { /* Otherwise use the given stack */ + *childregs = *regs; childregs->sp = usp; p->thread.pc = (unsigned long) ret_from_fork; } |