Apply rustc-0023-Add-Trusty-OS-support-to-Rust-std.patch
This commit is contained in:
parent
2b285cd5f0
commit
87ca2dbb00
9 changed files with 164 additions and 0 deletions
|
@ -42,6 +42,7 @@ fn main() {
|
||||||
|| target_os == "fuchsia"
|
|| target_os == "fuchsia"
|
||||||
|| (target_vendor == "fortanix" && target_env == "sgx")
|
|| (target_vendor == "fortanix" && target_env == "sgx")
|
||||||
|| target_os == "hermit"
|
|| target_os == "hermit"
|
||||||
|
|| target_os == ("trusty")
|
||||||
|| target_os == "l4re"
|
|| target_os == "l4re"
|
||||||
|| target_os == "redox"
|
|| target_os == "redox"
|
||||||
|| target_os == "haiku"
|
|| target_os == "haiku"
|
||||||
|
|
|
@ -72,6 +72,7 @@ cfg_if::cfg_if! {
|
||||||
target_family = "unix",
|
target_family = "unix",
|
||||||
target_os = "wasi",
|
target_os = "wasi",
|
||||||
target_os = "teeos",
|
target_os = "teeos",
|
||||||
|
target_os = "trusty",
|
||||||
))] {
|
))] {
|
||||||
mod unix;
|
mod unix;
|
||||||
} else if #[cfg(target_os = "windows")] {
|
} else if #[cfg(target_os = "windows")] {
|
||||||
|
|
|
@ -37,6 +37,9 @@ cfg_if::cfg_if! {
|
||||||
} else if #[cfg(target_os = "hermit")] {
|
} else if #[cfg(target_os = "hermit")] {
|
||||||
mod hermit;
|
mod hermit;
|
||||||
pub use self::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"))] {
|
} else if #[cfg(all(target_os = "wasi", target_env = "p2"))] {
|
||||||
mod wasip2;
|
mod wasip2;
|
||||||
pub use self::wasip2::*;
|
pub use self::wasip2::*;
|
||||||
|
|
28
library/std/src/sys/pal/trusty/mod.rs
Normal file
28
library/std/src/sys/pal/trusty/mod.rs
Normal 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::*;
|
82
library/std/src/sys/pal/trusty/stdio.rs
Normal file
82
library/std/src/sys/pal/trusty/stdio.rs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,6 +60,9 @@ cfg_if::cfg_if! {
|
||||||
} else if #[cfg(target_os = "teeos")] {
|
} else if #[cfg(target_os = "teeos")] {
|
||||||
mod teeos;
|
mod teeos;
|
||||||
pub use teeos::fill_bytes;
|
pub use teeos::fill_bytes;
|
||||||
|
} else if #[cfg(target_os = "trusty")] {
|
||||||
|
mod trusty;
|
||||||
|
pub use trusty::fill_bytes;
|
||||||
} else if #[cfg(target_os = "uefi")] {
|
} else if #[cfg(target_os = "uefi")] {
|
||||||
mod uefi;
|
mod uefi;
|
||||||
pub use uefi::fill_bytes;
|
pub use uefi::fill_bytes;
|
||||||
|
|
7
library/std/src/sys/random/trusty.rs
Normal file
7
library/std/src/sys/random/trusty.rs
Normal 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()) }
|
||||||
|
}
|
30
library/std/src/sys/thread_local/key/trusty.rs
Normal file
30
library/std/src/sys/thread_local/key/trusty.rs
Normal 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) {}
|
|
@ -170,6 +170,15 @@ pub(crate) mod key {
|
||||||
pub(crate) use xous::destroy_tls;
|
pub(crate) use xous::destroy_tls;
|
||||||
pub(super) use xous::{Key, get, set};
|
pub(super) use xous::{Key, get, set};
|
||||||
use xous::{create, destroy};
|
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};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue