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