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