diff options
Diffstat (limited to 'arch/frv/kernel')
| -rw-r--r-- | arch/frv/kernel/entry.S | 32 | ||||
| -rw-r--r-- | arch/frv/kernel/process.c | 5 | ||||
| -rw-r--r-- | arch/frv/kernel/setup.c | 2 | 
3 files changed, 10 insertions, 29 deletions
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S index 00273296031..dfcd263c051 100644 --- a/arch/frv/kernel/entry.S +++ b/arch/frv/kernel/entry.S @@ -867,13 +867,8 @@ ret_from_fork:  ret_from_kernel_thread:  	lddi.p		@(gr28,#REG_GR(8)),gr20  	call		schedule_tail -	or.p		gr20,gr20,gr8 -	calll		@(gr21,gr0) -	bra		sys_exit - -	.globl		ret_from_kernel_execve -ret_from_kernel_execve: -	ori		gr28,0,sp +	calll.p		@(gr21,gr0) +	or		gr20,gr20,gr8  	bra		__syscall_exit  ################################################################################################### @@ -1080,27 +1075,10 @@ __entry_return_from_kernel_interrupt:  	subicc		gr5,#0,gr0,icc0  	beq		icc0,#0,__entry_return_direct -__entry_preempt_need_resched: -	ldi		@(gr15,#TI_FLAGS),gr4 -	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0 -	beq		icc0,#1,__entry_return_direct - -	setlos		#PREEMPT_ACTIVE,gr5 -	sti		gr5,@(gr15,#TI_FLAGS) - -	andi		gr23,#~PSR_PIL,gr23 -	movgs		gr23,psr - -	call		schedule -	sti		gr0,@(gr15,#TI_PRE_COUNT) - -	movsg		psr,gr23 -	ori		gr23,#PSR_PIL_14,gr23 -	movgs		gr23,psr -	bra		__entry_preempt_need_resched -#else -	bra		__entry_return_direct +	subcc		gr0,gr0,gr0,icc2		/* set Z and clear C */ +	call		preempt_schedule_irq  #endif +	bra		__entry_return_direct  ############################################################################### diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c index 655d90d20bb..7e33215f1d8 100644 --- a/arch/frv/kernel/process.c +++ b/arch/frv/kernel/process.c @@ -181,6 +181,9 @@ int copy_thread(unsigned long clone_flags,  	childregs = (struct pt_regs *)  		(task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE); +	/* set up the userspace frame (the only place that the USP is stored) */ +	*childregs = *__kernel_frame0_ptr; +  	p->set_child_tid = p->clear_child_tid = NULL;  	p->thread.frame	 = childregs; @@ -191,10 +194,8 @@ int copy_thread(unsigned long clone_flags,  	p->thread.frame0 = childregs;  	if (unlikely(!regs)) { -		memset(childregs, 0, sizeof(struct pt_regs));  		childregs->gr9 = usp; /* function */  		childregs->gr8 = arg; -		chilregs->psr = PSR_S;  		p->thread.pc = (unsigned long) ret_from_kernel_thread;  		save_user_regs(p->thread.user);  		return 0; diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c index 1f1e5efb338..b8993c87d3d 100644 --- a/arch/frv/kernel/setup.c +++ b/arch/frv/kernel/setup.c @@ -112,9 +112,11 @@ char __initdata redboot_command_line[COMMAND_LINE_SIZE];  #ifdef CONFIG_PM  #define __pminit  #define __pminitdata +#define __pminitconst  #else  #define __pminit __init  #define __pminitdata __initdata +#define __pminitconst __initconst  #endif  struct clock_cmode {  |