The return from software signal handling pushes code on the stack that system calls to the kernels cleanup code. This is borrowed directly from the m68k linux signal handler. The rt signal case is not quite right for the restricted instruction set of the ColdFire parts. And neither the normal signal case or rt signal case properly flushes/pushes the appropriate cache lines. Rework the return path to just call back through some code fragments in the kernel proper (with no MMU in the way we can do this). No cache problems, and less code overall. Original patch submitted by Wilson Callan <wcallan@savantav.com> Greg fixed the rt signal return path to use the proper system call Signed-off-by: Greg Ungerer <gerg@uclinux.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			151 lines
		
	
	
	
		
			2.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			2.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*
 | 
						|
 *  linux/arch/m68knommu/kernel/entry.S
 | 
						|
 *
 | 
						|
 *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
 | 
						|
 *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
 | 
						|
 *                      Kenneth Albanowski <kjahds@kjahds.com>,
 | 
						|
 *  Copyright (C) 2000  Lineo Inc. (www.lineo.com) 
 | 
						|
 *
 | 
						|
 * Based on:
 | 
						|
 *
 | 
						|
 *  linux/arch/m68k/kernel/entry.S
 | 
						|
 *
 | 
						|
 *  Copyright (C) 1991, 1992  Linus Torvalds
 | 
						|
 *
 | 
						|
 * This file is subject to the terms and conditions of the GNU General Public
 | 
						|
 * License.  See the file README.legal in the main directory of this archive
 | 
						|
 * for more details.
 | 
						|
 *
 | 
						|
 * Linux/m68k support by Hamish Macdonald
 | 
						|
 *
 | 
						|
 * 68060 fixes by Jesper Skov
 | 
						|
 * ColdFire support by Greg Ungerer (gerg@snapgear.com)
 | 
						|
 * 5307 fixes by David W. Miller
 | 
						|
 * linux 2.4 support David McCullough <davidm@snapgear.com>
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/sys.h>
 | 
						|
#include <linux/linkage.h>
 | 
						|
#include <asm/thread_info.h>
 | 
						|
#include <asm/errno.h>
 | 
						|
#include <asm/setup.h>
 | 
						|
#include <asm/segment.h>
 | 
						|
#include <asm/asm-offsets.h>
 | 
						|
#include <asm/entry.h>
 | 
						|
#include <asm/unistd.h>
 | 
						|
 | 
						|
.text
 | 
						|
 | 
						|
.globl buserr
 | 
						|
.globl trap
 | 
						|
.globl ret_from_exception
 | 
						|
.globl ret_from_signal
 | 
						|
.globl sys_fork
 | 
						|
.globl sys_clone
 | 
						|
.globl sys_vfork
 | 
						|
 | 
						|
ENTRY(buserr)
 | 
						|
	SAVE_ALL
 | 
						|
	moveq	#-1,%d0
 | 
						|
	movel	%d0,%sp@(PT_ORIG_D0)
 | 
						|
	movel	%sp,%sp@- 		/* stack frame pointer argument */
 | 
						|
	jsr	buserr_c
 | 
						|
	addql	#4,%sp
 | 
						|
	jra	ret_from_exception
 | 
						|
 | 
						|
ENTRY(trap)
 | 
						|
	SAVE_ALL
 | 
						|
	moveq	#-1,%d0
 | 
						|
	movel	%d0,%sp@(PT_ORIG_D0)
 | 
						|
	movel	%sp,%sp@- 		/* stack frame pointer argument */
 | 
						|
	jsr	trap_c
 | 
						|
	addql	#4,%sp
 | 
						|
	jra	ret_from_exception
 | 
						|
 | 
						|
#ifdef TRAP_DBG_INTERRUPT
 | 
						|
 | 
						|
.globl dbginterrupt
 | 
						|
ENTRY(dbginterrupt)
 | 
						|
	SAVE_ALL
 | 
						|
	moveq	#-1,%d0
 | 
						|
	movel	%d0,%sp@(PT_ORIG_D0)
 | 
						|
	movel	%sp,%sp@- 		/* stack frame pointer argument */
 | 
						|
	jsr	dbginterrupt_c
 | 
						|
	addql	#4,%sp
 | 
						|
	jra	ret_from_exception
 | 
						|
#endif
 | 
						|
 | 
						|
ENTRY(reschedule)
 | 
						|
	/* save top of frame */
 | 
						|
	pea	%sp@
 | 
						|
	jbsr	set_esp0
 | 
						|
	addql	#4,%sp
 | 
						|
	pea	ret_from_exception
 | 
						|
	jmp	schedule
 | 
						|
 | 
						|
ENTRY(ret_from_fork)
 | 
						|
	movel	%d1,%sp@-
 | 
						|
	jsr	schedule_tail
 | 
						|
	addql	#4,%sp
 | 
						|
	jra	ret_from_exception
 | 
						|
 | 
						|
ENTRY(sys_fork)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	pea	%sp@(SWITCH_STACK_SIZE)
 | 
						|
	jbsr	m68k_fork
 | 
						|
	addql	#4,%sp
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(sys_vfork)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	pea	%sp@(SWITCH_STACK_SIZE)
 | 
						|
	jbsr	m68k_vfork
 | 
						|
	addql	#4,%sp
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(sys_clone)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	pea	%sp@(SWITCH_STACK_SIZE)
 | 
						|
	jbsr	m68k_clone
 | 
						|
	addql	#4,%sp
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(sys_sigsuspend)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	pea	%sp@(SWITCH_STACK_SIZE)
 | 
						|
	jbsr	do_sigsuspend
 | 
						|
	addql	#4,%sp
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(sys_rt_sigsuspend)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	pea	%sp@(SWITCH_STACK_SIZE)
 | 
						|
	jbsr	do_rt_sigsuspend
 | 
						|
	addql	#4,%sp
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(sys_sigreturn)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	jbsr	do_sigreturn
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(sys_rt_sigreturn)
 | 
						|
	SAVE_SWITCH_STACK
 | 
						|
	jbsr	do_rt_sigreturn
 | 
						|
	RESTORE_SWITCH_STACK
 | 
						|
	rts
 | 
						|
 | 
						|
ENTRY(ret_from_user_signal)
 | 
						|
	moveq #__NR_sigreturn,%d0
 | 
						|
	trap #0
 | 
						|
 | 
						|
ENTRY(ret_from_user_rt_signal)
 | 
						|
	move #__NR_rt_sigreturn,%d0
 | 
						|
	trap #0
 | 
						|
 |