1
Fork 0

Apply rustc-0023-Add-Trusty-OS-support-to-Rust-std.patch

This commit is contained in:
Nicole LeGare 2025-02-04 21:59:22 +00:00 committed by Nicole L
parent 2b285cd5f0
commit 87ca2dbb00
9 changed files with 164 additions and 0 deletions

View file

@ -42,6 +42,7 @@ fn main() {
|| target_os == "fuchsia"
|| (target_vendor == "fortanix" && target_env == "sgx")
|| target_os == "hermit"
|| target_os == ("trusty")
|| target_os == "l4re"
|| target_os == "redox"
|| target_os == "haiku"

View file

@ -72,6 +72,7 @@ cfg_if::cfg_if! {
target_family = "unix",
target_os = "wasi",
target_os = "teeos",
target_os = "trusty",
))] {
mod unix;
} else if #[cfg(target_os = "windows")] {

View file

@ -37,6 +37,9 @@ cfg_if::cfg_if! {
} else if #[cfg(target_os = "hermit")] {
mod hermit;
pub use self::hermit::*;
} else if #[cfg(target_os = "trusty")] {
mod trusty;
pub use self::trusty::*;
} else if #[cfg(all(target_os = "wasi", target_env = "p2"))] {
mod wasip2;
pub use self::wasip2::*;

View file

@ -0,0 +1,28 @@
//! System bindings for the Trusty OS.
#[path = "../unsupported/args.rs"]
pub mod args;
#[path = "../unsupported/env.rs"]
pub mod env;
#[path = "../unsupported/fs.rs"]
pub mod fs;
#[path = "../unsupported/io.rs"]
pub mod io;
#[path = "../unsupported/net.rs"]
pub mod net;
#[path = "../unsupported/os.rs"]
pub mod os;
#[path = "../unsupported/pipe.rs"]
pub mod pipe;
#[path = "../unsupported/process.rs"]
pub mod process;
pub mod stdio;
#[path = "../unsupported/time.rs"]
pub mod time;
#[path = "../unsupported/thread.rs"]
pub mod thread;
#[path = "../unsupported/common.rs"]
#[deny(unsafe_op_in_unsafe_fn)]
mod common;
pub use common::*;

View file

@ -0,0 +1,82 @@
use crate::io;
pub struct Stdin;
pub struct Stdout;
pub struct Stderr;
impl Stdin {
pub const fn new() -> Stdin {
Stdin
}
}
impl io::Read for Stdin {
fn read(&mut self, _buf: &mut [u8]) -> io::Result<usize> {
Ok(0)
}
}
impl Stdout {
pub const fn new() -> Stdout {
Stdout
}
}
impl io::Write for Stdout {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
_write(libc::STDOUT_FILENO, buf)
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
impl Stderr {
pub const fn new() -> Stderr {
Stderr
}
}
impl io::Write for Stderr {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
_write(libc::STDERR_FILENO, buf)
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
pub const STDIN_BUF_SIZE: usize = 0;
pub fn is_ebadf(_err: &io::Error) -> bool {
true
}
pub fn panic_output() -> Option<impl io::Write> {
Some(Stderr)
}
fn _write(fd: i32, message: &[u8]) -> io::Result<usize> {
let mut iov =
libc::iovec { iov_base: message.as_ptr() as *mut _, iov_len: message.len() };
loop {
// SAFETY: syscall, safe arguments.
let ret = unsafe { libc::writev(fd, &iov, 1) };
if ret < 0 {
return Err(io::Error::last_os_error());
}
let ret = ret as usize;
if ret > iov.iov_len {
return Err(io::Error::last_os_error());
}
if ret == iov.iov_len {
return Ok(message.len());
}
// SAFETY: ret has been checked to be less than the length of
// the buffer
iov.iov_base = unsafe { iov.iov_base.add(ret) };
iov.iov_len -= ret;
}
}

View file

@ -60,6 +60,9 @@ cfg_if::cfg_if! {
} else if #[cfg(target_os = "teeos")] {
mod teeos;
pub use teeos::fill_bytes;
} else if #[cfg(target_os = "trusty")] {
mod trusty;
pub use trusty::fill_bytes;
} else if #[cfg(target_os = "uefi")] {
mod uefi;
pub use uefi::fill_bytes;

View file

@ -0,0 +1,7 @@
extern "C" {
fn trusty_rng_secure_rand(randomBuffer: *mut core::ffi::c_void, randomBufferLen: libc::size_t);
}
pub fn fill_bytes(bytes: &mut [u8]) {
unsafe { trusty_rng_secure_rand(bytes.as_mut_ptr().cast(), bytes.len()) }
}

View file

@ -0,0 +1,30 @@
use crate::ptr;
pub type Key = usize;
type Dtor = unsafe extern "C" fn(*mut u8);
static mut STORAGE: crate::vec::Vec<(*mut u8, Option<Dtor>)> = Vec::new();
#[inline]
pub fn create(dtor: Option<Dtor>) -> Key {
unsafe {
#[allow(static_mut_refs)]
let key = STORAGE.len();
#[allow(static_mut_refs)]
STORAGE.push((ptr::null_mut(), dtor));
key
}
}
#[inline]
pub unsafe fn set(key: Key, value: *mut u8) {
unsafe { STORAGE[key].0 = value };
}
#[inline]
pub unsafe fn get(key: Key) -> *mut u8 {
unsafe { STORAGE[key].0 }
}
#[inline]
pub fn destroy(_key: Key) {}

View file

@ -170,6 +170,15 @@ pub(crate) mod key {
pub(crate) use xous::destroy_tls;
pub(super) use xous::{Key, get, set};
use xous::{create, destroy};
} else if #[cfg(target_os = "trusty")] {
#[allow(unused_unsafe)]
mod racy;
#[cfg(test)]
mod tests;
mod trusty;
pub(super) use racy::LazyKey;
pub(super) use trusty::{Key, get, set};
use trusty::{create, destroy};
}
}
}