2d7f16d6d1
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>
152 lines
2.8 KiB
ArmAsm
152 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
|
|
|