|
@@ -60,6 +60,7 @@ ENTRY(ret_from_kernel_thread)
|
|
|
mov (REG_D0,fp),d0
|
|
|
mov (REG_A0,fp),a0
|
|
|
calls (a0)
|
|
|
+ GET_THREAD_INFO a2 # A2 must be set on return from sys_exit()
|
|
|
clr d0
|
|
|
mov d0,(REG_D0,fp)
|
|
|
jmp syscall_exit
|
|
@@ -107,10 +108,10 @@ syscall_exit_work:
|
|
|
and EPSW_nSL,d0
|
|
|
beq resume_kernel # returning to supervisor mode
|
|
|
|
|
|
- btst _TIF_SYSCALL_TRACE,d2
|
|
|
- beq work_pending
|
|
|
LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call
|
|
|
# schedule() instead
|
|
|
+ btst _TIF_SYSCALL_TRACE,d2
|
|
|
+ beq work_pending
|
|
|
mov fp,d0
|
|
|
call syscall_trace_exit[],0 # do_syscall_trace(regs)
|
|
|
jmp resume_userspace
|
|
@@ -123,6 +124,7 @@ work_pending:
|
|
|
work_resched:
|
|
|
call schedule[],0
|
|
|
|
|
|
+resume_userspace:
|
|
|
# make sure we don't miss an interrupt setting need_resched or
|
|
|
# sigpending between sampling and the rti
|
|
|
LOCAL_IRQ_DISABLE
|
|
@@ -131,6 +133,8 @@ work_resched:
|
|
|
mov (TI_flags,a2),d2
|
|
|
btst _TIF_WORK_MASK,d2
|
|
|
beq restore_all
|
|
|
+
|
|
|
+ LOCAL_IRQ_ENABLE
|
|
|
btst _TIF_NEED_RESCHED,d2
|
|
|
bne work_resched
|
|
|
|
|
@@ -169,17 +173,6 @@ ret_from_intr:
|
|
|
and EPSW_nSL,d0
|
|
|
beq resume_kernel # returning to supervisor mode
|
|
|
|
|
|
-ENTRY(resume_userspace)
|
|
|
- # make sure we don't miss an interrupt setting need_resched or
|
|
|
- # sigpending between sampling and the rti
|
|
|
- LOCAL_IRQ_DISABLE
|
|
|
-
|
|
|
- # is there any work to be done on int/exception return?
|
|
|
- mov (TI_flags,a2),d2
|
|
|
- btst _TIF_WORK_MASK,d2
|
|
|
- bne work_pending
|
|
|
- jmp restore_all
|
|
|
-
|
|
|
#ifdef CONFIG_PREEMPT
|
|
|
ENTRY(resume_kernel)
|
|
|
LOCAL_IRQ_DISABLE
|