Mutex guards kata-uart-client read and write

Change-Id: I5757dcf68f64359b743f458f336a813aeb43c069
GitOrigin-RevId: 1c6c85f95c6509cc915df1b82076942cd540c441
This commit is contained in:
Matt Harvey 2021-08-13 14:26:43 -07:00 committed by Sam Leffler
parent 7c3cc70ab1
commit 4043c8b5b7
2 changed files with 12 additions and 2 deletions

View File

@ -9,9 +9,11 @@ component DebugConsole {
dataport Buf tx_dataport;
uses dataport_io_inf uart_tx;
has mutex tx_mutex;
dataport Buf rx_dataport;
uses dataport_io_inf uart_rx;
has mutex rx_mutex;
provides LoggerInterface logger;
uses ProcessControlInterface proc_ctrl;

View File

@ -7,15 +7,19 @@ use kata_io as io;
// C interface to external UART driver.
extern "C" {
static rx_dataport: *mut cty::c_uchar;
static tx_dataport: *mut cty::c_uchar;
fn uart_rx_update(n: cty::size_t);
fn rx_mutex_lock();
fn rx_mutex_unlock();
static tx_dataport: *mut cty::c_uchar;
fn uart_tx_update(n: cty::size_t);
fn tx_mutex_lock();
fn tx_mutex_unlock();
}
// Console logging interface.
#[no_mangle]
pub extern "C" fn logger_log(msg: *const cstr_core::c_char) {
// TODO(sleffler): is the uart driver ok w/ multiple writers?
let output: &mut dyn io::Write = &mut self::Tx {};
unsafe {
let _ = writeln!(output, "{}", CStr::from_ptr(msg).to_str().unwrap());
@ -27,9 +31,11 @@ pub struct Rx {}
impl io::Read for Rx {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
unsafe {
rx_mutex_lock();
uart_rx_update(buf.len());
let port = core::slice::from_raw_parts(rx_dataport, buf.len());
buf.copy_from_slice(&port);
rx_mutex_unlock();
}
Ok(buf.len())
}
@ -40,9 +46,11 @@ pub struct Tx {}
impl io::Write for Tx {
fn write(&mut self, buf: &[u8]) -> Result<usize, io::Error> {
unsafe {
tx_mutex_lock();
let port = core::slice::from_raw_parts_mut(tx_dataport, buf.len());
port.copy_from_slice(buf);
uart_tx_update(buf.len());
tx_mutex_unlock();
}
Ok(buf.len())
}