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