1use core::{
2 mem,
3 ops::{Deref, DerefMut},
4 slice,
5};
6
7use crate::flag::{EventFlags, MapFlags, PtraceFlags, StdFsCallKind};
8
9#[derive(Copy, Clone, Debug, Default)]
10#[repr(C)]
11pub struct Event {
12 pub id: usize,
13 pub flags: EventFlags,
14 pub data: usize,
15}
16
17impl Deref for Event {
18 type Target = [u8];
19 fn deref(&self) -> &[u8] {
20 unsafe { slice::from_raw_parts(self as *const Event as *const u8, mem::size_of::<Event>()) }
21 }
22}
23
24impl DerefMut for Event {
25 fn deref_mut(&mut self) -> &mut [u8] {
26 unsafe { slice::from_raw_parts_mut(self as *mut Event as *mut u8, mem::size_of::<Event>()) }
27 }
28}
29
30#[derive(Copy, Clone, Debug, Default)]
31#[repr(C)]
32pub struct ITimerSpec {
33 pub it_interval: TimeSpec,
34 pub it_value: TimeSpec,
35}
36
37impl Deref for ITimerSpec {
38 type Target = [u8];
39 fn deref(&self) -> &[u8] {
40 unsafe {
41 slice::from_raw_parts(
42 self as *const ITimerSpec as *const u8,
43 mem::size_of::<ITimerSpec>(),
44 )
45 }
46 }
47}
48
49impl DerefMut for ITimerSpec {
50 fn deref_mut(&mut self) -> &mut [u8] {
51 unsafe {
52 slice::from_raw_parts_mut(
53 self as *mut ITimerSpec as *mut u8,
54 mem::size_of::<ITimerSpec>(),
55 )
56 }
57 }
58}
59
60#[derive(Copy, Clone, Debug, Default)]
61#[repr(C)]
62pub struct OldMap {
63 pub offset: usize,
64 pub size: usize,
65 pub flags: MapFlags,
66}
67
68impl Deref for OldMap {
69 type Target = [u8];
70 fn deref(&self) -> &[u8] {
71 unsafe {
72 slice::from_raw_parts(self as *const OldMap as *const u8, mem::size_of::<OldMap>())
73 }
74 }
75}
76
77impl DerefMut for OldMap {
78 fn deref_mut(&mut self) -> &mut [u8] {
79 unsafe {
80 slice::from_raw_parts_mut(self as *mut OldMap as *mut u8, mem::size_of::<OldMap>())
81 }
82 }
83}
84#[derive(Copy, Clone, Debug, Default)]
85#[repr(C)]
86pub struct Map {
87 pub offset: usize,
89
90 pub size: usize,
92
93 pub flags: MapFlags,
95
96 pub address: usize,
100}
101
102impl Deref for Map {
103 type Target = [u8];
104 fn deref(&self) -> &[u8] {
105 unsafe { slice::from_raw_parts(self as *const Map as *const u8, mem::size_of::<Map>()) }
106 }
107}
108
109impl DerefMut for Map {
110 fn deref_mut(&mut self) -> &mut [u8] {
111 unsafe { slice::from_raw_parts_mut(self as *mut Map as *mut u8, mem::size_of::<Map>()) }
112 }
113}
114
115#[derive(Copy, Clone, Debug, Default, PartialEq)]
116#[repr(C)]
117pub struct Stat {
118 pub st_dev: u64,
119 pub st_ino: u64,
120 pub st_mode: u16,
121 pub st_nlink: u32,
122 pub st_uid: u32,
123 pub st_gid: u32,
124 pub st_size: u64,
125 pub st_blksize: u32,
126 pub st_blocks: u64,
127 pub st_mtime: u64,
128 pub st_mtime_nsec: u32,
129 pub st_atime: u64,
130 pub st_atime_nsec: u32,
131 pub st_ctime: u64,
132 pub st_ctime_nsec: u32,
133}
134
135impl Deref for Stat {
136 type Target = [u8];
137 fn deref(&self) -> &[u8] {
138 unsafe { slice::from_raw_parts(self as *const Stat as *const u8, mem::size_of::<Stat>()) }
139 }
140}
141
142impl DerefMut for Stat {
143 fn deref_mut(&mut self) -> &mut [u8] {
144 unsafe { slice::from_raw_parts_mut(self as *mut Stat as *mut u8, mem::size_of::<Stat>()) }
145 }
146}
147
148#[derive(Copy, Clone, Debug, Default, PartialEq)]
149#[repr(C)]
150pub struct StatVfs {
151 pub f_bsize: u32,
152 pub f_blocks: u64,
153 pub f_bfree: u64,
154 pub f_bavail: u64,
155}
156
157impl Deref for StatVfs {
158 type Target = [u8];
159 fn deref(&self) -> &[u8] {
160 unsafe {
161 slice::from_raw_parts(
162 self as *const StatVfs as *const u8,
163 mem::size_of::<StatVfs>(),
164 )
165 }
166 }
167}
168
169impl DerefMut for StatVfs {
170 fn deref_mut(&mut self) -> &mut [u8] {
171 unsafe {
172 slice::from_raw_parts_mut(self as *mut StatVfs as *mut u8, mem::size_of::<StatVfs>())
173 }
174 }
175}
176
177#[derive(Copy, Clone, Debug, Default, PartialEq)]
178#[repr(C, packed)]
179pub struct StdFsCallMeta {
180 pub kind: u8, _rsvd: [u8; 7],
182 pub arg1: u64,
183 pub arg2: u64,
184}
185
186impl StdFsCallMeta {
187 pub fn new(kind: StdFsCallKind, arg1: u64, arg2: u64) -> Self {
188 Self {
189 kind: kind as u8,
190 _rsvd: [0; 7],
191 arg1,
192 arg2,
193 }
194 }
195}
196
197impl Deref for StdFsCallMeta {
198 type Target = [u64];
199 fn deref(&self) -> &[u64] {
200 unsafe {
201 slice::from_raw_parts(
202 self as *const StdFsCallMeta as *const u64,
203 mem::size_of::<StdFsCallMeta>() / mem::size_of::<u64>(),
204 )
205 }
206 }
207}
208
209impl DerefMut for StdFsCallMeta {
210 fn deref_mut(&mut self) -> &mut [u64] {
211 unsafe {
212 slice::from_raw_parts_mut(
213 self as *mut StdFsCallMeta as *mut u64,
214 mem::size_of::<StdFsCallMeta>() / mem::size_of::<u64>(),
215 )
216 }
217 }
218}
219
220#[derive(Copy, Clone, Debug, Default, PartialEq)]
221#[repr(C)]
222pub struct TimeSpec {
223 pub tv_sec: i64,
224 pub tv_nsec: i32,
225}
226
227const NANOS_PER_SEC: u128 = 1_000_000_000;
228
229impl TimeSpec {
230 pub fn from_nanos(nanos: u128) -> Self {
231 Self {
232 tv_sec: i64::try_from(nanos / NANOS_PER_SEC).unwrap_or(i64::MAX),
233 tv_nsec: (nanos % NANOS_PER_SEC) as i32, }
235 }
236 pub fn to_nanos(&self) -> u128 {
237 self.tv_sec as u128 * NANOS_PER_SEC + self.tv_nsec as u128
238 }
239}
240
241impl Deref for TimeSpec {
242 type Target = [u8];
243 fn deref(&self) -> &[u8] {
244 unsafe {
245 slice::from_raw_parts(
246 self as *const TimeSpec as *const u8,
247 mem::size_of::<TimeSpec>(),
248 )
249 }
250 }
251}
252
253impl DerefMut for TimeSpec {
254 fn deref_mut(&mut self) -> &mut [u8] {
255 unsafe {
256 slice::from_raw_parts_mut(self as *mut TimeSpec as *mut u8, mem::size_of::<TimeSpec>())
257 }
258 }
259}
260
261#[derive(Clone, Copy, Debug, Default)]
262#[repr(C)]
263pub struct PtraceEvent {
264 pub cause: PtraceFlags,
265 pub a: usize,
266 pub b: usize,
267 pub c: usize,
268 pub d: usize,
269 pub e: usize,
270 pub f: usize,
271}
272
273impl Deref for PtraceEvent {
274 type Target = [u8];
275 fn deref(&self) -> &[u8] {
276 unsafe {
277 slice::from_raw_parts(
278 self as *const PtraceEvent as *const u8,
279 mem::size_of::<PtraceEvent>(),
280 )
281 }
282 }
283}
284
285impl DerefMut for PtraceEvent {
286 fn deref_mut(&mut self) -> &mut [u8] {
287 unsafe {
288 slice::from_raw_parts_mut(
289 self as *mut PtraceEvent as *mut u8,
290 mem::size_of::<PtraceEvent>(),
291 )
292 }
293 }
294}
295
296#[macro_export]
297macro_rules! ptrace_event {
298 ($cause:expr $(, $a:expr $(, $b:expr $(, $c:expr)?)?)?) => {
299 $crate::data::PtraceEvent {
300 cause: $cause,
301 $(a: $a,
302 $(b: $b,
303 $(c: $c,)?
304 )?
305 )?
306 ..Default::default()
307 }
308 }
309}
310
311bitflags::bitflags! {
312 #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Clone, Copy, Default)]
313 pub struct GrantFlags: usize {
314 const GRANT_READ = 0x0000_0001;
315 const GRANT_WRITE = 0x0000_0002;
316 const GRANT_EXEC = 0x0000_0004;
317
318 const GRANT_SHARED = 0x0000_0008;
319 const GRANT_LAZY = 0x0000_0010;
320 const GRANT_SCHEME = 0x0000_0020;
321 const GRANT_PHYS = 0x0000_0040;
322 const GRANT_PINNED = 0x0000_0080;
323 const GRANT_PHYS_CONTIGUOUS = 0x0000_0100;
324 }
325}
326
327impl GrantFlags {
328 #[deprecated = "use the safe `from_bits_retain` method instead"]
329 pub unsafe fn from_bits_unchecked(bits: usize) -> Self {
330 Self::from_bits_retain(bits)
331 }
332}
333
334#[derive(Clone, Copy, Debug, Default)]
335#[repr(C)]
336pub struct GrantDesc {
337 pub base: usize,
338 pub size: usize,
339 pub flags: GrantFlags,
340 pub offset: u64,
341}
342
343impl Deref for GrantDesc {
344 type Target = [u8];
345 fn deref(&self) -> &[u8] {
346 unsafe {
347 slice::from_raw_parts(
348 self as *const GrantDesc as *const u8,
349 mem::size_of::<GrantDesc>(),
350 )
351 }
352 }
353}
354
355impl DerefMut for GrantDesc {
356 fn deref_mut(&mut self) -> &mut [u8] {
357 unsafe {
358 slice::from_raw_parts_mut(
359 self as *mut GrantDesc as *mut u8,
360 mem::size_of::<GrantDesc>(),
361 )
362 }
363 }
364}
365
366#[derive(Clone, Copy, Debug, Default)]
367#[repr(C)]
368pub struct SetSighandlerData {
369 pub user_handler: usize,
370 pub excp_handler: usize,
371 pub thread_control_addr: usize,
372 pub proc_control_addr: usize,
373}
374
375impl Deref for SetSighandlerData {
376 type Target = [u8];
377 fn deref(&self) -> &[u8] {
378 unsafe { slice::from_raw_parts(self as *const Self as *const u8, mem::size_of::<Self>()) }
379 }
380}
381
382impl DerefMut for SetSighandlerData {
383 fn deref_mut(&mut self) -> &mut [u8] {
384 unsafe { slice::from_raw_parts_mut(self as *mut Self as *mut u8, mem::size_of::<Self>()) }
385 }
386}
387pub use crate::sigabi::*;
388
389#[derive(Copy, Clone, Debug, Default, PartialEq)]
391#[repr(C)]
392pub struct ProcSchemeAttrs {
393 pub pid: u32,
394 pub euid: u32,
395 pub egid: u32,
396 pub prio: u32,
397 pub debug_name: [u8; 32],
398}
399impl Deref for ProcSchemeAttrs {
400 type Target = [u8];
401 fn deref(&self) -> &[u8] {
402 unsafe { slice::from_raw_parts(self as *const Self as *const u8, mem::size_of::<Self>()) }
403 }
404}
405impl DerefMut for ProcSchemeAttrs {
406 fn deref_mut(&mut self) -> &mut [u8] {
407 unsafe {
408 slice::from_raw_parts_mut(
409 self as *mut ProcSchemeAttrs as *mut u8,
410 mem::size_of::<ProcSchemeAttrs>(),
411 )
412 }
413 }
414}
415#[derive(Copy, Clone, Debug, Default)]
416#[repr(C)]
417pub struct CtxtStsBuf {
418 pub status: usize,
419 pub excp: crate::Exception,
420}
421impl Deref for CtxtStsBuf {
422 type Target = [u8];
423 fn deref(&self) -> &[u8] {
424 unsafe { slice::from_raw_parts(self as *const Self as *const u8, mem::size_of::<Self>()) }
425 }
426}
427impl DerefMut for CtxtStsBuf {
428 fn deref_mut(&mut self) -> &mut [u8] {
429 unsafe {
430 slice::from_raw_parts_mut(
431 self as *mut CtxtStsBuf as *mut u8,
432 mem::size_of::<CtxtStsBuf>(),
433 )
434 }
435 }
436}
437
438#[derive(Copy, Clone, Debug, Default)]
439#[repr(C)]
440pub struct NewFdParams {
441 pub offset: u64,
442 pub number: usize,
443 pub flags: usize,
444 pub internal_flags: u8,
445}
446
447#[repr(u8)]
448#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
449pub enum GlobalSchemes {
450 Debug = 1,
451 Event = 2,
452 Memory = 3,
453 Pipe = 4,
454 Serio = 5,
455 Irq = 6,
456 Time = 7,
457 Sys = 8,
458 Proc = 9,
459 Acpi = 10,
460 Dtb = 11,
461}
462impl GlobalSchemes {
463 pub fn try_from_raw(raw: u8) -> Option<Self> {
464 match raw {
465 1 => Some(Self::Debug),
466 2 => Some(Self::Event),
467 3 => Some(Self::Memory),
468 4 => Some(Self::Pipe),
469 5 => Some(Self::Serio),
470 6 => Some(Self::Irq),
471 7 => Some(Self::Time),
472 8 => Some(Self::Sys),
473 9 => Some(Self::Proc),
474 10 => Some(Self::Acpi),
475 11 => Some(Self::Dtb),
476 _ => None,
477 }
478 }
479 pub fn as_str(&self) -> &'static str {
480 match self {
481 Self::Debug => "debug",
482 Self::Event => "event",
483 Self::Memory => "memory",
484 Self::Pipe => "pipe",
485 Self::Serio => "serio",
486 Self::Irq => "irq",
487 Self::Time => "time",
488 Self::Sys => "sys",
489 Self::Proc => "kernel.proc",
490 Self::Acpi => "kernel.acpi",
491 Self::Dtb => "kernel.dtb",
492 }
493 }
494}
495
496#[repr(C)]
497#[derive(Debug, Clone, Copy, Default)]
498pub struct KernelSchemeInfo {
499 pub scheme_id: u8,
500 pub fd: usize,
501}