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