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