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}