Skip to main content

starnix_core/ptrace/
event.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use bitflags::bitflags;
6use starnix_uapi::{
7    PTRACE_EVENT_CLONE, PTRACE_EVENT_EXEC, PTRACE_EVENT_EXIT, PTRACE_EVENT_FORK,
8    PTRACE_EVENT_SECCOMP, PTRACE_EVENT_STOP, PTRACE_EVENT_VFORK, PTRACE_EVENT_VFORK_DONE,
9    PTRACE_O_EXITKILL, PTRACE_O_SUSPEND_SECCOMP, PTRACE_O_TRACECLONE, PTRACE_O_TRACEEXEC,
10    PTRACE_O_TRACEEXIT, PTRACE_O_TRACEFORK, PTRACE_O_TRACESECCOMP, PTRACE_O_TRACESYSGOOD,
11    PTRACE_O_TRACEVFORK, PTRACE_O_TRACEVFORKDONE,
12};
13
14bitflags! {
15    #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
16    #[repr(transparent)]
17    pub struct PtraceOptions: u32 {
18        const EXITKILL = PTRACE_O_EXITKILL;
19        const TRACECLONE = PTRACE_O_TRACECLONE;
20        const TRACEEXEC = PTRACE_O_TRACEEXEC;
21        const TRACEEXIT = PTRACE_O_TRACEEXIT;
22        const TRACEFORK = PTRACE_O_TRACEFORK;
23        const TRACESYSGOOD = PTRACE_O_TRACESYSGOOD;
24        const TRACEVFORK = PTRACE_O_TRACEVFORK;
25        const TRACEVFORKDONE = PTRACE_O_TRACEVFORKDONE;
26        const TRACESECCOMP = PTRACE_O_TRACESECCOMP;
27        const SUSPEND_SECCOMP = PTRACE_O_SUSPEND_SECCOMP;
28    }
29}
30
31#[repr(u32)]
32#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
33pub enum PtraceEvent {
34    #[default]
35    None = 0,
36    Stop = PTRACE_EVENT_STOP,
37    Clone = PTRACE_EVENT_CLONE,
38    Fork = PTRACE_EVENT_FORK,
39    Vfork = PTRACE_EVENT_VFORK,
40    VforkDone = PTRACE_EVENT_VFORK_DONE,
41    Exec = PTRACE_EVENT_EXEC,
42    Exit = PTRACE_EVENT_EXIT,
43    Seccomp = PTRACE_EVENT_SECCOMP,
44}
45
46impl PtraceEvent {
47    pub fn from_option(option: PtraceOptions) -> Self {
48        match option {
49            PtraceOptions::TRACECLONE => PtraceEvent::Clone,
50            PtraceOptions::TRACEFORK => PtraceEvent::Fork,
51            PtraceOptions::TRACEVFORK => PtraceEvent::Vfork,
52            PtraceOptions::TRACEVFORKDONE => PtraceEvent::VforkDone,
53            PtraceOptions::TRACEEXEC => PtraceEvent::Exec,
54            PtraceOptions::TRACEEXIT => PtraceEvent::Exit,
55            PtraceOptions::TRACESECCOMP => PtraceEvent::Seccomp,
56            _ => unreachable!("Bad ptrace event specified"),
57        }
58    }
59}
60
61/// Information about what caused a ptrace-event-stop.
62#[derive(Clone, Copy, Debug, PartialEq, Eq)]
63pub struct PtraceEventData {
64    /// The event that caused the task to stop (e.g., PTRACE_EVENT_FORK or PTRACE_EVENT_EXIT).
65    pub event: PtraceEvent,
66
67    /// The message associated with the event (e.g., tid, exit status).
68    pub msg: u64,
69}
70
71impl PtraceEventData {
72    pub fn new(option: PtraceOptions, msg: u64) -> Self {
73        Self { event: PtraceEvent::from_option(option), msg }
74    }
75    pub fn new_from_event(event: PtraceEvent, msg: u64) -> Self {
76        Self { event, msg }
77    }
78}