userspace/memory/stack/
auxiliary.rs

1pub mod entry;
2pub use entry::*;
3pub mod atype;
4
5pub use atype::Type;
6pub use atype::TypeTrait;
7
8#[repr(C)]
9#[derive(Debug)]
10pub struct List {
11    pub counter: usize,
12    pub former: *mut Entry,
13    pub latter: *mut Entry,
14}
15
16impl Default for List {
17    fn default() -> List {
18        List {
19            counter: 0,
20            former: core::ptr::null_mut(),
21            latter: core::ptr::null_mut(),
22        }
23    }
24}
25
26impl List {
27    #[rustfmt::skip]
28    pub fn from_pointer(auxiliary_pointer: crate::target::arch::Pointer) -> (List, crate::target::arch::Pointer) {
29        let auxiliary_pointer: *mut crate::target::arch::PointerType = auxiliary_pointer.0 as *mut crate::target::arch::PointerType;
30
31        let mut counter = 0;
32        unsafe {
33            loop {
34                if auxiliary_pointer.add(counter).is_null() {
35                    break;
36                }
37                let key_pointer = auxiliary_pointer.add(counter);
38                let key_pointer = key_pointer as *mut usize;
39                let value_pointer = key_pointer.add(1) as *mut u8;
40                counter += 1;
41                let pair = Type::from_pair(key_pointer, value_pointer);
42                if pair.is_null() {
43                    break
44                }
45            }
46        }
47
48        crate::info!("done counting\n");
49
50        let latter_pointer = unsafe { (auxiliary_pointer as crate::target::arch::PointerType).add(1 + counter) };
51
52        if counter == 0 {
53            return (List::default(), crate::target::arch::Pointer(latter_pointer));
54        }
55
56        let list_pointer = crate::memory::alloc::<Entry>(counter);
57
58        unsafe {
59            // preenche cada Entry in-place
60            for a in 0..counter {
61                let entry_pointer = auxiliary_pointer.add(a) as crate::target::arch::PointerType;
62                let entry = Entry::from_pointer(crate::target::arch::Pointer(entry_pointer));
63                core::ptr::write(list_pointer.add(a), entry);
64            }
65            // liga prev/next
66            for a in 0..counter {
67                let entry = list_pointer.add(a);
68                (*entry).prev = if a == 0 { core::ptr::null_mut() } else { list_pointer.add(a - 1) };
69                (*entry).next = if a + 1 == counter { core::ptr::null_mut() } else { list_pointer.add(a + 1) };
70            }
71        }
72
73        let list = List {
74            counter,
75            former: list_pointer,
76            latter: unsafe { list_pointer.add(counter - 1) },
77        };
78
79        (list, crate::target::arch::Pointer(latter_pointer))
80    }
81
82    pub fn print(&self) {
83        crate::info!("Auxiliary!!! {{\n");
84        for a in 0..self.counter {
85            if let Some(e) = self.get(a) {
86                crate::info!("\t{:?} @ ", unsafe {
87                    crate::target::arch::Pointer(
88                        self.former.add(a) as crate::target::arch::PointerType
89                    )
90                },);
91                crate::info!("{:?}\n", e);
92            }
93        }
94        crate::info!("}} Auxiliary \n");
95    }
96
97    pub fn print_arguments(&self) {
98        crate::info!("Auxiliary count: {}\n", self.counter);
99        for a in 0..self.counter {
100            if let Some(entry) = self.get(a) {
101                // Assumindo Entry tem campo `value: *crate::target::arch::PointerType` ou similar; ajustar conforme Entry real.
102                // unsafe {
103                // se Entry tiver método para converter a string, use-o aqui
104                crate::info!("Arg {}: '{:?}'", a, entry.pointer);
105                // }
106            }
107        }
108    }
109
110    pub fn get(&self, index: usize) -> Option<&Entry> {
111        if index >= self.counter || self.former.is_null() {
112            return None;
113        }
114        unsafe { Some(&*self.former.add(index)) }
115    }
116
117    pub fn get_mut(&mut self, index: usize) -> Option<&mut Entry> {
118        if index >= self.counter || self.former.is_null() {
119            return None;
120        }
121        unsafe { Some(&mut *self.former.add(index)) }
122    }
123
124    pub fn len(&self) -> usize {
125        self.counter
126    }
127
128    pub fn is_empty(&self) -> bool {
129        self.counter == 0
130    }
131}
132
133pub struct Iter<'l> {
134    list: &'l List,
135    index: usize,
136}
137
138impl Drop for List {
139    fn drop(&mut self) {
140        if !self.former.is_null() && self.counter > 0 {
141            unsafe {
142                // primeiro dropar cada Entry in-place (isso chama Drop de Entry, se houver)
143                for a in 0..self.counter {
144                    let entry_ptr = self.former.add(a);
145                    core::ptr::drop_in_place(entry_ptr);
146                }
147
148                // desaloca o bloco que foi alocado por alloc
149                let total_size = core::mem::size_of::<Entry>() * self.counter as usize;
150                let aligned_size =
151                    (total_size + crate::memory::page::SIZE - 1) & !(crate::memory::page::SIZE - 1);
152
153                let _ = crate::target::os::syscall::munmap(self.former as *mut u8, aligned_size);
154                // opcional: limpar para evitar double-drop
155                self.former = core::ptr::null_mut();
156                self.latter = core::ptr::null_mut();
157                self.counter = 0;
158            }
159        }
160    }
161}
162
163impl<'l> Iterator for Iter<'l> {
164    type Item = &'l Entry;
165
166    fn next(&mut self) -> Option<Self::Item> {
167        if self.index >= self.list.counter as usize {
168            return None;
169        }
170        let item = self.list.get(self.index);
171        self.index += 1;
172        item
173    }
174}
175
176// pub fn from_pointer(auxiliary_pointer: crate::target::arch::Pointer) -> Self {
177
178//         crate::info!("Environment count: {:?}\n\n", counter);
179
180//         if counter == 0 {
181//             return Self::default();
182//         }
183
184//         // Allocate memory using mmap
185//         let entries_ptr = unsafe {
186//             let size = core::mem::size_of::<Entry<'e>>() * counter;
187
188//             // Align size to page boundary
189//             let page_size = 4096;
190//             let aligned_size = (size + page_size - 1) & !(page_size - 1);
191
192//             // Define mmap constants locally since they're not accessible
193//             const PROT_READ: i32 = 0x1;
194//             const PROT_WRITE: i32 = 0x2;
195//             const MAP_PRIVATE: i32 = 0x02;
196//             const MAP_ANONYMOUS: i32 = 0x20;
197
198//             let result = memory::mmap::mmap(
199//                 ptr::null_mut(),
200//                 aligned_size,
201//                 PROT_READ | PROT_WRITE,
202//                 MAP_PRIVATE | MAP_ANONYMOUS,
203//                 -1,
204//                 0,
205//             );
206
207//             match result {
208//                 Ok(ptr) => ptr as *mut Entry<'e>,
209//                 Err(_) => {
210//                     // Allocation failed, return default vector
211//                     crate::info!("Failed to allocate memory for environment vector\n");
212//                     return Self::default();
213//                 }
214//             }
215//         };
216
217//         // Create entries from the environment pointers
218//         for i in 0..counter {
219//             unsafe {
220//                 let env_ptr = auxiliary_pointer.add(i);
221//                 let entry = Entry::from_pointer(env_ptr, i);
222//                 ptr::write(entries_ptr.add(i), entry);
223//                 // crate::info!("Env {}: {:?}\n", i, (*entries_ptr.add(i)).value);
224//             }
225//         }
226
227//         // Move past the environment array and the NULL terminator
228//         let next_pointer = unsafe { auxiliary_pointer.add(counter + 1) };
229
230//         let environment = Self {
231//             counter,
232//             entries: entries_ptr,
233//         };
234
235//         environment
236//     }
237
238// pub mod atype;
239// pub mod entry;
240
241// pub use atype::Type;
242// pub use entry::*;
243
244// use human::info;
245
246// use core::crate::target::arch::x86_64;
247
248// #[repr(C)]
249// #[derive(Debug, Clone, Copy)]
250// pub struct Vector {
251//     pub pointer: crate::target::arch::Pointer,
252//     pub counter: Option<usize>,
253//     pub entries: *mut Entry,
254// }
255
256// impl Default for Vector {
257//     fn default() -> Self {
258//         Self {
259//             counter: None,
260//             entries: 0x0 as *mut Entry,
261//         }
262//     }
263// }
264
265// impl Vector {
266//     pub fn from_pointer(auxv_pointer: crate::target::arch::Pointer) -> Self {
267//         Self::default()
268//     }
269
270//     pub fn new(entries: *mut Entry) -> Self {
271//         Self {
272//             entries,
273//             counter: None,
274//         }
275//     }
276
277//     pub fn counter(&mut self) -> usize {
278//         if let Some(counter) = self.counter {
279//             return counter;
280//         }
281
282//         let mut counter = 0;
283//         let mut auxv = self.entries;
284//         loop {
285//             let auxv_entry = unsafe { *auxv.offset(counter as isize) };
286
287//             if auxv_entry.atype == 0 {
288//                 break;
289//             }
290
291//             counter += 1;
292//         }
293
294//         self.counter = Some(counter);
295//         counter
296//     }
297
298//     pub fn get_by_index(&mut self, index: usize) -> Option<*mut Entry> {
299//         if index < self.counter() {
300//             return Some(unsafe { self.entries.offset(index as isize) });
301//         }
302//         None
303//     }
304
305//     pub fn get_by_type_id(&mut self, atype: usize) -> Option<*mut Entry> {
306//         for av in 0..self.counter() {
307//             let entry = unsafe { self.entries.offset(av as isize) };
308
309//             if (unsafe { *entry }).atype == atype {
310//                 return Some(entry);
311//             }
312//         }
313//         None
314//     }
315
316//     pub fn get_by_type(&mut self, atype: Type) -> Option<*mut Entry> {
317//         self.get_by_type_id(atype.to())
318//     }
319
320//     pub fn set_by_type_id(&mut self, atype: usize, value: usize) {
321//         if let Some(entry) = self.get_by_type_id(atype) {
322//             unsafe { (*entry).value = value };
323//         }
324//     }
325
326//     pub fn set_by_type(&mut self, atype: Type, value: usize) {
327//         self.set_by_type_id(atype.to(), value);
328//     }
329
330//     pub fn print(self) {
331//         crate::info!("tobeaprint");
332//         return ();
333//         let counter = self.counter();
334
335//         (0..counter).for_each(|av| {
336//             let auxv_entry = unsafe { self.entries.offset(av as isize) };
337
338//             let auxv_type = unsafe { Type::from((*auxv_entry).atype) as u64 };
339//             crate::info!("Auxv: {} = ", auxv_type);
340//             if !unsafe { ((*auxv_entry).value as *const u8).is_null() } {
341//                 // crate::info!(auxv_entry.value as *const u8);
342//             } else {
343//                 crate::info!("NULL");
344//             }
345//             crate::info!("'\n");
346//         });
347
348//         crate::info!("auxv at: {} \n", self.pointer.0 as u64);
349//         let mut av = 0;
350//         unsafe {
351//             while !self.entries.offset(av).is_null() && (*self.entries.offset(av)).atype != 0 {
352//                 let auxv_entry = *self.entries.offset(av);
353
354//                 let a = Type::from(auxv_entry.atype).as_str();
355//                 let b = auxv_entry.atype as u64;
356//                 crate::info!("\tAuxv: {} ({}) = ", a, b);
357
358//                 if !(auxv_entry.value as *const u8).is_null() {
359//                     let s = crate::misc::as_str(auxv_entry.value as *const u8);
360//                     match auxv_entry.atype {
361//                         31 => crate::info!("{}", s),
362//                         _ => crate::info!("{}", auxv_entry.value as u64),
363//                     }
364//                 } else {
365//                     crate::info!("NULL");
366//                 }
367//                 crate::info!("'\n");
368//                 av += 1;
369//             }
370//         }
371//         crate::info!("\n=======\nAuxvCount={};\n=======\n", av as u64);
372//     }
373// }