1
2
3
4
5sys64_execve:
6 set sys_execve, %g1
7 jmpl %g1, %g0
8 flushw
9
10sys64_execveat:
11 set sys_execveat, %g1
12 jmpl %g1, %g0
13 flushw
14
15#ifdef CONFIG_COMPAT
16sunos_execv:
17 mov %g0, %o2
18sys32_execve:
19 set compat_sys_execve, %g1
20 jmpl %g1, %g0
21 flushw
22
23sys32_execveat:
24 set compat_sys_execveat, %g1
25 jmpl %g1, %g0
26 flushw
27#endif
28
29 .align 32
30#ifdef CONFIG_COMPAT
31sys32_sigstack:
32 ba,pt %xcc, do_sys32_sigstack
33 mov %i6, %o2
34#endif
35 .align 32
36#ifdef CONFIG_COMPAT
37sys32_sigreturn:
38 add %sp, PTREGS_OFF, %o0
39 call do_sigreturn32
40 add %o7, 1f-.-4, %o7
41 nop
42#endif
43sys_rt_sigreturn:
44 add %sp, PTREGS_OFF, %o0
45 call do_rt_sigreturn
46 add %o7, 1f-.-4, %o7
47 nop
48#ifdef CONFIG_COMPAT
49sys32_rt_sigreturn:
50 add %sp, PTREGS_OFF, %o0
51 call do_rt_sigreturn32
52 add %o7, 1f-.-4, %o7
53 nop
54#endif
55 .align 32
561: ldx [%g6 + TI_FLAGS], %l5
57 andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
58 be,pt %icc, rtrap
59 nop
60 call syscall_trace_leave
61 add %sp, PTREGS_OFF, %o0
62 ba,pt %xcc, rtrap
63 nop
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 .align 32
89sys_vfork:
90 flushw
91 ba,pt %xcc, sparc_vfork
92 add %sp, PTREGS_OFF, %o0
93
94 .align 32
95sys_fork:
96 flushw
97 ba,pt %xcc, sparc_fork
98 add %sp, PTREGS_OFF, %o0
99
100 .align 32
101sys_clone:
102 flushw
103 ba,pt %xcc, sparc_clone
104 add %sp, PTREGS_OFF, %o0
105
106 .globl ret_from_fork
107ret_from_fork:
108
109 stb %g0, [%g6 + TI_NEW_CHILD]
110 call schedule_tail
111 mov %g7, %o0
112 ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0
113 brnz,pt %o0, ret_sys_call
114 ldx [%g6 + TI_FLAGS], %l0
115 ldx [%sp + PTREGS_OFF + PT_V9_G1], %l1
116 call %l1
117 ldx [%sp + PTREGS_OFF + PT_V9_G2], %o0
118 ba,pt %xcc, ret_sys_call
119 mov 0, %o0
120
121 .globl sparc_exit_group
122 .type sparc_exit_group,
123sparc_exit_group:
124 sethi %hi(sys_exit_group), %g7
125 ba,pt %xcc, 1f
126 or %g7, %lo(sys_exit_group), %g7
127 .size sparc_exit_group,.-sparc_exit_group
128
129 .globl sparc_exit
130 .type sparc_exit,
131sparc_exit:
132 sethi %hi(sys_exit), %g7
133 or %g7, %lo(sys_exit), %g7
1341: rdpr %pstate, %g2
135 wrpr %g2, PSTATE_IE, %pstate
136 rdpr %otherwin, %g1
137 rdpr %cansave, %g3
138 add %g3, %g1, %g3
139 wrpr %g3, 0x0, %cansave
140 wrpr %g0, 0x0, %otherwin
141 wrpr %g2, 0x0, %pstate
142 jmpl %g7, %g0
143 stb %g0, [%g6 + TI_WSAVED]
144 .size sparc_exit,.-sparc_exit
145
146linux_sparc_ni_syscall:
147 sethi %hi(sys_ni_syscall), %l7
148 ba,pt %xcc, 4f
149 or %l7, %lo(sys_ni_syscall), %l7
150
151linux_syscall_trace32:
152 call syscall_trace_enter
153 add %sp, PTREGS_OFF, %o0
154 brnz,pn %o0, 3f
155 mov -ENOSYS, %o0
156
157
158 ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
159 sethi %hi(sys_call_table32), %l7
160 ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
161 or %l7, %lo(sys_call_table32), %l7
162 ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
163 ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
164 ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
165 ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
166 ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
167
168 cmp %g1, NR_syscalls
169 bgeu,pn %xcc, 3f
170 mov -ENOSYS, %o0
171
172 sll %g1, 2, %l4
173 srl %i0, 0, %o0
174 lduw [%l7 + %l4], %l7
175 srl %i4, 0, %o4
176 srl %i1, 0, %o1
177 srl %i2, 0, %o2
178 ba,pt %xcc, 5f
179 srl %i3, 0, %o3
180
181linux_syscall_trace:
182 call syscall_trace_enter
183 add %sp, PTREGS_OFF, %o0
184 brnz,pn %o0, 3f
185 mov -ENOSYS, %o0
186
187
188 ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
189 sethi %hi(sys_call_table64), %l7
190 ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
191 or %l7, %lo(sys_call_table64), %l7
192 ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
193 ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
194 ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
195 ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
196 ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
197
198 cmp %g1, NR_syscalls
199 bgeu,pn %xcc, 3f
200 mov -ENOSYS, %o0
201
202 sll %g1, 2, %l4
203 mov %i0, %o0
204 lduw [%l7 + %l4], %l7
205 mov %i1, %o1
206 mov %i2, %o2
207 mov %i3, %o3
208 b,pt %xcc, 2f
209 mov %i4, %o4
210
211
212
213 .align 32
214 .globl linux_sparc_syscall32
215linux_sparc_syscall32:
216
217 cmp %g1, NR_syscalls ! IEU1 Group
218 bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
219 srl %i0, 0, %o0 ! IEU0
220 sll %g1, 2, %l4 ! IEU0 Group
221 srl %i4, 0, %o4 ! IEU1
222 lduw [%l7 + %l4], %l7 ! Load
223 srl %i1, 0, %o1 ! IEU0 Group
224 ldx [%g6 + TI_FLAGS], %l0 ! Load
225
226 srl %i3, 0, %o3 ! IEU0
227 srl %i2, 0, %o2 ! IEU0 Group
228 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
229 bne,pn %icc, linux_syscall_trace32 ! CTI
230 mov %i0, %l5 ! IEU1
2315: call %l7 ! CTI Group brk forced
232 srl %i5, 0, %o5 ! IEU1
233 ba,pt %xcc, 3f
234 sra %o0, 0, %o0
235
236
237 .align 32
238 .globl linux_sparc_syscall
239linux_sparc_syscall:
240
241 cmp %g1, NR_syscalls ! IEU1 Group
242 bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
243 mov %i0, %o0 ! IEU0
244 sll %g1, 2, %l4 ! IEU0 Group
245 mov %i1, %o1 ! IEU1
246 lduw [%l7 + %l4], %l7 ! Load
2474: mov %i2, %o2 ! IEU0 Group
248 ldx [%g6 + TI_FLAGS], %l0 ! Load
249
250 mov %i3, %o3 ! IEU1
251 mov %i4, %o4 ! IEU0 Group
252 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
253 bne,pn %icc, linux_syscall_trace ! CTI Group
254 mov %i0, %l5 ! IEU0
2552: call %l7 ! CTI Group brk forced
256 mov %i5, %o5 ! IEU0
257 nop
258
2593: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
260ret_sys_call:
261 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
262 mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
263 sllx %g2, 32, %g2
264
265 cmp %o0, -ERESTART_RESTARTBLOCK
266 bgeu,pn %xcc, 1f
267 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT|_TIF_NOHZ), %g0
268 ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
269
2702:
271
272 andn %g3, %g2, %g3
2733:
274 stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
275 bne,pn %icc, linux_syscall_trace2
276 add %l1, 0x4, %l2 ! npc = npc+4
277 stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
278 ba,pt %xcc, rtrap
279 stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
280
2811:
282
283
284
285 ldub [%g6 + TI_SYS_NOERROR], %l2
286 brnz,pn %l2, 2b
287 ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
288
289
290
291 sub %g0, %o0, %o0
292 stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
293 ba,pt %xcc, 3b
294 or %g3, %g2, %g3
295
296linux_syscall_trace2:
297 call syscall_trace_leave
298 add %sp, PTREGS_OFF, %o0
299 stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
300 ba,pt %xcc, rtrap
301 stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
302