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// }