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-99, 2000- 02, 06 Ralf Baechle <ralf@linux-mips.org> 7 * Copyright (C) 2001 MIPS Technologies, Inc. 8 * Copyright (C) 2004 Thiemo Seufer 9 * Copyright (C) 2014 Imagination Technologies Ltd. 10 */ 11#include <linux/errno.h> 12#include <asm/asm.h> 13#include <asm/asmmacro.h> 14#include <asm/irqflags.h> 15#include <asm/mipsregs.h> 16#include <asm/regdef.h> 17#include <asm/stackframe.h> 18#include <asm/isadep.h> 19#include <asm/sysmips.h> 20#include <asm/thread_info.h> 21#include <asm/unistd.h> 22#include <asm/war.h> 23#include <asm/asm-offsets.h> 24 25/* Highest syscall used of any syscall flavour */ 26#define MAX_SYSCALL_NO __NR_O32_Linux + __NR_O32_Linux_syscalls 27 28 .align 5 29NESTED(handle_sys, PT_SIZE, sp) 30 .set noat 31 SAVE_SOME 32 TRACE_IRQS_ON_RELOAD 33 STI 34 .set at 35 36 lw t1, PT_EPC(sp) # skip syscall on return 37 38 subu v0, v0, __NR_O32_Linux # check syscall number 39 sltiu t0, v0, __NR_O32_Linux_syscalls + 1 40 addiu t1, 4 # skip to next instruction 41 sw t1, PT_EPC(sp) 42 beqz t0, illegal_syscall 43 44 sll t0, v0, 2 45 la t1, sys_call_table 46 addu t1, t0 47 lw t2, (t1) # syscall routine 48 beqz t2, illegal_syscall 49 50 sw a3, PT_R26(sp) # save a3 for syscall restarting 51 52 /* 53 * More than four arguments. Try to deal with it by copying the 54 * stack arguments from the user stack to the kernel stack. 55 * This Sucks (TM). 56 */ 57 lw t0, PT_R29(sp) # get old user stack pointer 58 59 /* 60 * We intentionally keep the kernel stack a little below the top of 61 * userspace so we don't have to do a slower byte accurate check here. 62 */ 63 lw t5, TI_ADDR_LIMIT($28) 64 addu t4, t0, 32 65 and t5, t4 66 bltz t5, bad_stack # -> sp is bad 67 68 /* 69 * Ok, copy the args from the luser stack to the kernel stack. 70 * t3 is the precomputed number of instruction bytes needed to 71 * load or store arguments 6-8. 72 */ 73 74 .set push 75 .set noreorder 76 .set nomacro 77 781: user_lw(t5, 16(t0)) # argument #5 from usp 794: user_lw(t6, 20(t0)) # argument #6 from usp 803: user_lw(t7, 24(t0)) # argument #7 from usp 812: user_lw(t8, 28(t0)) # argument #8 from usp 82 83 sw t5, 16(sp) # argument #5 to ksp 84 sw t6, 20(sp) # argument #6 to ksp 85 sw t7, 24(sp) # argument #7 to ksp 86 sw t8, 28(sp) # argument #8 to ksp 87 .set pop 88 89 .section __ex_table,"a" 90 PTR 1b,bad_stack 91 PTR 2b,bad_stack 92 PTR 3b,bad_stack 93 PTR 4b,bad_stack 94 .previous 95 96 lw t0, TI_FLAGS($28) # syscall tracing enabled? 97 li t1, _TIF_WORK_SYSCALL_ENTRY 98 and t0, t1 99 bnez t0, syscall_trace_entry # -> yes 100 101 jalr t2 # Do The Real Thing (TM) 102 103 li t0, -EMAXERRNO - 1 # error? 104 sltu t0, t0, v0 105 sw t0, PT_R7(sp) # set error flag 106 beqz t0, 1f 107 108 lw t1, PT_R2(sp) # syscall number 109 negu v0 # error 110 sw t1, PT_R0(sp) # save it for syscall restarting 1111: sw v0, PT_R2(sp) # result 112 113o32_syscall_exit: 114 j syscall_exit_partial 115 116/* ------------------------------------------------------------------------ */ 117 118syscall_trace_entry: 119 SAVE_STATIC 120 move s0, t2 121 move a0, sp 122 123 /* 124 * syscall number is in v0 unless we called syscall(__NR_###) 125 * where the real syscall number is in a0 126 */ 127 addiu a1, v0, __NR_O32_Linux 128 bnez v0, 1f /* __NR_syscall at offset 0 */ 129 lw a1, PT_R4(sp) 130 1311: jal syscall_trace_enter 132 133 bltz v0, 2f # seccomp failed? Skip syscall 134 135 move t0, s0 136 RESTORE_STATIC 137 lw a0, PT_R4(sp) # Restore argument registers 138 lw a1, PT_R5(sp) 139 lw a2, PT_R6(sp) 140 lw a3, PT_R7(sp) 141 jalr t0 142 143 li t0, -EMAXERRNO - 1 # error? 144 sltu t0, t0, v0 145 sw t0, PT_R7(sp) # set error flag 146 beqz t0, 1f 147 148 lw t1, PT_R2(sp) # syscall number 149 negu v0 # error 150 sw t1, PT_R0(sp) # save it for syscall restarting 1511: sw v0, PT_R2(sp) # result 152 1532: j syscall_exit 154 155/* ------------------------------------------------------------------------ */ 156 157 /* 158 * The stackpointer for a call with more than 4 arguments is bad. 159 * We probably should handle this case a bit more drastic. 160 */ 161bad_stack: 162 li v0, EFAULT 163 sw v0, PT_R2(sp) 164 li t0, 1 # set error flag 165 sw t0, PT_R7(sp) 166 j o32_syscall_exit 167 168 /* 169 * The system call does not exist in this kernel 170 */ 171illegal_syscall: 172 li v0, ENOSYS # error 173 sw v0, PT_R2(sp) 174 li t0, 1 # set error flag 175 sw t0, PT_R7(sp) 176 j o32_syscall_exit 177 END(handle_sys) 178 179 LEAF(sys_syscall) 180 subu t0, a0, __NR_O32_Linux # check syscall number 181 sltiu v0, t0, __NR_O32_Linux_syscalls + 1 182 beqz t0, einval # do not recurse 183 sll t1, t0, 2 184 beqz v0, einval 185 lw t2, sys_call_table(t1) # syscall routine 186 187 /* Some syscalls like execve get their arguments from struct pt_regs 188 and claim zero arguments in the syscall table. Thus we have to 189 assume the worst case and shuffle around all potential arguments. 190 If you want performance, don't use indirect syscalls. */ 191 192 move a0, a1 # shift argument registers 193 move a1, a2 194 move a2, a3 195 lw a3, 16(sp) 196 lw t4, 20(sp) 197 lw t5, 24(sp) 198 lw t6, 28(sp) 199 sw t4, 16(sp) 200 sw t5, 20(sp) 201 sw t6, 24(sp) 202 sw a0, PT_R4(sp) # .. and push back a0 - a3, some 203 sw a1, PT_R5(sp) # syscalls expect them there 204 sw a2, PT_R6(sp) 205 sw a3, PT_R7(sp) 206 sw a3, PT_R26(sp) # update a3 for syscall restarting 207 jr t2 208 /* Unreached */ 209 210einval: li v0, -ENOSYS 211 jr ra 212 END(sys_syscall) 213 214 .align 2 215 .type sys_call_table, @object 216EXPORT(sys_call_table) 217 PTR sys_syscall /* 4000 */ 218 PTR sys_exit 219 PTR __sys_fork 220 PTR sys_read 221 PTR sys_write 222 PTR sys_open /* 4005 */ 223 PTR sys_close 224 PTR sys_waitpid 225 PTR sys_creat 226 PTR sys_link 227 PTR sys_unlink /* 4010 */ 228 PTR sys_execve 229 PTR sys_chdir 230 PTR sys_time 231 PTR sys_mknod 232 PTR sys_chmod /* 4015 */ 233 PTR sys_lchown 234 PTR sys_ni_syscall 235 PTR sys_ni_syscall /* was sys_stat */ 236 PTR sys_lseek 237 PTR sys_getpid /* 4020 */ 238 PTR sys_mount 239 PTR sys_oldumount 240 PTR sys_setuid 241 PTR sys_getuid 242 PTR sys_stime /* 4025 */ 243 PTR sys_ptrace 244 PTR sys_alarm 245 PTR sys_ni_syscall /* was sys_fstat */ 246 PTR sys_pause 247 PTR sys_utime /* 4030 */ 248 PTR sys_ni_syscall 249 PTR sys_ni_syscall 250 PTR sys_access 251 PTR sys_nice 252 PTR sys_ni_syscall /* 4035 */ 253 PTR sys_sync 254 PTR sys_kill 255 PTR sys_rename 256 PTR sys_mkdir 257 PTR sys_rmdir /* 4040 */ 258 PTR sys_dup 259 PTR sysm_pipe 260 PTR sys_times 261 PTR sys_ni_syscall 262 PTR sys_brk /* 4045 */ 263 PTR sys_setgid 264 PTR sys_getgid 265 PTR sys_ni_syscall /* was signal(2) */ 266 PTR sys_geteuid 267 PTR sys_getegid /* 4050 */ 268 PTR sys_acct 269 PTR sys_umount 270 PTR sys_ni_syscall 271 PTR sys_ioctl 272 PTR sys_fcntl /* 4055 */ 273 PTR sys_ni_syscall 274 PTR sys_setpgid 275 PTR sys_ni_syscall 276 PTR sys_olduname 277 PTR sys_umask /* 4060 */ 278 PTR sys_chroot 279 PTR sys_ustat 280 PTR sys_dup2 281 PTR sys_getppid 282 PTR sys_getpgrp /* 4065 */ 283 PTR sys_setsid 284 PTR sys_sigaction 285 PTR sys_sgetmask 286 PTR sys_ssetmask 287 PTR sys_setreuid /* 4070 */ 288 PTR sys_setregid 289 PTR sys_sigsuspend 290 PTR sys_sigpending 291 PTR sys_sethostname 292 PTR sys_setrlimit /* 4075 */ 293 PTR sys_getrlimit 294 PTR sys_getrusage 295 PTR sys_gettimeofday 296 PTR sys_settimeofday 297 PTR sys_getgroups /* 4080 */ 298 PTR sys_setgroups 299 PTR sys_ni_syscall /* old_select */ 300 PTR sys_symlink 301 PTR sys_ni_syscall /* was sys_lstat */ 302 PTR sys_readlink /* 4085 */ 303 PTR sys_uselib 304 PTR sys_swapon 305 PTR sys_reboot 306 PTR sys_old_readdir 307 PTR sys_mips_mmap /* 4090 */ 308 PTR sys_munmap 309 PTR sys_truncate 310 PTR sys_ftruncate 311 PTR sys_fchmod 312 PTR sys_fchown /* 4095 */ 313 PTR sys_getpriority 314 PTR sys_setpriority 315 PTR sys_ni_syscall 316 PTR sys_statfs 317 PTR sys_fstatfs /* 4100 */ 318 PTR sys_ni_syscall /* was ioperm(2) */ 319 PTR sys_socketcall 320 PTR sys_syslog 321 PTR sys_setitimer 322 PTR sys_getitimer /* 4105 */ 323 PTR sys_newstat 324 PTR sys_newlstat 325 PTR sys_newfstat 326 PTR sys_uname 327 PTR sys_ni_syscall /* 4110 was iopl(2) */ 328 PTR sys_vhangup 329 PTR sys_ni_syscall /* was sys_idle() */ 330 PTR sys_ni_syscall /* was sys_vm86 */ 331 PTR sys_wait4 332 PTR sys_swapoff /* 4115 */ 333 PTR sys_sysinfo 334 PTR sys_ipc 335 PTR sys_fsync 336 PTR sys_sigreturn 337 PTR __sys_clone /* 4120 */ 338 PTR sys_setdomainname 339 PTR sys_newuname 340 PTR sys_ni_syscall /* sys_modify_ldt */ 341 PTR sys_adjtimex 342 PTR sys_mprotect /* 4125 */ 343 PTR sys_sigprocmask 344 PTR sys_ni_syscall /* was create_module */ 345 PTR sys_init_module 346 PTR sys_delete_module 347 PTR sys_ni_syscall /* 4130 was get_kernel_syms */ 348 PTR sys_quotactl 349 PTR sys_getpgid 350 PTR sys_fchdir 351 PTR sys_bdflush 352 PTR sys_sysfs /* 4135 */ 353 PTR sys_personality 354 PTR sys_ni_syscall /* for afs_syscall */ 355 PTR sys_setfsuid 356 PTR sys_setfsgid 357 PTR sys_llseek /* 4140 */ 358 PTR sys_getdents 359 PTR sys_select 360 PTR sys_flock 361 PTR sys_msync 362 PTR sys_readv /* 4145 */ 363 PTR sys_writev 364 PTR sys_cacheflush 365 PTR sys_cachectl 366 PTR sys_sysmips 367 PTR sys_ni_syscall /* 4150 */ 368 PTR sys_getsid 369 PTR sys_fdatasync 370 PTR sys_sysctl 371 PTR sys_mlock 372 PTR sys_munlock /* 4155 */ 373 PTR sys_mlockall 374 PTR sys_munlockall 375 PTR sys_sched_setparam 376 PTR sys_sched_getparam 377 PTR sys_sched_setscheduler /* 4160 */ 378 PTR sys_sched_getscheduler 379 PTR sys_sched_yield 380 PTR sys_sched_get_priority_max 381 PTR sys_sched_get_priority_min 382 PTR sys_sched_rr_get_interval /* 4165 */ 383 PTR sys_nanosleep 384 PTR sys_mremap 385 PTR sys_accept 386 PTR sys_bind 387 PTR sys_connect /* 4170 */ 388 PTR sys_getpeername 389 PTR sys_getsockname 390 PTR sys_getsockopt 391 PTR sys_listen 392 PTR sys_recv /* 4175 */ 393 PTR sys_recvfrom 394 PTR sys_recvmsg 395 PTR sys_send 396 PTR sys_sendmsg 397 PTR sys_sendto /* 4180 */ 398 PTR sys_setsockopt 399 PTR sys_shutdown 400 PTR sys_socket 401 PTR sys_socketpair 402 PTR sys_setresuid /* 4185 */ 403 PTR sys_getresuid 404 PTR sys_ni_syscall /* was sys_query_module */ 405 PTR sys_poll 406 PTR sys_ni_syscall /* was nfsservctl */ 407 PTR sys_setresgid /* 4190 */ 408 PTR sys_getresgid 409 PTR sys_prctl 410 PTR sys_rt_sigreturn 411 PTR sys_rt_sigaction 412 PTR sys_rt_sigprocmask /* 4195 */ 413 PTR sys_rt_sigpending 414 PTR sys_rt_sigtimedwait 415 PTR sys_rt_sigqueueinfo 416 PTR sys_rt_sigsuspend 417 PTR sys_pread64 /* 4200 */ 418 PTR sys_pwrite64 419 PTR sys_chown 420 PTR sys_getcwd 421 PTR sys_capget 422 PTR sys_capset /* 4205 */ 423 PTR sys_sigaltstack 424 PTR sys_sendfile 425 PTR sys_ni_syscall 426 PTR sys_ni_syscall 427 PTR sys_mips_mmap2 /* 4210 */ 428 PTR sys_truncate64 429 PTR sys_ftruncate64 430 PTR sys_stat64 431 PTR sys_lstat64 432 PTR sys_fstat64 /* 4215 */ 433 PTR sys_pivot_root 434 PTR sys_mincore 435 PTR sys_madvise 436 PTR sys_getdents64 437 PTR sys_fcntl64 /* 4220 */ 438 PTR sys_ni_syscall 439 PTR sys_gettid 440 PTR sys_readahead 441 PTR sys_setxattr 442 PTR sys_lsetxattr /* 4225 */ 443 PTR sys_fsetxattr 444 PTR sys_getxattr 445 PTR sys_lgetxattr 446 PTR sys_fgetxattr 447 PTR sys_listxattr /* 4230 */ 448 PTR sys_llistxattr 449 PTR sys_flistxattr 450 PTR sys_removexattr 451 PTR sys_lremovexattr 452 PTR sys_fremovexattr /* 4235 */ 453 PTR sys_tkill 454 PTR sys_sendfile64 455 PTR sys_futex 456#ifdef CONFIG_MIPS_MT_FPAFF 457 /* 458 * For FPU affinity scheduling on MIPS MT processors, we need to 459 * intercept sys_sched_xxxaffinity() calls until we get a proper hook 460 * in kernel/sched/core.c. Considered only temporary we only support 461 * these hooks for the 32-bit kernel - there is no MIPS64 MT processor 462 * atm. 463 */ 464 PTR mipsmt_sys_sched_setaffinity 465 PTR mipsmt_sys_sched_getaffinity 466#else 467 PTR sys_sched_setaffinity 468 PTR sys_sched_getaffinity /* 4240 */ 469#endif /* CONFIG_MIPS_MT_FPAFF */ 470 PTR sys_io_setup 471 PTR sys_io_destroy 472 PTR sys_io_getevents 473 PTR sys_io_submit 474 PTR sys_io_cancel /* 4245 */ 475 PTR sys_exit_group 476 PTR sys_lookup_dcookie 477 PTR sys_epoll_create 478 PTR sys_epoll_ctl 479 PTR sys_epoll_wait /* 4250 */ 480 PTR sys_remap_file_pages 481 PTR sys_set_tid_address 482 PTR sys_restart_syscall 483 PTR sys_fadvise64_64 484 PTR sys_statfs64 /* 4255 */ 485 PTR sys_fstatfs64 486 PTR sys_timer_create 487 PTR sys_timer_settime 488 PTR sys_timer_gettime 489 PTR sys_timer_getoverrun /* 4260 */ 490 PTR sys_timer_delete 491 PTR sys_clock_settime 492 PTR sys_clock_gettime 493 PTR sys_clock_getres 494 PTR sys_clock_nanosleep /* 4265 */ 495 PTR sys_tgkill 496 PTR sys_utimes 497 PTR sys_mbind 498 PTR sys_ni_syscall /* sys_get_mempolicy */ 499 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */ 500 PTR sys_mq_open 501 PTR sys_mq_unlink 502 PTR sys_mq_timedsend 503 PTR sys_mq_timedreceive 504 PTR sys_mq_notify /* 4275 */ 505 PTR sys_mq_getsetattr 506 PTR sys_ni_syscall /* sys_vserver */ 507 PTR sys_waitid 508 PTR sys_ni_syscall /* available, was setaltroot */ 509 PTR sys_add_key /* 4280 */ 510 PTR sys_request_key 511 PTR sys_keyctl 512 PTR sys_set_thread_area 513 PTR sys_inotify_init 514 PTR sys_inotify_add_watch /* 4285 */ 515 PTR sys_inotify_rm_watch 516 PTR sys_migrate_pages 517 PTR sys_openat 518 PTR sys_mkdirat 519 PTR sys_mknodat /* 4290 */ 520 PTR sys_fchownat 521 PTR sys_futimesat 522 PTR sys_fstatat64 523 PTR sys_unlinkat 524 PTR sys_renameat /* 4295 */ 525 PTR sys_linkat 526 PTR sys_symlinkat 527 PTR sys_readlinkat 528 PTR sys_fchmodat 529 PTR sys_faccessat /* 4300 */ 530 PTR sys_pselect6 531 PTR sys_ppoll 532 PTR sys_unshare 533 PTR sys_splice 534 PTR sys_sync_file_range /* 4305 */ 535 PTR sys_tee 536 PTR sys_vmsplice 537 PTR sys_move_pages 538 PTR sys_set_robust_list 539 PTR sys_get_robust_list /* 4310 */ 540 PTR sys_kexec_load 541 PTR sys_getcpu 542 PTR sys_epoll_pwait 543 PTR sys_ioprio_set 544 PTR sys_ioprio_get /* 4315 */ 545 PTR sys_utimensat 546 PTR sys_signalfd 547 PTR sys_ni_syscall /* was timerfd */ 548 PTR sys_eventfd 549 PTR sys_fallocate /* 4320 */ 550 PTR sys_timerfd_create 551 PTR sys_timerfd_gettime 552 PTR sys_timerfd_settime 553 PTR sys_signalfd4 554 PTR sys_eventfd2 /* 4325 */ 555 PTR sys_epoll_create1 556 PTR sys_dup3 557 PTR sys_pipe2 558 PTR sys_inotify_init1 559 PTR sys_preadv /* 4330 */ 560 PTR sys_pwritev 561 PTR sys_rt_tgsigqueueinfo 562 PTR sys_perf_event_open 563 PTR sys_accept4 564 PTR sys_recvmmsg /* 4335 */ 565 PTR sys_fanotify_init 566 PTR sys_fanotify_mark 567 PTR sys_prlimit64 568 PTR sys_name_to_handle_at 569 PTR sys_open_by_handle_at /* 4340 */ 570 PTR sys_clock_adjtime 571 PTR sys_syncfs 572 PTR sys_sendmmsg 573 PTR sys_setns 574 PTR sys_process_vm_readv /* 4345 */ 575 PTR sys_process_vm_writev 576 PTR sys_kcmp 577 PTR sys_finit_module 578 PTR sys_sched_setattr 579 PTR sys_sched_getattr /* 4350 */ 580 PTR sys_renameat2 581 PTR sys_seccomp 582