qemu-rust.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Zhao Liu <zhao1.liu@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-rust@nongnu.org
Subject: Re: [PATCH 03/10] rust: pl011: extract conversion to RegisterOffset
Date: Wed, 22 Jan 2025 22:34:05 +0800	[thread overview]
Message-ID: <Z5EB3b0VqvqxUaWm@intel.com> (raw)
In-Reply-To: <20250117092657.1051233-4-pbonzini@redhat.com>

On Fri, Jan 17, 2025 at 10:26:50AM +0100, Paolo Bonzini wrote:
> Date: Fri, 17 Jan 2025 10:26:50 +0100
> From: Paolo Bonzini <pbonzini@redhat.com>
> Subject: [PATCH 03/10] rust: pl011: extract conversion to RegisterOffset
> X-Mailer: git-send-email 2.47.1
> 
> As an added bonus, this also makes the new function return u32 instead
> of u64, thus factoring some casts into a single place.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  rust/hw/char/pl011/src/device.rs | 114 +++++++++++++++++--------------
>  1 file changed, 63 insertions(+), 51 deletions(-)

[snip]

> -    pub fn read(&mut self, offset: hwaddr, _size: c_uint) -> std::ops::ControlFlow<u64, u64> {
> +    fn regs_read(&mut self, offset: RegisterOffset) -> ControlFlow<u32, u32> {
>          use RegisterOffset::*;

Can we move this "use" to the start of the file?

IMO, placing it in the local scope appears unnecessary and somewhat
fragmented.

> -        let value = 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])
> -            }
> -            Err(_) => {
> -                // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset 0x%x\n", (int)offset);
> -                0
> -            }
> -            Ok(DR) => {
> +        std::ops::ControlFlow::Break(match offset {

std::ops can be omitted now.

> +            DR => {
>                  self.flags.set_receive_fifo_full(false);
>                  let c = self.read_fifo[self.read_pos];
>                  if self.read_count > 0 {

[snip]

> -    pub fn write(&mut self, offset: hwaddr, value: u64) {
> +    fn regs_write(&mut self, offset: RegisterOffset, value: u32) {
>          // eprintln!("write offset {offset} value {value}");
>          use RegisterOffset::*;
> -        let value: u32 = value as u32;
> -        match RegisterOffset::try_from(offset) {
> -            Err(_bad_offset) => {
> -                eprintln!("write bad offset {offset} value {value}");
> -            }
> -            Ok(DR) => {
> +        match offset {
> +            DR => {
>                  // ??? Check if transmitter is enabled.
>                  let ch: u8 = value as u8;
>                  // XXX this blocks entire thread. Rewrite to use
> @@ -290,22 +277,22 @@ pub fn write(&mut self, offset: hwaddr, value: u64) {
>                  self.int_level |= registers::INT_TX;
>                  self.update();
>              }
> -            Ok(RSR) => {
> -                self.receive_status_error_clear.reset();
> +            RSR => {
> +                self.receive_status_error_clear = 0.into();

Emm, why do we use 0.into() instead of reset() here? It looks they're
same.

[snip]

> @@ -562,6 +549,31 @@ pub fn post_load(&mut self, _version_id: u32) -> Result<(), ()> {
>  
>          Ok(())
>      }
> +
> +    pub fn read(&mut self, offset: hwaddr, _size: u32) -> ControlFlow<u64, u64> {

Maybe pub(crate)? But both are fine for me :-)

> +        match RegisterOffset::try_from(offset) {
> +            Err(v) if (0x3f8..0x400).contains(&(v >> 2)) => {
> +                let device_id = self.get_class().device_id;
> +                ControlFlow::Break(u64::from(device_id[(offset - 0xfe0) >> 2]))
> +            }
> +            Err(_) => {
> +                // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset 0x%x\n", (int)offset);
> +                ControlFlow::Break(0)
> +            }
> +            Ok(field) => match self.regs_read(field) {
> +                ControlFlow::Break(value) => ControlFlow::Break(value.into()),
> +                ControlFlow::Continue(value) => ControlFlow::Continue(value.into()),
> +            }
> +        }
> +    }
> +

Look good to me,

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



  reply	other threads:[~2025-01-22 14:15 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-17  9:26 [PATCH 00/10] rust: pl011: correctly use interior mutability Paolo Bonzini
2025-01-17  9:26 ` [PATCH 01/10] rust: pl011: remove unnecessary "extern crate" Paolo Bonzini
2025-01-22 13:37   ` Zhao Liu
2025-01-17  9:26 ` [PATCH 02/10] rust: pl011: hide unnecessarily "pub" items from outside pl011::device Paolo Bonzini
2025-01-22 13:39   ` Zhao Liu
2025-01-17  9:26 ` [PATCH 03/10] rust: pl011: extract conversion to RegisterOffset Paolo Bonzini
2025-01-22 14:34   ` Zhao Liu [this message]
2025-01-22 15:00     ` Paolo Bonzini
2025-01-22 17:00       ` Zhao Liu
2025-01-17  9:26 ` [PATCH 04/10] rust: pl011: extract CharBackend receive logic into a separate function Paolo Bonzini
2025-01-22 14:59   ` Zhao Liu
2025-01-22 15:04     ` Paolo Bonzini
2025-01-17  9:26 ` [PATCH 05/10] rust: pl011: pull interrupt updates out of read/write ops Paolo Bonzini
2025-01-22 16:50   ` Zhao Liu
2025-01-22 16:49     ` Paolo Bonzini
2025-01-17  9:26 ` [PATCH 06/10] rust: pl011: extract PL011Registers Paolo Bonzini
2025-01-23  3:44   ` Zhao Liu
2025-01-23  8:07     ` Paolo Bonzini
2025-01-17  9:26 ` [PATCH 07/10] rust: pl011: wrap registers with BqlRefCell Paolo Bonzini
2025-01-23  5:47   ` Zhao Liu
2025-01-23  8:05     ` Paolo Bonzini
2025-01-23  9:24       ` Zhao Liu
2025-01-23 11:39         ` Paolo Bonzini
2025-01-17  9:26 ` [PATCH 08/10] rust: pl011: remove duplicate definitions Paolo Bonzini
2025-01-23  6:12   ` Zhao Liu
2025-01-17  9:26 ` [PATCH 09/10] rust: pl011: pull device-specific code out of MemoryRegionOps callbacks Paolo Bonzini
2025-01-23  6:18   ` Zhao Liu
2025-01-17  9:26 ` [PATCH 10/10] rust: qdev: make reset take a shared reference Paolo Bonzini
2025-01-23  6:19   ` Zhao Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z5EB3b0VqvqxUaWm@intel.com \
    --to=zhao1.liu@intel.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-rust@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).