1/* 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 - 2000, 2001 by Ralf Baechle 7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 8 * Copyright (C) 2001 MIPS Technologies, Inc. 9 * Copyright (C) 2004 Thiemo Seufer 10 * 11 * Hairy, the userspace application uses a different argument passing 12 * convention than the kernel, so we have to translate things from o32 13 * to ABI64 calling convention. 64-bit syscalls are also processed 14 * here for now. 15 */ 16#include <linux/errno.h> 17#include <asm/asm.h> 18#include <asm/asmmacro.h> 19#include <asm/irqflags.h> 20#include <asm/mipsregs.h> 21#include <asm/regdef.h> 22#include <asm/stackframe.h> 23#include <asm/thread_info.h> 24#include <asm/unistd.h> 25#include <asm/sysmips.h> 26 27 .align 5 28NESTED(handle_sys, PT_SIZE, sp) 29 .set noat 30 SAVE_SOME 31 TRACE_IRQS_ON_RELOAD 32 STI 33 .set at 34 ld t1, PT_EPC(sp) # skip syscall on return 35 36 dsubu t0, v0, __NR_O32_Linux # check syscall number 37 sltiu t0, t0, __NR_O32_Linux_syscalls + 1 38 daddiu t1, 4 # skip to next instruction 39 sd t1, PT_EPC(sp) 40 beqz t0, not_o32_scall 41 42 /* We don't want to stumble over broken sign extensions from 43 userland. O32 does never use the upper half. */ 44 sll a0, a0, 0 45 sll a1, a1, 0 46 sll a2, a2, 0 47 sll a3, a3, 0 48 49 dsll t0, v0, 3 # offset into table 50 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(t0) 51 52 sd a3, PT_R26(sp) # save a3 for syscall restarting 53 54 /* 55 * More than four arguments. Try to deal with it by copying the 56 * stack arguments from the user stack to the kernel stack. 57 * This Sucks (TM). 58 * 59 * We intentionally keep the kernel stack a little below the top of 60 * userspace so we don't have to do a slower byte accurate check here. 61 */ 62 ld t0, PT_R29(sp) # get old user stack pointer 63 daddu t1, t0, 32 64 bltz t1, bad_stack 65 661: lw a4, 16(t0) # argument #5 from usp 672: lw a5, 20(t0) # argument #6 from usp 683: lw a6, 24(t0) # argument #7 from usp 694: lw a7, 28(t0) # argument #8 from usp (for indirect syscalls) 70 71 .section __ex_table,"a" 72 PTR 1b, bad_stack 73 PTR 2b, bad_stack 74 PTR 3b, bad_stack 75 PTR 4b, bad_stack 76 .previous 77 78 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT 79 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled? 80 and t0, t1, t0 81 bnez t0, trace_a_syscall 82 83 jalr t2 # Do The Real Thing (TM) 84 85 li t0, -EMAXERRNO - 1 # error? 86 sltu t0, t0, v0 87 sd t0, PT_R7(sp) # set error flag 88 beqz t0, 1f 89 90 ld t1, PT_R2(sp) # syscall number 91 dnegu v0 # error 92 sd t1, PT_R0(sp) # save it for syscall restarting 931: sd v0, PT_R2(sp) # result 94 95o32_syscall_exit: 96 local_irq_disable # make need_resched and 97 # signals dont change between 98 # sampling and return 99 LONG_L a2, TI_FLAGS($28) 100 li t0, _TIF_ALLWORK_MASK 101 and t0, a2, t0 102 bnez t0, o32_syscall_exit_work 103 104 j restore_partial 105 106o32_syscall_exit_work: 107 j syscall_exit_work_partial 108 109/* ------------------------------------------------------------------------ */ 110 111trace_a_syscall: 112 SAVE_STATIC 113 sd a4, PT_R8(sp) # Save argument registers 114 sd a5, PT_R9(sp) 115 sd a6, PT_R10(sp) 116 sd a7, PT_R11(sp) # For indirect syscalls 117 118 move s0, t2 # Save syscall pointer 119 move a0, sp 120 li a1, 0 121 jal do_syscall_trace 122 123 move t0, s0 124 RESTORE_STATIC 125 ld a0, PT_R4(sp) # Restore argument registers 126 ld a1, PT_R5(sp) 127 ld a2, PT_R6(sp) 128 ld a3, PT_R7(sp) 129 ld a4, PT_R8(sp) 130 ld a5, PT_R9(sp) 131 ld a6, PT_R10(sp) 132 ld a7, PT_R11(sp) # For indirect syscalls 133 jalr t0 134 135 li t0, -EMAXERRNO - 1 # error? 136 sltu t0, t0, v0 137 sd t0, PT_R7(sp) # set error flag 138 beqz t0, 1f 139 140 ld t1, PT_R2(sp) # syscall number 141 dnegu v0 # error 142 sd t1, PT_R0(sp) # save it for syscall restarting 1431: sd v0, PT_R2(sp) # result 144 145 j syscall_exit 146 147/* ------------------------------------------------------------------------ */ 148 149 /* 150 * The stackpointer for a call with more than 4 arguments is bad. 151 */ 152bad_stack: 153 li v0, EFAULT 154 sd v0, PT_R2(sp) 155 li t0, 1 # set error flag 156 sd t0, PT_R7(sp) 157 j o32_syscall_exit 158 159not_o32_scall: 160 /* 161 * This is not an o32 compatibility syscall, pass it on 162 * to the 64-bit syscall handlers. 163 */ 164#ifdef CONFIG_MIPS32_N32 165 j handle_sysn32 166#else 167 j handle_sys64 168#endif 169 END(handle_sys) 170 171LEAF(sys32_syscall) 172 subu t0, a0, __NR_O32_Linux # check syscall number 173 sltiu v0, t0, __NR_O32_Linux_syscalls + 1 174 beqz t0, einval # do not recurse 175 dsll t1, t0, 3 176 beqz v0, einval 177 ld t2, sys_call_table(t1) # syscall routine 178 179 move a0, a1 # shift argument registers 180 move a1, a2 181 move a2, a3 182 move a3, a4 183 move a4, a5 184 move a5, a6 185 move a6, a7 186 sd a0, PT_R4(sp) # ... and push back a0 - a3, some 187 sd a1, PT_R5(sp) # syscalls expect them there 188 sd a2, PT_R6(sp) 189 sd a3, PT_R7(sp) 190 sd a3, PT_R26(sp) # update a3 for syscall restarting 191 jr t2 192 /* Unreached */ 193 194einval: li v0, -ENOSYS 195 jr ra 196 END(sys32_syscall) 197 198 .align 3 199 .type sys_call_table,@object 200sys_call_table: 201 PTR sys32_syscall /* 4000 */ 202 PTR sys_exit 203 PTR sys_fork 204 PTR sys_read 205 PTR sys_write 206 PTR compat_sys_open /* 4005 */ 207 PTR sys_close 208 PTR sys_waitpid 209 PTR sys_creat 210 PTR sys_link 211 PTR sys_unlink /* 4010 */ 212 PTR sys32_execve 213 PTR sys_chdir 214 PTR compat_sys_time 215 PTR sys_mknod 216 PTR sys_chmod /* 4015 */ 217 PTR sys_lchown 218 PTR sys_ni_syscall 219 PTR sys_ni_syscall /* was sys_stat */ 220 PTR sys_lseek 221 PTR sys_getpid /* 4020 */ 222 PTR compat_sys_mount 223 PTR sys_oldumount 224 PTR sys_setuid 225 PTR sys_getuid 226 PTR compat_sys_stime /* 4025 */ 227 PTR compat_sys_ptrace 228 PTR sys_alarm 229 PTR sys_ni_syscall /* was sys_fstat */ 230 PTR sys_pause 231 PTR compat_sys_utime /* 4030 */ 232 PTR sys_ni_syscall 233 PTR sys_ni_syscall 234 PTR sys_access 235 PTR sys_nice 236 PTR sys_ni_syscall /* 4035 */ 237 PTR sys_sync 238 PTR sys_kill 239 PTR sys_rename 240 PTR sys_mkdir 241 PTR sys_rmdir /* 4040 */ 242 PTR sys_dup 243 PTR sysm_pipe 244 PTR compat_sys_times 245 PTR sys_ni_syscall 246 PTR sys_brk /* 4045 */ 247 PTR sys_setgid 248 PTR sys_getgid 249 PTR sys_ni_syscall /* was signal 2 */ 250 PTR sys_geteuid 251 PTR sys_getegid /* 4050 */ 252 PTR sys_acct 253 PTR sys_umount 254 PTR sys_ni_syscall 255 PTR compat_sys_ioctl 256 PTR compat_sys_fcntl /* 4055 */ 257 PTR sys_ni_syscall 258 PTR sys_setpgid 259 PTR sys_ni_syscall 260 PTR sys_olduname 261 PTR sys_umask /* 4060 */ 262 PTR sys_chroot 263 PTR compat_sys_ustat 264 PTR sys_dup2 265 PTR sys_getppid 266 PTR sys_getpgrp /* 4065 */ 267 PTR sys_setsid 268 PTR sys_32_sigaction 269 PTR sys_sgetmask 270 PTR sys_ssetmask 271 PTR sys_setreuid /* 4070 */ 272 PTR sys_setregid 273 PTR sys32_sigsuspend 274 PTR compat_sys_sigpending 275 PTR sys_sethostname 276 PTR compat_sys_setrlimit /* 4075 */ 277 PTR compat_sys_getrlimit 278 PTR compat_sys_getrusage 279 PTR compat_sys_gettimeofday 280 PTR compat_sys_settimeofday 281 PTR sys_getgroups /* 4080 */ 282 PTR sys_setgroups 283 PTR sys_ni_syscall /* old_select */ 284 PTR sys_symlink 285 PTR sys_ni_syscall /* was sys_lstat */ 286 PTR sys_readlink /* 4085 */ 287 PTR sys_uselib 288 PTR sys_swapon 289 PTR sys_reboot 290 PTR compat_sys_old_readdir 291 PTR sys_mips_mmap /* 4090 */ 292 PTR sys_munmap 293 PTR sys_truncate 294 PTR sys_ftruncate 295 PTR sys_fchmod 296 PTR sys_fchown /* 4095 */ 297 PTR sys_getpriority 298 PTR sys_setpriority 299 PTR sys_ni_syscall 300 PTR compat_sys_statfs 301 PTR compat_sys_fstatfs /* 4100 */ 302 PTR sys_ni_syscall /* sys_ioperm */ 303 PTR compat_sys_socketcall 304 PTR sys_syslog 305 PTR compat_sys_setitimer 306 PTR compat_sys_getitimer /* 4105 */ 307 PTR compat_sys_newstat 308 PTR compat_sys_newlstat 309 PTR compat_sys_newfstat 310 PTR sys_uname 311 PTR sys_ni_syscall /* sys_ioperm *//* 4110 */ 312 PTR sys_vhangup 313 PTR sys_ni_syscall /* was sys_idle */ 314 PTR sys_ni_syscall /* sys_vm86 */ 315 PTR compat_sys_wait4 316 PTR sys_swapoff /* 4115 */ 317 PTR compat_sys_sysinfo 318 PTR sys_32_ipc 319 PTR sys_fsync 320 PTR sys32_sigreturn 321 PTR sys32_clone /* 4120 */ 322 PTR sys_setdomainname 323 PTR sys_newuname 324 PTR sys_ni_syscall /* sys_modify_ldt */ 325 PTR compat_sys_adjtimex 326 PTR sys_mprotect /* 4125 */ 327 PTR compat_sys_sigprocmask 328 PTR sys_ni_syscall /* was creat_module */ 329 PTR sys_init_module 330 PTR sys_delete_module 331 PTR sys_ni_syscall /* 4130, get_kernel_syms */ 332 PTR sys_quotactl 333 PTR sys_getpgid 334 PTR sys_fchdir 335 PTR sys_bdflush 336 PTR sys_sysfs /* 4135 */ 337 PTR sys_32_personality 338 PTR sys_ni_syscall /* for afs_syscall */ 339 PTR sys_setfsuid 340 PTR sys_setfsgid 341 PTR sys_32_llseek /* 4140 */ 342 PTR compat_sys_getdents 343 PTR compat_sys_select 344 PTR sys_flock 345 PTR sys_msync 346 PTR compat_sys_readv /* 4145 */ 347 PTR compat_sys_writev 348 PTR sys_cacheflush 349 PTR sys_cachectl 350 PTR sys_sysmips 351 PTR sys_ni_syscall /* 4150 */ 352 PTR sys_getsid 353 PTR sys_fdatasync 354 PTR compat_sys_sysctl 355 PTR sys_mlock 356 PTR sys_munlock /* 4155 */ 357 PTR sys_mlockall 358 PTR sys_munlockall 359 PTR sys_sched_setparam 360 PTR sys_sched_getparam 361 PTR sys_sched_setscheduler /* 4160 */ 362 PTR sys_sched_getscheduler 363 PTR sys_sched_yield 364 PTR sys_sched_get_priority_max 365 PTR sys_sched_get_priority_min 366 PTR sys_32_sched_rr_get_interval /* 4165 */ 367 PTR compat_sys_nanosleep 368 PTR sys_mremap 369 PTR sys_accept 370 PTR sys_bind 371 PTR sys_connect /* 4170 */ 372 PTR sys_getpeername 373 PTR sys_getsockname 374 PTR sys_getsockopt 375 PTR sys_listen 376 PTR compat_sys_recv /* 4175 */ 377 PTR compat_sys_recvfrom 378 PTR compat_sys_recvmsg 379 PTR sys_send 380 PTR compat_sys_sendmsg 381 PTR sys_sendto /* 4180 */ 382 PTR compat_sys_setsockopt 383 PTR sys_shutdown 384 PTR sys_socket 385 PTR sys_socketpair 386 PTR sys_setresuid /* 4185 */ 387 PTR sys_getresuid 388 PTR sys_ni_syscall /* was query_module */ 389 PTR sys_poll 390 PTR compat_sys_nfsservctl 391 PTR sys_setresgid /* 4190 */ 392 PTR sys_getresgid 393 PTR sys_prctl 394 PTR sys32_rt_sigreturn 395 PTR sys_32_rt_sigaction 396 PTR sys_32_rt_sigprocmask /* 4195 */ 397 PTR sys_32_rt_sigpending 398 PTR compat_sys_rt_sigtimedwait 399 PTR sys_32_rt_sigqueueinfo 400 PTR sys32_rt_sigsuspend 401 PTR sys_32_pread /* 4200 */ 402 PTR sys_32_pwrite 403 PTR sys_chown 404 PTR sys_getcwd 405 PTR sys_capget 406 PTR sys_capset /* 4205 */ 407 PTR sys32_sigaltstack 408 PTR sys_32_sendfile 409 PTR sys_ni_syscall 410 PTR sys_ni_syscall 411 PTR sys_mips_mmap2 /* 4210 */ 412 PTR sys_32_truncate64 413 PTR sys_32_ftruncate64 414 PTR sys_newstat 415 PTR sys_newlstat 416 PTR sys_newfstat /* 4215 */ 417 PTR sys_pivot_root 418 PTR sys_mincore 419 PTR sys_madvise 420 PTR sys_getdents64 421 PTR compat_sys_fcntl64 /* 4220 */ 422 PTR sys_ni_syscall 423 PTR sys_gettid 424 PTR sys32_readahead 425 PTR sys_setxattr 426 PTR sys_lsetxattr /* 4225 */ 427 PTR sys_fsetxattr 428 PTR sys_getxattr 429 PTR sys_lgetxattr 430 PTR sys_fgetxattr 431 PTR sys_listxattr /* 4230 */ 432 PTR sys_llistxattr 433 PTR sys_flistxattr 434 PTR sys_removexattr 435 PTR sys_lremovexattr 436 PTR sys_fremovexattr /* 4235 */ 437 PTR sys_tkill 438 PTR sys_sendfile64 439 PTR compat_sys_futex 440 PTR compat_sys_sched_setaffinity 441 PTR compat_sys_sched_getaffinity /* 4240 */ 442 PTR compat_sys_io_setup 443 PTR sys_io_destroy 444 PTR compat_sys_io_getevents 445 PTR compat_sys_io_submit 446 PTR sys_io_cancel /* 4245 */ 447 PTR sys_exit_group 448 PTR sys32_lookup_dcookie 449 PTR sys_epoll_create 450 PTR sys_epoll_ctl 451 PTR sys_epoll_wait /* 4250 */ 452 PTR sys_remap_file_pages 453 PTR sys_set_tid_address 454 PTR sys_restart_syscall 455 PTR sys32_fadvise64_64 456 PTR compat_sys_statfs64 /* 4255 */ 457 PTR compat_sys_fstatfs64 458 PTR compat_sys_timer_create 459 PTR compat_sys_timer_settime 460 PTR compat_sys_timer_gettime 461 PTR sys_timer_getoverrun /* 4260 */ 462 PTR sys_timer_delete 463 PTR compat_sys_clock_settime 464 PTR compat_sys_clock_gettime 465 PTR compat_sys_clock_getres 466 PTR compat_sys_clock_nanosleep /* 4265 */ 467 PTR sys_tgkill 468 PTR compat_sys_utimes 469 PTR sys_ni_syscall /* sys_mbind */ 470 PTR sys_ni_syscall /* sys_get_mempolicy */ 471 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */ 472 PTR compat_sys_mq_open 473 PTR sys_mq_unlink 474 PTR compat_sys_mq_timedsend 475 PTR compat_sys_mq_timedreceive 476 PTR compat_sys_mq_notify /* 4275 */ 477 PTR compat_sys_mq_getsetattr 478 PTR sys_ni_syscall /* sys_vserver */ 479 PTR sys_32_waitid 480 PTR sys_ni_syscall /* available, was setaltroot */ 481 PTR sys_add_key /* 4280 */ 482 PTR sys_request_key 483 PTR sys_keyctl 484 PTR sys_set_thread_area 485 PTR sys_inotify_init 486 PTR sys_inotify_add_watch /* 4285 */ 487 PTR sys_inotify_rm_watch 488 PTR sys_migrate_pages 489 PTR compat_sys_openat 490 PTR sys_mkdirat 491 PTR sys_mknodat /* 4290 */ 492 PTR sys_fchownat 493 PTR compat_sys_futimesat 494 PTR sys_newfstatat 495 PTR sys_unlinkat 496 PTR sys_renameat /* 4295 */ 497 PTR sys_linkat 498 PTR sys_symlinkat 499 PTR sys_readlinkat 500 PTR sys_fchmodat 501 PTR sys_faccessat /* 4300 */ 502 PTR compat_sys_pselect6 503 PTR compat_sys_ppoll 504 PTR sys_unshare 505 PTR sys_splice 506 PTR sys32_sync_file_range /* 4305 */ 507 PTR sys_tee 508 PTR compat_sys_vmsplice 509 PTR compat_sys_move_pages 510 PTR compat_sys_set_robust_list 511 PTR compat_sys_get_robust_list /* 4310 */ 512 PTR compat_sys_kexec_load 513 PTR sys_getcpu 514 PTR compat_sys_epoll_pwait 515 PTR sys_ioprio_set 516 PTR sys_ioprio_get /* 4315 */ 517 PTR compat_sys_utimensat 518 PTR compat_sys_signalfd 519 PTR sys_ni_syscall /* was timerfd */ 520 PTR sys_eventfd 521 PTR sys32_fallocate /* 4320 */ 522 PTR sys_timerfd_create 523 PTR compat_sys_timerfd_gettime 524 PTR compat_sys_timerfd_settime 525 PTR compat_sys_signalfd4 526 PTR sys_eventfd2 /* 4325 */ 527 PTR sys_epoll_create1 528 PTR sys_dup3 529 PTR sys_pipe2 530 PTR sys_inotify_init1 531 PTR compat_sys_preadv /* 4330 */ 532 PTR compat_sys_pwritev 533 PTR compat_sys_rt_tgsigqueueinfo 534 PTR sys_perf_event_open 535 PTR sys_accept4 536 PTR compat_sys_recvmmsg /* 4335 */ 537 PTR sys_fanotify_init 538 PTR sys_32_fanotify_mark 539 PTR sys_prlimit64 540 .size sys_call_table,.-sys_call_table 541