diff options
| author | Valentin Popov <valentin@popov.link> | 2024-07-19 15:37:58 +0300 | 
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2024-07-19 15:37:58 +0300 | 
| commit | a990de90fe41456a23e58bd087d2f107d321f3a1 (patch) | |
| tree | 15afc392522a9e85dc3332235e311b7d39352ea9 /vendor/rustix/src/backend/linux_raw/param | |
| parent | 3d48cd3f81164bbfc1a755dc1d4a9a02f98c8ddd (diff) | |
| download | fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.tar.xz fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.zip  | |
Deleted vendor folder
Diffstat (limited to 'vendor/rustix/src/backend/linux_raw/param')
| -rw-r--r-- | vendor/rustix/src/backend/linux_raw/param/auxv.rs | 507 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/linux_raw/param/init.rs | 171 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs | 175 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/linux_raw/param/mod.rs | 15 | 
4 files changed, 0 insertions, 868 deletions
diff --git a/vendor/rustix/src/backend/linux_raw/param/auxv.rs b/vendor/rustix/src/backend/linux_raw/param/auxv.rs deleted file mode 100644 index b9ac27e..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/auxv.rs +++ /dev/null @@ -1,507 +0,0 @@ -//! Linux auxv support. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::fd::OwnedFd; -#[cfg(feature = "param")] -use crate::ffi::CStr; -use crate::fs::{Mode, OFlags}; -use crate::utils::{as_ptr, check_raw_pointer}; -#[cfg(feature = "alloc")] -use alloc::vec::Vec; -use core::mem::size_of; -use core::ptr::{null_mut, read_unaligned, NonNull}; -#[cfg(feature = "runtime")] -use core::sync::atomic::AtomicU8; -use core::sync::atomic::Ordering::Relaxed; -use core::sync::atomic::{AtomicPtr, AtomicUsize}; -use linux_raw_sys::elf::*; -use linux_raw_sys::general::{ -    AT_BASE, AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, -}; -#[cfg(feature = "runtime")] -use linux_raw_sys::general::{ -    AT_EGID, AT_ENTRY, AT_EUID, AT_GID, AT_PHDR, AT_PHENT, AT_PHNUM, AT_RANDOM, AT_SECURE, AT_UID, -}; - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { -    let mut page_size = PAGE_SIZE.load(Relaxed); - -    if page_size == 0 { -        init_auxv(); -        page_size = PAGE_SIZE.load(Relaxed); -    } - -    page_size -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { -    let mut ticks = CLOCK_TICKS_PER_SECOND.load(Relaxed); - -    if ticks == 0 { -        init_auxv(); -        ticks = CLOCK_TICKS_PER_SECOND.load(Relaxed); -    } - -    ticks as u64 -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { -    let mut hwcap = HWCAP.load(Relaxed); -    let mut hwcap2 = HWCAP2.load(Relaxed); - -    if hwcap == 0 || hwcap2 == 0 { -        init_auxv(); -        hwcap = HWCAP.load(Relaxed); -        hwcap2 = HWCAP2.load(Relaxed); -    } - -    (hwcap, hwcap2) -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { -    let mut execfn = EXECFN.load(Relaxed); - -    if execfn.is_null() { -        init_auxv(); -        execfn = EXECFN.load(Relaxed); -    } - -    // SAFETY: We assume the `AT_EXECFN` value provided by the kernel is a -    // valid pointer to a valid NUL-terminated array of bytes. -    unsafe { CStr::from_ptr(execfn.cast()) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { -    let mut secure = SECURE.load(Relaxed); - -    // 0 means not initialized yet. -    if secure == 0 { -        init_auxv(); -        secure = SECURE.load(Relaxed); -    } - -    // 0 means not present. Libc `getauxval(AT_SECURE)` would return 0. -    // 1 means not in secure mode. -    // 2 means in secure mode. -    secure > 1 -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { -    let mut phdr = PHDR.load(Relaxed); -    let mut phent = PHENT.load(Relaxed); -    let mut phnum = PHNUM.load(Relaxed); - -    if phdr.is_null() || phnum == 0 { -        init_auxv(); -        phdr = PHDR.load(Relaxed); -        phent = PHENT.load(Relaxed); -        phnum = PHNUM.load(Relaxed); -    } - -    (phdr.cast(), phent, phnum) -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { -    let mut ehdr = SYSINFO_EHDR.load(Relaxed); - -    if ehdr.is_null() { -        init_auxv(); -        ehdr = SYSINFO_EHDR.load(Relaxed); -    } - -    ehdr -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { -    let mut entry = ENTRY.load(Relaxed); - -    if entry == 0 { -        init_auxv(); -        entry = ENTRY.load(Relaxed); -    } - -    entry -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn random() -> *const [u8; 16] { -    let mut random = RANDOM.load(Relaxed); - -    if random.is_null() { -        init_auxv(); -        random = RANDOM.load(Relaxed); -    } - -    random -} - -static PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); -static CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); -static HWCAP: AtomicUsize = AtomicUsize::new(0); -static HWCAP2: AtomicUsize = AtomicUsize::new(0); -static EXECFN: AtomicPtr<c::c_char> = AtomicPtr::new(null_mut()); -static SYSINFO_EHDR: AtomicPtr<Elf_Ehdr> = AtomicPtr::new(null_mut()); -#[cfg(feature = "runtime")] -static SECURE: AtomicU8 = AtomicU8::new(0); -#[cfg(feature = "runtime")] -static PHDR: AtomicPtr<Elf_Phdr> = AtomicPtr::new(null_mut()); -#[cfg(feature = "runtime")] -static PHENT: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static PHNUM: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static ENTRY: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static RANDOM: AtomicPtr<[u8; 16]> = AtomicPtr::new(null_mut()); - -#[cfg(feature = "alloc")] -fn pr_get_auxv() -> crate::io::Result<Vec<u8>> { -    use super::super::conv::{c_int, pass_usize, ret_usize}; -    const PR_GET_AUXV: c::c_int = 0x4155_5856; -    let mut buffer = alloc::vec![0u8; 512]; -    let len = unsafe { -        ret_usize(syscall_always_asm!( -            __NR_prctl, -            c_int(PR_GET_AUXV), -            buffer.as_ptr(), -            pass_usize(buffer.len()), -            pass_usize(0), -            pass_usize(0) -        ))? -    }; -    if len <= buffer.len() { -        buffer.truncate(len); -        return Ok(buffer); -    } -    buffer.resize(len, 0); -    let len = unsafe { -        ret_usize(syscall_always_asm!( -            __NR_prctl, -            c_int(PR_GET_AUXV), -            buffer.as_ptr(), -            pass_usize(buffer.len()), -            pass_usize(0), -            pass_usize(0) -        ))? -    }; -    assert_eq!(len, buffer.len()); -    return Ok(buffer); -} - -/// If we don't have "use-explicitly-provided-auxv" or "use-libc-auxv", we -/// read the aux vector via the `prctl` `PR_GET_AUXV`, with a fallback to -/// /proc/self/auxv for kernels that don't support `PR_GET_AUXV`. -#[cold] -fn init_auxv() { -    #[cfg(feature = "alloc")] -    { -        match pr_get_auxv() { -            Ok(buffer) => { -                // SAFETY: We assume the kernel returns a valid auxv. -                unsafe { -                    init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())).unwrap(); -                } -                return; -            } -            Err(_) => { -                // Fall back to /proc/self/auxv on error. -            } -        } -    } - -    // Open "/proc/self/auxv", either because we trust "/proc", or because -    // we're running inside QEMU and `proc_self_auxv`'s extra checking foils -    // QEMU's emulation so we need to do a plain open to get the right -    // auxv records. -    let file = crate::fs::open("/proc/self/auxv", OFlags::RDONLY, Mode::empty()).unwrap(); - -    #[cfg(feature = "alloc")] -    init_from_auxv_file(file).unwrap(); - -    #[cfg(not(feature = "alloc"))] -    unsafe { -        init_from_aux_iter(AuxFile(file)).unwrap(); -    } -} - -/// Process auxv entries from the open file `auxv`. -#[cfg(feature = "alloc")] -#[cold] -#[must_use] -fn init_from_auxv_file(auxv: OwnedFd) -> Option<()> { -    let mut buffer = Vec::<u8>::with_capacity(512); -    loop { -        let cur = buffer.len(); - -        // Request one extra byte; `Vec` will often allocate more. -        buffer.reserve(1); - -        // Use all the space it allocated. -        buffer.resize(buffer.capacity(), 0); - -        // Read up to that many bytes. -        let n = match crate::io::read(&auxv, &mut buffer[cur..]) { -            Err(crate::io::Errno::INTR) => 0, -            Err(_err) => panic!(), -            Ok(0) => break, -            Ok(n) => n, -        }; - -        // Account for the number of bytes actually read. -        buffer.resize(cur + n, 0_u8); -    } - -    // SAFETY: We loaded from an auxv file into the buffer. -    unsafe { init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())) } -} - -/// Process auxv entries from the auxv array pointed to by `auxp`. -/// -/// # Safety -/// -/// This must be passed a pointer to an auxv array. -/// -/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; -/// function uses `read_unaligned` to read from it. -#[cold] -#[must_use] -unsafe fn init_from_aux_iter(aux_iter: impl Iterator<Item = Elf_auxv_t>) -> Option<()> { -    let mut pagesz = 0; -    let mut clktck = 0; -    let mut hwcap = 0; -    let mut hwcap2 = 0; -    let mut execfn = null_mut(); -    let mut sysinfo_ehdr = null_mut(); -    #[cfg(feature = "runtime")] -    let mut secure = 0; -    #[cfg(feature = "runtime")] -    let mut phdr = null_mut(); -    #[cfg(feature = "runtime")] -    let mut phnum = 0; -    #[cfg(feature = "runtime")] -    let mut phent = 0; -    #[cfg(feature = "runtime")] -    let mut entry = 0; -    #[cfg(feature = "runtime")] -    let mut uid = None; -    #[cfg(feature = "runtime")] -    let mut euid = None; -    #[cfg(feature = "runtime")] -    let mut gid = None; -    #[cfg(feature = "runtime")] -    let mut egid = None; -    #[cfg(feature = "runtime")] -    let mut random = null_mut(); - -    for Elf_auxv_t { a_type, a_val } in aux_iter { -        match a_type as _ { -            AT_PAGESZ => pagesz = a_val as usize, -            AT_CLKTCK => clktck = a_val as usize, -            AT_HWCAP => hwcap = a_val as usize, -            AT_HWCAP2 => hwcap2 = a_val as usize, -            AT_EXECFN => execfn = check_raw_pointer::<c::c_char>(a_val as *mut _)?.as_ptr(), -            AT_SYSINFO_EHDR => sysinfo_ehdr = check_elf_base(a_val as *mut _)?.as_ptr(), - -            AT_BASE => { -                // The `AT_BASE` value can be NULL in a static executable that -                // doesn't use a dynamic linker. If so, ignore it. -                if !a_val.is_null() { -                    let _ = check_elf_base(a_val.cast())?; -                } -            } - -            #[cfg(feature = "runtime")] -            AT_SECURE => secure = (a_val as usize != 0) as u8 + 1, -            #[cfg(feature = "runtime")] -            AT_UID => uid = Some(a_val), -            #[cfg(feature = "runtime")] -            AT_EUID => euid = Some(a_val), -            #[cfg(feature = "runtime")] -            AT_GID => gid = Some(a_val), -            #[cfg(feature = "runtime")] -            AT_EGID => egid = Some(a_val), -            #[cfg(feature = "runtime")] -            AT_PHDR => phdr = check_raw_pointer::<Elf_Phdr>(a_val as *mut _)?.as_ptr(), -            #[cfg(feature = "runtime")] -            AT_PHNUM => phnum = a_val as usize, -            #[cfg(feature = "runtime")] -            AT_PHENT => phent = a_val as usize, -            #[cfg(feature = "runtime")] -            AT_ENTRY => entry = a_val as usize, -            #[cfg(feature = "runtime")] -            AT_RANDOM => random = check_raw_pointer::<[u8; 16]>(a_val as *mut _)?.as_ptr(), - -            AT_NULL => break, -            _ => (), -        } -    } - -    #[cfg(feature = "runtime")] -    assert_eq!(phent, size_of::<Elf_Phdr>()); - -    // If we're running set-uid or set-gid, enable “secure execution” mode, -    // which doesn't do much, but users may be depending on the things that -    // it does do. -    #[cfg(feature = "runtime")] -    if uid != euid || gid != egid { -        secure = 2; -    } - -    // The base and sysinfo_ehdr (if present) matches our platform. Accept the -    // aux values. -    PAGE_SIZE.store(pagesz, Relaxed); -    CLOCK_TICKS_PER_SECOND.store(clktck, Relaxed); -    HWCAP.store(hwcap, Relaxed); -    HWCAP2.store(hwcap2, Relaxed); -    EXECFN.store(execfn, Relaxed); -    SYSINFO_EHDR.store(sysinfo_ehdr, Relaxed); -    #[cfg(feature = "runtime")] -    SECURE.store(secure, Relaxed); -    #[cfg(feature = "runtime")] -    PHDR.store(phdr, Relaxed); -    #[cfg(feature = "runtime")] -    PHNUM.store(phnum, Relaxed); -    #[cfg(feature = "runtime")] -    ENTRY.store(entry, Relaxed); -    #[cfg(feature = "runtime")] -    RANDOM.store(random, Relaxed); - -    Some(()) -} - -/// Check that `base` is a valid pointer to the kernel-provided vDSO. -/// -/// `base` is some value we got from a `AT_SYSINFO_EHDR` aux record somewhere, -/// which hopefully holds the value of the kernel-provided vDSO in memory. Do a -/// series of checks to be as sure as we can that it's safe to use. -#[cold] -#[must_use] -unsafe fn check_elf_base(base: *const Elf_Ehdr) -> Option<NonNull<Elf_Ehdr>> { -    // If we're reading a 64-bit auxv on a 32-bit platform, we'll see a zero -    // `a_val` because `AT_*` values are never greater than `u32::MAX`. Zero is -    // used by libc's `getauxval` to indicate errors, so it should never be a -    // valid value. -    if base.is_null() { -        return None; -    } - -    let hdr = match check_raw_pointer::<Elf_Ehdr>(base as *mut _) { -        Some(hdr) => hdr, -        None => return None, -    }; - -    let hdr = hdr.as_ref(); -    if hdr.e_ident[..SELFMAG] != ELFMAG { -        return None; // Wrong ELF magic -    } -    if !matches!(hdr.e_ident[EI_OSABI], ELFOSABI_SYSV | ELFOSABI_LINUX) { -        return None; // Unrecognized ELF OS ABI -    } -    if hdr.e_ident[EI_ABIVERSION] != ELFABIVERSION { -        return None; // Unrecognized ELF ABI version -    } -    if hdr.e_type != ET_DYN { -        return None; // Wrong ELF type -    } - -    // If ELF is extended, we'll need to adjust. -    if hdr.e_ident[EI_VERSION] != EV_CURRENT -        || hdr.e_ehsize as usize != size_of::<Elf_Ehdr>() -        || hdr.e_phentsize as usize != size_of::<Elf_Phdr>() -    { -        return None; -    } -    // We don't currently support extra-large numbers of segments. -    if hdr.e_phnum == PN_XNUM { -        return None; -    } - -    // If `e_phoff` is zero, it's more likely that we're looking at memory that -    // has been zeroed than that the kernel has somehow aliased the `Ehdr` and -    // the `Phdr`. -    if hdr.e_phoff < size_of::<Elf_Ehdr>() { -        return None; -    } - -    // Verify that the `EI_CLASS`/`EI_DATA`/`e_machine` fields match the -    // architecture we're running as. This helps catch cases where we're -    // running under QEMU. -    if hdr.e_ident[EI_CLASS] != ELFCLASS { -        return None; // Wrong ELF class -    } -    if hdr.e_ident[EI_DATA] != ELFDATA { -        return None; // Wrong ELF data -    } -    if hdr.e_machine != EM_CURRENT { -        return None; // Wrong machine type -    } - -    Some(NonNull::new_unchecked(as_ptr(hdr) as *mut _)) -} - -// Aux reading utilities - -// Read auxv records from an array in memory. -struct AuxPointer(*const Elf_auxv_t); - -impl Iterator for AuxPointer { -    type Item = Elf_auxv_t; - -    #[cold] -    fn next(&mut self) -> Option<Self::Item> { -        unsafe { -            let value = read_unaligned(self.0); -            self.0 = self.0.add(1); -            Some(value) -        } -    } -} - -// Read auxv records from a file. -#[cfg(not(feature = "alloc"))] -struct AuxFile(OwnedFd); - -#[cfg(not(feature = "alloc"))] -impl Iterator for AuxFile { -    type Item = Elf_auxv_t; - -    // This implementation does lots of `read`s and it isn't amazing, but -    // hopefully we won't use it often. -    #[cold] -    fn next(&mut self) -> Option<Self::Item> { -        let mut buf = [0_u8; size_of::<Self::Item>()]; -        let mut slice = &mut buf[..]; -        while !slice.is_empty() { -            match crate::io::read(&self.0, slice) { -                Ok(0) => panic!("unexpected end of auxv file"), -                Ok(n) => slice = &mut slice[n..], -                Err(crate::io::Errno::INTR) => continue, -                Err(err) => panic!("{:?}", err), -            } -        } -        Some(unsafe { read_unaligned(buf.as_ptr().cast()) }) -    } -} diff --git a/vendor/rustix/src/backend/linux_raw/param/init.rs b/vendor/rustix/src/backend/linux_raw/param/init.rs deleted file mode 100644 index fe29e9c..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/init.rs +++ /dev/null @@ -1,171 +0,0 @@ -//! Linux auxv `init` function, for "use-explicitly-provided-auxv" mode. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -#[cfg(feature = "param")] -use crate::ffi::CStr; -use core::ffi::c_void; -use core::ptr::{null_mut, read, NonNull}; -#[cfg(feature = "runtime")] -use core::sync::atomic::AtomicBool; -use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; -use linux_raw_sys::elf::*; -use linux_raw_sys::general::{ -    AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, -}; -#[cfg(feature = "runtime")] -use linux_raw_sys::general::{AT_ENTRY, AT_PHDR, AT_PHENT, AT_PHNUM, AT_RANDOM, AT_SECURE}; - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { -    unsafe { PAGE_SIZE.load(Ordering::Relaxed) } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { -    unsafe { CLOCK_TICKS_PER_SECOND.load(Ordering::Relaxed) as u64 } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { -    unsafe { -        ( -            HWCAP.load(Ordering::Relaxed), -            HWCAP2.load(Ordering::Relaxed), -        ) -    } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { -    let execfn = unsafe { EXECFN.load(Ordering::Relaxed) }; - -    // SAFETY: We initialize `EXECFN` to a valid `CStr` pointer, and we assume -    // the `AT_EXECFN` value provided by the kernel points to a valid C string. -    unsafe { CStr::from_ptr(execfn.cast()) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { -    unsafe { SECURE.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c_void, usize, usize) { -    unsafe { -        ( -            PHDR.load(Ordering::Relaxed).cast(), -            PHENT.load(Ordering::Relaxed), -            PHNUM.load(Ordering::Relaxed), -        ) -    } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { -    unsafe { SYSINFO_EHDR.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { -    unsafe { ENTRY.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn random() -> *const [u8; 16] { -    unsafe { RANDOM.load(Ordering::Relaxed) } -} - -static mut PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); -static mut CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); -static mut HWCAP: AtomicUsize = AtomicUsize::new(0); -static mut HWCAP2: AtomicUsize = AtomicUsize::new(0); -static mut SYSINFO_EHDR: AtomicPtr<Elf_Ehdr> = AtomicPtr::new(null_mut()); -// Initialize `EXECFN` to a valid `CStr` pointer so that we don't need to check -// for null on every `execfn` call. -static mut EXECFN: AtomicPtr<c::c_char> = AtomicPtr::new(b"\0".as_ptr() as _); -#[cfg(feature = "runtime")] -static mut SECURE: AtomicBool = AtomicBool::new(false); -// Use `dangling` so that we can always treat it like an empty slice. -#[cfg(feature = "runtime")] -static mut PHDR: AtomicPtr<Elf_Phdr> = AtomicPtr::new(NonNull::dangling().as_ptr()); -#[cfg(feature = "runtime")] -static mut PHENT: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut PHNUM: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut ENTRY: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut RANDOM: AtomicPtr<[u8; 16]> = AtomicPtr::new(NonNull::dangling().as_ptr()); - -/// When "use-explicitly-provided-auxv" is enabled, we export a function to be -/// called during initialization, and passed a pointer to the original -/// environment variable block set up by the OS. -pub(crate) unsafe fn init(envp: *mut *mut u8) { -    init_from_envp(envp); -} - -/// # Safety -/// -/// This must be passed a pointer to the environment variable buffer -/// provided by the kernel, which is followed in memory by the auxv array. -unsafe fn init_from_envp(mut envp: *mut *mut u8) { -    while !(*envp).is_null() { -        envp = envp.add(1); -    } -    init_from_auxp(envp.add(1).cast()) -} - -/// Process auxv entries from the auxv array pointed to by `auxp`. -/// -/// # Safety -/// -/// This must be passed a pointer to an auxv array. -/// -/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; -/// function uses `read_unaligned` to read from it. -unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) { -    loop { -        let Elf_auxv_t { a_type, a_val } = read(auxp); - -        match a_type as _ { -            AT_PAGESZ => PAGE_SIZE.store(a_val as usize, Ordering::Relaxed), -            AT_CLKTCK => CLOCK_TICKS_PER_SECOND.store(a_val as usize, Ordering::Relaxed), -            AT_HWCAP => HWCAP.store(a_val as usize, Ordering::Relaxed), -            AT_HWCAP2 => HWCAP2.store(a_val as usize, Ordering::Relaxed), -            AT_EXECFN => EXECFN.store(a_val.cast::<c::c_char>(), Ordering::Relaxed), -            AT_SYSINFO_EHDR => SYSINFO_EHDR.store(a_val.cast::<Elf_Ehdr>(), Ordering::Relaxed), - -            #[cfg(feature = "runtime")] -            AT_SECURE => SECURE.store(a_val as usize != 0, Ordering::Relaxed), -            #[cfg(feature = "runtime")] -            AT_PHDR => PHDR.store(a_val.cast::<Elf_Phdr>(), Ordering::Relaxed), -            #[cfg(feature = "runtime")] -            AT_PHNUM => PHNUM.store(a_val as usize, Ordering::Relaxed), -            #[cfg(feature = "runtime")] -            AT_PHENT => PHENT.store(a_val as usize, Ordering::Relaxed), -            #[cfg(feature = "runtime")] -            AT_ENTRY => ENTRY.store(a_val as usize, Ordering::Relaxed), -            #[cfg(feature = "runtime")] -            AT_RANDOM => RANDOM.store(a_val.cast::<[u8; 16]>(), Ordering::Relaxed), - -            AT_NULL => break, -            _ => (), -        } -        auxp = auxp.add(1); -    } -} diff --git a/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs b/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs deleted file mode 100644 index cfdd7a5..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs +++ /dev/null @@ -1,175 +0,0 @@ -//! Linux auxv support, using libc. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -#[cfg(feature = "param")] -use crate::ffi::CStr; -#[cfg(not(feature = "runtime"))] -use core::ptr::null; -use linux_raw_sys::elf::*; - -// `getauxval` wasn't supported in glibc until 2.16. Also this lets us use -// `*mut` as the return type to preserve strict provenance. -#[cfg(not(feature = "runtime"))] -weak!(fn getauxval(c::c_ulong) -> *mut c::c_void); - -// With the "runtime" feature, go ahead and depend on `getauxval` existing so -// that we never fail. -#[cfg(feature = "runtime")] -extern "C" { -    fn getauxval(type_: c::c_ulong) -> *mut c::c_void; -} - -#[cfg(feature = "runtime")] -const AT_PHDR: c::c_ulong = 3; -#[cfg(feature = "runtime")] -const AT_PHENT: c::c_ulong = 4; -#[cfg(feature = "runtime")] -const AT_PHNUM: c::c_ulong = 5; -#[cfg(feature = "runtime")] -const AT_ENTRY: c::c_ulong = 9; -const AT_HWCAP: c::c_ulong = 16; -#[cfg(feature = "runtime")] -const AT_RANDOM: c::c_ulong = 25; -const AT_HWCAP2: c::c_ulong = 26; -const AT_SECURE: c::c_ulong = 23; -const AT_EXECFN: c::c_ulong = 31; -const AT_SYSINFO_EHDR: c::c_ulong = 33; - -// Declare `sysconf` ourselves so that we don't depend on all of libc just for -// this. -extern "C" { -    fn sysconf(name: c::c_int) -> c::c_long; -} - -#[cfg(target_os = "android")] -const _SC_PAGESIZE: c::c_int = 39; -#[cfg(target_os = "linux")] -const _SC_PAGESIZE: c::c_int = 30; -#[cfg(target_os = "android")] -const _SC_CLK_TCK: c::c_int = 6; -#[cfg(target_os = "linux")] -const _SC_CLK_TCK: c::c_int = 2; - -#[test] -fn test_abi() { -    const_assert_eq!(self::_SC_PAGESIZE, ::libc::_SC_PAGESIZE); -    const_assert_eq!(self::_SC_CLK_TCK, ::libc::_SC_CLK_TCK); -    const_assert_eq!(self::AT_HWCAP, ::libc::AT_HWCAP); -    const_assert_eq!(self::AT_HWCAP2, ::libc::AT_HWCAP2); -    const_assert_eq!(self::AT_EXECFN, ::libc::AT_EXECFN); -    const_assert_eq!(self::AT_SECURE, ::libc::AT_SECURE); -    const_assert_eq!(self::AT_SYSINFO_EHDR, ::libc::AT_SYSINFO_EHDR); -    #[cfg(feature = "runtime")] -    const_assert_eq!(self::AT_PHDR, ::libc::AT_PHDR); -    #[cfg(feature = "runtime")] -    const_assert_eq!(self::AT_PHNUM, ::libc::AT_PHNUM); -    #[cfg(feature = "runtime")] -    const_assert_eq!(self::AT_ENTRY, ::libc::AT_ENTRY); -    #[cfg(feature = "runtime")] -    const_assert_eq!(self::AT_RANDOM, ::libc::AT_RANDOM); -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { -    unsafe { sysconf(_SC_PAGESIZE) as usize } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { -    unsafe { sysconf(_SC_CLK_TCK) as u64 } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { -    #[cfg(not(feature = "runtime"))] -    unsafe { -        if let Some(libc_getauxval) = getauxval.get() { -            let hwcap = libc_getauxval(AT_HWCAP) as usize; -            let hwcap2 = libc_getauxval(AT_HWCAP2) as usize; -            (hwcap, hwcap2) -        } else { -            (0, 0) -        } -    } - -    #[cfg(feature = "runtime")] -    unsafe { -        let hwcap = getauxval(AT_HWCAP) as usize; -        let hwcap2 = getauxval(AT_HWCAP2) as usize; -        (hwcap, hwcap2) -    } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { -    #[cfg(not(feature = "runtime"))] -    unsafe { -        if let Some(libc_getauxval) = getauxval.get() { -            CStr::from_ptr(libc_getauxval(AT_EXECFN).cast()) -        } else { -            cstr!("") -        } -    } - -    #[cfg(feature = "runtime")] -    unsafe { -        CStr::from_ptr(getauxval(AT_EXECFN).cast()) -    } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { -    unsafe { getauxval(AT_SECURE) as usize != 0 } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { -    unsafe { -        let phdr = getauxval(AT_PHDR) as *const c::c_void; -        let phent = getauxval(AT_PHENT) as usize; -        let phnum = getauxval(AT_PHNUM) as usize; -        (phdr, phent, phnum) -    } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { -    #[cfg(not(feature = "runtime"))] -    unsafe { -        if let Some(libc_getauxval) = getauxval.get() { -            libc_getauxval(AT_SYSINFO_EHDR) as *const Elf_Ehdr -        } else { -            null() -        } -    } - -    #[cfg(feature = "runtime")] -    unsafe { -        getauxval(AT_SYSINFO_EHDR) as *const Elf_Ehdr -    } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { -    unsafe { getauxval(AT_ENTRY) as usize } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn random() -> *const [u8; 16] { -    unsafe { getauxval(AT_RANDOM) as *const [u8; 16] } -} diff --git a/vendor/rustix/src/backend/linux_raw/param/mod.rs b/vendor/rustix/src/backend/linux_raw/param/mod.rs deleted file mode 100644 index 365f016..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -// With "use-explicitly-provided-auxv" enabled, we expect to be initialized -// with an explicit `rustix::param::init` call. -// -// With "use-libc-auxv" enabled, use libc's `getauxval`. -// -// Otherwise, we read aux values from /proc/self/auxv. -#[cfg_attr(feature = "use-explicitly-provided-auxv", path = "init.rs")] -#[cfg_attr( -    all( -        not(feature = "use-explicitly-provided-auxv"), -        feature = "use-libc-auxv" -    ), -    path = "libc_auxv.rs" -)] -pub(crate) mod auxv;  | 
