1
2
3
4sys_execve:
5 sethi %hi(sparc_execve), %g1
6 ba,pt %xcc, execve_merge
7 or %g1, %lo(sparc_execve), %g1
8
9#ifdef CONFIG_COMPAT
10sunos_execv:
11 stx %g0, [%sp + PTREGS_OFF + PT_V9_I2]
12sys32_execve:
13 sethi %hi(sparc32_execve), %g1
14 or %g1, %lo(sparc32_execve), %g1
15#endif
16
17execve_merge:
18 flushw
19 jmpl %g1, %g0
20 add %sp, PTREGS_OFF, %o0
21
22 .align 32
23sys_sparc_pipe:
24 ba,pt %xcc, sys_sparc_pipe_real
25 add %sp, PTREGS_OFF, %o0
26sys_nis_syscall:
27 ba,pt %xcc, c_sys_nis_syscall
28 add %sp, PTREGS_OFF, %o0
29sys_memory_ordering:
30 ba,pt %xcc, sparc_memory_ordering
31 add %sp, PTREGS_OFF, %o1
32sys_sigaltstack:
33 ba,pt %xcc, do_sigaltstack
34 add %i6, STACK_BIAS, %o2
35#ifdef CONFIG_COMPAT
36sys32_sigstack:
37 ba,pt %xcc, do_sys32_sigstack
38 mov %i6, %o2
39sys32_sigaltstack:
40 ba,pt %xcc, do_sys32_sigaltstack
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), %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_syscall
112ret_from_syscall:
113
114 stb %g0, [%g6 + TI_NEW_CHILD]
115 ldx [%g6 + TI_FLAGS], %l0
116 call schedule_tail
117 mov %g7, %o0
118 ba,pt %xcc, ret_sys_call
119 ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0
120
121 .globl sparc_exit
122 .type sparc_exit,
123sparc_exit:
124 rdpr %pstate, %g2
125 wrpr %g2, PSTATE_IE, %pstate
126 rdpr %otherwin, %g1
127 rdpr %cansave, %g3
128 add %g3, %g1, %g3
129 wrpr %g3, 0x0, %cansave
130 wrpr %g0, 0x0, %otherwin
131 wrpr %g2, 0x0, %pstate
132 ba,pt %xcc, sys_exit
133 stb %g0, [%g6 + TI_WSAVED]
134 .size sparc_exit,.-sparc_exit
135
136linux_sparc_ni_syscall:
137 sethi %hi(sys_ni_syscall), %l7
138 ba,pt %xcc, 4f
139 or %l7, %lo(sys_ni_syscall), %l7
140
141linux_syscall_trace32:
142 call syscall_trace_enter
143 add %sp, PTREGS_OFF, %o0
144 brnz,pn %o0, 3f
145 mov -ENOSYS, %o0
146 srl %i0, 0, %o0
147 srl %i4, 0, %o4
148 srl %i1, 0, %o1
149 srl %i2, 0, %o2
150 ba,pt %xcc, 2f
151 srl %i3, 0, %o3
152
153linux_syscall_trace:
154 call syscall_trace_enter
155 add %sp, PTREGS_OFF, %o0
156 brnz,pn %o0, 3f
157 mov -ENOSYS, %o0
158 mov %i0, %o0
159 mov %i1, %o1
160 mov %i2, %o2
161 mov %i3, %o3
162 b,pt %xcc, 2f
163 mov %i4, %o4
164
165
166
167 .align 32
168 .globl linux_sparc_syscall32
169linux_sparc_syscall32:
170
171 cmp %g1, NR_syscalls ! IEU1 Group
172 bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
173 srl %i0, 0, %o0 ! IEU0
174 sll %g1, 2, %l4 ! IEU0 Group
175 srl %i4, 0, %o4 ! IEU1
176 lduw [%l7 + %l4], %l7 ! Load
177 srl %i1, 0, %o1 ! IEU0 Group
178 ldx [%g6 + TI_FLAGS], %l0 ! Load
179
180 srl %i5, 0, %o5 ! IEU1
181 srl %i2, 0, %o2 ! IEU0 Group
182 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
183 bne,pn %icc, linux_syscall_trace32 ! CTI
184 mov %i0, %l5 ! IEU1
185 call %l7 ! CTI Group brk forced
186 srl %i3, 0, %o3 ! IEU0
187 ba,a,pt %xcc, 3f
188
189
190 .align 32
191 .globl linux_sparc_syscall
192linux_sparc_syscall:
193
194 cmp %g1, NR_syscalls ! IEU1 Group
195 bgeu,pn %xcc, linux_sparc_ni_syscall ! CTI
196 mov %i0, %o0 ! IEU0
197 sll %g1, 2, %l4 ! IEU0 Group
198 mov %i1, %o1 ! IEU1
199 lduw [%l7 + %l4], %l7 ! Load
2004: mov %i2, %o2 ! IEU0 Group
201 ldx [%g6 + TI_FLAGS], %l0 ! Load
202
203 mov %i3, %o3 ! IEU1
204 mov %i4, %o4 ! IEU0 Group
205 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
206 bne,pn %icc, linux_syscall_trace ! CTI Group
207 mov %i0, %l5 ! IEU0
2082: call %l7 ! CTI Group brk forced
209 mov %i5, %o5 ! IEU0
210 nop
211
2123: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
213ret_sys_call:
214 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3
215 ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1 ! pc = npc
216 sra %o0, 0, %o0
217 mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2
218 sllx %g2, 32, %g2
219
220
221
222
223 ldub [%g6 + TI_SYS_NOERROR], %l2
224 brnz,a,pn %l2, 80f
225 stb %g0, [%g6 + TI_SYS_NOERROR]
226
227 cmp %o0, -ERESTART_RESTARTBLOCK
228 bgeu,pn %xcc, 1f
229 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6
23080:
231
232 andn %g3, %g2, %g3
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 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %l6
245 sub %g0, %o0, %o0
246 or %g3, %g2, %g3
247 stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
248 stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
249 bne,pn %icc, linux_syscall_trace2
250 add %l1, 0x4, %l2 ! npc = npc+4
251 stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
252
253 b,pt %xcc, rtrap
254 stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
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