obkrnl/proc/
process.rs

1use super::{ProcAbi, ProcEvents};
2use crate::event::EventSet;
3use alloc::sync::Arc;
4use core::sync::atomic::{AtomicUsize, Ordering};
5
6/// Implementation of `proc` structure.
7pub struct Proc {
8    abi: Arc<dyn ProcAbi>, // p_sysent
9    pager: AtomicUsize,
10}
11
12impl Proc {
13    /// See `proc_init` and `proc_ctor` on the Orbis for a reference.
14    ///
15    /// # Reference offsets
16    /// | Version | Offset              |
17    /// |---------|---------------------|
18    /// |PS4 11.00|0x375970 and 0x3755D0|
19    pub fn new(abi: Arc<dyn ProcAbi>, events: &Arc<EventSet<ProcEvents>>) -> Arc<Self> {
20        let mut proc = Self {
21            abi,
22            pager: AtomicUsize::new(0),
23        };
24
25        // Trigger process_init event.
26        let mut et = events.trigger();
27
28        for h in et.select(|s| &s.process_init) {
29            h(&mut proc);
30        }
31
32        // Trigger process_ctor event.
33        let proc = Arc::new(proc);
34        let weak = Arc::downgrade(&proc);
35
36        for h in et.select(|s| &s.process_ctor) {
37            h(&weak);
38        }
39
40        drop(et);
41
42        todo!()
43    }
44
45    /// This function does not do anything except initialize the struct memory. It is the caller
46    /// responsibility to configure the process after this so it have a proper states and trigger
47    /// necessary events.
48    ///
49    /// # Context safety
50    /// This function does not require a CPU context.
51    pub fn new_bare(abi: Arc<dyn ProcAbi>) -> Self {
52        Self {
53            abi,
54            pager: AtomicUsize::new(0),
55        }
56    }
57
58    pub fn abi(&self) -> &Arc<dyn ProcAbi> {
59        &self.abi
60    }
61
62    pub fn pager(&self) -> usize {
63        self.pager.load(Ordering::Relaxed)
64    }
65}