[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 45/48] rust: pl011: drop use of ControlFlow
From: |
Paolo Bonzini |
Subject: |
[PULL 45/48] rust: pl011: drop use of ControlFlow |
Date: |
Fri, 24 Jan 2025 10:44:39 +0100 |
It is a poor match for what the code is doing, anyway.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
rust/hw/char/pl011/src/device.rs | 39 +++++++++++++++-----------------
1 file changed, 18 insertions(+), 21 deletions(-)
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index 9a0ba87aa5b..e916ea11884 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -5,7 +5,6 @@
use core::ptr::{addr_of, addr_of_mut, NonNull};
use std::{
ffi::CStr,
- ops::ControlFlow,
os::raw::{c_int, c_void},
};
@@ -177,10 +176,11 @@ fn vmsd() -> Option<&'static VMStateDescription> {
}
impl PL011Registers {
- pub(self) fn read(&mut self, offset: RegisterOffset) -> ControlFlow<u32,
u32> {
+ pub(self) fn read(&mut self, offset: RegisterOffset) -> (bool, u32) {
use RegisterOffset::*;
- ControlFlow::Break(match offset {
+ let mut update = false;
+ let result = match offset {
DR => {
self.flags.set_receive_fifo_full(false);
let c = self.read_fifo[self.read_pos];
@@ -196,8 +196,9 @@ pub(self) fn read(&mut self, offset: RegisterOffset) ->
ControlFlow<u32, u32> {
}
// Update error bits.
self.receive_status_error_clear.set_from_data(c);
- // Must call qemu_chr_fe_accept_input, so return Continue:
- return ControlFlow::Continue(u32::from(c));
+ // Must call qemu_chr_fe_accept_input
+ update = true;
+ u32::from(c)
}
RSR => u32::from(self.receive_status_error_clear),
FR => u32::from(self.flags),
@@ -216,7 +217,8 @@ pub(self) fn read(&mut self, offset: RegisterOffset) ->
ControlFlow<u32, u32> {
0
}
DMACR => self.dmacr,
- })
+ };
+ (update, result)
}
pub(self) fn write(
@@ -540,31 +542,26 @@ fn post_init(&self) {
}
pub fn read(&mut self, offset: hwaddr, _size: u32) -> u64 {
- let mut update_irq = false;
- let result = match RegisterOffset::try_from(offset) {
+ match RegisterOffset::try_from(offset) {
Err(v) if (0x3f8..0x400).contains(&(v >> 2)) => {
let device_id = self.get_class().device_id;
- u32::from(device_id[(offset - 0xfe0) >> 2])
+ u64::from(device_id[(offset - 0xfe0) >> 2])
}
Err(_) => {
// qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset
0x%x\n", (int)offset);
0
}
- Ok(field) => match self.regs.borrow_mut().read(field) {
- ControlFlow::Break(value) => value,
- ControlFlow::Continue(value) => {
- update_irq = true;
- value
+ Ok(field) => {
+ let (update_irq, result) = self.regs.borrow_mut().read(field);
+ if update_irq {
+ self.update();
+ unsafe {
+ qemu_chr_fe_accept_input(&mut self.char_backend);
+ }
}
- },
- };
- if update_irq {
- self.update();
- unsafe {
- qemu_chr_fe_accept_input(&mut self.char_backend);
+ result.into()
}
}
- result.into()
}
pub fn write(&mut self, offset: hwaddr, value: u64) {
--
2.48.1
- [PULL 42/48] rust: pl011: wrap registers with BqlRefCell, (continued)
- [PULL 42/48] rust: pl011: wrap registers with BqlRefCell, Paolo Bonzini, 2025/01/24
- [PULL 43/48] rust: pl011: remove duplicate definitions, Paolo Bonzini, 2025/01/24
- [PULL 24/48] memattrs: Check the size of MemTxAttrs, Paolo Bonzini, 2025/01/24
- [PULL 34/48] rust: vmstate: make order of parameters consistent in vmstate_clock, Paolo Bonzini, 2025/01/24
- [PULL 19/48] docs: Add GNR, SRF and CWF CPU models, Paolo Bonzini, 2025/01/24
- [PULL 30/48] rust: vmstate: add public utility macros to implement VMState, Paolo Bonzini, 2025/01/24
- [PULL 36/48] rust: pl011: remove unnecessary "extern crate", Paolo Bonzini, 2025/01/24
- [PULL 37/48] rust: pl011: hide unnecessarily "pub" items from outside pl011::device, Paolo Bonzini, 2025/01/24
- [PULL 48/48] rust: qemu-api: add sub-subclass to the integration tests, Paolo Bonzini, 2025/01/24
- [PULL 21/48] rust/qdev: Make REALIZE safe, Paolo Bonzini, 2025/01/24
- [PULL 45/48] rust: pl011: drop use of ControlFlow,
Paolo Bonzini <=
- [PULL 40/48] rust: pl011: pull interrupt updates out of read/write ops, Paolo Bonzini, 2025/01/24
- [PULL 32/48] rust: pl011: switch vmstate to new-style macros, Paolo Bonzini, 2025/01/24
- [PULL 38/48] rust: pl011: extract conversion to RegisterOffset, Paolo Bonzini, 2025/01/24
- [PULL 47/48] rust/zeroable: Implement Zeroable with const_zero macro, Paolo Bonzini, 2025/01/24
- [PULL 27/48] rust: vmstate: add varray support to vmstate_of!, Paolo Bonzini, 2025/01/24
- [PULL 28/48] rust: vmstate: implement Zeroable for VMStateField, Paolo Bonzini, 2025/01/24
- [PULL 31/48] rust: qemu_api: add vmstate_struct, Paolo Bonzini, 2025/01/24
- [PULL 39/48] rust: pl011: extract CharBackend receive logic into a separate function, Paolo Bonzini, 2025/01/24
- [PULL 44/48] rust: pl011: pull device-specific code out of MemoryRegionOps callbacks, Paolo Bonzini, 2025/01/24
- [PULL 33/48] rust: vmstate: remove translation of C vmstate macros, Paolo Bonzini, 2025/01/24