blob: cb28de6a2efa74eae75569ff3d3515ad4229b097 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 1995, 96, 97, 98, 99, 2000, 01, 02 by Ralf Baechle
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Copyright (C) 2001 MIPS Technologies, Inc.
9 */
10#include <linux/config.h>
11#include <linux/errno.h>
12#include <asm/asm.h>
13#include <asm/asmmacro.h>
14#include <asm/mipsregs.h>
15#include <asm/regdef.h>
16#include <asm/stackframe.h>
Sam Ravnborg048eb582005-09-09 22:32:31 +020017#include <asm/asm-offsets.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <asm/sysmips.h>
19#include <asm/thread_info.h>
20#include <asm/unistd.h>
21#include <asm/war.h>
22
23#ifndef CONFIG_BINFMT_ELF32
24/* Neither O32 nor N32, so define handle_sys here */
25#define handle_sys64 handle_sys
26#endif
27
28 .align 5
29NESTED(handle_sys64, PT_SIZE, sp)
30#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
31 /*
32 * When 32-bit compatibility is configured scall_o32.S
33 * already did this.
34 */
35 .set noat
36 SAVE_SOME
37 STI
38 .set at
39#endif
40
41 dsubu t0, v0, __NR_64_Linux # check syscall number
42 sltiu t0, t0, __NR_64_Linux_syscalls + 1
43#if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32)
44 ld t1, PT_EPC(sp) # skip syscall on return
45 daddiu t1, 4 # skip to next instruction
46 sd t1, PT_EPC(sp)
47#endif
48 beqz t0, illegal_syscall
49
50 dsll t0, v0, 3 # offset into table
51 ld t2, (sys_call_table - (__NR_64_Linux * 8))(t0)
52 # syscall routine
53
54 sd a3, PT_R26(sp) # save a3 for syscall restarting
55
56 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
57 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled?
58 and t0, t1, t0
59 bnez t0, syscall_trace_entry
60
61 jalr t2 # Do The Real Thing (TM)
62
63 li t0, -EMAXERRNO - 1 # error?
64 sltu t0, t0, v0
65 sd t0, PT_R7(sp) # set error flag
66 beqz t0, 1f
67
68 dnegu v0 # error
69 sd v0, PT_R0(sp) # set flag for syscall
70 # restarting
711: sd v0, PT_R2(sp) # result
72
73n64_syscall_exit:
74 local_irq_disable # make sure need_resched and
75 # signals dont change between
76 # sampling and return
77 LONG_L a2, TI_FLAGS($28) # current->work
78 li t0, _TIF_ALLWORK_MASK
79 and t0, a2, t0
80 bnez t0, n64_syscall_exit_work
81
82 j restore_partial
83
84n64_syscall_exit_work:
85 j syscall_exit_work_partial
86
87/* ------------------------------------------------------------------------ */
88
89syscall_trace_entry:
90 SAVE_STATIC
91 move s0, t2
92 move a0, sp
93 li a1, 0
94 jal do_syscall_trace
95
96 ld a0, PT_R4(sp) # Restore argument registers
97 ld a1, PT_R5(sp)
98 ld a2, PT_R6(sp)
99 ld a3, PT_R7(sp)
100 ld a4, PT_R8(sp)
101 ld a5, PT_R9(sp)
102 jalr s0
103
104 li t0, -EMAXERRNO - 1 # error?
105 sltu t0, t0, v0
106 sd t0, PT_R7(sp) # set error flag
107 beqz t0, 1f
108
109 dnegu v0 # error
110 sd v0, PT_R0(sp) # set flag for syscall restarting
1111: sd v0, PT_R2(sp) # result
112
113 j syscall_exit
114
115illegal_syscall:
116 /* This also isn't a 64-bit syscall, throw an error. */
117 li v0, -ENOSYS # error
118 sd v0, PT_R2(sp)
119 li t0, 1 # set error flag
120 sd t0, PT_R7(sp)
121 j n64_syscall_exit
122 END(handle_sys64)
123
124 LEAF(mips_atomic_set)
125 andi v0, a1, 3 # must be word aligned
126 bnez v0, bad_alignment
127
128 LONG_L v1, TI_ADDR_LIMIT($28) # in legal address range?
129 LONG_ADDIU a0, a1, 4
130 or a0, a0, a1
131 and a0, a0, v1
132 bltz a0, bad_address
133
134#ifdef CONFIG_CPU_HAS_LLSC
135 /* Ok, this is the ll/sc case. World is sane :-) */
1361: ll v0, (a1)
137 move a0, a2
1382: sc a0, (a1)
139#if R10000_LLSC_WAR
140 beqzl a0, 1b
141#else
142 beqz a0, 1b
143#endif
144
145 .section __ex_table,"a"
146 PTR 1b, bad_stack
147 PTR 2b, bad_stack
148 .previous
149#else
150 sw a1, 16(sp)
151 sw a2, 20(sp)
152
153 move a0, sp
154 move a2, a1
155 li a1, 1
156 jal do_page_fault
157
158 lw a1, 16(sp)
159 lw a2, 20(sp)
160
161 /*
162 * At this point the page should be readable and writable unless
163 * there was no more memory available.
164 */
1651: lw v0, (a1)
1662: sw a2, (a1)
167
168 .section __ex_table,"a"
169 PTR 1b, no_mem
170 PTR 2b, no_mem
171 .previous
172#endif
173
174 sd zero, PT_R7(sp) # success
175 sd v0, PT_R2(sp) # result
176
Ralf Baechleedcb98d2005-11-29 13:01:01 +0000177 j n64_syscall_exit # continue like a normal syscall
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178
179no_mem: li v0, -ENOMEM
180 jr ra
181
182bad_address:
183 li v0, -EFAULT
184 jr ra
185
186bad_alignment:
187 li v0, -EINVAL
188 jr ra
189 END(mips_atomic_set)
190
191 LEAF(sys_sysmips)
192 beq a0, MIPS_ATOMIC_SET, mips_atomic_set
193 j _sys_sysmips
194 END(sys_sysmips)
195
196 .align 3
197sys_call_table:
198 PTR sys_read /* 5000 */
199 PTR sys_write
200 PTR sys_open
201 PTR sys_close
202 PTR sys_newstat
203 PTR sys_newfstat /* 5005 */
204 PTR sys_newlstat
205 PTR sys_poll
206 PTR sys_lseek
207 PTR old_mmap
208 PTR sys_mprotect /* 5010 */
209 PTR sys_munmap
210 PTR sys_brk
211 PTR sys_rt_sigaction
212 PTR sys_rt_sigprocmask
213 PTR sys_ioctl /* 5015 */
214 PTR sys_pread64
215 PTR sys_pwrite64
216 PTR sys_readv
217 PTR sys_writev
218 PTR sys_access /* 5020 */
219 PTR sys_pipe
220 PTR sys_select
221 PTR sys_sched_yield
222 PTR sys_mremap
223 PTR sys_msync /* 5025 */
224 PTR sys_mincore
225 PTR sys_madvise
226 PTR sys_shmget
227 PTR sys_shmat
228 PTR sys_shmctl /* 5030 */
229 PTR sys_dup
230 PTR sys_dup2
231 PTR sys_pause
232 PTR sys_nanosleep
233 PTR sys_getitimer /* 5035 */
234 PTR sys_setitimer
235 PTR sys_alarm
236 PTR sys_getpid
237 PTR sys_sendfile64
238 PTR sys_socket /* 5040 */
239 PTR sys_connect
240 PTR sys_accept
241 PTR sys_sendto
242 PTR sys_recvfrom
243 PTR sys_sendmsg /* 5045 */
244 PTR sys_recvmsg
245 PTR sys_shutdown
246 PTR sys_bind
247 PTR sys_listen
248 PTR sys_getsockname /* 5050 */
249 PTR sys_getpeername
250 PTR sys_socketpair
251 PTR sys_setsockopt
252 PTR sys_getsockopt
253 PTR sys_clone /* 5055 */
254 PTR sys_fork
255 PTR sys_execve
256 PTR sys_exit
257 PTR sys_wait4
258 PTR sys_kill /* 5060 */
259 PTR sys_newuname
260 PTR sys_semget
261 PTR sys_semop
262 PTR sys_semctl
263 PTR sys_shmdt /* 5065 */
264 PTR sys_msgget
265 PTR sys_msgsnd
266 PTR sys_msgrcv
267 PTR sys_msgctl
268 PTR sys_fcntl /* 5070 */
269 PTR sys_flock
270 PTR sys_fsync
271 PTR sys_fdatasync
272 PTR sys_truncate
273 PTR sys_ftruncate /* 5075 */
274 PTR sys_getdents
275 PTR sys_getcwd
276 PTR sys_chdir
277 PTR sys_fchdir
278 PTR sys_rename /* 5080 */
279 PTR sys_mkdir
280 PTR sys_rmdir
281 PTR sys_creat
282 PTR sys_link
283 PTR sys_unlink /* 5085 */
284 PTR sys_symlink
285 PTR sys_readlink
286 PTR sys_chmod
287 PTR sys_fchmod
288 PTR sys_chown /* 5090 */
289 PTR sys_fchown
290 PTR sys_lchown
291 PTR sys_umask
292 PTR sys_gettimeofday
293 PTR sys_getrlimit /* 5095 */
294 PTR sys_getrusage
295 PTR sys_sysinfo
296 PTR sys_times
297 PTR sys_ptrace
298 PTR sys_getuid /* 5100 */
299 PTR sys_syslog
300 PTR sys_getgid
301 PTR sys_setuid
302 PTR sys_setgid
303 PTR sys_geteuid /* 5105 */
304 PTR sys_getegid
305 PTR sys_setpgid
306 PTR sys_getppid
307 PTR sys_getpgrp
308 PTR sys_setsid /* 5110 */
309 PTR sys_setreuid
310 PTR sys_setregid
311 PTR sys_getgroups
312 PTR sys_setgroups
313 PTR sys_setresuid /* 5115 */
314 PTR sys_getresuid
315 PTR sys_setresgid
316 PTR sys_getresgid
317 PTR sys_getpgid
318 PTR sys_setfsuid /* 5120 */
319 PTR sys_setfsgid
320 PTR sys_getsid
321 PTR sys_capget
322 PTR sys_capset
323 PTR sys_rt_sigpending /* 5125 */
324 PTR sys_rt_sigtimedwait
325 PTR sys_rt_sigqueueinfo
326 PTR sys_rt_sigsuspend
327 PTR sys_sigaltstack
328 PTR sys_utime /* 5130 */
329 PTR sys_mknod
330 PTR sys_personality
331 PTR sys_ustat
332 PTR sys_statfs
333 PTR sys_fstatfs /* 5135 */
334 PTR sys_sysfs
335 PTR sys_getpriority
336 PTR sys_setpriority
337 PTR sys_sched_setparam
338 PTR sys_sched_getparam /* 5140 */
339 PTR sys_sched_setscheduler
340 PTR sys_sched_getscheduler
341 PTR sys_sched_get_priority_max
342 PTR sys_sched_get_priority_min
343 PTR sys_sched_rr_get_interval /* 5145 */
344 PTR sys_mlock
345 PTR sys_munlock
346 PTR sys_mlockall
347 PTR sys_munlockall
348 PTR sys_vhangup /* 5150 */
349 PTR sys_pivot_root
350 PTR sys_sysctl
351 PTR sys_prctl
352 PTR sys_adjtimex
353 PTR sys_setrlimit /* 5155 */
354 PTR sys_chroot
355 PTR sys_sync
356 PTR sys_acct
357 PTR sys_settimeofday
358 PTR sys_mount /* 5160 */
359 PTR sys_umount
360 PTR sys_swapon
361 PTR sys_swapoff
362 PTR sys_reboot
363 PTR sys_sethostname /* 5165 */
364 PTR sys_setdomainname
365 PTR sys_ni_syscall /* was create_module */
366 PTR sys_init_module
367 PTR sys_delete_module
368 PTR sys_ni_syscall /* 5170, was get_kernel_syms */
369 PTR sys_ni_syscall /* was query_module */
370 PTR sys_quotactl
371 PTR sys_nfsservctl
372 PTR sys_ni_syscall /* res. for getpmsg */
373 PTR sys_ni_syscall /* 5175 for putpmsg */
374 PTR sys_ni_syscall /* res. for afs_syscall */
375 PTR sys_ni_syscall /* res. for security */
376 PTR sys_gettid
377 PTR sys_readahead
378 PTR sys_setxattr /* 5180 */
379 PTR sys_lsetxattr
380 PTR sys_fsetxattr
381 PTR sys_getxattr
382 PTR sys_lgetxattr
383 PTR sys_fgetxattr /* 5185 */
384 PTR sys_listxattr
385 PTR sys_llistxattr
386 PTR sys_flistxattr
387 PTR sys_removexattr
388 PTR sys_lremovexattr /* 5190 */
389 PTR sys_fremovexattr
390 PTR sys_tkill
391 PTR sys_ni_syscall
392 PTR sys_futex
393 PTR sys_sched_setaffinity /* 5195 */
394 PTR sys_sched_getaffinity
395 PTR sys_cacheflush
396 PTR sys_cachectl
397 PTR sys_sysmips
398 PTR sys_io_setup /* 5200 */
399 PTR sys_io_destroy
400 PTR sys_io_getevents
401 PTR sys_io_submit
402 PTR sys_io_cancel
403 PTR sys_exit_group /* 5205 */
404 PTR sys_lookup_dcookie
405 PTR sys_epoll_create
406 PTR sys_epoll_ctl
407 PTR sys_epoll_wait
408 PTR sys_remap_file_pages /* 5210 */
409 PTR sys_rt_sigreturn
410 PTR sys_set_tid_address
411 PTR sys_restart_syscall
412 PTR sys_semtimedop
413 PTR sys_fadvise64_64 /* 5215 */
414 PTR sys_timer_create
415 PTR sys_timer_settime
416 PTR sys_timer_gettime
417 PTR sys_timer_getoverrun
418 PTR sys_timer_delete /* 5220 */
419 PTR sys_clock_settime
420 PTR sys_clock_gettime
421 PTR sys_clock_getres
422 PTR sys_clock_nanosleep
423 PTR sys_tgkill /* 5225 */
424 PTR sys_utimes
425 PTR sys_mbind
426 PTR sys_ni_syscall /* sys_get_mempolicy */
427 PTR sys_ni_syscall /* sys_set_mempolicy */
428 PTR sys_mq_open /* 5230 */
429 PTR sys_mq_unlink
430 PTR sys_mq_timedsend
431 PTR sys_mq_timedreceive
432 PTR sys_mq_notify
433 PTR sys_mq_getsetattr /* 5235 */
434 PTR sys_ni_syscall /* sys_vserver */
435 PTR sys_waitid
436 PTR sys_ni_syscall /* available, was setaltroot */
437 PTR sys_add_key
438 PTR sys_request_key /* 5240 */
439 PTR sys_keyctl
Ralf Baechle3c370262005-04-13 17:43:59 +0000440 PTR sys_set_thread_area
Ralf Baechle7db36c82005-07-13 11:48:45 +0000441 PTR sys_inotify_init
442 PTR sys_inotify_add_watch
443 PTR sys_inotify_rm_watch /* 5245 */