From d3a8b67604b8de75de14fcc72b060406ee1b5131 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Tue, 14 Nov 2023 11:51:31 +0200 Subject: [PATCH] alnyan/yggdrasil: change how args are passed from the kernel --- library/std/src/sys/yggdrasil/args.rs | 69 +++++++++++++++---------- library/std/src/sys/yggdrasil/fs/mod.rs | 3 +- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/library/std/src/sys/yggdrasil/args.rs b/library/std/src/sys/yggdrasil/args.rs index d502e6c0264..184f9080ab7 100644 --- a/library/std/src/sys/yggdrasil/args.rs +++ b/library/std/src/sys/yggdrasil/args.rs @@ -1,5 +1,6 @@ use crate::ffi::OsString; use crate::fmt; +use crate::mem::size_of; use crate::str::FromStr; #[allow(dead_code)] @@ -12,15 +13,10 @@ pub struct Args { // Argument structure layout: // -// 0x000: args len -// 0x008: arg ptr 0 -// 0x010: arg len 0 -// 0x018: arg ptr 1 -// 0x020: arg len 1 -// ... -// .....: arg data 0 -// .....: arg data 1 +// 0x000: args pointer +// 0x008: envs pointer static mut ARGS: usize = 0; +static mut ENVS: usize = 0; pub fn args() -> Args { let base = unsafe { ARGS }; @@ -31,12 +27,33 @@ pub fn args() -> Args { let len = unsafe { #[allow(fuzzy_provenance_casts)] - (base as *mut usize).read() + (base as *const usize).read() }; Args { base, len, index: 0 } } +impl Args { + const fn item(base: usize, index: usize) -> usize { + base + (/* array len */1 + /* pair */ 2 * index) * size_of::() + } + + fn get(&self, index: usize) -> &'static str { + assert!(index < self.len); + let len = unsafe { + #[allow(fuzzy_provenance_casts)] + (Self::item(self.base, index) as *const usize).read() + }; + let ptr = unsafe { + #[allow(fuzzy_provenance_casts)] + ((Self::item(self.base, index) + size_of::()) as *const *const u8).read() + }; + let slice = unsafe { core::slice::from_raw_parts(ptr, len) }; + + core::str::from_utf8(slice).unwrap() + } +} + impl fmt::Debug for Args { fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result { todo!() @@ -51,26 +68,12 @@ impl Iterator for Args { return None; } - let ptr_ptr_addr = self.base + (1 + self.index * 2) * 8; - let arg_ptr = unsafe { - #[allow(fuzzy_provenance_casts)] - (ptr_ptr_addr as *mut usize).read() - }; - let arg_len = unsafe { - #[allow(fuzzy_provenance_casts)] - ((ptr_ptr_addr + 8) as *mut usize).read() - }; - - let slice = unsafe { - #[allow(fuzzy_provenance_casts)] - crate::slice::from_raw_parts(arg_ptr as *const u8, arg_len) - }; - let arg_str = crate::str::from_utf8(slice).unwrap(); - let arg_os_string = OsString::from_str(arg_str).unwrap(); - + let str = self.get(self.index); self.index += 1; - Some(arg_os_string) + let os_str = OsString::from_str(str).unwrap(); + + Some(os_str) } } @@ -87,5 +90,15 @@ impl DoubleEndedIterator for Args { } pub unsafe fn init(program_arg: usize) { - ARGS = program_arg; + #[repr(C)] + struct Header { + args_ptr: usize, + envs_ptr: usize, + }; + + #[allow(fuzzy_provenance_casts)] + let hdr = program_arg as *const Header; + + ARGS = (*hdr).args_ptr; + ENVS = (*hdr).envs_ptr; } diff --git a/library/std/src/sys/yggdrasil/fs/mod.rs b/library/std/src/sys/yggdrasil/fs/mod.rs index bbeb1348e36..74a652fd831 100644 --- a/library/std/src/sys/yggdrasil/fs/mod.rs +++ b/library/std/src/sys/yggdrasil/fs/mod.rs @@ -88,7 +88,8 @@ impl FileType { } pub fn is_symlink(&self) -> bool { - todo!() + // TODO: symlinks NYI + false } }