userspace/memory/
stack.rs1pub 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 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 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}