diff options
Diffstat (limited to 'arch/frv/kernel/entry.S')
| -rw-r--r-- | arch/frv/kernel/entry.S | 63 | 
1 files changed, 26 insertions, 37 deletions
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S index 63d579bf1c2..dfcd263c051 100644 --- a/arch/frv/kernel/entry.S +++ b/arch/frv/kernel/entry.S @@ -863,6 +863,14 @@ ret_from_fork:  	setlos.p	#0,gr8  	bra		__syscall_exit +	.globl		ret_from_kernel_thread +ret_from_kernel_thread: +	lddi.p		@(gr28,#REG_GR(8)),gr20 +	call		schedule_tail +	calll.p		@(gr21,gr0) +	or		gr20,gr20,gr8 +	bra		__syscall_exit +  ###################################################################################################  #  # Return to user mode is not as complex as all this looks, @@ -905,18 +913,19 @@ __syscall_call:  __syscall_exit:  	LEDS		0x6300 -	sti		gr8,@(gr28,#REG_GR(8))	; save return value +	# keep current PSR in GR23 +	movsg		psr,gr23 -	# rebuild saved psr - execve will change it for init/main.c  	ldi		@(gr28,#REG_PSR),gr22 + +	sti.p		gr8,@(gr28,#REG_GR(8))	; save return value + +	# rebuild saved psr - execve will change it for init/main.c  	srli		gr22,#1,gr5  	andi.p		gr22,#~PSR_PS,gr22  	andi		gr5,#PSR_PS,gr5  	or		gr5,gr22,gr22 -	ori		gr22,#PSR_S,gr22 - -	# keep current PSR in GR23 -	movsg		psr,gr23 +	ori.p		gr22,#PSR_S,gr22  	# make sure we don't miss an interrupt setting need_resched or sigpending between  	# sampling and the RETT @@ -924,9 +933,7 @@ __syscall_exit:  	movgs		gr23,psr  	ldi		@(gr15,#TI_FLAGS),gr4 -	sethi.p		%hi(_TIF_ALLWORK_MASK),gr5 -	setlo		%lo(_TIF_ALLWORK_MASK),gr5 -	andcc		gr4,gr5,gr0,icc0 +	andicc		gr4,#_TIF_ALLWORK_MASK,gr0,icc0  	bne		icc0,#0,__syscall_exit_work  	# restore all registers and return @@ -1068,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  ############################################################################### @@ -1111,9 +1101,7 @@ __entry_resume_userspace:  __entry_return_from_user_interrupt:  	LEDS		0x6402  	ldi		@(gr15,#TI_FLAGS),gr4 -	sethi.p		%hi(_TIF_WORK_MASK),gr5 -	setlo		%lo(_TIF_WORK_MASK),gr5 -	andcc		gr4,gr5,gr0,icc0 +	andicc		gr4,#_TIF_WORK_MASK,gr0,icc0  	beq		icc0,#1,__entry_return_direct  __entry_work_pending: @@ -1133,9 +1121,7 @@ __entry_work_resched:  	LEDS		0x6401  	ldi		@(gr15,#TI_FLAGS),gr4 -	sethi.p		%hi(_TIF_WORK_MASK),gr5 -	setlo		%lo(_TIF_WORK_MASK),gr5 -	andcc		gr4,gr5,gr0,icc0 +	andicc		gr4,#_TIF_WORK_MASK,gr0,icc0  	beq		icc0,#1,__entry_return_direct  	andicc		gr4,#_TIF_NEED_RESCHED,gr0,icc0  	bne		icc0,#1,__entry_work_resched @@ -1163,7 +1149,9 @@ __syscall_trace_entry:  	# perform syscall exit tracing  __syscall_exit_work:  	LEDS		0x6340 -	andicc		gr4,#_TIF_SYSCALL_TRACE,gr0,icc0 +	andicc		gr22,#PSR_PS,gr0,icc1	; don't handle on return to kernel mode +	andicc.p	gr4,#_TIF_SYSCALL_TRACE,gr0,icc0 +	bne		icc1,#0,__entry_return_direct  	beq		icc0,#1,__entry_work_pending  	movsg		psr,gr23 @@ -1358,7 +1346,7 @@ sys_call_table:  	.long sys_ni_syscall	/* for vm86 */  	.long sys_ni_syscall	/* Old sys_query_module */  	.long sys_poll -	.long sys_nfsservctl +	.long sys_ni_syscall	/* Old nfsservctl */  	.long sys_setresgid16	/* 170 */  	.long sys_getresgid16  	.long sys_prctl @@ -1526,5 +1514,6 @@ sys_call_table:  	.long sys_pwritev  	.long sys_rt_tgsigqueueinfo	/* 335 */  	.long sys_perf_event_open +	.long sys_setns  syscall_table_size = (. - sys_call_table)  | 
