cortex_m_semihosting/
hio.rs1use crate::nr;
4use core::{fmt, slice};
5
6#[derive(Clone, Copy)]
8pub struct HostStream {
9 fd: usize,
10}
11
12impl HostStream {
13 pub fn write_all(&mut self, buffer: &[u8]) -> Result<(), ()> {
15 write_all(self.fd, buffer)
16 }
17}
18
19impl fmt::Write for HostStream {
20 fn write_str(&mut self, s: &str) -> fmt::Result {
21 self.write_all(s.as_bytes()).map_err(|_| fmt::Error)
22 }
23}
24
25pub fn hstderr() -> Result<HostStream, ()> {
27 open(":tt\0", nr::open::W_APPEND)
32}
33
34pub fn hstdout() -> Result<HostStream, ()> {
36 open(":tt\0", nr::open::W_TRUNC)
37}
38
39fn open(name: &str, mode: usize) -> Result<HostStream, ()> {
40 let name = name.as_bytes();
41 match unsafe { syscall!(OPEN, name.as_ptr(), mode, name.len() - 1) } as isize {
42 -1 => Err(()),
43 fd => Ok(HostStream { fd: fd as usize }),
44 }
45}
46
47fn write_all(fd: usize, mut buffer: &[u8]) -> Result<(), ()> {
48 while !buffer.is_empty() {
49 match unsafe { syscall!(WRITE, fd, buffer.as_ptr(), buffer.len()) } {
50 0 => return Ok(()),
52 n if n <= buffer.len() => {
54 let offset = (buffer.len() - n) as isize;
55 buffer = unsafe { slice::from_raw_parts(buffer.as_ptr().offset(offset), n) }
56 }
57 #[cfg(feature = "jlink-quirks")]
58 n if n > 0xfffffff0 => return Ok(()),
61 _ => return Err(()),
63 }
64 }
65 Ok(())
66}