Skip to main content

rt/
kernel.rs

1// kernel -- the Linux kernel ABI, one table per architecture: system call numbers, open flags,
2// struct stat, the order of clone's arguments.  Nothing else defines them (build_rs.py lint):
3// a wrong number compiles and calls something else (57 is fork on x86-64, close on ARM64), a wrong
4// flag means something else (O_NOFOLLOW here is O_LARGEFILE there).  Both tables name the same
5// things, line by line; tools/kernel_table_check.py compares them with the kernel's headers.
6// Everything is also reached as rt::os::*, which has the helpers for the calls ARM64 does not
7// have (poll, fork, dup2, rename).
8//
9//   SYS_*        system calls; SYS_ARCH_PRCTL only on x86-64
10//   O_*          open flags
11//   Stat         struct stat; Stat::default() to pass it to fstat / newfstatat
12//   clone_args   clone's arguments after flags and stack, in the kernel's order
13//
14// The same on both architectures: AT_FDCWD, and what is not listed here (AT_* flags, S_IF*, errno
15// values, F_*, MAP_*, PROT_*, the clone flags, struct statfs).
16
17pub use arch::*;
18
19/// the current directory as the base of a relative path in the *at calls
20pub const AT_FDCWD: usize = -100isize as usize;
21
22#[cfg(target_arch = "x86_64")]
23mod arch {
24    use core::mem::{offset_of, size_of};
25
26    pub const SYS_READ: usize = 0;
27    pub const SYS_WRITE: usize = 1;
28    pub const SYS_CLOSE: usize = 3;
29    pub const SYS_FSTAT: usize = 5;
30    pub const SYS_LSEEK: usize = 8;
31    pub const SYS_MMAP: usize = 9;
32    pub const SYS_MPROTECT: usize = 10;
33    pub const SYS_MUNMAP: usize = 11;
34    pub const SYS_RT_SIGACTION: usize = 13;
35    pub const SYS_RT_SIGPROCMASK: usize = 14;
36    pub const SYS_RT_SIGRETURN: usize = 15;
37    pub const SYS_IOCTL: usize = 16;
38    pub const SYS_PREAD64: usize = 17;
39    pub const SYS_PWRITE64: usize = 18;
40    pub const SYS_SCHED_YIELD: usize = 24;
41    pub const SYS_MADVISE: usize = 28;
42    pub const SYS_SHMGET: usize = 29;
43    pub const SYS_SHMAT: usize = 30;
44    pub const SYS_SHMCTL: usize = 31;
45    pub const SYS_GETPID: usize = 39;
46    pub const SYS_SOCKET: usize = 41;
47    pub const SYS_CONNECT: usize = 42;
48    pub const SYS_SENDTO: usize = 44;
49    pub const SYS_RECVFROM: usize = 45;
50    pub const SYS_SENDMSG: usize = 46;
51    pub const SYS_RECVMSG: usize = 47;
52    pub const SYS_SHUTDOWN: usize = 48;
53    pub const SYS_BIND: usize = 49;
54    pub const SYS_LISTEN: usize = 50;
55    pub const SYS_GETSOCKNAME: usize = 51;
56    pub const SYS_GETPEERNAME: usize = 52;
57    pub const SYS_SETSOCKOPT: usize = 54;
58    pub const SYS_GETSOCKOPT: usize = 55;
59    pub const SYS_CLONE: usize = 56;
60    pub const SYS_EXECVE: usize = 59;
61    pub const SYS_EXIT: usize = 60;
62    pub const SYS_WAIT4: usize = 61;
63    pub const SYS_KILL: usize = 62;
64    pub const SYS_UNAME: usize = 63;
65    pub const SYS_SHMDT: usize = 67;
66    pub const SYS_FCNTL: usize = 72;
67    pub const SYS_FLOCK: usize = 73;
68    pub const SYS_FSYNC: usize = 74;
69    pub const SYS_FTRUNCATE: usize = 77;
70    pub const SYS_GETCWD: usize = 79;
71    pub const SYS_CHDIR: usize = 80;
72    pub const SYS_FCHMOD: usize = 91;
73    pub const SYS_FCHOWN: usize = 93;
74    pub const SYS_SYSINFO: usize = 99;
75    pub const SYS_PTRACE: usize = 101;
76    pub const SYS_GETUID: usize = 102;
77    pub const SYS_GETEUID: usize = 107;
78    pub const SYS_SETSID: usize = 112;
79    pub const SYS_SIGALTSTACK: usize = 131;
80    pub const SYS_STATFS: usize = 137;
81    pub const SYS_PIVOT_ROOT: usize = 155;
82    pub const SYS_PRCTL: usize = 157;
83    pub const SYS_CHROOT: usize = 161;
84    pub const SYS_MOUNT: usize = 165;
85    pub const SYS_UMOUNT2: usize = 166;
86    pub const SYS_INIT_MODULE: usize = 175;
87    pub const SYS_DELETE_MODULE: usize = 176;
88    pub const SYS_GETTID: usize = 186;
89    pub const SYS_FUTEX: usize = 202;
90    pub const SYS_SCHED_GETAFFINITY: usize = 204;
91    pub const SYS_GETDENTS64: usize = 217;
92    pub const SYS_CLOCK_GETTIME: usize = 228;
93    pub const SYS_EXIT_GROUP: usize = 231;
94    pub const SYS_TGKILL: usize = 234;
95    pub const SYS_KEXEC_LOAD: usize = 246;
96    pub const SYS_WAITID: usize = 247;
97    pub const SYS_ADD_KEY: usize = 248;
98    pub const SYS_REQUEST_KEY: usize = 249;
99    pub const SYS_KEYCTL: usize = 250;
100    pub const SYS_INOTIFY_ADD_WATCH: usize = 254;
101    pub const SYS_INOTIFY_RM_WATCH: usize = 255;
102    pub const SYS_OPENAT: usize = 257;
103    pub const SYS_MKDIRAT: usize = 258;
104    pub const SYS_FCHOWNAT: usize = 260;
105    pub const SYS_NEWFSTATAT: usize = 262;
106    pub const SYS_UNLINKAT: usize = 263;
107    pub const SYS_RENAMEAT: usize = 264;
108    pub const SYS_LINKAT: usize = 265;
109    pub const SYS_SYMLINKAT: usize = 266;
110    pub const SYS_READLINKAT: usize = 267;
111    pub const SYS_FCHMODAT: usize = 268;
112    pub const SYS_FACCESSAT: usize = 269;
113    pub const SYS_PPOLL: usize = 271;
114    pub const SYS_UNSHARE: usize = 272;
115    pub const SYS_UTIMENSAT: usize = 280;
116    pub const SYS_ACCEPT4: usize = 288;
117    pub const SYS_EVENTFD2: usize = 290;
118    pub const SYS_DUP3: usize = 292;
119    pub const SYS_PIPE2: usize = 293;
120    pub const SYS_INOTIFY_INIT1: usize = 294;
121    pub const SYS_PERF_EVENT_OPEN: usize = 298;
122    pub const SYS_OPEN_BY_HANDLE_AT: usize = 304;
123    pub const SYS_SETNS: usize = 308;
124    pub const SYS_PROCESS_VM_READV: usize = 310;
125    pub const SYS_PROCESS_VM_WRITEV: usize = 311;
126    pub const SYS_FINIT_MODULE: usize = 313;
127    pub const SYS_RENAMEAT2: usize = 316;
128    pub const SYS_SECCOMP: usize = 317;
129    pub const SYS_GETRANDOM: usize = 318;
130    pub const SYS_MEMFD_CREATE: usize = 319;
131    pub const SYS_KEXEC_FILE_LOAD: usize = 320;
132    pub const SYS_BPF: usize = 321;
133    pub const SYS_EXECVEAT: usize = 322;
134    pub const SYS_USERFAULTFD: usize = 323;
135    pub const SYS_CLOSE_RANGE: usize = 436;
136    pub const SYS_LANDLOCK_CREATE_RULESET: usize = 444;
137    pub const SYS_LANDLOCK_ADD_RULE: usize = 445;
138    pub const SYS_LANDLOCK_RESTRICT_SELF: usize = 446;
139    // x86-64 only: ARM64 sets the thread pointer with TPIDR_EL0 (ARM3)
140    pub const SYS_ARCH_PRCTL: usize = 158;
141
142    pub const O_RDONLY: usize = 0;
143    pub const O_WRONLY: usize = 1;
144    pub const O_RDWR: usize = 2;
145    pub const O_CREAT: usize = 0x40;
146    pub const O_EXCL: usize = 0x80;
147    pub const O_TRUNC: usize = 0x200;
148    pub const O_NONBLOCK: usize = 0x800;
149    pub const O_DIRECTORY: usize = 0x1_0000;
150    pub const O_NOFOLLOW: usize = 0x2_0000;
151    pub const O_CLOEXEC: usize = 0x8_0000;
152    pub const O_PATH: usize = 0x20_0000;
153    pub const O_TMPFILE: usize = 0x40_0000 | O_DIRECTORY;
154
155    /// struct stat of fstat / newfstatat, 144 bytes
156    #[repr(C)]
157    #[derive(Clone, Copy, Default)]
158    pub struct Stat {
159        pub st_dev: u64,
160        pub st_ino: u64,
161        pub st_nlink: u64,
162        pub st_mode: u32,
163        pub st_uid: u32,
164        pub st_gid: u32,
165        __pad0: u32,
166        pub st_rdev: u64,
167        pub st_size: i64,
168        pub st_blksize: i64,
169        pub st_blocks: i64,
170        pub st_atime: i64,
171        pub st_atime_nsec: i64,
172        pub st_mtime: i64,
173        pub st_mtime_nsec: i64,
174        pub st_ctime: i64,
175        pub st_ctime_nsec: i64,
176        __unused: [i64; 3],
177    }
178    const _: () = assert!(size_of::<Stat>() == 144 && offset_of!(Stat, st_mode) == 24 && offset_of!(Stat, st_size) == 48 && offset_of!(Stat, st_mtime) == 88);
179
180    /// clone(flags, stack, a, b, c): child_tid before tls
181    pub const fn clone_args(parent_tid: usize, child_tid: usize, tls: usize) -> [usize; 3] {
182        [parent_tid, child_tid, tls]
183    }
184}
185
186#[cfg(target_arch = "aarch64")]
187mod arch {
188    use core::mem::{offset_of, size_of};
189
190    pub const SYS_READ: usize = 63;
191    pub const SYS_WRITE: usize = 64;
192    pub const SYS_CLOSE: usize = 57;
193    pub const SYS_FSTAT: usize = 80;
194    pub const SYS_LSEEK: usize = 62;
195    pub const SYS_MMAP: usize = 222;
196    pub const SYS_MPROTECT: usize = 226;
197    pub const SYS_MUNMAP: usize = 215;
198    pub const SYS_RT_SIGACTION: usize = 134;
199    pub const SYS_RT_SIGPROCMASK: usize = 135;
200    pub const SYS_RT_SIGRETURN: usize = 139;
201    pub const SYS_IOCTL: usize = 29;
202    pub const SYS_PREAD64: usize = 67;
203    pub const SYS_PWRITE64: usize = 68;
204    pub const SYS_SCHED_YIELD: usize = 124;
205    pub const SYS_MADVISE: usize = 233;
206    pub const SYS_SHMGET: usize = 194;
207    pub const SYS_SHMAT: usize = 196;
208    pub const SYS_SHMCTL: usize = 195;
209    pub const SYS_GETPID: usize = 172;
210    pub const SYS_SOCKET: usize = 198;
211    pub const SYS_CONNECT: usize = 203;
212    pub const SYS_SENDTO: usize = 206;
213    pub const SYS_RECVFROM: usize = 207;
214    pub const SYS_SENDMSG: usize = 211;
215    pub const SYS_RECVMSG: usize = 212;
216    pub const SYS_SHUTDOWN: usize = 210;
217    pub const SYS_BIND: usize = 200;
218    pub const SYS_LISTEN: usize = 201;
219    pub const SYS_GETSOCKNAME: usize = 204;
220    pub const SYS_GETPEERNAME: usize = 205;
221    pub const SYS_SETSOCKOPT: usize = 208;
222    pub const SYS_GETSOCKOPT: usize = 209;
223    pub const SYS_CLONE: usize = 220;
224    pub const SYS_EXECVE: usize = 221;
225    pub const SYS_EXIT: usize = 93;
226    pub const SYS_WAIT4: usize = 260;
227    pub const SYS_KILL: usize = 129;
228    pub const SYS_UNAME: usize = 160;
229    pub const SYS_SHMDT: usize = 197;
230    pub const SYS_FCNTL: usize = 25;
231    pub const SYS_FLOCK: usize = 32;
232    pub const SYS_FSYNC: usize = 82;
233    pub const SYS_FTRUNCATE: usize = 46;
234    pub const SYS_GETCWD: usize = 17;
235    pub const SYS_CHDIR: usize = 49;
236    pub const SYS_FCHMOD: usize = 52;
237    pub const SYS_FCHOWN: usize = 55;
238    pub const SYS_SYSINFO: usize = 179;
239    pub const SYS_PTRACE: usize = 117;
240    pub const SYS_GETUID: usize = 174;
241    pub const SYS_GETEUID: usize = 175;
242    pub const SYS_SETSID: usize = 157;
243    pub const SYS_SIGALTSTACK: usize = 132;
244    pub const SYS_STATFS: usize = 43;
245    pub const SYS_PIVOT_ROOT: usize = 41;
246    pub const SYS_PRCTL: usize = 167;
247    pub const SYS_CHROOT: usize = 51;
248    pub const SYS_MOUNT: usize = 40;
249    pub const SYS_UMOUNT2: usize = 39;
250    pub const SYS_INIT_MODULE: usize = 105;
251    pub const SYS_DELETE_MODULE: usize = 106;
252    pub const SYS_GETTID: usize = 178;
253    pub const SYS_FUTEX: usize = 98;
254    pub const SYS_SCHED_GETAFFINITY: usize = 123;
255    pub const SYS_GETDENTS64: usize = 61;
256    pub const SYS_CLOCK_GETTIME: usize = 113;
257    pub const SYS_EXIT_GROUP: usize = 94;
258    pub const SYS_TGKILL: usize = 131;
259    pub const SYS_KEXEC_LOAD: usize = 104;
260    pub const SYS_WAITID: usize = 95;
261    pub const SYS_ADD_KEY: usize = 217;
262    pub const SYS_REQUEST_KEY: usize = 218;
263    pub const SYS_KEYCTL: usize = 219;
264    pub const SYS_INOTIFY_ADD_WATCH: usize = 27;
265    pub const SYS_INOTIFY_RM_WATCH: usize = 28;
266    pub const SYS_OPENAT: usize = 56;
267    pub const SYS_MKDIRAT: usize = 34;
268    pub const SYS_FCHOWNAT: usize = 54;
269    pub const SYS_NEWFSTATAT: usize = 79;
270    pub const SYS_UNLINKAT: usize = 35;
271    pub const SYS_RENAMEAT: usize = 38;
272    pub const SYS_LINKAT: usize = 37;
273    pub const SYS_SYMLINKAT: usize = 36;
274    pub const SYS_READLINKAT: usize = 78;
275    pub const SYS_FCHMODAT: usize = 53;
276    pub const SYS_FACCESSAT: usize = 48;
277    pub const SYS_PPOLL: usize = 73;
278    pub const SYS_UNSHARE: usize = 97;
279    pub const SYS_UTIMENSAT: usize = 88;
280    pub const SYS_ACCEPT4: usize = 242;
281    pub const SYS_EVENTFD2: usize = 19;
282    pub const SYS_DUP3: usize = 24;
283    pub const SYS_PIPE2: usize = 59;
284    pub const SYS_INOTIFY_INIT1: usize = 26;
285    pub const SYS_PERF_EVENT_OPEN: usize = 241;
286    pub const SYS_OPEN_BY_HANDLE_AT: usize = 265;
287    pub const SYS_SETNS: usize = 268;
288    pub const SYS_PROCESS_VM_READV: usize = 270;
289    pub const SYS_PROCESS_VM_WRITEV: usize = 271;
290    pub const SYS_FINIT_MODULE: usize = 273;
291    pub const SYS_RENAMEAT2: usize = 276;
292    pub const SYS_SECCOMP: usize = 277;
293    pub const SYS_GETRANDOM: usize = 278;
294    pub const SYS_MEMFD_CREATE: usize = 279;
295    pub const SYS_KEXEC_FILE_LOAD: usize = 294;
296    pub const SYS_BPF: usize = 280;
297    pub const SYS_EXECVEAT: usize = 281;
298    pub const SYS_USERFAULTFD: usize = 282;
299    pub const SYS_CLOSE_RANGE: usize = 436;
300    pub const SYS_LANDLOCK_CREATE_RULESET: usize = 444;
301    pub const SYS_LANDLOCK_ADD_RULE: usize = 445;
302    pub const SYS_LANDLOCK_RESTRICT_SELF: usize = 446;
303
304    pub const O_RDONLY: usize = 0;
305    pub const O_WRONLY: usize = 1;
306    pub const O_RDWR: usize = 2;
307    pub const O_CREAT: usize = 0x40;
308    pub const O_EXCL: usize = 0x80;
309    pub const O_TRUNC: usize = 0x200;
310    pub const O_NONBLOCK: usize = 0x800;
311    pub const O_DIRECTORY: usize = 0x4000;
312    pub const O_NOFOLLOW: usize = 0x8000;
313    pub const O_CLOEXEC: usize = 0x8_0000;
314    pub const O_PATH: usize = 0x20_0000;
315    pub const O_TMPFILE: usize = 0x40_0000 | O_DIRECTORY;
316
317    /// struct stat of fstat / newfstatat, 128 bytes
318    #[repr(C)]
319    #[derive(Clone, Copy, Default)]
320    pub struct Stat {
321        pub st_dev: u64,
322        pub st_ino: u64,
323        pub st_mode: u32,
324        pub st_nlink: u32,
325        pub st_uid: u32,
326        pub st_gid: u32,
327        pub st_rdev: u64,
328        __pad1: u64,
329        pub st_size: i64,
330        pub st_blksize: i32,
331        __pad2: i32,
332        pub st_blocks: i64,
333        pub st_atime: i64,
334        pub st_atime_nsec: i64,
335        pub st_mtime: i64,
336        pub st_mtime_nsec: i64,
337        pub st_ctime: i64,
338        pub st_ctime_nsec: i64,
339        __unused: [u32; 2],
340    }
341    const _: () = assert!(size_of::<Stat>() == 128 && offset_of!(Stat, st_mode) == 16 && offset_of!(Stat, st_size) == 48 && offset_of!(Stat, st_mtime) == 88);
342
343    /// clone(flags, stack, a, b, c): tls before child_tid (CONFIG_CLONE_BACKWARDS)
344    pub const fn clone_args(parent_tid: usize, child_tid: usize, tls: usize) -> [usize; 3] {
345        [parent_tid, tls, child_tid]
346    }
347}