diff options
Diffstat (limited to 'arch/mn10300/kernel/entry.S')
| -rw-r--r-- | arch/mn10300/kernel/entry.S | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index 68fcab8f8f6f..222152a3f751 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S | |||
| @@ -60,6 +60,7 @@ ENTRY(ret_from_kernel_thread) | |||
| 60 | mov (REG_D0,fp),d0 | 60 | mov (REG_D0,fp),d0 |
| 61 | mov (REG_A0,fp),a0 | 61 | mov (REG_A0,fp),a0 |
| 62 | calls (a0) | 62 | calls (a0) |
| 63 | GET_THREAD_INFO a2 # A2 must be set on return from sys_exit() | ||
| 63 | clr d0 | 64 | clr d0 |
| 64 | mov d0,(REG_D0,fp) | 65 | mov d0,(REG_D0,fp) |
| 65 | jmp syscall_exit | 66 | jmp syscall_exit |
| @@ -107,10 +108,10 @@ syscall_exit_work: | |||
| 107 | and EPSW_nSL,d0 | 108 | and EPSW_nSL,d0 |
| 108 | beq resume_kernel # returning to supervisor mode | 109 | beq resume_kernel # returning to supervisor mode |
| 109 | 110 | ||
| 110 | btst _TIF_SYSCALL_TRACE,d2 | ||
| 111 | beq work_pending | ||
| 112 | LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call | 111 | LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call |
| 113 | # schedule() instead | 112 | # schedule() instead |
| 113 | btst _TIF_SYSCALL_TRACE,d2 | ||
| 114 | beq work_pending | ||
| 114 | mov fp,d0 | 115 | mov fp,d0 |
| 115 | call syscall_trace_exit[],0 # do_syscall_trace(regs) | 116 | call syscall_trace_exit[],0 # do_syscall_trace(regs) |
| 116 | jmp resume_userspace | 117 | jmp resume_userspace |
| @@ -123,6 +124,7 @@ work_pending: | |||
| 123 | work_resched: | 124 | work_resched: |
| 124 | call schedule[],0 | 125 | call schedule[],0 |
| 125 | 126 | ||
| 127 | resume_userspace: | ||
| 126 | # make sure we don't miss an interrupt setting need_resched or | 128 | # make sure we don't miss an interrupt setting need_resched or |
| 127 | # sigpending between sampling and the rti | 129 | # sigpending between sampling and the rti |
| 128 | LOCAL_IRQ_DISABLE | 130 | LOCAL_IRQ_DISABLE |
| @@ -131,6 +133,8 @@ work_resched: | |||
| 131 | mov (TI_flags,a2),d2 | 133 | mov (TI_flags,a2),d2 |
| 132 | btst _TIF_WORK_MASK,d2 | 134 | btst _TIF_WORK_MASK,d2 |
| 133 | beq restore_all | 135 | beq restore_all |
| 136 | |||
| 137 | LOCAL_IRQ_ENABLE | ||
| 134 | btst _TIF_NEED_RESCHED,d2 | 138 | btst _TIF_NEED_RESCHED,d2 |
| 135 | bne work_resched | 139 | bne work_resched |
| 136 | 140 | ||
| @@ -169,17 +173,6 @@ ret_from_intr: | |||
| 169 | and EPSW_nSL,d0 | 173 | and EPSW_nSL,d0 |
| 170 | beq resume_kernel # returning to supervisor mode | 174 | beq resume_kernel # returning to supervisor mode |
| 171 | 175 | ||
| 172 | ENTRY(resume_userspace) | ||
| 173 | # make sure we don't miss an interrupt setting need_resched or | ||
| 174 | # sigpending between sampling and the rti | ||
| 175 | LOCAL_IRQ_DISABLE | ||
| 176 | |||
| 177 | # is there any work to be done on int/exception return? | ||
| 178 | mov (TI_flags,a2),d2 | ||
| 179 | btst _TIF_WORK_MASK,d2 | ||
| 180 | bne work_pending | ||
| 181 | jmp restore_all | ||
| 182 | |||
| 183 | #ifdef CONFIG_PREEMPT | 176 | #ifdef CONFIG_PREEMPT |
| 184 | ENTRY(resume_kernel) | 177 | ENTRY(resume_kernel) |
| 185 | LOCAL_IRQ_DISABLE | 178 | LOCAL_IRQ_DISABLE |
