aboutsummaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-12-06 19:00:21 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2025-01-27 19:27:40 +0100
commit137612772e300a386f0f0c31486eae7d1008a68c (patch)
treecb5df3d14bd89d3651e49f2fa8037b9d1c80f66b /rust
parent6d314cc04544969bd83521a315312702b8c166d1 (diff)
downloadqemu-137612772e300a386f0f0c31486eae7d1008a68c.zip
qemu-137612772e300a386f0f0c31486eae7d1008a68c.tar.gz
qemu-137612772e300a386f0f0c31486eae7d1008a68c.tar.bz2
rust: pl011: extract CharBackend receive logic into a separate function
Prepare for moving all references to the registers and the FIFO into a separate struct. Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'rust')
-rw-r--r--rust/hw/char/pl011/src/device.rs15
1 files changed, 9 insertions, 6 deletions
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index 64e7234..b14dcab 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -6,7 +6,7 @@ use core::ptr::{addr_of, addr_of_mut, NonNull};
use std::{
ffi::CStr,
ops::ControlFlow,
- os::raw::{c_int, c_uint, c_void},
+ os::raw::{c_int, c_void},
};
use qemu_api::{
@@ -478,6 +478,12 @@ impl PL011State {
self.read_count < self.fifo_depth()
}
+ pub fn receive(&mut self, ch: u32) {
+ if !self.loopback_enabled() {
+ self.put_fifo(ch)
+ }
+ }
+
pub fn event(&mut self, event: QEMUChrEvent) {
if event == QEMUChrEvent::CHR_EVENT_BREAK && !self.loopback_enabled() {
self.put_fifo(registers::Data::BREAK.into());
@@ -503,7 +509,7 @@ impl PL011State {
1
}
- pub fn put_fifo(&mut self, value: c_uint) {
+ pub fn put_fifo(&mut self, value: u32) {
let depth = self.fifo_depth();
assert!(depth > 0);
let slot = (self.read_pos + self.read_count) & (depth - 1);
@@ -626,12 +632,9 @@ pub unsafe extern "C" fn pl011_can_receive(opaque: *mut c_void) -> c_int {
pub unsafe extern "C" fn pl011_receive(opaque: *mut c_void, buf: *const u8, size: c_int) {
let mut state = NonNull::new(opaque).unwrap().cast::<PL011State>();
unsafe {
- if state.as_ref().loopback_enabled() {
- return;
- }
if size > 0 {
debug_assert!(!buf.is_null());
- state.as_mut().put_fifo(c_uint::from(buf.read_volatile()))
+ state.as_mut().receive(u32::from(buf.read_volatile()));
}
}
}