userspace/memory/stack/
auxiliary.rs

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