| /* | |
| * Copyright (C) 2000-2003 Axis Communications AB | |
| * | |
| * Authors: Bjorn Wesen (bjornw@axis.com) | |
| * Tobias Anderberg (tobiasa@axis.com), CRISv32 port. | |
| * | |
| * Code for the system-call and fault low-level handling routines. | |
| * | |
| * NOTE: This code handles signal-recognition, which happens every time | |
| * after a timer-interrupt and after each system call. | |
| * | |
| * Stack layout in 'ret_from_system_call': | |
| * ptrace needs to have all regs on the stack. | |
| * if the order here is changed, it needs to be | |
| * updated in fork.c:copy_process, signal.c:do_signal, | |
| * ptrace.c and ptrace.h | |
| * | |
| */ | |
| #include <linux/linkage.h> | |
| #include <linux/sys.h> | |
| #include <asm/unistd.h> | |
| #include <asm/errno.h> | |
| #include <asm/thread_info.h> | |
| #include <asm/asm-offsets.h> | |
| #include <hwregs/asm/reg_map_asm.h> | |
| #include <hwregs/asm/intr_vect_defs_asm.h> | |
| ;; Exported functions. | |
| .globl system_call | |
| .globl ret_from_intr | |
| .globl ret_from_fork | |
| .globl ret_from_kernel_thread | |
| .globl resume | |
| .globl multiple_interrupt | |
| .globl nmi_interrupt | |
| .globl spurious_interrupt | |
| .globl do_sigtrap | |
| .globl gdb_handle_exception | |
| .globl sys_call_table | |
| ; Check if preemptive kernel scheduling should be done. | |
| #ifdef CONFIG_PREEMPT | |
| _resume_kernel: | |
| di | |
| ; Load current task struct. | |
| movs.w -8192, $r0 ; THREAD_SIZE = 8192 | |
| and.d $sp, $r0 | |
| addoq +TI_preempt_count, $r0, $acr | |
| move.d [$acr], $r10 ; Preemption disabled? | |
| bne _Rexit | |
| nop | |
| _need_resched: | |
| addoq +TI_flags, $r0, $acr | |
| move.d [$acr], $r10 | |
| btstq TIF_NEED_RESCHED, $r10 ; Check if need_resched is set. | |
| bpl _Rexit | |
| nop | |
| ; Do preemptive kernel scheduling. | |
| jsr preempt_schedule_irq | |
| nop | |
| ; Load new task struct. | |
| movs.w -8192, $r0 ; THREAD_SIZE = 8192. | |
| and.d $sp, $r0 | |
| ; One more time with new task. | |
| ba _need_resched | |
| nop | |
| #else | |
| #define _resume_kernel _Rexit | |
| #endif | |
| ; Called at exit from fork. schedule_tail must be called to drop | |
| ; spinlock if CONFIG_PREEMPT. | |
| .type ret_from_fork,@function | |
| ret_from_fork: | |
| jsr schedule_tail | |
| nop | |
| ba ret_from_sys_call | |
| nop | |
| .size ret_from_fork, . - ret_from_fork | |
| .type ret_from_kernel_thread,@function | |
| ret_from_kernel_thread: | |
| jsr schedule_tail | |
| nop | |
| move.d $r2, $r10 | |
| jsr $r1 | |
| nop | |
| moveq 0, $r9 ; no syscall restarts, TYVM... | |
| ba ret_from_sys_call | |
| nop | |
| .size ret_from_kernel_thread, . - ret_from_kernel_thread | |
| .type ret_from_intr,@function | |
| ret_from_intr: | |
| moveq 0, $r9 ; not a syscall | |
| ;; Check for resched if preemptive kernel, or if we're going back to | |
| ;; user-mode. This test matches the user_regs(regs) macro. Don't simply | |
| ;; test CCS since that doesn't necessarily reflect what mode we'll | |
| ;; return into. | |
| addoq +PT_ccs, $sp, $acr | |
| move.d [$acr], $r0 | |
| btstq 16, $r0 ; User-mode flag. | |
| bpl _resume_kernel | |
| .size ret_from_intr, . - ret_from_intr + 2 ; +2 includes the dslot. | |
| ; Note that di below is in delay slot. | |
| .type _resume_userspace,@function | |
| _resume_userspace: | |
| di ; So need_resched and sigpending don't change. | |
| movs.w -8192, $r0 ; THREAD_SIZE == 8192 | |
| and.d $sp, $r0 | |
| addoq +TI_flags, $r0, $acr ; current->work | |
| move.d [$acr], $r10 | |
| and.d _TIF_WORK_MASK, $r10 ; Work to be done on return? | |
| bne _work_pending | |
| nop | |
| ba _Rexit | |
| nop | |
| .size _resume_userspace, . - _resume_userspace | |
| ;; The system_call is called by a BREAK instruction, which looks pretty | |
| ;; much like any other exception. | |
| ;; | |
| ;; System calls can't be made from interrupts but we still stack ERP | |
| ;; to have a complete stack frame. | |
| ;; | |
| ;; In r9 we have the wanted syscall number. Arguments come in r10,r11,r12, | |
| ;; r13,mof,srp | |
| ;; | |
| ;; This function looks on the _surface_ like spaghetti programming, but it's | |
| ;; really designed so that the fast-path does not force cache-loading of | |
| ;; non-used instructions. Only the non-common cases cause the outlined code | |
| ;; to run.. | |
| .type system_call,@function | |
| system_call: | |
| ;; Stack-frame similar to the irq heads, which is reversed in | |
| ;; ret_from_sys_call. | |
| sub.d 92, $sp ; Skip EDA. | |
| movem $r13, [$sp] | |
| move.d $sp, $r8 | |
| addq 14*4, $r8 | |
| move.d $acr, $r0 | |
| move $srs, $r1 | |
| move $mof, $r2 | |
| move $spc, $r3 | |
| move $ccs, $r4 | |
| move $srp, $r5 | |
| move $erp, $r6 | |
| move.d $r9, $r7 ; Store syscall number in EXS | |
| subq 4, $sp | |
| movem $r7, [$r8] | |
| ei ; Enable interrupts while processing syscalls. | |
| move.d $r10, [$sp] | |
| ; Set S-bit when kernel debugging to keep hardware breakpoints active. | |
| #ifdef CONFIG_ETRAX_KGDB | |
| move $ccs, $r0 | |
| or.d (1<<9), $r0 | |
| move $r0, $ccs | |
| #endif | |
| movs.w -ENOSYS, $r0 | |
| addoq +PT_r10, $sp, $acr | |
| move.d $r0, [$acr] | |
| ;; Check if this process is syscall-traced. | |
| movs.w -8192, $r0 ; THREAD_SIZE == 8192 | |
| and.d $sp, $r0 | |
| addoq +TI_flags, $r0, $acr | |
| move.d [$acr], $r0 | |
| btstq TIF_SYSCALL_TRACE, $r0 | |
| bmi _syscall_trace_entry | |
| nop | |
| _syscall_traced: | |
| ;; Check for sanity in the requested syscall number. | |
| cmpu.w NR_syscalls, $r9 | |
| bhs ret_from_sys_call | |
| lslq 2, $r9 ; Multiply by 4, in the delay slot. | |
| ;; The location on the stack for the register structure is passed as a | |
| ;; seventh argument. Some system calls need this. | |
| move.d $sp, $r0 | |
| subq 4, $sp | |
| move.d $r0, [$sp] | |
| ;; The registers carrying parameters (R10-R13) are intact. The optional | |
| ;; fifth and sixth parameters is in MOF and SRP respectively. Put them | |
| ;; back on the stack. | |
| subq 4, $sp | |
| move $srp, [$sp] | |
| subq 4, $sp | |
| move $mof, [$sp] | |
| ;; Actually to the system call. | |
| addo.d +sys_call_table, $r9, $acr | |
| move.d [$acr], $acr | |
| jsr $acr | |
| nop | |
| addq 3*4, $sp ; Pop the mof, srp and regs parameters. | |
| addoq +PT_r10, $sp, $acr | |
| move.d $r10, [$acr] ; Save the return value. | |
| moveq 1, $r9 ; "Parameter" to ret_from_sys_call to | |
| ; show it was a sys call. | |
| ;; Fall through into ret_from_sys_call to return. | |
| ret_from_sys_call: | |
| ;; R9 is a parameter: | |
| ;; >= 1 from syscall | |
| ;; 0 from irq | |
| ;; Get the current task-struct pointer. | |
| movs.w -8192, $r0 ; THREAD_SIZE == 8192 | |
| and.d $sp, $r0 | |
| di ; Make sure need_resched and sigpending don't change. | |
| addoq +TI_flags, $r0, $acr | |
| move.d [$acr], $r1 | |
| and.d _TIF_ALLWORK_MASK, $r1 | |
| bne _syscall_exit_work | |
| nop | |
| .size system_call, . - system_call | |
| .type _Rexit,@function | |
| _Rexit: | |
| #if defined(CONFIG_TRACE_IRQFLAGS) | |
| addoq +PT_ccs, $sp, $acr | |
| move.d [$acr], $r0 | |
| btstq 15, $r0 ; I1 | |
| bpl 1f | |
| nop | |
| jsr trace_hardirqs_on | |
| nop | |
| 1: | |
| #endif | |
| ;; This epilogue MUST match the prologues in multiple_interrupt, irq.h | |
| ;; and ptregs.h. | |
| addq 4, $sp ; Skip orig_r10. | |
| movem [$sp+], $r13 ; Registers R0-R13. | |
| move.d [$sp+], $acr | |
| move [$sp], $srs | |
| addq 4, $sp | |
| move [$sp+], $mof | |
| move [$sp+], $spc | |
| move [$sp+], $ccs | |
| move [$sp+], $srp | |
| move [$sp+], $erp | |
| addq 8, $sp ; Skip EXS, EDA. | |
| jump $erp | |
| rfe ; Restore condition code stack in delay-slot. | |
| .size _Rexit, . - _Rexit | |
| ;; We get here after doing a syscall if extra work might need to be done | |
| ;; perform syscall exit tracing if needed. | |
| .type _syscall_exit_work,@function | |
| _syscall_exit_work: | |
| ;; R0 contains current at this point and irq's are disabled. | |
| addoq +TI_flags, $r0, $acr | |
| move.d [$acr], $r1 | |
| btstq TIF_SYSCALL_TRACE, $r1 | |
| bpl _work_pending | |
| nop | |
| ei | |
| move.d $r9, $r1 ; Preserve R9. | |
| jsr do_syscall_trace | |
| nop | |
| move.d $r1, $r9 | |
| ba _resume_userspace | |
| nop | |
| .size _syscall_exit_work, . - _syscall_exit_work | |
| .type _work_pending,@function | |
| _work_pending: | |
| addoq +TI_flags, $r0, $acr | |
| move.d [$acr], $r12 ; The thread_info_flags parameter. | |
| move.d $sp, $r11 ; The regs param. | |
| jsr do_work_pending | |
| move.d $r9, $r10 ; The syscall/irq param. | |
| ba _Rexit | |
| nop | |
| .size _work_pending, . - _work_pending | |
| ;; We get here as a sidetrack when we've entered a syscall with the | |
| ;; trace-bit set. We need to call do_syscall_trace and then continue | |
| ;; with the call. | |
| _syscall_trace_entry: | |
| ;; PT_r10 in the frame contains -ENOSYS as required, at this point. | |
| jsr do_syscall_trace | |
| nop | |
| ;; Now re-enter the syscall code to do the syscall itself. We need to | |
| ;; restore R9 here to contain the wanted syscall, and the other | |
| ;; parameter-bearing registers. | |
| addoq +PT_r9, $sp, $acr | |
| move.d [$acr], $r9 | |
| addoq +PT_orig_r10, $sp, $acr | |
| move.d [$acr], $r10 ; PT_r10 is already -ENOSYS. | |
| addoq +PT_r11, $sp, $acr | |
| move.d [$acr], $r11 | |
| addoq +PT_r12, $sp, $acr | |
| move.d [$acr], $r12 | |
| addoq +PT_r13, $sp, $acr | |
| move.d [$acr], $r13 | |
| addoq +PT_mof, $sp, $acr | |
| move [$acr], $mof | |
| addoq +PT_srp, $sp, $acr | |
| move [$acr], $srp | |
| ba _syscall_traced | |
| nop | |
| ;; Resume performs the actual task-switching, by switching stack | |
| ;; pointers. Input arguments are: | |
| ;; | |
| ;; R10 = prev | |
| ;; R11 = next | |
| ;; R12 = thread offset in task struct. | |
| ;; | |
| ;; Returns old current in R10. | |
| .type resume,@function | |
| resume: | |
| subq 4, $sp ; Make space for srp. | |
| add.d $r12, $r10 ; R10 = current tasks tss. | |
| addoq +THREAD_ccs, $r10, $acr | |
| move $srp, [$sp] ; Keep old/new PC on the stack. | |
| move $ccs, [$acr] ; Save IRQ enable state. | |
| di | |
| addoq +THREAD_usp, $r10, $acr | |
| subq 10*4, $sp ; Make room for R9. | |
| move $usp, [$acr] ; Save user-mode stackpointer. | |
| ;; See copy_thread for the reason why register R9 is saved. | |
| movem $r9, [$sp] ; Save non-scratch registers and R9. | |
| addoq +THREAD_ksp, $r10, $acr | |
| move.d $sp, $r10 ; Return last running task in R10. | |
| move.d $sp, [$acr] ; Save kernel SP for old task. | |
| and.d -8192, $r10 ; Get thread_info from stackpointer. | |
| addoq +TI_task, $r10, $acr | |
| add.d $r12, $r11 ; Find the new tasks tss. | |
| move.d [$acr], $r10 ; Get task. | |
| addoq +THREAD_ksp, $r11, $acr | |
| move.d [$acr], $sp ; Switch to new stackframe. | |
| addoq +THREAD_usp, $r11, $acr | |
| movem [$sp+], $r9 ; Restore non-scratch registers and R9. | |
| move [$acr], $usp ; Restore user-mode stackpointer. | |
| addoq +THREAD_ccs, $r11, $acr | |
| move.d [$sp+], $r11 | |
| jump $r11 ; Restore PC. | |
| move [$acr], $ccs ; Restore IRQ enable status. | |
| .size resume, . - resume | |
| nmi_interrupt: | |
| ;; If we receive a watchdog interrupt while it is not expected, then set | |
| ;; up a canonical frame and dump register contents before dying. | |
| ;; This prologue MUST match the one in irq.h and the struct in ptregs.h! | |
| subq 12, $sp ; Skip EXS, EDA. | |
| move $nrp, [$sp] | |
| subq 4, $sp | |
| move $srp, [$sp] | |
| subq 4, $sp | |
| move $ccs, [$sp] | |
| subq 4, $sp | |
| move $spc, [$sp] | |
| subq 4, $sp | |
| move $mof, [$sp] | |
| subq 4, $sp | |
| move $srs, [$sp] | |
| subq 4, $sp | |
| move.d $acr, [$sp] | |
| subq 14*4, $sp ; Make room for R0-R13. | |
| movem $r13, [$sp] ; Push R0-R13. | |
| subq 4, $sp | |
| move.d $r10, [$sp] ; Push orig_r10. | |
| move.d REG_ADDR(intr_vect, regi_irq, r_nmi), $r0 | |
| move.d [$r0], $r0 | |
| btstq REG_BIT(intr_vect, r_nmi, watchdog), $r0 | |
| bpl 1f | |
| nop | |
| jsr handle_watchdog_bite ; In time.c. | |
| move.d $sp, $r10 ; Pointer to registers | |
| 1: btstq REG_BIT(intr_vect, r_nmi, ext), $r0 | |
| bpl 1f | |
| nop | |
| jsr handle_nmi | |
| move.d $sp, $r10 ; Pointer to registers | |
| 1: addq 4, $sp ; Skip orig_r10 | |
| movem [$sp+], $r13 | |
| move.d [$sp+], $acr | |
| move [$sp], $srs | |
| addq 4, $sp | |
| move [$sp+], $mof | |
| move [$sp+], $spc | |
| move [$sp+], $ccs | |
| move [$sp+], $srp | |
| move [$sp+], $nrp | |
| addq 8, $sp ; Skip EXS, EDA. | |
| jump $nrp | |
| rfn | |
| .comm cause_of_death, 4 ;; Don't declare this anywhere. | |
| spurious_interrupt: | |
| di | |
| jump hard_reset_now | |
| nop | |
| ;; This handles the case when multiple interrupts arrive at the same | |
| ;; time. Jump to the first set interrupt bit in a priority fashion. The | |
| ;; hardware will call the unserved interrupts after the handler | |
| ;; finishes. | |
| .type multiple_interrupt, @function | |
| multiple_interrupt: | |
| ;; This prologue MUST match the one in irq.h and the struct in ptregs.h! | |
| subq 12, $sp ; Skip EXS, EDA. | |
| move $erp, [$sp] | |
| subq 4, $sp | |
| move $srp, [$sp] | |
| subq 4, $sp | |
| move $ccs, [$sp] | |
| subq 4, $sp | |
| move $spc, [$sp] | |
| subq 4, $sp | |
| move $mof, [$sp] | |
| subq 4, $sp | |
| move $srs, [$sp] | |
| subq 4, $sp | |
| move.d $acr, [$sp] | |
| subq 14*4, $sp ; Make room for R0-R13. | |
| movem $r13, [$sp] ; Push R0-R13. | |
| subq 4, $sp | |
| move.d $r10, [$sp] ; Push orig_r10. | |
| ; Set S-bit when kernel debugging to keep hardware breakpoints active. | |
| #ifdef CONFIG_ETRAX_KGDB | |
| move $ccs, $r0 | |
| or.d (1<<9), $r0 | |
| move $r0, $ccs | |
| #endif | |
| jsr crisv32_do_multiple | |
| move.d $sp, $r10 | |
| jump ret_from_intr | |
| nop | |
| .size multiple_interrupt, . - multiple_interrupt | |
| do_sigtrap: | |
| ;; Sigtraps the process that executed the BREAK instruction. Creates a | |
| ;; frame that Rexit expects. | |
| subq 4, $sp | |
| move $eda, [$sp] | |
| subq 4, $sp | |
| move $exs, [$sp] | |
| subq 4, $sp | |
| move $erp, [$sp] | |
| subq 4, $sp | |
| move $srp, [$sp] | |
| subq 4, $sp | |
| move $ccs, [$sp] | |
| subq 4, $sp | |
| move $spc, [$sp] | |
| subq 4, $sp | |
| move $mof, [$sp] | |
| subq 4, $sp | |
| move $srs, [$sp] | |
| subq 4, $sp | |
| move.d $acr, [$sp] | |
| di ; Need to disable irq's at this point. | |
| subq 14*4, $sp ; Make room for r0-r13. | |
| movem $r13, [$sp] ; Push the r0-r13 registers. | |
| subq 4, $sp | |
| move.d $r10, [$sp] ; Push orig_r10. | |
| movs.w -8192, $r9 ; THREAD_SIZE == 8192 | |
| and.d $sp, $r9 | |
| ;; thread_info as first parameter | |
| move.d $r9, $r10 | |
| moveq 5, $r11 ; SIGTRAP as second argument. | |
| jsr ugdb_trap_user | |
| nop | |
| jump ret_from_intr ; Use the return routine for interrupts. | |
| nop | |
| gdb_handle_exception: | |
| subq 4, $sp | |
| move.d $r0, [$sp] | |
| #ifdef CONFIG_ETRAX_KGDB | |
| move $ccs, $r0 ; U-flag not affected by previous insns. | |
| btstq 16, $r0 ; Test the U-flag. | |
| bmi _ugdb_handle_exception ; Go to user mode debugging. | |
| nop ; Empty delay-slot (cannot pop R0 here). | |
| ba kgdb_handle_exception ; Go to kernel debugging. | |
| move.d [$sp+], $r0 ; Restore R0 in delay slot. | |
| #endif | |
| _ugdb_handle_exception: | |
| ba do_sigtrap ; SIGTRAP the offending process. | |
| move.d [$sp+], $r0 ; Restore R0 in delay slot. | |
| .data | |
| .section .rodata,"a" | |
| sys_call_table: | |
| .long sys_restart_syscall ; 0 - old "setup()" system call, used | |
| ; for restarting. | |
| .long sys_exit | |
| .long sys_fork | |
| .long sys_read | |
| .long sys_write | |
| .long sys_open /* 5 */ | |
| .long sys_close | |
| .long sys_waitpid | |
| .long sys_creat | |
| .long sys_link | |
| .long sys_unlink /* 10 */ | |
| .long sys_execve | |
| .long sys_chdir | |
| .long sys_time | |
| .long sys_mknod | |
| .long sys_chmod /* 15 */ | |
| .long sys_lchown16 | |
| .long sys_ni_syscall /* old break syscall holder */ | |
| .long sys_stat | |
| .long sys_lseek | |
| .long sys_getpid /* 20 */ | |
| .long sys_mount | |
| .long sys_oldumount | |
| .long sys_setuid16 | |
| .long sys_getuid16 | |
| .long sys_stime /* 25 */ | |
| .long sys_ptrace | |
| .long sys_alarm | |
| .long sys_fstat | |
| .long sys_pause | |
| .long sys_utime /* 30 */ | |
| .long sys_ni_syscall /* old stty syscall holder */ | |
| .long sys_ni_syscall /* old gtty syscall holder */ | |
| .long sys_access | |
| .long sys_nice | |
| .long sys_ni_syscall /* 35 old ftime syscall holder */ | |
| .long sys_sync | |
| .long sys_kill | |
| .long sys_rename | |
| .long sys_mkdir | |
| .long sys_rmdir /* 40 */ | |
| .long sys_dup | |
| .long sys_pipe | |
| .long sys_times | |
| .long sys_ni_syscall /* old prof syscall holder */ | |
| .long sys_brk /* 45 */ | |
| .long sys_setgid16 | |
| .long sys_getgid16 | |
| .long sys_signal | |
| .long sys_geteuid16 | |
| .long sys_getegid16 /* 50 */ | |
| .long sys_acct | |
| .long sys_umount /* recycled never used phys( */ | |
| .long sys_ni_syscall /* old lock syscall holder */ | |
| .long sys_ioctl | |
| .long sys_fcntl /* 55 */ | |
| .long sys_ni_syscall /* old mpx syscall holder */ | |
| .long sys_setpgid | |
| .long sys_ni_syscall /* old ulimit syscall holder */ | |
| .long sys_ni_syscall /* old sys_olduname holder */ | |
| .long sys_umask /* 60 */ | |
| .long sys_chroot | |
| .long sys_ustat | |
| .long sys_dup2 | |
| .long sys_getppid | |
| .long sys_getpgrp /* 65 */ | |
| .long sys_setsid | |
| .long sys_sigaction | |
| .long sys_sgetmask | |
| .long sys_ssetmask | |
| .long sys_setreuid16 /* 70 */ | |
| .long sys_setregid16 | |
| .long sys_sigsuspend | |
| .long sys_sigpending | |
| .long sys_sethostname | |
| .long sys_setrlimit /* 75 */ | |
| .long sys_old_getrlimit | |
| .long sys_getrusage | |
| .long sys_gettimeofday | |
| .long sys_settimeofday | |
| .long sys_getgroups16 /* 80 */ | |
| .long sys_setgroups16 | |
| .long sys_select /* was old_select in Linux/E100 */ | |
| .long sys_symlink | |
| .long sys_lstat | |
| .long sys_readlink /* 85 */ | |
| .long sys_uselib | |
| .long sys_swapon | |
| .long sys_reboot | |
| .long sys_old_readdir | |
| .long sys_old_mmap /* 90 */ | |
| .long sys_munmap | |
| .long sys_truncate | |
| .long sys_ftruncate | |
| .long sys_fchmod | |
| .long sys_fchown16 /* 95 */ | |
| .long sys_getpriority | |
| .long sys_setpriority | |
| .long sys_ni_syscall /* old profil syscall holder */ | |
| .long sys_statfs | |
| .long sys_fstatfs /* 100 */ | |
| .long sys_ni_syscall /* sys_ioperm in i386 */ | |
| .long sys_socketcall | |
| .long sys_syslog | |
| .long sys_setitimer | |
| .long sys_getitimer /* 105 */ | |
| .long sys_newstat | |
| .long sys_newlstat | |
| .long sys_newfstat | |
| .long sys_ni_syscall /* old sys_uname holder */ | |
| .long sys_ni_syscall /* sys_iopl in i386 */ | |
| .long sys_vhangup | |
| .long sys_ni_syscall /* old "idle" system call */ | |
| .long sys_ni_syscall /* vm86old in i386 */ | |
| .long sys_wait4 | |
| .long sys_swapoff /* 115 */ | |
| .long sys_sysinfo | |
| .long sys_ipc | |
| .long sys_fsync | |
| .long sys_sigreturn | |
| .long sys_clone /* 120 */ | |
| .long sys_setdomainname | |
| .long sys_newuname | |
| .long sys_ni_syscall /* sys_modify_ldt */ | |
| .long sys_adjtimex | |
| .long sys_mprotect /* 125 */ | |
| .long sys_sigprocmask | |
| .long sys_ni_syscall /* old "create_module" */ | |
| .long sys_init_module | |
| .long sys_delete_module | |
| .long sys_ni_syscall /* 130: old "get_kernel_syms" */ | |
| .long sys_quotactl | |
| .long sys_getpgid | |
| .long sys_fchdir | |
| .long sys_bdflush | |
| .long sys_sysfs /* 135 */ | |
| .long sys_personality | |
| .long sys_ni_syscall /* for afs_syscall */ | |
| .long sys_setfsuid16 | |
| .long sys_setfsgid16 | |
| .long sys_llseek /* 140 */ | |
| .long sys_getdents | |
| .long sys_select | |
| .long sys_flock | |
| .long sys_msync | |
| .long sys_readv /* 145 */ | |
| .long sys_writev | |
| .long sys_getsid | |
| .long sys_fdatasync | |
| .long sys_sysctl | |
| .long sys_mlock /* 150 */ | |
| .long sys_munlock | |
| .long sys_mlockall | |
| .long sys_munlockall | |
| .long sys_sched_setparam | |
| .long sys_sched_getparam /* 155 */ | |
| .long sys_sched_setscheduler | |
| .long sys_sched_getscheduler | |
| .long sys_sched_yield | |
| .long sys_sched_get_priority_max | |
| .long sys_sched_get_priority_min /* 160 */ | |
| .long sys_sched_rr_get_interval | |
| .long sys_nanosleep | |
| .long sys_mremap | |
| .long sys_setresuid16 | |
| .long sys_getresuid16 /* 165 */ | |
| .long sys_ni_syscall /* sys_vm86 */ | |
| .long sys_ni_syscall /* Old sys_query_module */ | |
| .long sys_poll | |
| .long sys_ni_syscall /* Old nfsservctl */ | |
| .long sys_setresgid16 /* 170 */ | |
| .long sys_getresgid16 | |
| .long sys_prctl | |
| .long sys_rt_sigreturn | |
| .long sys_rt_sigaction | |
| .long sys_rt_sigprocmask /* 175 */ | |
| .long sys_rt_sigpending | |
| .long sys_rt_sigtimedwait | |
| .long sys_rt_sigqueueinfo | |
| .long sys_rt_sigsuspend | |
| .long sys_pread64 /* 180 */ | |
| .long sys_pwrite64 | |
| .long sys_chown16 | |
| .long sys_getcwd | |
| .long sys_capget | |
| .long sys_capset /* 185 */ | |
| .long sys_sigaltstack | |
| .long sys_sendfile | |
| .long sys_ni_syscall /* streams1 */ | |
| .long sys_ni_syscall /* streams2 */ | |
| .long sys_vfork /* 190 */ | |
| .long sys_getrlimit | |
| .long sys_mmap2 | |
| .long sys_truncate64 | |
| .long sys_ftruncate64 | |
| .long sys_stat64 /* 195 */ | |
| .long sys_lstat64 | |
| .long sys_fstat64 | |
| .long sys_lchown | |
| .long sys_getuid | |
| .long sys_getgid /* 200 */ | |
| .long sys_geteuid | |
| .long sys_getegid | |
| .long sys_setreuid | |
| .long sys_setregid | |
| .long sys_getgroups /* 205 */ | |
| .long sys_setgroups | |
| .long sys_fchown | |
| .long sys_setresuid | |
| .long sys_getresuid | |
| .long sys_setresgid /* 210 */ | |
| .long sys_getresgid | |
| .long sys_chown | |
| .long sys_setuid | |
| .long sys_setgid | |
| .long sys_setfsuid /* 215 */ | |
| .long sys_setfsgid | |
| .long sys_pivot_root | |
| .long sys_mincore | |
| .long sys_madvise | |
| .long sys_getdents64 /* 220 */ | |
| .long sys_fcntl64 | |
| .long sys_ni_syscall /* reserved for TUX */ | |
| .long sys_ni_syscall | |
| .long sys_gettid | |
| .long sys_readahead /* 225 */ | |
| .long sys_setxattr | |
| .long sys_lsetxattr | |
| .long sys_fsetxattr | |
| .long sys_getxattr | |
| .long sys_lgetxattr /* 230 */ | |
| .long sys_fgetxattr | |
| .long sys_listxattr | |
| .long sys_llistxattr | |
| .long sys_flistxattr | |
| .long sys_removexattr /* 235 */ | |
| .long sys_lremovexattr | |
| .long sys_fremovexattr | |
| .long sys_tkill | |
| .long sys_sendfile64 | |
| .long sys_futex /* 240 */ | |
| .long sys_sched_setaffinity | |
| .long sys_sched_getaffinity | |
| .long sys_ni_syscall /* sys_set_thread_area */ | |
| .long sys_ni_syscall /* sys_get_thread_area */ | |
| .long sys_io_setup /* 245 */ | |
| .long sys_io_destroy | |
| .long sys_io_getevents | |
| .long sys_io_submit | |
| .long sys_io_cancel | |
| .long sys_fadvise64 /* 250 */ | |
| .long sys_ni_syscall | |
| .long sys_exit_group | |
| .long sys_lookup_dcookie | |
| .long sys_epoll_create | |
| .long sys_epoll_ctl /* 255 */ | |
| .long sys_epoll_wait | |
| .long sys_remap_file_pages | |
| .long sys_set_tid_address | |
| .long sys_timer_create | |
| .long sys_timer_settime /* 260 */ | |
| .long sys_timer_gettime | |
| .long sys_timer_getoverrun | |
| .long sys_timer_delete | |
| .long sys_clock_settime | |
| .long sys_clock_gettime /* 265 */ | |
| .long sys_clock_getres | |
| .long sys_clock_nanosleep | |
| .long sys_statfs64 | |
| .long sys_fstatfs64 | |
| .long sys_tgkill /* 270 */ | |
| .long sys_utimes | |
| .long sys_fadvise64_64 | |
| .long sys_ni_syscall /* sys_vserver */ | |
| .long sys_ni_syscall /* sys_mbind */ | |
| .long sys_ni_syscall /* 275 sys_get_mempolicy */ | |
| .long sys_ni_syscall /* sys_set_mempolicy */ | |
| .long sys_mq_open | |
| .long sys_mq_unlink | |
| .long sys_mq_timedsend | |
| .long sys_mq_timedreceive /* 280 */ | |
| .long sys_mq_notify | |
| .long sys_mq_getsetattr | |
| .long sys_ni_syscall /* reserved for kexec */ | |
| .long sys_waitid | |
| .long sys_ni_syscall /* 285 */ /* available */ | |
| .long sys_add_key | |
| .long sys_request_key | |
| .long sys_keyctl | |
| .long sys_ioprio_set | |
| .long sys_ioprio_get /* 290 */ | |
| .long sys_inotify_init | |
| .long sys_inotify_add_watch | |
| .long sys_inotify_rm_watch | |
| .long sys_migrate_pages | |
| .long sys_openat /* 295 */ | |
| .long sys_mkdirat | |
| .long sys_mknodat | |
| .long sys_fchownat | |
| .long sys_futimesat | |
| .long sys_fstatat64 /* 300 */ | |
| .long sys_unlinkat | |
| .long sys_renameat | |
| .long sys_linkat | |
| .long sys_symlinkat | |
| .long sys_readlinkat /* 305 */ | |
| .long sys_fchmodat | |
| .long sys_faccessat | |
| .long sys_pselect6 | |
| .long sys_ppoll | |
| .long sys_unshare /* 310 */ | |
| .long sys_set_robust_list | |
| .long sys_get_robust_list | |
| .long sys_splice | |
| .long sys_sync_file_range | |
| .long sys_tee /* 315 */ | |
| .long sys_vmsplice | |
| .long sys_move_pages | |
| .long sys_getcpu | |
| .long sys_epoll_pwait | |
| .long sys_utimensat /* 320 */ | |
| .long sys_signalfd | |
| .long sys_timerfd_create | |
| .long sys_eventfd | |
| .long sys_fallocate | |
| .long sys_timerfd_settime /* 325 */ | |
| .long sys_timerfd_gettime | |
| .long sys_signalfd4 | |
| .long sys_eventfd2 | |
| .long sys_epoll_create1 | |
| .long sys_dup3 /* 330 */ | |
| .long sys_pipe2 | |
| .long sys_inotify_init1 | |
| .long sys_preadv | |
| .long sys_pwritev | |
| .long sys_setns /* 335 */ | |
| .long sys_name_to_handle_at | |
| .long sys_open_by_handle_at | |
| .long sys_rt_tgsigqueueinfo | |
| .long sys_perf_event_open | |
| .long sys_recvmmsg /* 340 */ | |
| .long sys_accept4 | |
| .long sys_fanotify_init | |
| .long sys_fanotify_mark | |
| .long sys_prlimit64 | |
| .long sys_clock_adjtime /* 345 */ | |
| .long sys_syncfs | |
| .long sys_sendmmsg | |
| .long sys_process_vm_readv | |
| .long sys_process_vm_writev | |
| .long sys_kcmp /* 350 */ | |
| .long sys_finit_module | |
| .long sys_sched_setattr | |
| .long sys_sched_getattr | |
| .long sys_renameat2 | |
| .long sys_seccomp /* 355 */ | |
| .long sys_getrandom | |
| .long sys_memfd_create | |
| .long sys_bpf | |
| .long sys_execveat | |
| /* | |
| * NOTE!! This doesn't have to be exact - we just have | |
| * to make sure we have _enough_ of the "sys_ni_syscall" | |
| * entries. Don't panic if you notice that this hasn't | |
| * been shrunk every time we add a new system call. | |
| */ | |
| .rept NR_syscalls - (.-sys_call_table) / 4 | |
| .long sys_ni_syscall | |
| .endr | |