summary refs log tree commit diff
path: root/ripple/minitrace/src/syscall_abi/mod.rs
blob: e0b35a9258c1a2010e806bcfb4939978e83df14c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// SPDX-FileCopyrightText: edef <edef@unfathomable.blue>
// SPDX-FileCopyrightText: V <v@unfathomable.blue>
// SPDX-License-Identifier: OSL-3.0

use {
	crate::{define_syscalls, syscall_bitflags, syscall_enums, Process},
	std::ffi::CString,
};

pub(crate) use arg::{ProcessSyscallArg, SyscallArg};
pub(crate) use fd::{DirFd, FileDesc};

mod arg;
mod fd;
pub mod macros;

type SigAction = ();
type SysInfo = ();
type Tms = ();
type Stat = ();
type RobustListHead = ();
type RLimit64 = ();

define_syscalls! {
	enum SyscallEntry {
		fn read(fd: FileDesc, buf: *mut u8, count: usize) -> i64 = 0;
		fn write(fd: FileDesc, buf: *const u8, count: usize) -> i64 = 1;
		fn close(fd: FileDesc) -> i64 = 3;
		fn mmap(addr: u64, len: u64, prot: ProtFlags, flags: MapFlags, fd: Option<FileDesc>, off: u64) -> i64 = 9;
		fn mprotect(addr: u64, len: usize, prot: ProtFlags) -> i64 = 10;
		fn brk(brk: u64) -> i64 = 12;
		fn rt_sigaction(sig: Signal, act: *const SigAction, oact: *mut SigAction, sigsetsize: usize) -> i64 = 13;
		fn ioctl(fd: FileDesc, cmd: Ioctl, arg: u64) -> i64 = 16;
		fn pread64(fd: FileDesc, buf: *mut u8, count: usize, pos: u64) -> i64 = 17;
		fn access(filename: CString, mode: AccessMode) -> i64 = 21;
		fn getcwd(buf: *mut u8, size: u64) -> i64 = 79;
		fn readlink(path: CString, buf: *mut u8, bufsiz: i32) -> i64 = 89;
		fn sysinfo(info: *mut SysInfo) -> i64 = 99;
		fn times(tbuf: *mut Tms) -> i64 = 100;
		fn arch_prctl(option: ArchOption, arg2: u64) -> i64 = 158;
		fn set_tid_address(tidptr: *mut i32) -> i64 = 218;
		fn exit_group(error_code: i32) -> i64 = 231;
		fn openat(dfd: DirFd, filename: CString, flags: OpenFlags, mode: FileMode) -> i64 = 257;
		fn newfstatat(dfd: DirFd, filename: CString, statbuf: *mut Stat, flags: AtFlags) -> i64 = 262;
		fn set_robust_list(head: *mut RobustListHead, len: usize) -> i64 = 273;
		fn prlimit64(pid: i32, resource: ResourceLimit, new_rlim: *const RLimit64, old_rlim: *mut RLimit64) -> i64 = 302;
		fn getrandom(ubuf: *mut u8, len: usize, flags: GrndFlags) -> i64 = 318;
	}
}

syscall_bitflags! {
	struct OpenFlags: i32 {
		const WRONLY  = 1 <<  0 => O_WRONLY;
		const CREAT   = 1 <<  6 => O_CREAT;
		const NOCTTY  = 1 <<  8 => O_NOCTTY;
		const TRUNC   = 1 <<  9 => O_TRUNC;
		const CLOEXEC = 1 << 19 => O_CLOEXEC;
	}

	struct GrndFlags: u32 {
		const NONBLOCK = 1 << 0 => GRND_NONBLOCK;
		const RANDOM   = 1 << 1 => GRND_RANDOM;
	}

	struct MapFlags: i32 {
		const PRIVATE   = 1 <<  1 => MAP_PRIVATE;
		const FIXED     = 1 <<  4 => MAP_FIXED;
		const ANONYMOUS = 1 <<  5 => MAP_ANONYMOUS;
		const DENYWRITE = 1 << 11 => MAP_DENYWRITE;
	}

	struct ProtFlags: i32 {
		const READ  = 1 << 0 => PROT_READ;
		const WRITE = 1 << 1 => PROT_WRITE;
		const EXEC  = 1 << 2 => PROT_EXEC;
	}

	struct AtFlags: i32 {
		const EMPTY_PATH = 1 << 12 => AT_EMPTY_PATH;
	}

	struct AccessMode: i32 {
		const F = 0 => F_OK;
		const X = 1 << 0 => X_OK;
		const W = 1 << 1 => W_OK;
		const R = 1 << 2 => R_OK;
	}

	struct FileMode: u32 {
		const IRUSR = 0o400 => S_IRUSR;
		const IWUSR = 0o200 => S_IWUSR;
		const IXUSR = 0o100 => S_IXUSR;

		const IRGRP = 0o040 => S_IRGRP;
		const IWGRP = 0o020 => S_IWGRP;
		const IXGRP = 0o010 => S_IXGRP;

		const IROTH = 0o004 => S_IROTH;
		const IWOTH = 0o002 => S_IWOTH;
		const IXOTH = 0o001 => S_IXOTH;
	}
}

syscall_enums! {
	enum ResourceLimit: u32 {
		STACK = 0x3 => RLIMIT_STACK,
		RSS   = 0x5 => RLIMIT_RSS,
		AS    = 0x9 => RLIMIT_AS,
	}

	enum ArchOption: i32 {
		SET_FS = 0x1002,
	}

	enum Ioctl: u64 {
		TCGETS     = 0x5401 => TCGETS,
		TIOCGWINSZ = 0x5413 => TIOCGWINSZ,
	}

	enum Signal: i32 {
		ILL  =  4 => SIGILL,
		ABRT =  6 => SIGABRT,
		BUS  =  7 => SIGBUS,
		FPE  =  8 => SIGFPE,
		SEGV = 11 => SIGSEGV,
	}
}