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