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