diff options
Diffstat (limited to 'arch/sh/kernel/process_32.c')
| -rw-r--r-- | arch/sh/kernel/process_32.c | 36 | 
1 files changed, 26 insertions, 10 deletions
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index 3326a45749d..b965f0282c7 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c @@ -7,7 +7,11 @@   *   *  SuperH version:  Copyright (C) 1999, 2000  Niibe Yutaka & Kaz Kojima   *		     Copyright (C) 2006 Lineo Solutions Inc. support SH4A UBC - *		     Copyright (C) 2002 - 2007  Paul Mundt + *		     Copyright (C) 2002 - 2008  Paul Mundt + * + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details.   */  #include <linux/module.h>  #include <linux/mm.h> @@ -26,6 +30,7 @@  #include <asm/system.h>  #include <asm/ubc.h>  #include <asm/fpu.h> +#include <asm/syscalls.h>  static int hlt_counter;  int ubc_usercnt = 0; @@ -111,15 +116,21 @@ void show_regs(struct pt_regs * regs)  {  	printk("\n");  	printk("Pid : %d, Comm: %20s\n", task_pid_nr(current), current->comm); +	printk("CPU : %d    %s  (%s %.*s)\n", +	       smp_processor_id(), print_tainted(), init_utsname()->release, +	       (int)strcspn(init_utsname()->version, " "), +	       init_utsname()->version); +  	print_symbol("PC is at %s\n", instruction_pointer(regs)); +	print_symbol("PR is at %s\n", regs->pr); +  	printk("PC  : %08lx SP  : %08lx SR  : %08lx ",  	       regs->pc, regs->regs[15], regs->sr);  #ifdef CONFIG_MMU -	printk("TEA : %08x    ", ctrl_inl(MMU_TEA)); +	printk("TEA : %08x\n", ctrl_inl(MMU_TEA));  #else -	printk("                  "); +	printk("\n");  #endif -	printk("%s\n", print_tainted());  	printk("R0  : %08lx R1  : %08lx R2  : %08lx R3  : %08lx\n",  	       regs->regs[0],regs->regs[1], @@ -162,6 +173,7 @@ __asm__(".align 5\n"  int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)  {  	struct pt_regs regs; +	int pid;  	memset(®s, 0, sizeof(regs));  	regs.regs[4] = (unsigned long)arg; @@ -171,8 +183,12 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)  	regs.sr = (1 << 30);  	/* Ok, create the new process.. */ -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, -		       ®s, 0, NULL, NULL); +	pid = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, +		      ®s, 0, NULL, NULL); + +	trace_mark(kernel_arch_kthread_create, "pid %d fn %p", pid, fn); + +	return pid;  }  /* @@ -210,10 +226,10 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)  	struct task_struct *tsk = current;  	fpvalid = !!tsk_used_math(tsk); -	if (fpvalid) { -		unlazy_fpu(tsk, regs); -		memcpy(fpu, &tsk->thread.fpu.hard, sizeof(*fpu)); -	} +	if (fpvalid) +		fpvalid = !fpregs_get(tsk, NULL, 0, +				      sizeof(struct user_fpu_struct), +				      fpu, NULL);  #endif  	return fpvalid;  |