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