summaryrefslogtreecommitdiffstats
path: root/arch/blackfin/kernel/process.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-06-19 17:34:46 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-06-19 17:34:46 -0700
commit17fad5209e6b55148dbd20156cdaf2c7e67faa40 (patch)
tree0b014c85f699b829f785a90ce193dec814af9ba9 /arch/blackfin/kernel/process.c
parent898f96fd5059854bef89d2a65a6de737bd5c5411 (diff)
parenteec511d75edd5139ea6de537f6908085b171e7a0 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier/blackfin: Blackfin: convert page/tlb to asm-generic Blackfin: convert types to asm-generic Blackfin: convert irq/process to asm-generic Blackfin: convert signal/mmap to asm-generic Blackfin: convert locking primitives to asm-generic Blackfin: convert termios to asm-generic Blackfin: convert simple headers to asm-generic Blackfin: convert socket/poll to asm-generic Blackfin: convert user/elf to asm-generic Blackfin: convert shm/sysv/ipc to asm-generic Blackfin: convert asm/ioctls.h to asm-generic/ioctls.h Blackfin: only build irqpanic.c when needed Blackfin: pull in asm/io.h in ksyms for prototypes Blackfin: use common test_bit() rather than __test_bit()
Diffstat (limited to 'arch/blackfin/kernel/process.c')
-rw-r--r--arch/blackfin/kernel/process.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c
index 30d0843ed70..3e1d86e456f 100644
--- a/arch/blackfin/kernel/process.c
+++ b/arch/blackfin/kernel/process.c
@@ -160,6 +160,29 @@ pid_t kernel_thread(int (*fn) (void *), void *arg, unsigned long flags)
}
EXPORT_SYMBOL(kernel_thread);
+/*
+ * Do necessary setup to start up a newly executed thread.
+ *
+ * pass the data segment into user programs if it exists,
+ * it can't hurt anything as far as I can tell
+ */
+void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
+{
+ set_fs(USER_DS);
+ regs->pc = new_ip;
+ if (current->mm)
+ regs->p5 = current->mm->start_data;
+#ifdef CONFIG_SMP
+ task_thread_info(current)->l1_task_info.stack_start =
+ (void *)current->mm->context.stack_start;
+ task_thread_info(current)->l1_task_info.lowest_sp = (void *)new_sp;
+ memcpy(L1_SCRATCH_TASK_INFO, &task_thread_info(current)->l1_task_info,
+ sizeof(*L1_SCRATCH_TASK_INFO));
+#endif
+ wrusp(new_sp);
+}
+EXPORT_SYMBOL_GPL(start_thread);
+
void flush_thread(void)
{
}