#include <linux/linkage.h>
#include <asm/unistd.h>
#include <asm/thread_info.h>
#include <asm/errno.h>
#include <asm/setup.h>
#include <asm/asm-offsets.h>
#include <asm/entry.h>
#ifdef CONFIG_COLDFIRE_SW_A7
.bss
sw_ksp:
.long 0
sw_usp:
.long 0
#endif
.text
.globl system_call
.globl resume
.globl ret_from_exception
.globl sys_call_table
.globl inthandler
enosys:
mov.l #sys_ni_syscall,%d3
bra 1f
ENTRY(system_call)
SAVE_ALL_SYS
move #0x2000,%sr
GET_CURRENT(%d2)
cmpl #NR_syscalls,%d0
jcc enosys
lea sys_call_table,%a0
lsll #2,%d0
movel %a0@(%d0),%d3
jeq enosys
1:
movel %sp,%d2
andl #-THREAD_SIZE,%d2
movel %d2,%a0
movel %a0@,%a1
movel %sp,%a1@(TASK_THREAD+THREAD_ESP0)
btst #(TIF_SYSCALL_TRACE%8),%a0@(TINFO_FLAGS+(31-TIF_SYSCALL_TRACE)/8)
bnes 1f
movel %d3,%a0
jbsr %a0@
movel %d0,%sp@(PT_OFF_D0)
jra ret_from_exception
1:
movel #-ENOSYS,%d2
movel %d2,PT_OFF_D0(%sp)
subql #4,%sp
SAVE_SWITCH_STACK
jbsr syscall_trace_enter
RESTORE_SWITCH_STACK
addql #4,%sp
addql #1,%d0
jeq ret_from_exception
movel %d3,%a0
jbsr %a0@
movel %d0,%sp@(PT_OFF_D0)
subql #4,%sp
SAVE_SWITCH_STACK
jbsr syscall_trace_leave
RESTORE_SWITCH_STACK
addql #4,%sp
ret_from_exception:
move #0x2700,%sr
btst #5,%sp@(PT_OFF_SR)
jeq Luser_return
#ifdef CONFIG_PREEMPTION
movel %sp,%d1
andl #-THREAD_SIZE,%d1
movel %d1,%a0
movel %a0@(TINFO_FLAGS),%d1
andl #(1<<TIF_NEED_RESCHED),%d1
jeq Lkernel_return
movel %a0@(TINFO_PREEMPT),%d1
cmpl #0,%d1
jne Lkernel_return
pea Lkernel_return
jmp preempt_schedule_irq
#endif
Lkernel_return:
moveml %sp@,%d1-%d5/%a0-%a2
lea %sp@(32),%sp
movel %sp@+,%d0
addql #4,%sp
addl %sp@+,%sp
rte
Luser_return:
movel %sp,%d1
andl #-THREAD_SIZE,%d1
movel %d1,%a0
moveb %a0@(TINFO_FLAGS+3),%d1
jne Lwork_to_do
Lreturn:
RESTORE_USER
Lwork_to_do:
movel %a0@(TINFO_FLAGS),%d1
move #0x2000,%sr
btst #TIF_NEED_RESCHED,%d1
jne reschedule
Lsignal_return:
subql #4,%sp
SAVE_SWITCH_STACK
pea %sp@(SWITCH_STACK_SIZE)
jsr do_notify_resume
addql #4,%sp
RESTORE_SWITCH_STACK
addql #4,%sp
jmp Luser_return
ENTRY(inthandler)
SAVE_ALL_INT
GET_CURRENT(%d2)
movew %sp@(PT_OFF_FORMATVEC),%d0
andl #0x03fc,%d0
movel %sp,%sp@-
lsrl #2,%d0
movel %d0,%sp@-
jbsr do_IRQ
lea %sp@(8),%sp
bra ret_from_exception
ENTRY(resume)
movew %sr,%d1
movew %d1,%a0@(TASK_THREAD+THREAD_SR)
movel %a0,%d1
SAVE_SWITCH_STACK
movel %sp,%a0@(TASK_THREAD+THREAD_KSP)
RDUSP
movel %a3,%a0@(TASK_THREAD+THREAD_USP)
#ifdef CONFIG_MMU
movel %a1,%a2
#endif
movel %a1@(TASK_THREAD+THREAD_USP),%a3
WRUSP
movel %a1@(TASK_THREAD+THREAD_KSP),%sp
movew %a1@(TASK_THREAD+THREAD_SR),%d7
movew %d7,%sr
RESTORE_SWITCH_STACK
rts