[opentitanlib] Fix Ti50Emulator Uart Sub-process state handling. Fix state handling due to changes introduced by PR#13277 with function get_socket(..). Signed-off-by: Michał Mazurek <maz@semihalf.com>
diff --git a/sw/host/opentitanlib/src/transport/ti50emulator/uart.rs b/sw/host/opentitanlib/src/transport/ti50emulator/uart.rs index 44ae99f..960cf0d 100644 --- a/sw/host/opentitanlib/src/transport/ti50emulator/uart.rs +++ b/sw/host/opentitanlib/src/transport/ti50emulator/uart.rs
@@ -50,25 +50,17 @@ Ok(()) } - pub fn check_state(&self) -> Result<bool> { + pub fn get_state(&self) -> Result<EmuState> { let process = &mut self.inner.borrow_mut().process; process.update_status()?; - let valid = match process.get_state() { - EmuState::On | EmuState::Error => true, - _ => false, - }; - return Ok(valid); + Ok(process.get_state()) } pub fn get_socket(&self) -> Result<RefMut<UnixStream>> { - if self.check_state()? { - self.reconnect()?; - // Socket should be valid as long as the subprocess is running. - return Ok(RefMut::map(self.socket.borrow_mut(), |socket| { - socket.as_mut().unwrap() - })); - } - bail!(UartError::GenericError("Invalid socket".to_string())); + self.reconnect()?; + return Ok(RefMut::map(self.socket.borrow_mut(), |socket| { + socket.as_mut().unwrap() + })); } } @@ -90,24 +82,53 @@ /// Reads UART receive data into `buf`, returning the number of bytes read. /// This function _may_ block. fn read(&self, buf: &mut [u8]) -> Result<usize> { - let mut socket = self.get_socket()?; - socket.set_read_timeout(None)?; - return Ok(socket.read(buf)?); + match self.get_state()? { + EmuState::On => { + let mut socket = self.get_socket()?; + socket.set_read_timeout(None)?; + Ok(socket.read(buf)?) + } + EmuState::Off => Ok(0), + state => Err(UartError::GenericError(format!( + "Operation not supported in Emulator state: {}", + state + )) + .into()), + } } /// Reads UART receive data into `buf`, returning the number of bytes read. /// The `timeout` may be used to specify a duration to wait for data. /// If timeout expires without any data arriving `Ok(0)` will be returned, never `Err(_)`. fn read_timeout(&self, buf: &mut [u8], timeout: Duration) -> Result<usize> { - let mut socket = self.get_socket()?; - socket.set_read_timeout(Some(timeout))?; - return Ok(socket.read(buf).context("UART read error")?); + match self.get_state()? { + EmuState::On => { + let mut socket = self.get_socket()?; + socket.set_read_timeout(Some(timeout))?; + return Ok(socket.read(buf).context("UART read error")?); + } + EmuState::Off => Ok(0), + state => Err(UartError::GenericError(format!( + "Operation not supported in Emulator state: {}", + state + )) + .into()), + } } /// Writes data from `buf` to the UART. fn write(&self, buf: &[u8]) -> Result<()> { - self.get_socket()?.write(buf).context("UART read error")?; - return Ok(()); + match self.get_state()? { + EmuState::On => { + self.get_socket()?.write(buf).context("UART read error")?; + Ok(()) + } + state => Err(UartError::GenericError(format!( + "Operation not supported in Emulator state: {}", + state + )) + .into()), + } } /// Clears the UART RX buffer.