pub struct Serial {Show 17 fields
interrupt_enable: Arc<AtomicU8>,
interrupt_identification: u8,
interrupt_evt: Event,
line_control: u8,
line_status: u8,
modem_control: u8,
modem_status: u8,
scratch: u8,
baud_divisor: u16,
in_buffer: VecDeque<u8>,
in_channel: Option<Receiver<u8>>,
input: Option<Box<dyn SerialInput>>,
out: Option<Box<dyn Write + Send>>,
out_timestamp: bool,
last_write_was_newline: bool,
device_state: DeviceState,
worker: Option<WorkerThread<Box<dyn SerialInput>>>,
}
Expand description
Emulates serial COM ports commonly seen on x86 I/O ports 0x3f8/0x2f8/0x3e8/0x2e8.
This can optionally write the guest’s output to a Write trait object. To send input to the
guest, use queue_input_bytes
directly, or give a Read trait object which will be used queue
bytes when used_command
is called.
Fields§
§interrupt_enable: Arc<AtomicU8>
§interrupt_identification: u8
§interrupt_evt: Event
§line_control: u8
§line_status: u8
§modem_control: u8
§modem_status: u8
§scratch: u8
§baud_divisor: u16
§in_buffer: VecDeque<u8>
§in_channel: Option<Receiver<u8>>
§input: Option<Box<dyn SerialInput>>
§out: Option<Box<dyn Write + Send>>
§out_timestamp: bool
§last_write_was_newline: bool
§device_state: DeviceState
§worker: Option<WorkerThread<Box<dyn SerialInput>>>
Implementations§
source§impl Serial
impl Serial
fn new_common( interrupt_evt: Event, input: Option<Box<dyn SerialInput>>, out: Option<Box<dyn Write + Send>>, out_timestamp: bool ) -> Serial
sourcepub fn debug_label() -> String
pub fn debug_label() -> String
Returns a debug label for the serial device. Used when setting up IrqEventSource
.
sourcepub fn queue_input_bytes(&mut self, c: &[u8]) -> Result<()>
pub fn queue_input_bytes(&mut self, c: &[u8]) -> Result<()>
Queues raw bytes for the guest to read and signals the interrupt if the line status would change. These bytes will be read by the guest before any bytes from the input stream that have not already been queued.
fn spawn_input_thread(&mut self)
fn drain_in_channel(&mut self)
sourcepub fn interrupt_event(&self) -> &Event
pub fn interrupt_event(&self) -> &Event
Gets the interrupt event used to interrupt the driver when it needs to respond to this device.
fn is_dlab_set(&self) -> bool
fn is_recv_intr_enabled(&self) -> bool
fn is_thr_intr_enabled(&self) -> bool
fn is_thr_intr_changed(&self, bit: u8) -> bool
fn is_loop(&self) -> bool
fn add_intr_bit(&mut self, bit: u8)
fn del_intr_bit(&mut self, bit: u8)
fn trigger_thr_empty(&mut self) -> Result<()>
fn trigger_recv_interrupt(&mut self) -> Result<()>
fn trigger_interrupt(&mut self) -> Result<()>
fn set_data_bit(&mut self)
fn is_data_avaiable(&self) -> bool
fn iir_reset(&mut self)
fn handle_write(&mut self, offset: u8, v: u8) -> Result<()>
fn handle_write_data(&mut self, v: u8) -> Result<()>
Trait Implementations§
source§impl BusDevice for Serial
impl BusDevice for Serial
source§fn device_id(&self) -> DeviceId
fn device_id(&self) -> DeviceId
source§fn debug_label(&self) -> String
fn debug_label(&self) -> String
source§fn write(&mut self, info: BusAccessInfo, data: &[u8])
fn write(&mut self, info: BusAccessInfo, data: &[u8])
offset
into this devicesource§fn read(&mut self, info: BusAccessInfo, data: &mut [u8])
fn read(&mut self, info: BusAccessInfo, data: &mut [u8])
offset
from this devicesource§fn config_register_write(
&mut self,
reg_idx: usize,
offset: u64,
data: &[u8]
) -> ConfigWriteResult
fn config_register_write( &mut self, reg_idx: usize, offset: u64, data: &[u8] ) -> ConfigWriteResult
source§fn config_register_read(&self, reg_idx: usize) -> u32
fn config_register_read(&self, reg_idx: usize) -> u32
source§fn init_pci_config_mapping(
&mut self,
shmem: &SharedMemory,
base: usize,
len: usize
) -> bool
fn init_pci_config_mapping( &mut self, shmem: &SharedMemory, base: usize, len: usize ) -> bool
source§fn virtual_config_register_write(&mut self, reg_idx: usize, value: u32)
fn virtual_config_register_write(&mut self, reg_idx: usize, value: u32)
source§fn virtual_config_register_read(&self, reg_idx: usize) -> u32
fn virtual_config_register_read(&self, reg_idx: usize) -> u32
source§fn on_sandboxed(&mut self)
fn on_sandboxed(&mut self)
source§fn get_ranges(&self) -> Vec<(BusRange, BusType)>
fn get_ranges(&self) -> Vec<(BusRange, BusType)>
source§fn destroy_device(&mut self)
fn destroy_device(&mut self)
source§impl SerialDevice for Serial
impl SerialDevice for Serial
source§fn new(
_protection_type: ProtectionType,
interrupt_evt: Event,
input: Option<Box<dyn SerialInput>>,
out: Option<Box<dyn Write + Send>>,
_sync: Option<Box<dyn FileSync + Send>>,
options: SerialOptions,
_keep_rds: Vec<RawDescriptor>
) -> Serial
fn new( _protection_type: ProtectionType, interrupt_evt: Event, input: Option<Box<dyn SerialInput>>, out: Option<Box<dyn Write + Send>>, _sync: Option<Box<dyn FileSync + Send>>, options: SerialOptions, _keep_rds: Vec<RawDescriptor> ) -> Serial
Constructs a Serial device ready for input and output.
The stream input
should not block, instead returning 0 bytes if are no bytes available.
Auto Trait Implementations§
impl !RefUnwindSafe for Serial
impl Send for Serial
impl !Sync for Serial
impl Unpin for Serial
impl !UnwindSafe for Serial
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.