Linux System Call Tables
Numbers, names and arguments of the Linux system calls for 8 architectures, one table per kernel version. The tables are generated from the kernel sources, so each entry links to the place where the system call is defined. To find the number of a system call on every architecture at once, use the comparison table.
Tables (kernel version × architecture)
| Kernel | x86-64 | x86 (i386) | ARM (EABI) | AArch64 | RISC-V 64 | MIPS o32 | MIPS n64 | PowerPC64 | All |
|---|---|---|---|---|---|---|---|---|---|
| Linux 7.2 | 421 | 461 | 424 | 327 | 328 | 445 | 374 | 424 | compare |
| Linux 6.18 | 419 | 459 | 422 | 325 | 326 | 443 | 372 | 422 | compare |
| Linux 5.15 | 396 | 438 | 401 | 304 | 304 | 422 | 352 | 401 | compare |
| Linux 4.7 | 329 | — | — | — | — | — | — | — |
Each cell is the number of entries of the table. Linux 4.7 is the historical hand-written x86-64 table of this site.
Calling conventions
| Arch | Instruction | Number | Arg 1 | Arg 2 | Arg 3 | Arg 4 | Arg 5 | Arg 6 | Return | Clobbered / error |
|---|---|---|---|---|---|---|---|---|---|---|
| x86-64 | syscall | rax | rdi | rsi | rdx | r10 | r8 | r9 | rax | rcx, r11 |
| x86 (i386) | int 0x80 | eax | ebx | ecx | edx | esi | edi | ebp | eax | — |
| ARM (EABI) | svc #0 | r7 | r0 | r1 | r2 | r3 | r4 | r5 | r0 | — |
| AArch64 | svc #0 | x8 | x0 | x1 | x2 | x3 | x4 | x5 | x0 | — |
| RISC-V 64 | ecall | a7 | a0 | a1 | a2 | a3 | a4 | a5 | a0 | — |
| MIPS o32 | syscall | v0 | a0 | a1 | a2 | a3 | sp+16 | sp+20 | v0 | a3 = error flag |
| MIPS n64 | syscall | v0 | a0 | a1 | a2 | a3 | a4 | a5 | v0 | a3 = error flag |
| PowerPC64 | sc | r0 | r3 | r4 | r5 | r6 | r7 | r8 | r3 | CR0.SO = error flag |
A return value between
-4095 and -1 is an error (-errno); libc turns it into -1 and sets errno (MIPS and PowerPC flag errors separately, see below). Function call ABIs are on the calling conventions cheat sheet.Changes between versions (x86-64)
System call numbers never change once allocated: new system calls get the next free number, removed ones become reserved.
Since Linux 5.1 new system calls get the same number on every architecture (424 and up, plus the 4000/5000 base on MIPS), except on Alpha.
Linux 6.18 → 7.2 +2 / −0
Linux 5.15 → 6.18 +23 / −0
335 uretprobe336 uprobe449 futex_waitv450 set_mempolicy_home_node451 cachestat452 fchmodat2453 map_shadow_stack454 futex_wake455 futex_wait456 futex_requeue457 statmount458 listmount459 lsm_get_self_attr460 lsm_set_self_attr461 lsm_list_modules462 mseal463 setxattrat464 getxattrat465 listxattrat466 removexattrat467 open_tree_attr468 file_getattr469 file_setattr
Linux 4.7 → 5.15 +31 / −0
329 pkey_mprotect330 pkey_alloc331 pkey_free332 statx333 io_pgetevents334 rseq424 pidfd_send_signal425 io_uring_setup426 io_uring_enter427 io_uring_register428 open_tree429 move_mount430 fsopen431 fsconfig432 fsmount433 fspick434 pidfd_open435 clone3436 close_range437 openat2438 pidfd_getfd439 faccessat2440 process_madvise441 epoll_pwait2442 mount_setattr443 quotactl_fd444 landlock_create_ruleset445 landlock_add_rule446 landlock_restrict_self447 memfd_secret448 process_mrelease