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