From 7bde03603149c70d85d6986f278853db90a58878 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jeremy@system76.com> Date: Sun, 21 Apr 2019 15:45:55 -0600 Subject: [PATCH] Remove va_list submodule, format --- .gitmodules | 3 - Cargo.lock | 6 +- src/cxa.rs | 4 +- src/db.rs | 10 +- src/header/dl-tls/mod.rs | 26 ++++- src/header/mod.rs | 2 +- src/header/netdb/host.rs | 2 +- src/header/netdb/mod.rs | 12 +- src/header/netinet_ip/mod.rs | 1 + src/header/sgtty/mod.rs | 6 +- src/header/stdio/mod.rs | 2 +- src/header/stdio/printf.rs | 62 +++++++--- src/header/stdio/scanf.rs | 7 +- src/header/stdlib/mod.rs | 9 +- src/header/string/mod.rs | 14 +-- src/header/sys_ioctl/redox.rs | 16 +-- src/header/unistd/mod.rs | 2 +- src/header/unistd/pathconf.rs | 4 +- src/header/wchar/mod.rs | 2 +- src/ld_so/linker.rs | 209 ++++++++++++++++++---------------- src/ld_so/start.rs | 4 +- src/ld_so/tcb.rs | 46 ++++---- src/platform/linux/mod.rs | 11 +- src/platform/pte.rs | 13 ++- src/platform/redox/mod.rs | 16 ++- src/start.rs | 4 +- va_list | 1 - 27 files changed, 271 insertions(+), 223 deletions(-) delete mode 160000 va_list diff --git a/.gitmodules b/.gitmodules index f4880e3f4..edbbe9b61 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "ralloc"] path = ralloc url = https://gitlab.redox-os.org/redox-os/ralloc.git -[submodule "va_list"] - path = va_list - url = https://gitlab.redox-os.org/redox-os/va_list-rs.git [submodule "core_io"] path = core_io url = https://gitlab.redox-os.org/redox-os/core_io.git diff --git a/Cargo.lock b/Cargo.lock index 0af490c62..493206582 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -336,7 +336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -434,7 +434,7 @@ dependencies = [ [[package]] name = "syn" -version = "0.15.30" +version = "0.15.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -578,7 +578,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum standalone-syn 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "115808f5187c07c23cb93eee49d542fae54c6e8285d3a24c6ff683fcde9243db" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)" = "66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2" +"checksum syn 0.15.32 (registry+https://github.com/rust-lang/crates.io-index)" = "846620ec526c1599c070eff393bfeeeb88a93afa2513fc3b49f1fea84cf7b0ed" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" diff --git a/src/cxa.rs b/src/cxa.rs index fa5574c47..62a47eefc 100644 --- a/src/cxa.rs +++ b/src/cxa.rs @@ -5,8 +5,8 @@ use platform::types::*; #[derive(Clone, Copy)] struct CxaAtExitFunc { //func: extern "C" fn(*mut c_void), - //arg: *mut c_void, - //dso: *mut c_void, +//arg: *mut c_void, +//dso: *mut c_void, } static mut CXA_ATEXIT_FUNCS: [Option<CxaAtExitFunc>; 32] = [None; 32]; diff --git a/src/db.rs b/src/db.rs index 67f4d75be..9c2acce19 100644 --- a/src/db.rs +++ b/src/db.rs @@ -18,10 +18,7 @@ pub struct Db<R: BufRead> { impl<R: BufRead> Db<R> { pub fn new(reader: R, separator: Separator) -> Self { - Db { - reader, - separator - } + Db { reader, separator } } pub fn read(&mut self) -> io::Result<Option<Vec<String>>> { @@ -48,9 +45,6 @@ pub type FileDb = Db<BufReader<File>>; impl FileDb { pub fn open(path: &CStr, separator: Separator) -> io::Result<Self> { let file = File::open(path, fcntl::O_RDONLY | fcntl::O_CLOEXEC)?; - Ok(Db::new( - BufReader::new(file), - separator - )) + Ok(Db::new(BufReader::new(file), separator)) } } diff --git a/src/header/dl-tls/mod.rs b/src/header/dl-tls/mod.rs index 63a00fc7b..62f67cfca 100644 --- a/src/header/dl-tls/mod.rs +++ b/src/header/dl-tls/mod.rs @@ -11,17 +11,35 @@ pub struct dl_tls_index { #[no_mangle] pub unsafe extern "C" fn __tls_get_addr(ti: *mut dl_tls_index) -> *mut c_void { - trace!("__tls_get_addr({:p}: {:#x}, {:#x})", ti, (*ti).ti_module, (*ti).ti_offset); + trace!( + "__tls_get_addr({:p}: {:#x}, {:#x})", + ti, + (*ti).ti_module, + (*ti).ti_offset + ); if let Some(tcb) = Tcb::current() { if let Some(tls) = tcb.tls() { if let Some(masters) = tcb.masters() { if let Some(master) = masters.get((*ti).ti_module as usize) { - let addr = tls.as_mut_ptr().add(master.offset + (*ti).ti_offset as usize); - trace!("__tls_get_addr({:p}: {:#x}, {:#x}) = {:p}", ti, (*ti).ti_module, (*ti).ti_offset, addr); + let addr = tls + .as_mut_ptr() + .add(master.offset + (*ti).ti_offset as usize); + trace!( + "__tls_get_addr({:p}: {:#x}, {:#x}) = {:p}", + ti, + (*ti).ti_module, + (*ti).ti_offset, + addr + ); return addr as *mut c_void; } } } } - panic!("__tls_get_addr({:p}: {:#x}, {:#x}) failed", ti, (*ti).ti_module, (*ti).ti_offset); + panic!( + "__tls_get_addr({:p}: {:#x}, {:#x}) failed", + ti, + (*ti).ti_module, + (*ti).ti_offset + ); } diff --git a/src/header/mod.rs b/src/header/mod.rs index 316433d1a..a03a7b970 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -4,9 +4,9 @@ pub mod arpa_inet; pub mod assert; pub mod ctype; pub mod dirent; -pub mod dlfcn; #[path = "dl-tls/mod.rs"] pub mod dl_tls; +pub mod dlfcn; pub mod errno; pub mod fcntl; pub mod float; diff --git a/src/header/netdb/host.rs b/src/header/netdb/host.rs index cde8a138e..2fe486e06 100644 --- a/src/header/netdb/host.rs +++ b/src/header/netdb/host.rs @@ -9,9 +9,9 @@ use header::fcntl::O_RDONLY; use header::netinet_in::in_addr; use header::sys_socket::constants::AF_INET; use header::unistd::SEEK_SET; -use platform::{Pal, Sys}; use platform::rlb::{Line, RawLineBuffer}; use platform::types::*; +use platform::{Pal, Sys}; use super::{bytes_to_box_str, hostent}; diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs index 8bfb17b16..0978bb366 100644 --- a/src/header/netdb/mod.rs +++ b/src/header/netdb/mod.rs @@ -17,7 +17,7 @@ use header::fcntl::O_RDONLY; use header::netinet_in::{in_addr, sockaddr_in, sockaddr_in6}; use header::stdlib::atoi; use header::strings::strcasecmp; -use header::sys_socket::constants::{AF_INET}; +use header::sys_socket::constants::AF_INET; use header::sys_socket::{sa_family_t, sockaddr, socklen_t}; use header::unistd::SEEK_SET; use platform; @@ -666,9 +666,9 @@ pub unsafe extern "C" fn getaddrinfo( //TODO: Use hints let mut ai_flags = hints_opt.map_or(0, |hints| hints.ai_flags); - let mut ai_family;// = hints_opt.map_or(AF_UNSPEC, |hints| hints.ai_family); + let mut ai_family; // = hints_opt.map_or(AF_UNSPEC, |hints| hints.ai_family); let ai_socktype = hints_opt.map_or(0, |hints| hints.ai_socktype); - let mut ai_protocol;// = hints_opt.map_or(0, |hints| hints.ai_protocol); + let mut ai_protocol; // = hints_opt.map_or(0, |hints| hints.ai_protocol); *res = ptr::null_mut(); @@ -677,7 +677,7 @@ pub unsafe extern "C" fn getaddrinfo( //TODO: Support other service definitions as well as AI_NUMERICSERV match str::from_utf8_unchecked(service.to_bytes()).parse::<u16>() { Ok(ok) => port = ok, - Err(_err) => () + Err(_err) => (), } } @@ -700,7 +700,7 @@ pub unsafe extern "C" fn getaddrinfo( sin_family: ai_family as sa_family_t, sin_port: htons(port), sin_addr: in_addr, - sin_zero: [0; 8] + sin_zero: [0; 8], })) as *mut sockaddr; let ai_addrlen = mem::size_of::<sockaddr_in>(); @@ -725,7 +725,7 @@ pub unsafe extern "C" fn getaddrinfo( let mut indirect = res; while !(*indirect).is_null() { - indirect=&mut (**indirect).ai_next; + indirect = &mut (**indirect).ai_next; } *indirect = Box::into_raw(addrinfo); } diff --git a/src/header/netinet_ip/mod.rs b/src/header/netinet_ip/mod.rs index e69de29bb..8b1378917 100644 --- a/src/header/netinet_ip/mod.rs +++ b/src/header/netinet_ip/mod.rs @@ -0,0 +1 @@ + diff --git a/src/header/sgtty/mod.rs b/src/header/sgtty/mod.rs index 6ffeaeb31..6d474daa5 100644 --- a/src/header/sgtty/mod.rs +++ b/src/header/sgtty/mod.rs @@ -5,10 +5,6 @@ use platform::types::*; #[no_mangle] pub extern "C" fn gtty(fd: c_int, out: *mut sgttyb) -> c_int { - eprintln!( - "unimplemented: gtty({}, {:p})", - fd, - out - ); + eprintln!("unimplemented: gtty({}, {:p})", fd, out); -1 } diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs index a3c44a6cc..bda780205 100644 --- a/src/header/stdio/mod.rs +++ b/src/header/stdio/mod.rs @@ -3,10 +3,10 @@ use alloc::borrow::{Borrow, BorrowMut}; use alloc::boxed::Box; use alloc::vec::Vec; +use core::ffi::VaList as va_list; use core::fmt::Write as WriteFmt; use core::ops::{Deref, DerefMut}; use core::{fmt, mem, ptr, slice, str}; -use core::ffi::VaList as va_list; use c_str::CStr; use fs::File; diff --git a/src/header/stdio/printf.rs b/src/header/stdio/printf.rs index 83583ddda..e41f24b30 100644 --- a/src/header/stdio/printf.rs +++ b/src/header/stdio/printf.rs @@ -1,9 +1,9 @@ use alloc::string::String; use alloc::string::ToString; use alloc::vec::Vec; +use core::ffi::VaList as va_list; use core::ops::Range; use core::{fmt, slice}; -use core::ffi::VaList as va_list; use io::{self, Write}; use platform; @@ -34,7 +34,7 @@ enum ArgType { CharPtr, VoidPtr, IntPtr, - ArgDefault + ArgDefault, } #[derive(Clone, Copy)] @@ -51,7 +51,7 @@ union VaArg { char_ptr: *const c_char, void_ptr: *const c_void, int_ptr: *mut c_int, - arg_default: usize + arg_default: usize, } struct BufferedVaList<'a> { @@ -71,19 +71,45 @@ impl<'a> BufferedVaList<'a> { unsafe fn get_arg(&mut self, ty: ArgType) -> VaArg { match ty { - ArgType::Byte => VaArg { byte: self.list.arg::<c_char>() }, - ArgType::Short => VaArg { short: self.list.arg::<c_short>() }, - ArgType::Int => VaArg { int: self.list.arg::<c_int>() }, - ArgType::Long => VaArg { long: self.list.arg::<c_long>() }, - ArgType::LongLong => VaArg { longlong: self.list.arg::<c_longlong>() }, - ArgType::PtrDiff => VaArg { ptrdiff: self.list.arg::<ptrdiff_t>() }, - ArgType::Size => VaArg { size: self.list.arg::<ssize_t>() }, - ArgType::IntMax => VaArg { intmax: self.list.arg::<intmax_t>() }, - ArgType::Double => VaArg { double: self.list.arg::<c_double>() }, - ArgType::CharPtr => VaArg { char_ptr: self.list.arg::<*const c_char>() }, - ArgType::VoidPtr => VaArg { void_ptr: self.list.arg::<*const c_void>() }, - ArgType::IntPtr => VaArg { int_ptr: self.list.arg::<*mut c_int>() }, - ArgType::ArgDefault => VaArg { arg_default: self.list.arg::<usize>() } + ArgType::Byte => VaArg { + byte: self.list.arg::<c_char>(), + }, + ArgType::Short => VaArg { + short: self.list.arg::<c_short>(), + }, + ArgType::Int => VaArg { + int: self.list.arg::<c_int>(), + }, + ArgType::Long => VaArg { + long: self.list.arg::<c_long>(), + }, + ArgType::LongLong => VaArg { + longlong: self.list.arg::<c_longlong>(), + }, + ArgType::PtrDiff => VaArg { + ptrdiff: self.list.arg::<ptrdiff_t>(), + }, + ArgType::Size => VaArg { + size: self.list.arg::<ssize_t>(), + }, + ArgType::IntMax => VaArg { + intmax: self.list.arg::<intmax_t>(), + }, + ArgType::Double => VaArg { + double: self.list.arg::<c_double>(), + }, + ArgType::CharPtr => VaArg { + char_ptr: self.list.arg::<*const c_char>(), + }, + ArgType::VoidPtr => VaArg { + void_ptr: self.list.arg::<*const c_void>(), + }, + ArgType::IntPtr => VaArg { + int_ptr: self.list.arg::<*mut c_int>(), + }, + ArgType::ArgDefault => VaArg { + arg_default: self.list.arg::<usize>(), + }, } } @@ -425,7 +451,9 @@ unsafe fn inner_printf<W: Write>(w: W, format: *const c_char, ap: va_list) -> io IntKind::Short => fmt_int(fmt, ap.get(ArgType::Short, index).short), IntKind::Int => fmt_int(fmt, ap.get(ArgType::Int, index).int), IntKind::Long => fmt_int(fmt, ap.get(ArgType::Long, index).long), - IntKind::LongLong => fmt_int(fmt, ap.get(ArgType::LongLong, index).longlong), + IntKind::LongLong => { + fmt_int(fmt, ap.get(ArgType::LongLong, index).longlong) + } IntKind::PtrDiff => fmt_int(fmt, ap.get(ArgType::PtrDiff, index).ptrdiff), IntKind::Size => fmt_int(fmt, ap.get(ArgType::Size, index).size), IntKind::IntMax => fmt_int(fmt, ap.get(ArgType::IntMax, index).intmax), diff --git a/src/header/stdio/scanf.rs b/src/header/stdio/scanf.rs index fd7a655d0..1b7f8ddb1 100644 --- a/src/header/stdio/scanf.rs +++ b/src/header/stdio/scanf.rs @@ -1,8 +1,8 @@ use alloc::string::String; use alloc::vec::Vec; +use core::ffi::VaList as va_list; use io::Read; use platform::types::*; -use core::ffi::VaList as va_list; #[derive(PartialEq, Eq)] enum IntKind { @@ -403,7 +403,8 @@ unsafe fn inner_scanf<R: Read>( let mut ptr: Option<*mut c_char> = if ignore { None } else { Some(ap.arg()) }; // While we haven't used up all the width, and it matches - while width.map(|w| w > 0).unwrap_or(true) && !invert == matches.contains(&byte) { + while width.map(|w| w > 0).unwrap_or(true) && !invert == matches.contains(&byte) + { if let Some(ref mut ptr) = ptr { **ptr = byte as c_char; *ptr = ptr.offset(1); @@ -422,7 +423,7 @@ unsafe fn inner_scanf<R: Read>( *ptr = 0; matched += 1; } - }, + } b'n' => { if !ignore { *ap.arg::<*mut c_int>() = count as c_int; diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index 61192f605..402bbfab8 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -195,8 +195,8 @@ pub unsafe extern "C" fn calloc(nelem: size_t, elsize: size_t) -> *mut c_void { intrinsics::write_bytes(ptr as *mut u8, 0, size); } ptr - }, - None => core::ptr::null_mut() + } + None => core::ptr::null_mut(), } } @@ -632,10 +632,7 @@ pub unsafe extern "C" fn realpath(pathname: *const c_char, resolved: *mut c_char }; let len = out.len(); - let read = Sys::fpath( - *file, - &mut out[..len - 1], - ); + let read = Sys::fpath(*file, &mut out[..len - 1]); if read < 0 { return ptr::null_mut(); } diff --git a/src/header/string/mod.rs b/src/header/string/mod.rs index ec2598edb..8c8acb216 100644 --- a/src/header/string/mod.rs +++ b/src/header/string/mod.rs @@ -28,12 +28,16 @@ pub unsafe extern "C" fn memccpy( } #[no_mangle] -pub unsafe extern "C" fn memchr(haystack: *const c_void, needle: c_int, len: size_t) -> *mut c_void { +pub unsafe extern "C" fn memchr( + haystack: *const c_void, + needle: c_int, + len: size_t, +) -> *mut c_void { let haystack = slice::from_raw_parts(haystack as *const u8, len as usize); match memchr::memchr(needle as u8, haystack) { Some(index) => haystack[index..].as_ptr() as *mut c_void, - None => ptr::null_mut() + None => ptr::null_mut(), } } @@ -226,11 +230,7 @@ pub unsafe extern "C" fn strerror(errnum: c_int) -> *mut c_char { } #[no_mangle] -pub unsafe extern "C" fn strerror_r( - errnum: c_int, - buf: *mut c_char, - buflen: size_t, -) -> c_int { +pub unsafe extern "C" fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: size_t) -> c_int { let msg = strerror(errnum); let len = strlen(msg); diff --git a/src/header/sys_ioctl/redox.rs b/src/header/sys_ioctl/redox.rs index b0f0d1dd8..005a4d73a 100644 --- a/src/header/sys_ioctl/redox.rs +++ b/src/header/sys_ioctl/redox.rs @@ -31,7 +31,7 @@ fn dup_read<T>(fd: c_int, name: &str, t: &mut T) -> syscall::Result<usize> { let _ = syscall::close(dup); - res.map(|bytes| bytes/size) + res.map(|bytes| bytes / size) } fn dup_write<T>(fd: c_int, name: &str, t: &T) -> syscall::Result<usize> { @@ -45,7 +45,7 @@ fn dup_write<T>(fd: c_int, name: &str, t: &T) -> syscall::Result<usize> { let _ = syscall::close(dup); - res.map(|bytes| bytes/size) + res.map(|bytes| bytes / size) } #[no_mangle] @@ -67,7 +67,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> } else { 0 } - }, + } TCFLSH => { let queue = out as c_int; if e(dup_write(fd, "flush", &queue)) == !0 { @@ -75,7 +75,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> } else { 0 } - }, + } TIOCGPGRP => { let pgrp = &mut *(out as *mut pid_t); if e(dup_read(fd, "pgrp", pgrp)) == !0 { @@ -83,7 +83,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> } else { 0 } - }, + } TIOCSPGRP => { let pgrp = &*(out as *const pid_t); if e(dup_write(fd, "pgrp", pgrp)) == !0 { @@ -91,7 +91,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> } else { 0 } - }, + } TIOCGWINSZ => { let winsize = &mut *(out as *mut winsize); if e(dup_read(fd, "winsize", winsize)) == !0 { @@ -99,7 +99,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> } else { 0 } - }, + } TIOCSWINSZ => { let winsize = &*(out as *const winsize); if e(dup_write(fd, "winsize", winsize)) == !0 { @@ -107,7 +107,7 @@ pub unsafe extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> } else { 0 } - }, + } _ => { platform::errno = errno::EINVAL; -1 diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index 48d1ae6c6..7e2b935b5 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -558,7 +558,7 @@ pub extern "C" fn sleep(seconds: c_uint) -> c_uint { #[no_mangle] pub extern "C" fn swab(src: *const c_void, dest: *mut c_void, nbytes: ssize_t) { if nbytes <= 0 { - return + return; } let number_of_swaps = nbytes / 2; let mut offset = 0; diff --git a/src/header/unistd/pathconf.rs b/src/header/unistd/pathconf.rs index a0c308255..767d6f614 100644 --- a/src/header/unistd/pathconf.rs +++ b/src/header/unistd/pathconf.rs @@ -49,7 +49,9 @@ fn pc(name: c_int) -> c_long { _PC_SYMLINK_MAX => -1, _PC_2_SYMLINKS => 1, _ => { - unsafe { platform::errno = errno::EINVAL; } + unsafe { + platform::errno = errno::EINVAL; + } -1 } } diff --git a/src/header/wchar/mod.rs b/src/header/wchar/mod.rs index 18dd985d0..72e2a74e2 100644 --- a/src/header/wchar/mod.rs +++ b/src/header/wchar/mod.rs @@ -1,7 +1,7 @@ //! wchar implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/wchar.h.html -use core::{mem, ptr, usize}; use core::ffi::VaList as va_list; +use core::{mem, ptr, usize}; use header::stdio::*; use header::stdlib::MB_CUR_MAX; diff --git a/src/ld_so/linker.rs b/src/ld_so/linker.rs index a48e26dc2..8ed79f9bf 100644 --- a/src/ld_so/linker.rs +++ b/src/ld_so/linker.rs @@ -3,7 +3,7 @@ use alloc::collections::BTreeMap; use alloc::string::{String, ToString}; use alloc::vec::Vec; use core::{mem, ptr, slice}; -use goblin::elf::{Elf, program_header, reloc, sym}; +use goblin::elf::{program_header, reloc, sym, Elf}; use goblin::error::{Error, Result}; use c_str::CString; @@ -12,8 +12,8 @@ use header::{fcntl, sys_mman, unistd}; use io::Read; use platform::types::c_void; +use super::tcb::{Master, Tcb}; use super::PAGE_SIZE; -use super::tcb::{Tcb, Master}; #[cfg(target_os = "redox")] const PATH_SEP: char = ';'; @@ -23,7 +23,7 @@ const PATH_SEP: char = ':'; pub struct Linker { library_path: String, - objects: BTreeMap<String, Box<[u8]>> + objects: BTreeMap<String, Box<[u8]>>, } impl Linker { @@ -39,19 +39,16 @@ impl Linker { let mut data = Vec::new(); - let path_c = CString::new(path).map_err(|err| Error::Malformed( - format!("invalid path '{}': {}", path, err) - ))?; + let path_c = CString::new(path) + .map_err(|err| Error::Malformed(format!("invalid path '{}': {}", path, err)))?; { let flags = fcntl::O_RDONLY | fcntl::O_CLOEXEC; - let mut file = File::open(&path_c, flags).map_err(|err| Error::Malformed( - format!("failed to open '{}': {}", path, err) - ))?; + let mut file = File::open(&path_c, flags) + .map_err(|err| Error::Malformed(format!("failed to open '{}': {}", path, err)))?; - file.read_to_end(&mut data).map_err(|err| Error::Malformed( - format!("failed to read '{}': {}", path, err) - ))?; + file.read_to_end(&mut data) + .map_err(|err| Error::Malformed(format!("failed to read '{}': {}", path, err)))?; } self.load_data(name, data.into_boxed_slice()) @@ -64,7 +61,7 @@ impl Linker { //println!("{:#?}", elf); for library in elf.libraries.iter() { - if ! self.objects.contains_key(&library.to_string()) { + if !self.objects.contains_key(&library.to_string()) { self.load_library(library)?; } } @@ -90,9 +87,9 @@ impl Linker { println!("check {}", path); let access = unsafe { - let path_c = CString::new(path.as_bytes()).map_err(|err| Error::Malformed( - format!("invalid path '{}': {}", path, err) - ))?; + let path_c = CString::new(path.as_bytes()).map_err(|err| { + Error::Malformed(format!("invalid path '{}': {}", path, err)) + })?; // TODO: Use R_OK | X_OK unistd::access(path_c.as_ptr(), unistd::F_OK) == 0 @@ -104,9 +101,7 @@ impl Linker { } } - Err(Error::Malformed( - format!("failed to locate '{}'", name) - )) + Err(Error::Malformed(format!("failed to locate '{}'", name))) } } @@ -138,7 +133,8 @@ impl Linker { for ph in elf.program_headers.iter() { let voff = ph.p_vaddr as usize % PAGE_SIZE; let vaddr = ph.p_vaddr as usize - voff; - let vsize = ((ph.p_memsz as usize + voff + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; + let vsize = + ((ph.p_memsz as usize + voff + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; match ph.p_type { program_header::PT_LOAD => { @@ -154,15 +150,15 @@ impl Linker { } else { bounds_opt = Some((vaddr, vaddr + vsize)); } - }, + } program_header::PT_TLS => { println!(" load tls {:#x}: {:x?}", vsize, ph); tls_size += vsize; if *elf_name == primary { tls_primary += vsize; } - }, - _ => () + } + _ => (), } } match bounds_opt { @@ -182,12 +178,12 @@ impl Linker { sys_mman::PROT_READ | sys_mman::PROT_WRITE, sys_mman::MAP_ANONYMOUS | sys_mman::MAP_PRIVATE, -1, - 0 + 0, ); - if ptr as usize == !0 /* MAP_FAILED */ { - return Err(Error::Malformed( - format!("failed to map {}", elf_name) - )); + if ptr as usize == !0 + /* MAP_FAILED */ + { + return Err(Error::Malformed(format!("failed to map {}", elf_name))); } slice::from_raw_parts_mut(ptr as *mut u8, size) }; @@ -225,7 +221,7 @@ impl Linker { let mmap = match mmaps.get_mut(elf_name) { Some(some) => some, - None => continue + None => continue, }; println!("load {}", elf_name); @@ -242,9 +238,12 @@ impl Linker { let range = ph.file_range(); match object.get(range.clone()) { Some(some) => some, - None => return Err(Error::Malformed( - format!("failed to read {:?}", range) - )), + None => { + return Err(Error::Malformed(format!( + "failed to read {:?}", + range + ))) + } } }; @@ -252,19 +251,28 @@ impl Linker { let range = ph.p_vaddr as usize..ph.p_vaddr as usize + obj_data.len(); match mmap.get_mut(range.clone()) { Some(some) => some, - None => return Err(Error::Malformed( - format!("failed to write {:?}", range) - )), + None => { + return Err(Error::Malformed(format!( + "failed to write {:?}", + range + ))) + } } }; - println!(" copy {:#x}, {:#x}: {:#x}, {:#x}", vaddr, vsize, voff, obj_data.len()); + println!( + " copy {:#x}, {:#x}: {:#x}, {:#x}", + vaddr, + vsize, + voff, + obj_data.len() + ); mmap_data.copy_from_slice(obj_data); - }, + } program_header::PT_TLS => { let valign = if ph.p_align > 0 { - ((ph.p_memsz + (ph.p_align - 1))/ph.p_align) * ph.p_align + ((ph.p_memsz + (ph.p_align - 1)) / ph.p_align) * ph.p_align } else { ph.p_memsz } as usize; @@ -277,10 +285,7 @@ impl Linker { println!( " tls master {:p}, {:#x}: {:#x}, {:#x}", - tcb_master.ptr, - tcb_master.len, - tcb_master.offset, - valign, + tcb_master.ptr, tcb_master.len, tcb_master.offset, valign, ); if *elf_name == primary { @@ -293,8 +298,8 @@ impl Linker { tls_ranges.insert(elf_name, (tls_index, tcb_master.range())); tcb_masters.push(tcb_master); } - }, - _ => () + } + _ => (), } } } @@ -309,13 +314,18 @@ impl Linker { for (elf_name, elf) in elfs.iter() { let mmap = match mmaps.get_mut(elf_name) { Some(some) => some, - None => continue + None => continue, }; println!("link {}", elf_name); // Relocate - for rel in elf.dynrelas.iter().chain(elf.dynrels.iter()).chain(elf.pltrelocs.iter()) { + for rel in elf + .dynrelas + .iter() + .chain(elf.dynrels.iter()) + .chain(elf.pltrelocs.iter()) + { // println!(" rel {}: {:x?}", // reloc::r_to_str(rel.r_type, elf.header.e_machine), // rel @@ -326,13 +336,18 @@ impl Linker { let b = mmap.as_mut_ptr() as usize; let s = if rel.r_sym > 0 { - let sym = elf.dynsyms.get(rel.r_sym).ok_or(Error::Malformed( - format!("missing symbol for relocation {:?}", rel) - ))?; - - let name = elf.dynstrtab.get(sym.st_name).ok_or(Error::Malformed( - format!("missing name for symbol {:?}", sym) - ))??; + let sym = elf.dynsyms.get(rel.r_sym).ok_or(Error::Malformed(format!( + "missing symbol for relocation {:?}", + rel + )))?; + + let name = + elf.dynstrtab + .get(sym.st_name) + .ok_or(Error::Malformed(format!( + "missing name for symbol {:?}", + sym + )))??; if let Some(value) = globals.get(name) { // println!(" sym {}: {:x?} = {:#x}", name, sym, value); @@ -351,34 +366,37 @@ impl Linker { (0, 0) }; - let ptr = unsafe { - mmap.as_mut_ptr().add(rel.r_offset as usize) - }; + let ptr = unsafe { mmap.as_mut_ptr().add(rel.r_offset as usize) }; let set_u64 = |value| { // println!(" set_u64 {:#x}", value); - unsafe { *(ptr as *mut u64) = value; } + unsafe { + *(ptr as *mut u64) = value; + } }; match rel.r_type { reloc::R_X86_64_64 => { set_u64((s + a) as u64); - }, + } reloc::R_X86_64_DTPMOD64 => { set_u64(tm as u64); - }, + } reloc::R_X86_64_GLOB_DAT | reloc::R_X86_64_JUMP_SLOT => { set_u64(s as u64); - }, + } reloc::R_X86_64_RELATIVE => { set_u64((b + a) as u64); - }, + } reloc::R_X86_64_TPOFF64 => { set_u64((s + a).wrapping_sub(t) as u64); - }, + } reloc::R_X86_64_IRELATIVE => (), // Handled below _ => { - println!(" {} unsupported", reloc::r_to_str(rel.r_type, elf.header.e_machine)); + println!( + " {} unsupported", + reloc::r_to_str(rel.r_type, elf.header.e_machine) + ); } } } @@ -389,7 +407,8 @@ impl Linker { program_header::PT_LOAD => { let voff = ph.p_vaddr as usize % PAGE_SIZE; let vaddr = ph.p_vaddr as usize - voff; - let vsize = ((ph.p_memsz as usize + voff + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; + let vsize = + ((ph.p_memsz as usize + voff + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; let mut prot = 0; @@ -408,20 +427,17 @@ impl Linker { let ptr = mmap.as_mut_ptr().add(vaddr); println!(" prot {:#x}, {:#x}: {:p}, {:#x}", vaddr, vsize, ptr, prot); - sys_mman::mprotect( - ptr as *mut c_void, - vsize, - prot - ) + sys_mman::mprotect(ptr as *mut c_void, vsize, prot) }; if res < 0 { - return Err(Error::Malformed( - format!("failed to mprotect {}", elf_name) - )); + return Err(Error::Malformed(format!( + "failed to mprotect {}", + elf_name + ))); } - }, - _ => () + } + _ => (), } } } @@ -436,7 +452,7 @@ impl Linker { for (elf_name, elf) in elfs.iter() { let mmap = match mmaps.get_mut(elf_name) { Some(some) => some, - None => continue + None => continue, }; println!("entry {}", elf_name); @@ -446,7 +462,12 @@ impl Linker { } // Relocate - for rel in elf.dynrelas.iter().chain(elf.dynrels.iter()).chain(elf.pltrelocs.iter()) { + for rel in elf + .dynrelas + .iter() + .chain(elf.dynrels.iter()) + .chain(elf.pltrelocs.iter()) + { // println!(" rel {}: {:x?}", // reloc::r_to_str(rel.r_type, elf.header.e_machine), // rel @@ -456,21 +477,21 @@ impl Linker { let b = mmap.as_mut_ptr() as usize; - let ptr = unsafe { - mmap.as_mut_ptr().add(rel.r_offset as usize) - }; + let ptr = unsafe { mmap.as_mut_ptr().add(rel.r_offset as usize) }; let set_u64 = |value| { // println!(" set_u64 {:#x}", value); - unsafe { *(ptr as *mut u64) = value; } + unsafe { + *(ptr as *mut u64) = value; + } }; match rel.r_type { reloc::R_X86_64_IRELATIVE => unsafe { - let f: unsafe extern "C" fn () -> u64 = mem::transmute(b + a); + let f: unsafe extern "C" fn() -> u64 = mem::transmute(b + a); set_u64(f()); }, - _ => () + _ => (), } } @@ -480,7 +501,8 @@ impl Linker { program_header::PT_LOAD => { let voff = ph.p_vaddr as usize % PAGE_SIZE; let vaddr = ph.p_vaddr as usize - voff; - let vsize = ((ph.p_memsz as usize + voff + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; + let vsize = + ((ph.p_memsz as usize + voff + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; let mut prot = 0; @@ -499,26 +521,21 @@ impl Linker { let ptr = mmap.as_mut_ptr().add(vaddr); println!(" prot {:#x}, {:#x}: {:p}, {:#x}", vaddr, vsize, ptr, prot); - sys_mman::mprotect( - ptr as *mut c_void, - vsize, - prot - ) + sys_mman::mprotect(ptr as *mut c_void, vsize, prot) }; if res < 0 { - return Err(Error::Malformed( - format!("failed to mprotect {}", elf_name) - )); + return Err(Error::Malformed(format!( + "failed to mprotect {}", + elf_name + ))); } - }, - _ => () + } + _ => (), } } } - entry_opt.ok_or(Error::Malformed( - format!("missing entry for {}", primary) - )) + entry_opt.ok_or(Error::Malformed(format!("missing entry for {}", primary))) } } diff --git a/src/ld_so/start.rs b/src/ld_so/start.rs index 120c57967..1407639d8 100644 --- a/src/ld_so/start.rs +++ b/src/ld_so/start.rs @@ -61,7 +61,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize { if let Some(value) = parts.next() { match key { "LD_LIBRARY_PATH" => library_path = value, - _ => () + _ => (), } } } @@ -120,7 +120,7 @@ pub extern "C" fn relibc_ld_so_start(sp: &'static mut Stack) -> usize { eprintln!("ld.so: entry '{}': {:#x}", path, entry); //unistd::_exit(0); entry - }, + } Err(err) => { eprintln!("ld.so: failed to link '{}': {}", path, err); unistd::_exit(1); diff --git a/src/ld_so/tcb.rs b/src/ld_so/tcb.rs index 7bd67fea4..157876828 100644 --- a/src/ld_so/tcb.rs +++ b/src/ld_so/tcb.rs @@ -1,6 +1,6 @@ use alloc::boxed::Box; -use core::{mem, ptr, slice}; use core::ops::Range; +use core::{mem, ptr, slice}; use goblin::error::{Error, Result}; use header::sys_mman; @@ -20,10 +20,7 @@ pub struct Master { impl Master { /// The initial data for this TLS region pub unsafe fn data(&self) -> &'static [u8] { - slice::from_raw_parts( - self.ptr, - self.len - ) + slice::from_raw_parts(self.ptr, self.len) } /// The region of TLS that the master will initialize @@ -56,14 +53,17 @@ impl Tcb { let tcb_ptr = tcb_page.as_mut_ptr() as *mut Self; // println!("New TCB: {:p}", tcb_ptr); - ptr::write(tcb_ptr, Self { - tls_end: tls.as_mut_ptr().add(tls.len()), - tls_len: tls.len(), - tcb_ptr: tcb_ptr, - tcb_len: tcb_page.len(), - masters_ptr: ptr::null_mut(), - masters_len: 0, - }); + ptr::write( + tcb_ptr, + Self { + tls_end: tls.as_mut_ptr().add(tls.len()), + tls_len: tls.len(), + tcb_ptr: tcb_ptr, + tcb_len: tcb_page.len(), + masters_ptr: ptr::null_mut(), + masters_len: 0, + }, + ); Ok(&mut *tcb_ptr) } @@ -86,7 +86,7 @@ impl Tcb { } else { Some(slice::from_raw_parts_mut( self.tls_end.offset(-(self.tls_len as isize)), - self.tls_len + self.tls_len, )) } } @@ -98,7 +98,7 @@ impl Tcb { } else { Some(slice::from_raw_parts_mut( self.masters_ptr, - self.masters_len / mem::size_of::<Master>() + self.masters_len / mem::size_of::<Master>(), )) } } @@ -121,9 +121,7 @@ impl Tcb { tls_data.copy_from_slice(data); } else { - return Err(Error::Malformed( - format!("failed to copy tls master {}", i) - )); + return Err(Error::Malformed(format!("failed to copy tls master {}", i))); } } } @@ -152,12 +150,12 @@ impl Tcb { sys_mman::PROT_READ | sys_mman::PROT_WRITE, sys_mman::MAP_ANONYMOUS | sys_mman::MAP_PRIVATE, -1, - 0 + 0, ); - if ptr as usize == !0 /* MAP_FAILED */ { - return Err(Error::Malformed( - format!("failed to map tls") - )); + if ptr as usize == !0 + /* MAP_FAILED */ + { + return Err(Error::Malformed(format!("failed to map tls"))); } Ok(slice::from_raw_parts_mut(ptr as *mut u8, size)) } @@ -180,7 +178,7 @@ impl Tcb { Ok(( tls, //TODO: Consider allocating TCB as part of TLS - slice::from_raw_parts_mut(tcb_addr as *mut u8, PAGE_SIZE) + slice::from_raw_parts_mut(tcb_addr as *mut u8, PAGE_SIZE), )) } diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index c3018d25a..fcd1f3b13 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -193,10 +193,7 @@ impl Pal for Sys { write!(proc_path, "{}", fildes).unwrap(); proc_path.push(0); - Self::readlink( - CStr::from_bytes_with_nul(&proc_path).unwrap(), - out - ) + Self::readlink(CStr::from_bytes_with_nul(&proc_path).unwrap(), out) } fn fsync(fildes: c_int) -> c_int { @@ -329,11 +326,7 @@ impl Pal for Sys { #[cfg(target_arch = "x86_64")] unsafe fn pte_clone(stack: *mut usize) -> pid_t { - let flags = - CLONE_VM | - CLONE_FS | - CLONE_FILES | - CLONE_SIGHAND; + let flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND; let pid; asm!(" # Call clone syscall diff --git a/src/platform/pte.rs b/src/platform/pte.rs index 3cf3e7e06..cdbc60b64 100644 --- a/src/platform/pte.rs +++ b/src/platform/pte.rs @@ -7,7 +7,7 @@ use core::{intrinsics, ptr}; use header::sys_mman; use header::time::timespec; -use ld_so::tcb::{Tcb, Master}; +use ld_so::tcb::{Master, Tcb}; use mutex::{FUTEX_WAIT, FUTEX_WAKE}; use platform::types::{c_int, c_uint, c_void, pid_t, size_t}; use platform::{Pal, Sys}; @@ -67,11 +67,11 @@ unsafe extern "C" fn pte_osThreadShim( mutex: pte_osMutexHandle, tls_size: usize, tls_masters_ptr: *mut Master, - tls_masters_len: usize + tls_masters_len: usize, ) { // The kernel allocated TLS does not have masters set, so do not attempt to copy it. // It will be copied by the kernel. - if ! tls_masters_ptr.is_null() { + if !tls_masters_ptr.is_null() { let tcb = Tcb::new(tls_size).unwrap(); tcb.masters_ptr = tls_masters_ptr; tcb.masters_len = tls_masters_len; @@ -107,7 +107,7 @@ pub unsafe extern "C" fn pte_osThreadCreate( sys_mman::PROT_READ | sys_mman::PROT_WRITE, sys_mman::MAP_SHARED | sys_mman::MAP_ANONYMOUS, -1, - 0 + 0, ); if stack_base as isize == -1 { return PTE_OS_GENERAL_FAILURE; @@ -154,7 +154,10 @@ pub unsafe extern "C" fn pte_osThreadCreate( if pid_stacks.is_none() { pid_stacks = Some(BTreeMap::new()); } - pid_stacks.as_mut().unwrap().insert(id, (stack_base, stack_size)); + pid_stacks + .as_mut() + .unwrap() + .insert(id, (stack_base, stack_size)); pte_osMutexUnlock(&mut pid_stacks_lock); *ppte_osThreadHandle = id; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index a2dfa9667..a6092cc7a 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -765,6 +765,11 @@ impl Pal for Sys { time.tv_nsec -= 1000000000; } + // Teehee + if timeout == 0 { + time.tv_sec += 1; + } + if timeout_file.write(&time).is_err() { return -1; } @@ -817,12 +822,11 @@ impl Pal for Sys { #[cfg(target_arch = "x86_64")] unsafe fn pte_clone(stack: *mut usize) -> pid_t { - let flags = - syscall::CLONE_VM | - syscall::CLONE_FS | - syscall::CLONE_FILES | - syscall::CLONE_SIGHAND | - syscall::CLONE_STACK; + let flags = syscall::CLONE_VM + | syscall::CLONE_FS + | syscall::CLONE_FILES + | syscall::CLONE_SIGHAND + | syscall::CLONE_STACK; let pid; asm!(" # Call clone syscall diff --git a/src/start.rs b/src/start.rs index 79c22d8e7..af8477bcd 100644 --- a/src/start.rs +++ b/src/start.rs @@ -3,8 +3,8 @@ use core::{intrinsics, ptr}; use header::{stdio, stdlib}; use platform; -use platform::{Pal, Sys}; use platform::types::*; +use platform::{Pal, Sys}; #[repr(C)] pub struct Stack { @@ -49,7 +49,7 @@ unsafe fn copy_string_array(array: *const *const c_char, len: usize) -> Vec<*mut // other. This will test that the current system is compatible with the current binary #[no_mangle] pub unsafe fn relibc_verify_host() { - if ! Sys::verify() { + if !Sys::verify() { intrinsics::abort(); } } diff --git a/va_list b/va_list deleted file mode 160000 index 1e7a8b6b6..000000000 --- a/va_list +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1e7a8b6b6f8171caab6c8c531ee9f1983bc2ebe0 -- GitLab