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