userspace/memory/
stack.rs

1pub use crate::info;
2pub mod arguments;
3pub mod auxiliary;
4pub mod environment;
5
6#[repr(u8)]
7#[derive(Debug, Clone, Copy)]
8pub enum Status {
9    Raw,
10    Modfied,
11}
12
13#[repr(C)]
14#[derive(Debug)]
15pub struct Stack {
16    pub former: crate::target::arch::Pointer,
17    pub latter: crate::target::arch::Pointer,
18    // pub size: usize,
19    // pub size_modified: usize,
20    pub arguments: arguments::List,
21    pub environment: environment::List,
22    pub auxiliary: auxiliary::List,
23    pub status: Status,
24}
25
26impl Stack {
27    pub fn from_pointer(stack_pointer: crate::target::arch::Pointer) -> Self {
28        let (arguments, environment_pointer) = arguments::List::from_pointer(stack_pointer);
29        let (environment, auxiliary_pointer) = environment::List::from_pointer(environment_pointer);
30        let (auxiliary, latter_pointer) = auxiliary::List::from_pointer(auxiliary_pointer);
31        // let latter_pointer = auxiliary_pointer;
32        Self {
33            former: stack_pointer,
34            latter: latter_pointer,
35            arguments,
36            environment,
37            auxiliary,
38            status: Status::Raw,
39        }
40    }
41
42    pub fn current() -> Self {
43        Self::from_pointer(crate::target::arch::Pointer::current())
44    }
45
46    pub fn print(&self) {
47        info!("--- Stack Contents ---\n");
48        info!(
49            "pub struct Stack {{
50                pub former: crate::target::arch::Pointer = {:?},
51                pub latter: crate::target::arch::Pointer = {:?},
52                pub arguments: arguments::List = {:?},
53                pub status: Status = {:?},
54            }}\n",
55            self.former, self.latter, self.arguments, self.status,
56        );
57        self.arguments.print();
58        self.environment.print();
59        self.auxiliary.print();
60        info!("---------------------\n");
61    }
62}