1
2
3
4
5
6
7
8
9
10
11#include <asm/asm.h>
12#include <asm/asmmacro.h>
13#include <asm/compiler.h>
14#include <asm/regdef.h>
15#include <asm/mipsregs.h>
16#include <asm/stackframe.h>
17#include <asm/isadep.h>
18#include <asm/thread_info.h>
19#include <asm/war.h>
20
21#ifndef CONFIG_PREEMPT
22#define resume_kernel restore_all
23#else
24#define __ret_from_irq ret_from_exception
25#endif
26
27 .text
28 .align 5
29#ifndef CONFIG_PREEMPT
30FEXPORT(ret_from_exception)
31 local_irq_disable
32 b __ret_from_irq
33#endif
34FEXPORT(ret_from_irq)
35 LONG_S s0, TI_REGS($28)
36FEXPORT(__ret_from_irq)
37
38
39
40
41resume_userspace_check:
42 LONG_L t0, PT_STATUS(sp)
43 andi t0, t0, KU_USER
44 beqz t0, resume_kernel
45
46resume_userspace:
47 local_irq_disable
48
49
50 LONG_L a2, TI_FLAGS($28)
51 andi t0, a2, _TIF_WORK_MASK
52 bnez t0, work_pending
53 j restore_all
54
55#ifdef CONFIG_PREEMPT
56resume_kernel:
57 local_irq_disable
58 lw t0, TI_PRE_COUNT($28)
59 bnez t0, restore_all
60need_resched:
61 LONG_L t0, TI_FLAGS($28)
62 andi t1, t0, _TIF_NEED_RESCHED
63 beqz t1, restore_all
64 LONG_L t0, PT_STATUS(sp)
65 andi t0, 1
66 beqz t0, restore_all
67 jal preempt_schedule_irq
68 b need_resched
69#endif
70
71FEXPORT(ret_from_kernel_thread)
72 jal schedule_tail
73 move a0, s1
74 jal s0
75 j syscall_exit
76
77FEXPORT(ret_from_fork)
78 jal schedule_tail
79
80FEXPORT(syscall_exit)
81 local_irq_disable
82
83
84 LONG_L a2, TI_FLAGS($28)
85 li t0, _TIF_ALLWORK_MASK
86 and t0, a2, t0
87 bnez t0, syscall_exit_work
88
89restore_all:
90 .set noat
91 RESTORE_TEMP
92 RESTORE_AT
93 RESTORE_STATIC
94restore_partial:
95#ifdef CONFIG_TRACE_IRQFLAGS
96 SAVE_STATIC
97 SAVE_AT
98 SAVE_TEMP
99 LONG_L v0, PT_STATUS(sp)
100
101 and v0, ST0_IEP
102#else
103 and v0, ST0_IE
104#endif
105 beqz v0, 1f
106 jal trace_hardirqs_on
107 b 2f
1081: jal trace_hardirqs_off
1092:
110 RESTORE_TEMP
111 RESTORE_AT
112 RESTORE_STATIC
113#endif
114 RESTORE_SOME
115 RESTORE_SP_AND_RET
116 .set at
117
118work_pending:
119 andi t0, a2, _TIF_NEED_RESCHED
120 beqz t0, work_notifysig
121work_resched:
122 jal schedule
123
124 local_irq_disable
125
126
127 LONG_L a2, TI_FLAGS($28)
128 andi t0, a2, _TIF_WORK_MASK
129
130 beqz t0, restore_all
131 andi t0, a2, _TIF_NEED_RESCHED
132 bnez t0, work_resched
133
134work_notifysig:
135
136 move a0, sp
137 li a1, 0
138 jal do_notify_resume
139 j resume_userspace_check
140
141FEXPORT(syscall_exit_partial)
142 local_irq_disable
143
144 LONG_L a2, TI_FLAGS($28)
145 li t0, _TIF_ALLWORK_MASK
146 and t0, a2
147 beqz t0, restore_partial
148 SAVE_STATIC
149syscall_exit_work:
150 LONG_L t0, PT_STATUS(sp)
151 andi t0, t0, KU_USER
152 beqz t0, resume_kernel
153 li t0, _TIF_WORK_SYSCALL_EXIT
154 and t0, a2
155 beqz t0, work_pending
156 local_irq_enable
157
158 move a0, sp
159 jal syscall_trace_leave
160 b resume_userspace
161
162
163 defined(CONFIG_MIPS_MT)
164
165
166
167
168
169
170LEAF(mips_ihb)
171 .set MIPS_ISA_LEVEL_RAW
172 jr.hb ra
173 nop
174 END(mips_ihb)
175
176#endif
177