diff options
| author | 袁浩 <yuanhao34@huawei.com> | 2023-10-09 11:27:11 +0800 |
|---|---|---|
| committer | Sword-Destiny <yuanhonglong@outlook.com> | 2023-12-07 10:33:03 +0800 |
| commit | e353eb91fb793c5ec7cb12f7c99a13d55e05fba1 (patch) | |
| tree | 6a61dd5284f4cb8c425316e9e510190ef7744c1e /library/std/src/sys/teeos/stdio.rs | |
| parent | 28968414c57f12b827f01a5e6b99017b7ffa7370 (diff) | |
| download | rust-e353eb91fb793c5ec7cb12f7c99a13d55e05fba1.tar.gz rust-e353eb91fb793c5ec7cb12f7c99a13d55e05fba1.zip | |
add teeos std impl
Signed-off-by: 袁浩 <yuanhao34@huawei.com>
Diffstat (limited to 'library/std/src/sys/teeos/stdio.rs')
| -rw-r--r-- | library/std/src/sys/teeos/stdio.rs | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/library/std/src/sys/teeos/stdio.rs b/library/std/src/sys/teeos/stdio.rs new file mode 100644 index 00000000000..9ca04f29273 --- /dev/null +++ b/library/std/src/sys/teeos/stdio.rs @@ -0,0 +1,88 @@ +#![deny(unsafe_op_in_unsafe_fn)] + +use crate::io; +use core::arch::asm; + +pub struct Stdin; +pub struct Stdout; +pub struct Stderr; + +const KCALL_DEBUG_CMD_PUT_BYTES: i64 = 2; + +unsafe fn debug_call(cap_ref: u64, call_no: i64, arg1: u64, arg2: u64) -> i32 { + let ret: u64; + unsafe { + asm!( + "svc #99", + inout("x0") cap_ref => ret, + in("x1") call_no, + in("x2") arg1, + in("x3") arg2, + ); + } + + ret as i32 +} + +fn print_buf(s: &[u8]) -> io::Result<usize> { + // Corresponds to `HM_DEBUG_PUT_BYTES_LIMIT`. + const MAX_LEN: usize = 512; + let len = if s.len() > MAX_LEN { MAX_LEN } else { s.len() }; + let result = unsafe { debug_call(0, KCALL_DEBUG_CMD_PUT_BYTES, s.as_ptr() as u64, len as u64) }; + + if result == 0 { Ok(len) } else { Err(io::Error::from(io::ErrorKind::InvalidInput)) } +} + +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> { + print_buf(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> { + print_buf(buf) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +pub const STDIN_BUF_SIZE: usize = 0; + +pub fn is_ebadf(err: &io::Error) -> bool { + err.raw_os_error() == Some(libc::EBADF as i32) +} + +pub fn panic_output() -> Option<impl io::Write> { + Some(Stderr::new()) +} |
