From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106105; cv=none; d=zohomail.com; s=zohoarc; b=diik4UEBJR017Hlbc63fWRZUzGcYC7jW/yaVqSilpW6J1yHrTA/MhOL0LLZrbnPodbpdbrMT5NDQlx2TocdzB5lkeiFOWJZfXXDYBcajx77iqU4GLATB3bdSJwEyb+PAgITLp6u2zhG0GfPYXR0bUE8D5fJf0vaBeCT17Togbo4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106105; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=1sWErDgBgStcF4IIFiG2aKGTxEPfyMd9ElyExlJqlCM=; b=SDzvgEE4Wtbmmlwv9yHGFOb/ziusQtLn2Kj+SCTN/M3YVAzjst7jg+kWDvtROx+Za4wFoickDjDsESm03CqgxvjK5Me44l61x8ONzyP3w7Ycsdv9mzScfX3TbgxFYTz4cXWvqQydSYvUz6r7JOiv0Z+W20gNxZo0t9Za0O2k0hA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106105325668.9920582313999; Fri, 17 Jan 2025 01:28:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidC-0002Wd-Df; Fri, 17 Jan 2025 04:27:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidB-0002W8-2L for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYid9-0003Ot-Kq for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:08 -0500 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-58-QLcPmEuAMhO0hr0dj48pYQ-1; Fri, 17 Jan 2025 04:27:03 -0500 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-aa67855b3deso169525966b.1 for ; Fri, 17 Jan 2025 01:27:03 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab398ac5879sm14112366b.162.2025.01.17.01.26.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106027; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1sWErDgBgStcF4IIFiG2aKGTxEPfyMd9ElyExlJqlCM=; b=ONve/fNpDatv6lxUyE4GDQfHMxe6B9vWz2qSr1kNFK2VQfySrI59LTY9k678hvUaKvtLC8 bFPzkhFFRWSRyEaR2ESzNKwPQTlt3ov3XLy/gDlCxSq67ek1DQcoeLjgxlJn9vPFYH0V94 3rloVJZMbLYMqY4lh7Q9mRGRZIPFd80= X-MC-Unique: QLcPmEuAMhO0hr0dj48pYQ-1 X-Mimecast-MFC-AGG-ID: QLcPmEuAMhO0hr0dj48pYQ X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106022; x=1737710822; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1sWErDgBgStcF4IIFiG2aKGTxEPfyMd9ElyExlJqlCM=; b=lWzGGu+6H1TQULm1IXmAm0bV1Tuks6Nl0YVLFwuKuKuuGWQRf0jVRS/0R+7oXTTU9v CeOpJcfU+J7m2CRsoOwCeCvCxb5vSG7KMJnt6lvZKo9nFv6EngZ7zTrBsmcxycmOVMbZ /M+byU07RW+7xyJgq+UJfx2hmy43azyDDuhTWtzqKxUYZSvXY3YDU1rBXpbbgDU2Jui1 apUXvZt26RLIQMQNNhRFTJBz6Ae0PN69rNlu17/o3x/F2MQZeBkYrzgJGc+LIkB1VlqR xsY3LOPMXLo8vfBD9biTMN2bbLshsq9YRf4yH2OdEHdMb2hlOwcjzFWWd8pxg2HYW2Wy tpiQ== X-Gm-Message-State: AOJu0YwHXBxZ8pYXS7OB69PBrm3KS2d9DeTu69+2X0dYivFAdL7OhyrA 43ArEVVj7Dv892g4gGkZsZAqzOAiF3Q943dCe3lg3vibeDyYn5+CK4gi89J1ymV3jzkPpCADP/n k6HVwyHafsbDvXKJgoIqLd0hqe08PeMv3IWdwFG02FrUIulU/3vEGWh+14dXRK2BybXlVZ05YYA AyDXh4XAGnYOETTekRrO5q/4dj2SoQdPuuc+O9Z9s= X-Gm-Gg: ASbGncvEIZiTVbl2inxKzLtA/A2RhWCKCpUgtxX3gmNwRa2yIrfSt2sQA8dnXoEcpi1 NDxUqtUNA7Z1cpsFtmZyBH7spdmMjpeBpDCmpMMziTEtZbKv7pc8xEdYQ4Cc8Go45ZEv0Z2rYgX d4AjhAu6DaQleJYl1nqT0n1gkiE4/DBfvZLgiFjRdgrtj2D+kdqLH/QGhjHudUT/LIZELSWxaxk 2Zi7Mdb4DHDrQNUvJWK1FO99z9UoOS+AyZvbQaN981peVQBTVWKYTBe2I6z X-Received: by 2002:a17:907:98b:b0:aa6:aa8a:9088 with SMTP id a640c23a62f3a-ab38b44d471mr186961466b.41.1737106021750; Fri, 17 Jan 2025 01:27:01 -0800 (PST) X-Google-Smtp-Source: AGHT+IEk6bG2UE+cUPVwBEJo1OkWk6DXnHkUE1Q7mZ9OfUwZKkowqMCw3iuNOMc2f8aHnNafDdTF0g== X-Received: by 2002:a17:907:98b:b0:aa6:aa8a:9088 with SMTP id a640c23a62f3a-ab38b44d471mr186959466b.41.1737106021300; Fri, 17 Jan 2025 01:27:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 01/10] rust: pl011: remove unnecessary "extern crate" Date: Fri, 17 Jan 2025 10:26:48 +0100 Message-ID: <20250117092657.1051233-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -39 X-Spam_score: -4.0 X-Spam_bar: ---- X-Spam_report: (-4.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-1.797, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106106234019000 Content-Type: text/plain; charset="utf-8" Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/lib.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rust/hw/char/pl011/src/lib.rs b/rust/hw/char/pl011/src/lib.rs index f30f9850ad4..d10f0805aac 100644 --- a/rust/hw/char/pl011/src/lib.rs +++ b/rust/hw/char/pl011/src/lib.rs @@ -25,10 +25,6 @@ #![allow(clippy::upper_case_acronyms)] #![allow(clippy::result_unit_err)] =20 -extern crate bilge; -extern crate bilge_impl; -extern crate qemu_api; - use qemu_api::c_str; =20 pub mod device; --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106081; cv=none; d=zohomail.com; s=zohoarc; b=VgldJBO3N+5EbVJANnD9EN5nQFV3en9dzLocGhRJGGsZ/7ebbjGNJa+SpuoThET0CA351UlFhdmy/bnsFoIATuyRU8f//ge3CbFAGowlMxZmhDyBYG/tuxV07pRm7qT+paNieRqJBC1aWEZeBoxMwlFJl7/DBZcTZDTYw9wlGbc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106081; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=LHIx6YD9KYcmWShWQUyELs6YliSZmQn+Rg6KU2NYAh4=; b=VAXnr2+DVIQHrVzK7I7G9xV+auz13XyfeK2iZlOY3LslwYBx6rAOMGkcYSMJhxYKDwpEqrv9ZGCLN6QXQdceGgcPekywRj+UP7iRXo/u5ZJzxVcP1aXwOGM9RwTSbBW5IsClAnMOWEq2XO4Xts06ugAgBwEUgZIAZEM5Zkl6Y5k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 173710608124535.75902793253533; Fri, 17 Jan 2025 01:28:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidE-0002XL-9s; Fri, 17 Jan 2025 04:27:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidC-0002Wb-C9 for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:10 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYid9-0003Ow-Ld for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:10 -0500 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-261-uwfYejEsOH62yIio6_A-DQ-1; Fri, 17 Jan 2025 04:27:05 -0500 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-aa6732a1af5so180997966b.3 for ; Fri, 17 Jan 2025 01:27:05 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384c74cd8sm139482366b.3.2025.01.17.01.27.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106027; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LHIx6YD9KYcmWShWQUyELs6YliSZmQn+Rg6KU2NYAh4=; b=QPToVZb3ADcInUZOFQrc2AHxCzslEHIOEI4l9kaq1FueMA2NR/HIUJJUlWshVxrQ/MwNPl q1LWts8mYqq8+aOxLL4kK4TanNHhZtdFcDFfvMVqSrJA3i6J84meDx+S4YdtwlK+hvogb1 WjwiHSwI0CuLKhI2WRai6+37GVQJY3s= X-MC-Unique: uwfYejEsOH62yIio6_A-DQ-1 X-Mimecast-MFC-AGG-ID: uwfYejEsOH62yIio6_A-DQ X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106024; x=1737710824; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LHIx6YD9KYcmWShWQUyELs6YliSZmQn+Rg6KU2NYAh4=; b=omst0zTzz+RupVOig8Mpk7/D1beFS9sFpv56kaGvdE4KNkdVV/3zilQm2i/sJZVeAq Np7CegtGfiYruLSxgxitZ0o5fHsRHEOfsjckf4lBYZhY7J7fEiZKoPBB0dHDO5fBeSVc /9rNyXoJVavbDhpuDW4wTUUtORf6vh1/s7MnGMInvrZrPwp798W5/GV0XpujH3CpQfkr W8BF5Y7x7x1sDOqncqx4uS9q7hVzr6NNxEGXtIK5y+1AAMcZLql6h7/habUOcluIP++u QW2zkms421UOSWzsqxG+Rpb3PpfO3bH/UTQHeoM9bV1c5arv7ET7TlXDmNav54EsSFVV vzxA== X-Gm-Message-State: AOJu0YwbS1JUW0fGpsZsAZc5wVYTIpPp86llghetgty3qCbiAisGV8qp PDpOE2q1EEOHs9DpK2apt9V4aUTqhjZOaZaZpGCMmfY3IIGgnof24glWYh1CW4gVBkRML4E3E4Y G15MuBZOfrpT0Aai0s/kMhl/DfaDgUfPh4oCDwEoonIdWhxTDMM5usmwN3DufUxJovgQpruHNiG 6L7E6GWnuVD/r8V/29WbL+Z+Hl7GXz0JPc8GOlHS4= X-Gm-Gg: ASbGncuW1G7IeRegP8fGXspe/DvWBOfnHy6Q+jawifB/j6C0OhrWYwqQNNIWNd8DeSn 5ZeP2TKlTXWrposQnslL3VXNNsLstZS1TSgZU/YXv/cKNE3Z39SQtGY4aAcsJgH5PDXUmFcNMi3 wOUbDNCP665jRIztfbMKxo/375K4AV38hAToI3gcxHq7jFyxJMTzNDEp6ZOuftnzi/5QvvtmP8j 7SVlzZKRbnwABCedm7ZUzkq1YLWBarP2DJNJ2eqIFYHT8tGBFBKZf4P6Ajd X-Received: by 2002:a17:906:cec6:b0:ab3:85eb:377b with SMTP id a640c23a62f3a-ab38b4c6c1emr183550566b.53.1737106023649; Fri, 17 Jan 2025 01:27:03 -0800 (PST) X-Google-Smtp-Source: AGHT+IHM0mJvtY8pA+DH5mVS/e7Ey0Sz1Ooyy8eupg8JIcJnYdQkWvqa0bYjt8ezufRBrw2WpLuJxw== X-Received: by 2002:a17:906:cec6:b0:ab3:85eb:377b with SMTP id a640c23a62f3a-ab38b4c6c1emr183548266b.53.1737106023163; Fri, 17 Jan 2025 01:27:03 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 02/10] rust: pl011: hide unnecessarily "pub" items from outside pl011::device Date: Fri, 17 Jan 2025 10:26:49 +0100 Message-ID: <20250117092657.1051233-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106082139019000 Content-Type: text/plain; charset="utf-8" The only public interfaces for pl011 are TYPE_PL011 and pl011_create. Remove pub from everything else. Note: the "allow(dead_code)" is removed later. Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 2 +- rust/hw/char/pl011/src/device_class.rs | 2 +- rust/hw/char/pl011/src/lib.rs | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 11a87664c7a..e85e46ba0bb 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -565,7 +565,7 @@ pub fn post_load(&mut self, _version_id: u32) -> Result= <(), ()> { } =20 /// Which bits in the interrupt status matter for each outbound IRQ line ? -pub const IRQMASK: [u32; 6] =3D [ +const IRQMASK: [u32; 6] =3D [ /* combined IRQ */ Interrupt::E | Interrupt::MS diff --git a/rust/hw/char/pl011/src/device_class.rs b/rust/hw/char/pl011/sr= c/device_class.rs index b052d98803f..2fd805fd12d 100644 --- a/rust/hw/char/pl011/src/device_class.rs +++ b/rust/hw/char/pl011/src/device_class.rs @@ -21,7 +21,7 @@ extern "C" fn pl011_clock_needed(opaque: *mut c_void) -> = bool { } =20 /// Migration subsection for [`PL011State`] clock. -pub static VMSTATE_PL011_CLOCK: VMStateDescription =3D VMStateDescription { +static VMSTATE_PL011_CLOCK: VMStateDescription =3D VMStateDescription { name: c_str!("pl011/clock").as_ptr(), version_id: 1, minimum_version_id: 1, diff --git a/rust/hw/char/pl011/src/lib.rs b/rust/hw/char/pl011/src/lib.rs index d10f0805aac..2baacba2306 100644 --- a/rust/hw/char/pl011/src/lib.rs +++ b/rust/hw/char/pl011/src/lib.rs @@ -27,9 +27,11 @@ =20 use qemu_api::c_str; =20 -pub mod device; -pub mod device_class; -pub mod memory_ops; +mod device; +mod device_class; +mod memory_ops; + +pub use device::pl011_create; =20 pub const TYPE_PL011: &::std::ffi::CStr =3D c_str!("pl011"); pub const TYPE_PL011_LUMINARY: &::std::ffi::CStr =3D c_str!("pl011_luminar= y"); @@ -42,7 +44,7 @@ #[allow(non_camel_case_types)] #[repr(u64)] #[derive(Debug, qemu_api_macros::TryInto)] -pub enum RegisterOffset { +enum RegisterOffset { /// Data Register /// /// A write to this register initiates the actual data transmission @@ -98,7 +100,8 @@ pub enum RegisterOffset { //Reserved =3D 0x04C, } =20 -pub mod registers { +#[allow(dead_code)] +mod registers { //! Device registers exposed as typed structs which are backed by arbi= trary //! integer bitmaps. [`Data`], [`Control`], [`LineControl`], etc. use bilge::prelude::*; --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106061; cv=none; d=zohomail.com; s=zohoarc; b=PNCZAjovr0WfI2XdtB1ykXbZhfop1SH0ysW7FDFlfeiETsAy4GBFVfJTM3h6GULm0irOq51ye1l9X1GufvhRcZHNSV7ackkUeZ8zSWu2htCOEONo/KUzHwa1JKvXpOiU5VWCW2z+pS4nuD2SPu5AlyekUpUQ/D+bO3im5HQp8MM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106061; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yg9E2XuUSyGQRjCtC8wEmW8Wp8rdiIMGDc9ZVcc615o=; b=G/xNCP2V7H3XQS65+QWA9ZrMZQidW5midPeyzIO5SL9Oka4VnEQwds96s3Lnl35jK39TuaGBqmwA4IwzspS1tWn4coHmZVmK1046WslAyf3l3S93YQGibVF/tKu5cnufRAKNVcbD65DPsAIRUfDOTLmbpi1Wjd0yUbINv5zF2Uw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106061491401.4043210802158; Fri, 17 Jan 2025 01:27:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidG-0002YW-OF; Fri, 17 Jan 2025 04:27:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidE-0002Xr-VD for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:12 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidD-0003Pl-7k for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:12 -0500 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-575-769Py5syN2KXodCZEe6mDA-1; Fri, 17 Jan 2025 04:27:07 -0500 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-aaf901a0ef9so166379466b.0 for ; Fri, 17 Jan 2025 01:27:07 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384f8d88fsm139383966b.140.2025.01.17.01.27.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106030; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yg9E2XuUSyGQRjCtC8wEmW8Wp8rdiIMGDc9ZVcc615o=; b=gCugkKQErxGiZAZu+UEnEUKPxr6GQhlEatYJDE7Yvnc3iLJehyEQXwj4LvMin9cXPjcaeG SpRDhhunvksZLif1JswPs9wYYerFaWxxv5y54bU9oYrb6EsRONnygIDSS6wcMKTf8nX1qG b6hfGbgKYJkAoPhOI93Z6pfEz9noylk= X-MC-Unique: 769Py5syN2KXodCZEe6mDA-1 X-Mimecast-MFC-AGG-ID: 769Py5syN2KXodCZEe6mDA X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106026; x=1737710826; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yg9E2XuUSyGQRjCtC8wEmW8Wp8rdiIMGDc9ZVcc615o=; b=GWepBezQl/bhqqSdpu8awSpBxBZ1/6q16WdQQf3OsW4nyntctUJvVVip+7lgeX8XYO bhA1hwjXEPT2C1jorrOujQs1CtPE0XKfbCH6ZRibmpQEs6LHE2Na9DxYZdFVRqhIAT4i h/y0brUscdWemC+QWYqoUMMZ5Wkw5JjcTix33oNFueZMt0UA+muSDf4Lr2LTa5wbpyxT 5ILqvBTSL4FayXj9y7+jXS/vqp0QGRrJc6yH/rK7xZXnx70G8ISAgysTc4ytfF/Z5/OT A+skird4hy/cri6wL5UQ6/UA07d6jzPO8BEvGemf+dLeI6JX/XgMMQQ94XQbC1uUDAZo duJQ== X-Gm-Message-State: AOJu0Yzlo2lffzhQeWrCuaOXGzTvn5eGh3zzb6/moF+kBikAjjZO+YKo 6AELkGi5X9VsbhDrlbJDdWfEFPIejDCO0PDDcJzGpaw0+wPMWfGjOcbE1ljO0CAOJc82Lnpokf8 Fp4C6YAHZtfB9V8Fz5D47cQqzag7FWLMkO2sPef7lZQmV+K7S0nvJGZdhuJGBjPwvob9yFosEco w3dOY71hps/wX6YkOJwHJOZZ3DGHMnlAisZQqzHEk= X-Gm-Gg: ASbGncunjR8u/BnyPWZK+kEeyiYCBlkv+2IgtUXpaW40f6TTaUdfFotI9NPxTdZhD2A twx8xBcYUMvzl1Ac5oxCNcRconPivi9whh59HrwT9Ay8ViKh586fwE0Z8DHvacXtfE9OpokS1vz zd9+zoIZrkmF0JsT9Lb91mcU9THUjrCKaLoXhJOnFkFQOfc9UClQlpiNJJmnjqar28Ch19Q8lL0 HaEAlK88BsIaXKfofXtT+5vrI1wcZIr40e/yZ+EkoDFg0FwFsyiqcPlOVWp X-Received: by 2002:a17:907:3206:b0:aac:622:8f6 with SMTP id a640c23a62f3a-ab38b1ff09emr197267666b.17.1737106025785; Fri, 17 Jan 2025 01:27:05 -0800 (PST) X-Google-Smtp-Source: AGHT+IGU5XNZEKrYV9IyAuzfTQf6xXnxWnsSY9NzqVGivP0fD/0XYrPu9v560RW9MBSNGAlHZevAig== X-Received: by 2002:a17:907:3206:b0:aac:622:8f6 with SMTP id a640c23a62f3a-ab38b1ff09emr197265966b.17.1737106025264; Fri, 17 Jan 2025 01:27:05 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 03/10] rust: pl011: extract conversion to RegisterOffset Date: Fri, 17 Jan 2025 10:26:50 +0100 Message-ID: <20250117092657.1051233-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106062184019000 Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 114 +++++++++++++++++-------------- 1 file changed, 63 insertions(+), 51 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index e85e46ba0bb..6d662865182 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -5,6 +5,7 @@ use core::ptr::{addr_of_mut, NonNull}; use std::{ ffi::CStr, + ops::ControlFlow, os::raw::{c_int, c_uint, c_void}, }; =20 @@ -214,19 +215,11 @@ fn post_init(&self) { } } =20 - pub fn read(&mut self, offset: hwaddr, _size: c_uint) -> std::ops::Con= trolFlow { + fn regs_read(&mut self, offset: RegisterOffset) -> ControlFlow { use RegisterOffset::*; =20 - let value =3D match RegisterOffset::try_from(offset) { - Err(v) if (0x3f8..0x400).contains(&(v >> 2)) =3D> { - let device_id =3D self.get_class().device_id; - u32::from(device_id[(offset - 0xfe0) >> 2]) - } - Err(_) =3D> { - // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset = 0x%x\n", (int)offset); - 0 - } - Ok(DR) =3D> { + std::ops::ControlFlow::Break(match offset { + DR =3D> { self.flags.set_receive_fifo_full(false); let c =3D self.read_fifo[self.read_pos]; if self.read_count > 0 { @@ -243,39 +236,33 @@ pub fn read(&mut self, offset: hwaddr, _size: c_uint)= -> std::ops::ControlFlow u32::from(self.receive_status_error_clear), - Ok(FR) =3D> u32::from(self.flags), - Ok(FBRD) =3D> self.fbrd, - Ok(ILPR) =3D> self.ilpr, - Ok(IBRD) =3D> self.ibrd, - Ok(LCR_H) =3D> u32::from(self.line_control), - Ok(CR) =3D> u32::from(self.control), - Ok(FLS) =3D> self.ifl, - Ok(IMSC) =3D> self.int_enabled, - Ok(RIS) =3D> self.int_level, - Ok(MIS) =3D> self.int_level & self.int_enabled, - Ok(ICR) =3D> { + return ControlFlow::Continue(u32::from(c)); + }, + RSR =3D> u32::from(self.receive_status_error_clear), + FR =3D> u32::from(self.flags), + FBRD =3D> self.fbrd, + ILPR =3D> self.ilpr, + IBRD =3D> self.ibrd, + LCR_H =3D> u32::from(self.line_control), + CR =3D> u32::from(self.control), + FLS =3D> self.ifl, + IMSC =3D> self.int_enabled, + RIS =3D> self.int_level, + MIS =3D> self.int_level & self.int_enabled, + ICR =3D> { // "The UARTICR Register is the interrupt clear register a= nd is write-only" // Source: ARM DDI 0183G 3.3.13 Interrupt Clear Register, = UARTICR 0 - } - Ok(DMACR) =3D> self.dmacr, - }; - std::ops::ControlFlow::Break(value.into()) + }, + DMACR =3D> self.dmacr, + }) } =20 - 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 =3D value as u32; - match RegisterOffset::try_from(offset) { - Err(_bad_offset) =3D> { - eprintln!("write bad offset {offset} value {value}"); - } - Ok(DR) =3D> { + match offset { + DR =3D> { // ??? Check if transmitter is enabled. let ch: u8 =3D 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 |=3D registers::INT_TX; self.update(); } - Ok(RSR) =3D> { - self.receive_status_error_clear.reset(); + RSR =3D> { + self.receive_status_error_clear =3D 0.into(); } - Ok(FR) =3D> { + FR =3D> { // flag writes are ignored } - Ok(ILPR) =3D> { + ILPR =3D> { self.ilpr =3D value; } - Ok(IBRD) =3D> { + IBRD =3D> { self.ibrd =3D value; } - Ok(FBRD) =3D> { + FBRD =3D> { self.fbrd =3D value; } - Ok(LCR_H) =3D> { + LCR_H =3D> { let new_val: registers::LineControl =3D value.into(); // Reset the FIFO state on FIFO enable or disable if self.line_control.fifos_enabled() !=3D new_val.fifos_en= abled() { @@ -328,26 +315,26 @@ pub fn write(&mut self, offset: hwaddr, value: u64) { self.line_control =3D new_val; self.set_read_trigger(); } - Ok(CR) =3D> { + CR =3D> { // ??? Need to implement the enable bit. self.control =3D value.into(); self.loopback_mdmctrl(); } - Ok(FLS) =3D> { + FLS =3D> { self.ifl =3D value; self.set_read_trigger(); } - Ok(IMSC) =3D> { + IMSC =3D> { self.int_enabled =3D value; self.update(); } - Ok(RIS) =3D> {} - Ok(MIS) =3D> {} - Ok(ICR) =3D> { + RIS =3D> {} + MIS =3D> {} + ICR =3D> { self.int_level &=3D !value; self.update(); } - Ok(DMACR) =3D> { + DMACR =3D> { self.dmacr =3D value; if value & 3 > 0 { // qemu_log_mask(LOG_UNIMP, "pl011: DMA not implemente= d\n"); @@ -562,6 +549,31 @@ pub fn post_load(&mut self, _version_id: u32) -> Resul= t<(), ()> { =20 Ok(()) } + + pub fn read(&mut self, offset: hwaddr, _size: u32) -> ControlFlow { + match RegisterOffset::try_from(offset) { + Err(v) if (0x3f8..0x400).contains(&(v >> 2)) =3D> { + let device_id =3D self.get_class().device_id; + ControlFlow::Break(u64::from(device_id[(offset - 0xfe0) >>= 2])) + } + Err(_) =3D> { + // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset = 0x%x\n", (int)offset); + ControlFlow::Break(0) + } + Ok(field) =3D> match self.regs_read(field) { + ControlFlow::Break(value) =3D> ControlFlow::Break(value.in= to()), + ControlFlow::Continue(value) =3D> ControlFlow::Continue(va= lue.into()), + } + } + } + + pub fn write(&mut self, offset: hwaddr, value: u64) { + if let Ok(field) =3D RegisterOffset::try_from(offset) { + self.regs_write(field, value as u32); + } else { + eprintln!("write bad offset {offset} value {value}"); + } + } } =20 /// Which bits in the interrupt status matter for each outbound IRQ line ? --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106063; cv=none; d=zohomail.com; s=zohoarc; b=SgFTeOrPnjoFvIJGZxbPdRDOZFh25boMM2JSftcmQMyU9g0j52LvG73Ch5WDngqniuycoxZVXPk22LMh7tiGwvnggf8xMcS2+UZBMm1PWCbjBj4JHy6+1DErqYkJuSq8MAB+CVC64sYGkrB9Ba1Vv/sshO9/pqCW6CYJNe1pIis= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106063; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yQ+sUuwc6C6WWkzJforxNjfkV4dPtivna2iSl2/kOD4=; b=kfpFNFQfKPrpxylMi7SwnB+jlBO9Xik/tsFjqd76mOpoC1U08l/6kJYVv0UYEHpCFnCHEXzDl8jyPxweWDOUGpNhjj9l+zhzy6JXpiFNryFeV4ZKuOViAQ+dojMEVkpG2GvhlMN9ABLWqgX24Y16/XCLLrmQ8XYOdfBD0g63DrI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17371060637371.3633377043297514; Fri, 17 Jan 2025 01:27:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidI-0002ZF-9K; Fri, 17 Jan 2025 04:27:16 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidG-0002YO-3B for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:14 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidE-0003Px-Jc for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:13 -0500 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-651-rXBIGrUcMWWtmO5d2d66iw-1; Fri, 17 Jan 2025 04:27:10 -0500 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-aaf8396f65fso202721966b.0 for ; Fri, 17 Jan 2025 01:27:10 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384fcec76sm136223366b.184.2025.01.17.01.27.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106031; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yQ+sUuwc6C6WWkzJforxNjfkV4dPtivna2iSl2/kOD4=; b=fHmQsLqdhuOqKEAMTdC5g+3PtgKB+qdnndMoRWZ6n8bgwY4S1iKuubPoogMJ/lAQ9CDKNV U975eK+vmovwH+EA6ycwwy3ZCk1+XYpA6hxedN3XJaSNV0GxjLef5ee2TVyZFjdbn0JOh9 lF6/GhKzYm2YMYvTMerCCPOIjtnUGcQ= X-MC-Unique: rXBIGrUcMWWtmO5d2d66iw-1 X-Mimecast-MFC-AGG-ID: rXBIGrUcMWWtmO5d2d66iw X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106028; x=1737710828; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yQ+sUuwc6C6WWkzJforxNjfkV4dPtivna2iSl2/kOD4=; b=DvHNCzCJHZTlJEr8ByVXYXkpWD0r0LJ4Pd42kYLqege4BAW43Gg8NgxC2HP4hyhXEn KP4wYSr3hXerXfBAm75gWbl1zLc4rH6/lfcVS7ClNGKoHFXogx9Drq1isVP+gkekCCtQ PYeXx4a4x7AexlRbzY3BPGIgSANuzzrM7ywhVGEJeXq/9Ftad32Fo5jghPQVx/B1jrUJ ondkPzH6arrexKQXXGaiUhkyL0/psq964SXgwLcmnwRepGOqOap2kYdtcoARK0ofM9WT hDfOzkBYF6LmeOvOvcuLzHHYhgWBd+UzjNB0+gEnZ/AKZnOVzgNnGKedJ358SOcsubhw +xMw== X-Gm-Message-State: AOJu0YzFWCFvR1cZtbpuYwH7vIt/Ku2/Qog+7GrLMDzrOIefE+Z1vkQ/ p+t+xSPgfsxwGsOv1mg/+udshq56XAQn+35GqZeF2Ab0vubqG0107axC0qWuZSh0QC1NcqvbEmR xbF1wwOcZ+vSyXqW+h5iJLRUioJftzR21iCKN/9JJ9ewV5HEVUnrEFxTMMx/Lq/FkY3CwDvSEgU QtJ++12YjET1DwiwINcrMtCWzRkH2xz+qqH8ZFjjg= X-Gm-Gg: ASbGnct/J0UMbxxQTP5qwMd9181GV4DLGACH/WOS3tUDyRbX5/hMB9zpqvILejikV9g gfvdfNbXFOt7wB6XZS4umV8cApnW5Y1OI++kBFxThTmE6mCPOKeV+BimHtj9jBTuXyxrySltuss n3MXuhiy9BiCo8aEMZbIhHi2Ms+nvmUsGCHQVQtBSbt8SK3ZstzXHYu6AsidEz7QsdweqdOy08T rFFgzoXUr/DNZivSvXf6hZUx+tA2kB0MOqAXS03WlUbp7HTxGnUbvTp0++6 X-Received: by 2002:a17:907:2cc7:b0:aa6:9ee3:e51f with SMTP id a640c23a62f3a-ab38b377762mr207322666b.41.1737106028345; Fri, 17 Jan 2025 01:27:08 -0800 (PST) X-Google-Smtp-Source: AGHT+IGgFxSLGX9Q61z3o5ZA4AS2wJlP8GSEz8jJmPmXVBKvBnkZo5ZLjwrAObdov9L/LckRkqw2Gw== X-Received: by 2002:a17:907:2cc7:b0:aa6:9ee3:e51f with SMTP id a640c23a62f3a-ab38b377762mr207319966b.41.1737106027825; Fri, 17 Jan 2025 01:27:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 04/10] rust: pl011: extract CharBackend receive logic into a separate function Date: Fri, 17 Jan 2025 10:26:51 +0100 Message-ID: <20250117092657.1051233-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106064265019000 Content-Type: text/plain; charset="utf-8" Prepare for moving all references to the registers and the FIFO into a separate struct. Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 6d662865182..2e8707aef97 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -6,7 +6,7 @@ use std::{ ffi::CStr, ops::ControlFlow, - os::raw::{c_int, c_uint, c_void}, + os::raw::{c_int, c_void}, }; =20 use qemu_api::{ @@ -480,6 +480,12 @@ pub fn can_receive(&self) -> bool { self.read_count < self.fifo_depth() } =20 + pub fn receive(&mut self, ch: u32) { + if !self.loopback_enabled() { + self.put_fifo(ch) + } + } + pub fn event(&mut self, event: QEMUChrEvent) { if event =3D=3D bindings::QEMUChrEvent::CHR_EVENT_BREAK && !self.l= oopback_enabled() { self.put_fifo(registers::Data::BREAK.into()); @@ -505,7 +511,7 @@ pub fn fifo_depth(&self) -> u32 { 1 } =20 - pub fn put_fifo(&mut self, value: c_uint) { + pub fn put_fifo(&mut self, value: u32) { let depth =3D self.fifo_depth(); assert!(depth > 0); let slot =3D (self.read_pos + self.read_count) & (depth - 1); @@ -615,12 +621,9 @@ pub fn write(&mut self, offset: hwaddr, value: u64) { unsafe { debug_assert!(!opaque.is_null()); let mut state =3D NonNull::new_unchecked(opaque.cast::= ()); - 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())); } } } --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106081; cv=none; d=zohomail.com; s=zohoarc; b=TFStqC/rvlre/G1DE+wEstULv0UYWoq/FhjE6blN3H3HDvychpAEP2EJeq09rH9DXIZxjFxnjIg+ycCnePNN2VAoTYXfiTvUCOiGEeCKPGILXE6H/Xsnd2gnNR1yByOIFDKsBuTfUTWL8XSMfQ6aN0ylCCYgx8H8L9BePt1ej1A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106081; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fXzW1PWCx2t+pwE+gDuweFFhlLiqOMxBQW7g5vUIp6E=; b=VOouP8WLsIn60Aya24Wu0dGNU7Ueb7cxWLeZ851lixRpmJfqGTwEX0bvWnMpWu3+qeC8oFp7vb+SkrHDHzNDx9AWrHHHe9ni55pvKRyFI6TaKTIou2smyGQUMZXEu1FwOk1nGRJuYl7b6V9xa5CXICueh3X+JoBX/pfutkUZHrA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106081474980.5113694911978; Fri, 17 Jan 2025 01:28:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidO-0002ax-O6; Fri, 17 Jan 2025 04:27:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidM-0002aI-MN for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:21 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidH-0003Qx-Ez for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:20 -0500 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-627-_F_pcRQHNl6zM0_qRGPdSw-1; Fri, 17 Jan 2025 04:27:12 -0500 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-aa68203d288so146415766b.1 for ; Fri, 17 Jan 2025 01:27:12 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384f2903esm138579566b.109.2025.01.17.01.27.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106034; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fXzW1PWCx2t+pwE+gDuweFFhlLiqOMxBQW7g5vUIp6E=; b=aOdzHcpauWm4kcaKT4L5bl7J0gDjCfEgjPHPMrtqgVftTm+CGYnndEngzO6AIdJf3f2drT au93FmMGeJzFMen2v0IwyO4UkSJvY044duKWsiF7Z/6jpsxNFAaR435iqcFUUvTnvhHb3X cmXKMbVWOpT4Jztt1BZgeEgYxokza34= X-MC-Unique: _F_pcRQHNl6zM0_qRGPdSw-1 X-Mimecast-MFC-AGG-ID: _F_pcRQHNl6zM0_qRGPdSw X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106031; x=1737710831; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fXzW1PWCx2t+pwE+gDuweFFhlLiqOMxBQW7g5vUIp6E=; b=ge1TK1aLQ1f9qZU2rpHeX3dGYrL6i0vJ/zhNMrt1TG4mBlPjgT5hA+v3MltkQuO00D OhfXOtu91T4U59LFFkUpGuckIMBbovWHq6UX0kh6v2e2OJ7tAhFLSPq4xeJCIqJS7fys K1Z8f2V7SwYp3Ww0RhRieOgJzKiEhnbM8TJbyq48TKIs2wISEHkO8yz69/trx7Kz2eiU k57DN5tnBPgWGhzlD9Xpa0N2/IjEBdDEwIfj4GMbzRxeivVKuak6qjSrGwutCJbCFjII KQV7Lu0Fu6/BcMfUglpPl+hJ96l5jqBA7bQTIoCCI6vN49Xp8HTu0mFRct1gbAhx+vMg zqoA== X-Gm-Message-State: AOJu0YyVerm4TPzFPz8Au21rHPfKQKPLX7f8i6zYobqqcFciz3NSdMKY O6qGt9KsSA3t6kBxUcgY/c1WIrAHEaWQuXmZBGnUSGz4/anneHxiiZDU1m+/lHcgaoUlLQ7joPN diyRoBmmxombR3SU10gjjPCBB3ecYGBIKSeEfPyRJcv+aY8grXlMvju9aeQlcS8172kRwj8fIVK 4Vs3OX/7nzFCe8R2QkCpm1x4G1DXPi4CyPtSl+6lk= X-Gm-Gg: ASbGncvYjfghJye4S7j5wrf6fvlPMfU8j+skZ8jGFpocAFvsEZVNy4bOreiLJDjKySb LxoqYwNjMKdE++DtvT7+ko9O0lVCRJ3/0e7wANg2yAh2vxHdhocBK1b2pZFZ30w1S5Ec5sYvJUn IqnK8bvzx+H2DlYRn1aiZuTpkDZwmedMd/+iVaJcFEb1tyVWiGQoJqprSC0VAySNibTB4SwtwqW m3lvgRymODsJ8GcF/DJr/71Dd4PvhxqwtGgBUsPvEeeHi06gN50/fuwAETQ X-Received: by 2002:a17:907:9710:b0:aa6:a21b:2a9 with SMTP id a640c23a62f3a-ab38b3e2ed0mr197954766b.57.1737106030602; Fri, 17 Jan 2025 01:27:10 -0800 (PST) X-Google-Smtp-Source: AGHT+IGHhRa8RaSJ9NpeAmOvSfs3cxied5hB/iXsr+26UCo3MWxX3lVniKyIWzlY51SautRHczjLZg== X-Received: by 2002:a17:907:9710:b0:aa6:a21b:2a9 with SMTP id a640c23a62f3a-ab38b3e2ed0mr197952366b.57.1737106030038; Fri, 17 Jan 2025 01:27:10 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 05/10] rust: pl011: pull interrupt updates out of read/write ops Date: Fri, 17 Jan 2025 10:26:52 +0100 Message-ID: <20250117092657.1051233-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106082251019000 Content-Type: text/plain; charset="utf-8" qemu_irqs are not part of the vmstate, therefore they will remain in PL011State. Update them if needed after regs_read()/regs_write(). Apply #[must_use] to functions that return whether the interrupt state could have changed, so that it's harder to forget the call to update(). Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 68 ++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 2e8707aef97..67c3e63baa1 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -234,7 +234,6 @@ fn regs_read(&mut self, offset: RegisterOffset) -> Cont= rolFlow { } // Update error bits. self.receive_status_error_clear.set_from_data(c); - self.update(); // Must call qemu_chr_fe_accept_input, so return Continue: return ControlFlow::Continue(u32::from(c)); }, @@ -258,7 +257,7 @@ fn regs_read(&mut self, offset: RegisterOffset) -> Cont= rolFlow { }) } =20 - fn regs_write(&mut self, offset: RegisterOffset, value: u32) { + fn regs_write(&mut self, offset: RegisterOffset, value: u32) -> bool { // eprintln!("write offset {offset} value {value}"); use RegisterOffset::*; match offset { @@ -273,9 +272,10 @@ fn regs_write(&mut self, offset: RegisterOffset, value= : u32) { unsafe { qemu_chr_fe_write_all(addr_of_mut!(self.char_backend),= &ch, 1); } - self.loopback_tx(value); + // interrupts always checked + let _ =3D self.loopback_tx(value); self.int_level |=3D registers::INT_TX; - self.update(); + return true; } RSR =3D> { self.receive_status_error_clear =3D 0.into(); @@ -299,7 +299,7 @@ fn regs_write(&mut self, offset: RegisterOffset, value:= u32) { self.reset_rx_fifo(); self.reset_tx_fifo(); } - if self.line_control.send_break() ^ new_val.send_break() { + let update =3D (self.line_control.send_break() !=3D new_va= l.send_break()) && { let mut break_enable: c_int =3D new_val.send_break().i= nto(); // SAFETY: self.char_backend is a valid CharBackend in= stance after it's been // initialized in realize(). @@ -310,15 +310,16 @@ fn regs_write(&mut self, offset: RegisterOffset, valu= e: u32) { addr_of_mut!(break_enable).cast::(), ); } - self.loopback_break(break_enable > 0); - } + self.loopback_break(break_enable > 0) + }; self.line_control =3D new_val; self.set_read_trigger(); + return update; } CR =3D> { // ??? Need to implement the enable bit. self.control =3D value.into(); - self.loopback_mdmctrl(); + return self.loopback_mdmctrl(); } FLS =3D> { self.ifl =3D value; @@ -326,13 +327,13 @@ fn regs_write(&mut self, offset: RegisterOffset, valu= e: u32) { } IMSC =3D> { self.int_enabled =3D value; - self.update(); + return true; } RIS =3D> {} MIS =3D> {} ICR =3D> { self.int_level &=3D !value; - self.update(); + return true; } DMACR =3D> { self.dmacr =3D value; @@ -342,14 +343,12 @@ fn regs_write(&mut self, offset: RegisterOffset, valu= e: u32) { } } } + false } =20 #[inline] - fn loopback_tx(&mut self, value: u32) { - if !self.loopback_enabled() { - return; - } - + #[must_use] + fn loopback_tx(&mut self, value: u32) -> bool { // Caveat: // // In real hardware, TX loopback happens at the serial-bit level @@ -367,12 +366,13 @@ fn loopback_tx(&mut self, value: u32) { // hardware flow-control is enabled. // // For simplicity, the above described is not emulated. - self.put_fifo(value); + self.loopback_enabled() && self.put_fifo(value) } =20 - fn loopback_mdmctrl(&mut self) { + #[must_use] + fn loopback_mdmctrl(&mut self) -> bool { if !self.loopback_enabled() { - return; + return false; } =20 /* @@ -413,13 +413,11 @@ fn loopback_mdmctrl(&mut self) { il |=3D Interrupt::RI as u32; } self.int_level =3D il; - self.update(); + true } =20 - fn loopback_break(&mut self, enable: bool) { - if enable { - self.loopback_tx(registers::Data::BREAK.into()); - } + fn loopback_break(&mut self, enable: bool) -> bool { + enable && self.loopback_tx(registers::Data::BREAK.into()) } =20 fn set_read_trigger(&mut self) { @@ -481,14 +479,17 @@ pub fn can_receive(&self) -> bool { } =20 pub fn receive(&mut self, ch: u32) { - if !self.loopback_enabled() { - self.put_fifo(ch) + if !self.loopback_enabled() && self.put_fifo(ch) { + self.update(); } } =20 pub fn event(&mut self, event: QEMUChrEvent) { if event =3D=3D bindings::QEMUChrEvent::CHR_EVENT_BREAK && !self.l= oopback_enabled() { - self.put_fifo(registers::Data::BREAK.into()); + let update =3D self.put_fifo(registers::Data::BREAK.into()); + if update { + self.update(); + } } } =20 @@ -511,7 +512,8 @@ pub fn fifo_depth(&self) -> u32 { 1 } =20 - pub fn put_fifo(&mut self, value: u32) { + #[must_use] + pub fn put_fifo(&mut self, value: u32) -> bool { let depth =3D self.fifo_depth(); assert!(depth > 0); let slot =3D (self.read_pos + self.read_count) & (depth - 1); @@ -524,8 +526,9 @@ pub fn put_fifo(&mut self, value: u32) { =20 if self.read_count =3D=3D self.read_trigger { self.int_level |=3D registers::INT_RX; - self.update(); + return true; } + false } =20 pub fn update(&self) { @@ -568,14 +571,19 @@ pub fn read(&mut self, offset: hwaddr, _size: u32) ->= ControlFlow { } Ok(field) =3D> match self.regs_read(field) { ControlFlow::Break(value) =3D> ControlFlow::Break(value.in= to()), - ControlFlow::Continue(value) =3D> ControlFlow::Continue(va= lue.into()), + ControlFlow::Continue(value) =3D> { + self.update(); + ControlFlow::Continue(value.into()) + }, } } } =20 pub fn write(&mut self, offset: hwaddr, value: u64) { if let Ok(field) =3D RegisterOffset::try_from(offset) { - self.regs_write(field, value as u32); + if self.regs_write(field, value as u32) { + self.update(); + } } else { eprintln!("write bad offset {offset} value {value}"); } --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106109; cv=none; d=zohomail.com; s=zohoarc; b=VVTUES6AAMvzSu3uXTzgITnTOwepbsyLJ91XYdBmjpJcH0Y8LhYlXDigBvmTEIvJ+BOgyn5j6t1LAaXJfVMhvQqPUPrCkJaRh4PKI4jqxxTLOMVWhA776Z1p/jtQkYmF5B8Cj0frbV4ugX5D9U33pwZf3WcjKL2ikTd9Cw7rlBM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106109; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=kzzo+asbhdDSlPNru2mbn4dyMHJpm2dSBxjyr6Sulsg=; b=HoUKeAiGZuPFBnbttIUDvf5TQ6sKa4fUFhxGEjS6W8F2k2o2x2dj6PTAGUH7V083gOZivs6sHX3JDytqxnhTtsrgw+5dhvJbeidKWvhvFvzYrVTSdAZ0L5PBHj9ENZ577cOOHcwqsyerFGN2/f3YnF73ULKKF8nR0eqqzTydIoQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106109954434.97855966710904; Fri, 17 Jan 2025 01:28:29 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidM-0002aH-I8; Fri, 17 Jan 2025 04:27:20 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidL-0002a6-S0 for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:19 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidJ-0003RF-Is for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:19 -0500 Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-78-4GQxnvr2MaeoOvV4MaL1Rw-1; Fri, 17 Jan 2025 04:27:15 -0500 Received: by mail-ed1-f69.google.com with SMTP id 4fb4d7f45d1cf-5d3ded861f5so1760756a12.2 for ; Fri, 17 Jan 2025 01:27:14 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5db736716d6sm1214485a12.31.2025.01.17.01.27.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106036; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kzzo+asbhdDSlPNru2mbn4dyMHJpm2dSBxjyr6Sulsg=; b=AXRl3+SPSVMfXPF97bbyCKa6L7031n/rgIDiWCupU9j9F+VgzfbRa/Iras+uKyNEiNVb75 cRfO2XkiRs33z/xvuaB7x3hzv3anTEKUL3czAkfTOVWCOvsqZDhfJJ/H2uBnEdgviXgyZn C9DzBsyZEtUXLtyuGiL0zTRxAChG9ZU= X-MC-Unique: 4GQxnvr2MaeoOvV4MaL1Rw-1 X-Mimecast-MFC-AGG-ID: 4GQxnvr2MaeoOvV4MaL1Rw X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106033; x=1737710833; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kzzo+asbhdDSlPNru2mbn4dyMHJpm2dSBxjyr6Sulsg=; b=AHb75BRyAdbocI9deX3kZEmkUn4DAWc3yH83UCSfKVEkFiV2Wo6Z/oHYEqhgoNR/oI WUMiwuSL8MNjS+RKU2vGIPH3RCeoD5g91zJ/keA6cZm5hYTCbJZEVKMVOjYyd/szIYKO IAQ9WltyH4vR2lapgMyPpIANG+MygSpge/u2zklhOfkwCjgJmJ42lrtwboH59C1QU3od SQiYJWqIugiK0/8SsMZLKBM0zES5vuLSxd+cH6mZDzAWM297Oz5MqhFKHgCWkt52wAts NqzsLb4ewhLhssxk5CnowFrMFSNQPgPgLMX+M/G7qq0LQQWRkk3lksnnX4Xd2R4dlusH HVJA== X-Gm-Message-State: AOJu0YwPBJi+v7tGuxOmQTbyMZN+bbgx8Ns8Kiu6yrhOsazNGtUe93bB VW2UFLWZYvxOrBggFyk8vHsvSBe5x6uklVflqfj0xh4V5zlg8X7GEgitDy23MvStxs5GQWT4ogD b3fkU4A40O3xKV+nH+Ou+SN8az3RfcWTEt8um3l7wpxEuSqivijMXrasTYTvER550GBdPvYIzzt p2JuaQv/xVLlq4Ric/lGuFDtHOy6wtgL54wE6BynU= X-Gm-Gg: ASbGncv2RVw90Tx7icpuUdd/621pvh169e0bOFHiLYsVzGIgf0/E6bKOjC+lkhy9EHJ 7OxJnuYYai9WHKtElHbmBIEKAOMG2dDBet1q2kV/YvtHHIq1fsa7yRtTapjQ+N23JFKmn09YWB0 YZWgtK6ycAo4Tl++aHnc4kC16Dpy99bODvIDBdgYPVfvBATnd9q9EOWoJWpAIptioPPYarkKWWE DgNegAiSnKCFpKpspZqUSogG49/+/f9XYjdEPuNH3a65DuVgdPRYrI+x20r X-Received: by 2002:a05:6402:1ed0:b0:5d9:fa36:5969 with SMTP id 4fb4d7f45d1cf-5db7db139a6mr1295491a12.21.1737106032808; Fri, 17 Jan 2025 01:27:12 -0800 (PST) X-Google-Smtp-Source: AGHT+IHAAgAI3k17nYAtQJWUbdu7w6DjDAshtr+7w8oIUAkDSwu59XMws22hfBfHrQ7Aw45OLZTjiQ== X-Received: by 2002:a05:6402:1ed0:b0:5d9:fa36:5969 with SMTP id 4fb4d7f45d1cf-5db7db139a6mr1295467a12.21.1737106032227; Fri, 17 Jan 2025 01:27:12 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 06/10] rust: pl011: extract PL011Registers Date: Fri, 17 Jan 2025 10:26:53 +0100 Message-ID: <20250117092657.1051233-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -39 X-Spam_score: -4.0 X-Spam_bar: ---- X-Spam_report: (-4.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-1.797, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106110473019000 Content-Type: text/plain; charset="utf-8" Pull all the mutable fields of PL011State into a separate struct. Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 251 ++++++++++++++----------- rust/hw/char/pl011/src/device_class.rs | 46 +++-- 2 files changed, 168 insertions(+), 129 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 67c3e63baa1..476abe765a9 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -78,11 +78,8 @@ fn index(&self, idx: u32) -> &Self::Output { } =20 #[repr(C)] -#[derive(Debug, qemu_api_macros::Object, qemu_api_macros::offsets)] -/// PL011 Device Model in QEMU -pub struct PL011State { - pub parent_obj: ParentField, - pub iomem: MemoryRegion, +#[derive(Debug, Default, qemu_api_macros::offsets)] +pub struct PL011Registers { #[doc(alias =3D "fr")] pub flags: registers::Flags, #[doc(alias =3D "lcr")] @@ -102,8 +99,17 @@ pub struct PL011State { pub read_pos: u32, pub read_count: u32, pub read_trigger: u32, +} + +#[repr(C)] +#[derive(Debug, qemu_api_macros::Object, qemu_api_macros::offsets)] +/// PL011 Device Model in QEMU +pub struct PL011State { + pub parent_obj: ParentField, + pub iomem: MemoryRegion, #[doc(alias =3D "chr")] pub char_backend: CharBackend, + pub regs: PL011Registers, /// QEMU interrupts /// /// ```text @@ -161,61 +167,8 @@ fn vmsd() -> Option<&'static VMStateDescription> { const RESET: Option =3D Some(Self::reset); } =20 -impl PL011State { - /// Initializes a pre-allocated, unitialized instance of `PL011State`. - /// - /// # Safety - /// - /// `self` must point to a correctly sized and aligned location for the - /// `PL011State` type. It must not be called more than once on the same - /// location/instance. All its fields are expected to hold unitialized - /// values with the sole exception of `parent_obj`. - unsafe fn init(&mut self) { - const CLK_NAME: &CStr =3D c_str!("clk"); - - // SAFETY: - // - // self and self.iomem are guaranteed to be valid at this point si= nce callers - // must make sure the `self` reference is valid. - unsafe { - memory_region_init_io( - addr_of_mut!(self.iomem), - addr_of_mut!(*self).cast::(), - &PL011_OPS, - addr_of_mut!(*self).cast::(), - Self::TYPE_NAME.as_ptr(), - 0x1000, - ); - } - - // SAFETY: - // - // self.clock is not initialized at this point; but since `NonNull= <_>` is Copy, - // we can overwrite the undefined value without side effects. This= is - // safe since all PL011State instances are created by QOM code whi= ch - // calls this function to initialize the fields; therefore no code= is - // able to access an invalid self.clock value. - unsafe { - let dev: &mut DeviceState =3D self.upcast_mut(); - self.clock =3D NonNull::new(qdev_init_clock_in( - dev, - CLK_NAME.as_ptr(), - None, /* pl011_clock_update */ - addr_of_mut!(*self).cast::(), - ClockEvent::ClockUpdate.0, - )) - .unwrap(); - } - } - - fn post_init(&self) { - self.init_mmio(&self.iomem); - for irq in self.interrupts.iter() { - self.init_irq(irq); - } - } - - fn regs_read(&mut self, offset: RegisterOffset) -> ControlFlow { +impl PL011Registers { + pub(self) fn read(&mut self, offset: RegisterOffset) -> ControlFlow { use RegisterOffset::*; =20 std::ops::ControlFlow::Break(match offset { @@ -257,7 +210,12 @@ fn regs_read(&mut self, offset: RegisterOffset) -> Con= trolFlow { }) } =20 - fn regs_write(&mut self, offset: RegisterOffset, value: u32) -> bool { + pub(self) fn write( + &mut self, + offset: RegisterOffset, + value: u32, + char_backend: *mut CharBackend, + ) -> bool { // eprintln!("write offset {offset} value {value}"); use RegisterOffset::*; match offset { @@ -267,10 +225,10 @@ fn regs_write(&mut self, offset: RegisterOffset, valu= e: u32) -> bool { // XXX this blocks entire thread. Rewrite to use // qemu_chr_fe_write and background I/O callbacks =20 - // SAFETY: self.char_backend is a valid CharBackend instan= ce after it's been + // SAFETY: char_backend is a valid CharBackend instance af= ter it's been // initialized in realize(). unsafe { - qemu_chr_fe_write_all(addr_of_mut!(self.char_backend),= &ch, 1); + qemu_chr_fe_write_all(char_backend, &ch, 1); } // interrupts always checked let _ =3D self.loopback_tx(value); @@ -305,7 +263,7 @@ fn regs_write(&mut self, offset: RegisterOffset, value:= u32) -> bool { // initialized in realize(). unsafe { qemu_chr_fe_ioctl( - addr_of_mut!(self.char_backend), + char_backend, CHR_IOCTL_SERIAL_SET_BREAK as i32, addr_of_mut!(break_enable).cast::(), ); @@ -424,23 +382,6 @@ fn set_read_trigger(&mut self) { self.read_trigger =3D 1; } =20 - pub fn realize(&mut self) { - // SAFETY: self.char_backend has the correct size and alignment fo= r a - // CharBackend object, and its callbacks are of the correct types. - unsafe { - qemu_chr_fe_set_handlers( - addr_of_mut!(self.char_backend), - Some(pl011_can_receive), - Some(pl011_receive), - Some(pl011_event), - None, - addr_of_mut!(*self).cast::(), - core::ptr::null_mut(), - true, - ); - } - } - pub fn reset(&mut self) { self.line_control.reset(); self.receive_status_error_clear.reset(); @@ -473,26 +414,6 @@ pub fn reset_tx_fifo(&mut self) { self.flags.set_transmit_fifo_empty(true); } =20 - pub fn can_receive(&self) -> bool { - // trace_pl011_can_receive(s->lcr, s->read_count, r); - self.read_count < self.fifo_depth() - } - - pub fn receive(&mut self, ch: u32) { - if !self.loopback_enabled() && self.put_fifo(ch) { - self.update(); - } - } - - pub fn event(&mut self, event: QEMUChrEvent) { - if event =3D=3D bindings::QEMUChrEvent::CHR_EVENT_BREAK && !self.l= oopback_enabled() { - let update =3D self.put_fifo(registers::Data::BREAK.into()); - if update { - self.update(); - } - } - } - #[inline] pub fn fifo_enabled(&self) -> bool { self.line_control.fifos_enabled() =3D=3D registers::Mode::FIFO @@ -531,14 +452,7 @@ pub fn put_fifo(&mut self, value: u32) -> bool { false } =20 - pub fn update(&self) { - let flags =3D self.int_level & self.int_enabled; - for (irq, i) in self.interrupts.iter().zip(IRQMASK) { - irq.set(flags & i !=3D 0); - } - } - - pub fn post_load(&mut self, _version_id: u32) -> Result<(), ()> { + pub fn post_load(&mut self) -> Result<(), ()> { /* Sanity-check input state */ if self.read_pos >=3D self.read_fifo.len() || self.read_count > se= lf.read_fifo.len() { return Err(()); @@ -558,8 +472,66 @@ pub fn post_load(&mut self, _version_id: u32) -> Resul= t<(), ()> { =20 Ok(()) } +} + +impl PL011State { + /// Initializes a pre-allocated, unitialized instance of `PL011State`. + /// + /// # Safety + /// + /// `self` must point to a correctly sized and aligned location for the + /// `PL011State` type. It must not be called more than once on the same + /// location/instance. All its fields are expected to hold unitialized + /// values with the sole exception of `parent_obj`. + unsafe fn init(&mut self) { + const CLK_NAME: &CStr =3D c_str!("clk"); + + // SAFETY: + // + // self and self.iomem are guaranteed to be valid at this point si= nce callers + // must make sure the `self` reference is valid. + unsafe { + memory_region_init_io( + addr_of_mut!(self.iomem), + addr_of_mut!(*self).cast::(), + &PL011_OPS, + addr_of_mut!(*self).cast::(), + Self::TYPE_NAME.as_ptr(), + 0x1000, + ); + } + + self.regs =3D Default::default(); + + // SAFETY: + // + // self.clock is not initialized at this point; but since `NonNull= <_>` is Copy, + // we can overwrite the undefined value without side effects. This= is + // safe since all PL011State instances are created by QOM code whi= ch + // calls this function to initialize the fields; therefore no code= is + // able to access an invalid self.clock value. + unsafe { + let dev: &mut DeviceState =3D self.upcast_mut(); + self.clock =3D NonNull::new(qdev_init_clock_in( + dev, + CLK_NAME.as_ptr(), + None, /* pl011_clock_update */ + addr_of_mut!(*self).cast::(), + ClockEvent::ClockUpdate.0, + )) + .unwrap(); + } + } + + fn post_init(&self) { + self.init_mmio(&self.iomem); + for irq in self.interrupts.iter() { + self.init_irq(irq); + } + } =20 pub fn read(&mut self, offset: hwaddr, _size: u32) -> ControlFlow { + let regs =3D &mut self.regs; match RegisterOffset::try_from(offset) { Err(v) if (0x3f8..0x400).contains(&(v >> 2)) =3D> { let device_id =3D self.get_class().device_id; @@ -569,7 +541,7 @@ pub fn read(&mut self, offset: hwaddr, _size: u32) -> C= ontrolFlow { // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset = 0x%x\n", (int)offset); ControlFlow::Break(0) } - Ok(field) =3D> match self.regs_read(field) { + Ok(field) =3D> match regs.read(field) { ControlFlow::Break(value) =3D> ControlFlow::Break(value.in= to()), ControlFlow::Continue(value) =3D> { self.update(); @@ -580,14 +552,71 @@ pub fn read(&mut self, offset: hwaddr, _size: u32) ->= ControlFlow { } =20 pub fn write(&mut self, offset: hwaddr, value: u64) { + let regs =3D &mut self.regs; if let Ok(field) =3D RegisterOffset::try_from(offset) { - if self.regs_write(field, value as u32) { + if regs.write(field, value as u32, &mut self.char_backend) { self.update(); } } else { eprintln!("write bad offset {offset} value {value}"); } } + + pub fn can_receive(&self) -> bool { + // trace_pl011_can_receive(s->lcr, s->read_count, r); + let regs =3D &self.regs; + regs.read_count < regs.fifo_depth() + } + + pub fn receive(&mut self, ch: u32) { + let regs =3D &mut self.regs; + if !regs.loopback_enabled() && regs.put_fifo(ch) { + self.update(); + } + } + + pub fn event(&mut self, event: QEMUChrEvent) { + let regs =3D &mut self.regs; + if event =3D=3D bindings::QEMUChrEvent::CHR_EVENT_BREAK && !regs.l= oopback_enabled() { + let update =3D regs.put_fifo(registers::Data::BREAK.into()); + if update { + self.update() + } + } + } + + pub fn realize(&mut self) { + // SAFETY: self.char_backend has the correct size and alignment fo= r a + // CharBackend object, and its callbacks are of the correct types. + unsafe { + qemu_chr_fe_set_handlers( + addr_of_mut!(self.char_backend), + Some(pl011_can_receive), + Some(pl011_receive), + Some(pl011_event), + None, + addr_of_mut!(*self).cast::(), + core::ptr::null_mut(), + true, + ); + } + } + + pub fn reset(&mut self) { + self.regs.reset(); + } + + pub fn update(&self) { + let regs =3D &self.regs; + let flags =3D regs.int_level & regs.int_enabled; + for (irq, i) in self.interrupts.iter().zip(IRQMASK) { + irq.set(flags & i !=3D 0); + } + } + + pub fn post_load(&mut self, _version_id: u32) -> Result<(), ()> { + self.regs.post_load() + } } =20 /// Which bits in the interrupt status matter for each outbound IRQ line ? diff --git a/rust/hw/char/pl011/src/device_class.rs b/rust/hw/char/pl011/sr= c/device_class.rs index 2fd805fd12d..e25645ceb0d 100644 --- a/rust/hw/char/pl011/src/device_class.rs +++ b/rust/hw/char/pl011/src/device_class.rs @@ -6,11 +6,11 @@ use std::os::raw::{c_int, c_void}; =20 use qemu_api::{ - bindings::*, c_str, vmstate_clock, vmstate_fields, vmstate_of, vmstate= _subsections, - vmstate_unused, zeroable::Zeroable, + bindings::*, c_str, vmstate_clock, vmstate_fields, vmstate_of, vmstate= _struct, + vmstate_subsections, vmstate_unused, zeroable::Zeroable, }; =20 -use crate::device::PL011State; +use crate::device::{PL011Registers, PL011State}; =20 extern "C" fn pl011_clock_needed(opaque: *mut c_void) -> bool { unsafe { @@ -45,6 +45,30 @@ extern "C" fn pl011_post_load(opaque: *mut c_void, versi= on_id: c_int) -> c_int { } } =20 +static VMSTATE_PL011_REGS: VMStateDescription =3D VMStateDescription { + name: c_str!("pl011").as_ptr(), + version_id: 2, + minimum_version_id: 2, + fields: vmstate_fields! { + vmstate_of!(PL011Registers, flags), + vmstate_of!(PL011Registers, line_control), + vmstate_of!(PL011Registers, receive_status_error_clear), + vmstate_of!(PL011Registers, control), + vmstate_of!(PL011Registers, dmacr), + vmstate_of!(PL011Registers, int_enabled), + vmstate_of!(PL011Registers, int_level), + vmstate_of!(PL011Registers, read_fifo), + vmstate_of!(PL011Registers, ilpr), + vmstate_of!(PL011Registers, ibrd), + vmstate_of!(PL011Registers, fbrd), + vmstate_of!(PL011Registers, ifl), + vmstate_of!(PL011Registers, read_pos), + vmstate_of!(PL011Registers, read_count), + vmstate_of!(PL011Registers, read_trigger), + }, + ..Zeroable::ZERO +}; + pub static VMSTATE_PL011: VMStateDescription =3D VMStateDescription { name: c_str!("pl011").as_ptr(), version_id: 2, @@ -52,21 +76,7 @@ extern "C" fn pl011_post_load(opaque: *mut c_void, versi= on_id: c_int) -> c_int { post_load: Some(pl011_post_load), fields: vmstate_fields! { vmstate_unused!(core::mem::size_of::()), - vmstate_of!(PL011State, flags), - vmstate_of!(PL011State, line_control), - vmstate_of!(PL011State, receive_status_error_clear), - vmstate_of!(PL011State, control), - vmstate_of!(PL011State, dmacr), - vmstate_of!(PL011State, int_enabled), - vmstate_of!(PL011State, int_level), - vmstate_of!(PL011State, read_fifo), - vmstate_of!(PL011State, ilpr), - vmstate_of!(PL011State, ibrd), - vmstate_of!(PL011State, fbrd), - vmstate_of!(PL011State, ifl), - vmstate_of!(PL011State, read_pos), - vmstate_of!(PL011State, read_count), - vmstate_of!(PL011State, read_trigger), + vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, PL011Regist= ers), }, subsections: vmstate_subsections! { VMSTATE_PL011_CLOCK --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106130; cv=none; d=zohomail.com; s=zohoarc; b=Jc/WFZcElyzIARfVJR1LJTA+dTxYz+oKnx/P/ShOAzinDZK/LSJHCEO1fOysql2pWtyOdQ0jVuhE/8ayMIuVh4utqcUn7LWRkggE5DYoxvqzBoio2bepi3boLX48SyhOjaV4+DJaEoHJMBEBY87EPCrI10VMdRGNXqEKIywUmn8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106130; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=BITrw44P4w2bvCQ1NpWsRn31RrbjunDLRRexWgq3HHQ=; b=bYHF9nPAXKrOA1yvnP/LItnxxKdgIL2edwwtXBM8nc+vIqV88QIjIZQTVlsOuPCZgNxBGP+Syb90YFgdgGwTD8usKZSlx+hhShV+XIJvooR7LvZ4gzdyNMV6XfbERRgcFurJRpA3nNMwtKmaSqMnf2iQLDQd19RLv9ju7ANrxtM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106130714237.95563019754172; Fri, 17 Jan 2025 01:28:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidY-0002dq-SF; Fri, 17 Jan 2025 04:27:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidT-0002cC-GH for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:29 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidN-0003Rc-Gi for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:26 -0500 Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-695-lQqNfVpwOPifA77sfM9dFg-1; Fri, 17 Jan 2025 04:27:17 -0500 Received: by mail-ed1-f71.google.com with SMTP id 4fb4d7f45d1cf-5d3d2cccbe4so1808033a12.3 for ; Fri, 17 Jan 2025 01:27:17 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384f2242bsm137373666b.118.2025.01.17.01.27.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106039; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=BITrw44P4w2bvCQ1NpWsRn31RrbjunDLRRexWgq3HHQ=; b=cBEpa6tTSr9OZLep4eBvBFSl7361A3XexiPUi8MBXAn00QaDHC/Li+Ot7Pcj1E6mfbi4YF I6RsFQFTRU5jekEEY8gbNMr7BhR2FHdokEoBQcA4dWtXgzlYSxu4Ge/E6AXDRg7//5v4TR uQFC+QkfRgkm/ucu+aq9jXuWkK/4jik= X-MC-Unique: lQqNfVpwOPifA77sfM9dFg-1 X-Mimecast-MFC-AGG-ID: lQqNfVpwOPifA77sfM9dFg X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106035; x=1737710835; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BITrw44P4w2bvCQ1NpWsRn31RrbjunDLRRexWgq3HHQ=; b=PetL3lx+XdrSfYjFq3vSF9tYM/2F2DwNSR8/UvuCVLqlXkB2zZgAy8rNhqoMN9baUv JuSalQIuTB0Rw4QbaLRzOU3P9nspY6M0clhs9UC9l8KzfPEOJLaMxjLWewmmV1FRIeL4 S7E8Q9g1JiRiMS7gEUuwuB78Dg/D2loQRvgiMS/EwkAE13tYLTENduycLwJjw7H6nYVh xivLR8KECXpBmdJb6aNvU785DxeQaiHSnji6dWx8sQcRwipBNxWAj8SXcwweYW9mCHyc TL0cA+SjSfx4mlog4MMAVaDnk1YN9Ia7cQ8SKoaAdF0fERBWFsvOQHYaJciG5Sa4K2oM Sotg== X-Gm-Message-State: AOJu0YwrME5kjd9Z0rFfmJI/6paN+LDruNcPK+Pt11sGn5hcGiWVvHB9 O/9XfWObzqKW6UT9WngAa1mOJ1YEQoKHhcZ+3rJes5CziBeXB8CUilIShfnDfd8iIPky/k5MQX2 HF9Cbs3AvWrutR4APbaXgAc+V4P2arwWY/Q9mNqNZcwz9DMLNwT7ICZFoL5fd3Dv4OAjj/vUIJW 6SkRpO/z4xOBVoEsNM2s32ddUz3XWxoy/VzAfn9oo= X-Gm-Gg: ASbGncvKOWIJ9Tm7uKZV/HnC1zxrdoaQV3k4dHWePDYtPVMdNCY6fToH8V8POmA452y iSA1ekWlATsQfa5EJykuXgg0oepsR+BiVO0tUQJEC0c7zWJhEOcsQh4BnE0T8p4Q8j4fipReJ0V 5rLWeEnXN03aMkA3p/GunLP48nZvB3xds3p2Lkb5MM9oB6ADOhfq1lL654imRSA5LDZxIvA1W5p dHW8fBZdRVqzM5pdEe4hO/zeWwW9Az/vgZEFZAvbiDqCoLzIymWxA70pQce X-Received: by 2002:a17:907:d87:b0:aab:d4f0:c598 with SMTP id a640c23a62f3a-ab38b163e88mr182766466b.27.1737106035526; Fri, 17 Jan 2025 01:27:15 -0800 (PST) X-Google-Smtp-Source: AGHT+IHM3xBiLlu1RrP/TGFxrKCGnXWRBJYhH422XRXl47H2MI/ZbKF33AxiB9YjlvutaayNsAPfgA== X-Received: by 2002:a17:907:d87:b0:aab:d4f0:c598 with SMTP id a640c23a62f3a-ab38b163e88mr182764766b.27.1737106035051; Fri, 17 Jan 2025 01:27:15 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 07/10] rust: pl011: wrap registers with BqlRefCell Date: Fri, 17 Jan 2025 10:26:54 +0100 Message-ID: <20250117092657.1051233-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106132595019000 Content-Type: text/plain; charset="utf-8" This is a step towards making memory ops use a shared reference to the device type; it's not yet possible due to the calls to character device functions. Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 38 +++++++++++++------------- rust/hw/char/pl011/src/device_class.rs | 8 +++--- rust/hw/char/pl011/src/memory_ops.rs | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 476abe765a9..1d3da59e481 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -102,14 +102,14 @@ pub struct PL011Registers { } =20 #[repr(C)] -#[derive(Debug, qemu_api_macros::Object, qemu_api_macros::offsets)] +#[derive(qemu_api_macros::Object, qemu_api_macros::offsets)] /// PL011 Device Model in QEMU pub struct PL011State { pub parent_obj: ParentField, pub iomem: MemoryRegion, #[doc(alias =3D "chr")] pub char_backend: CharBackend, - pub regs: PL011Registers, + pub regs: BqlRefCell, /// QEMU interrupts /// /// ```text @@ -530,8 +530,8 @@ fn post_init(&self) { } } =20 + #[allow(clippy::needless_pass_by_ref_mut)] pub fn read(&mut self, offset: hwaddr, _size: u32) -> ControlFlow { - let regs =3D &mut self.regs; match RegisterOffset::try_from(offset) { Err(v) if (0x3f8..0x400).contains(&(v >> 2)) =3D> { let device_id =3D self.get_class().device_id; @@ -541,7 +541,7 @@ pub fn read(&mut self, offset: hwaddr, _size: u32) -> C= ontrolFlow { // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset = 0x%x\n", (int)offset); ControlFlow::Break(0) } - Ok(field) =3D> match regs.read(field) { + Ok(field) =3D> match self.regs.borrow_mut().read(field) { ControlFlow::Break(value) =3D> ControlFlow::Break(value.in= to()), ControlFlow::Continue(value) =3D> { self.update(); @@ -552,7 +552,7 @@ pub fn read(&mut self, offset: hwaddr, _size: u32) -> C= ontrolFlow { } =20 pub fn write(&mut self, offset: hwaddr, value: u64) { - let regs =3D &mut self.regs; + let mut regs =3D self.regs.borrow_mut(); if let Ok(field) =3D RegisterOffset::try_from(offset) { if regs.write(field, value as u32, &mut self.char_backend) { self.update(); @@ -564,19 +564,19 @@ pub fn write(&mut self, offset: hwaddr, value: u64) { =20 pub fn can_receive(&self) -> bool { // trace_pl011_can_receive(s->lcr, s->read_count, r); - let regs =3D &self.regs; + let regs =3D self.regs.borrow(); regs.read_count < regs.fifo_depth() } =20 - pub fn receive(&mut self, ch: u32) { - let regs =3D &mut self.regs; + pub fn receive(&self, ch: u32) { + let mut regs =3D self.regs.borrow_mut(); if !regs.loopback_enabled() && regs.put_fifo(ch) { self.update(); } } =20 - pub fn event(&mut self, event: QEMUChrEvent) { - let regs =3D &mut self.regs; + pub fn event(&self, event: QEMUChrEvent) { + let mut regs =3D self.regs.borrow_mut(); if event =3D=3D bindings::QEMUChrEvent::CHR_EVENT_BREAK && !regs.l= oopback_enabled() { let update =3D regs.put_fifo(registers::Data::BREAK.into()); if update { @@ -603,19 +603,19 @@ pub fn realize(&mut self) { } =20 pub fn reset(&mut self) { - self.regs.reset(); + self.regs.borrow_mut().reset(); } =20 pub fn update(&self) { - let regs =3D &self.regs; + let regs =3D self.regs.borrow(); let flags =3D regs.int_level & regs.int_enabled; for (irq, i) in self.interrupts.iter().zip(IRQMASK) { irq.set(flags & i !=3D 0); } } =20 - pub fn post_load(&mut self, _version_id: u32) -> Result<(), ()> { - self.regs.post_load() + pub fn post_load(&self, _version_id: u32) -> Result<(), ()> { + self.regs.borrow_mut().post_load() } } =20 @@ -657,10 +657,10 @@ pub fn post_load(&mut self, _version_id: u32) -> Resu= lt<(), ()> { pub unsafe extern "C" fn pl011_receive(opaque: *mut c_void, buf: *const u8= , size: c_int) { unsafe { debug_assert!(!opaque.is_null()); - let mut state =3D NonNull::new_unchecked(opaque.cast::= ()); + let state =3D NonNull::new_unchecked(opaque.cast::()); if size > 0 { debug_assert!(!buf.is_null()); - state.as_mut().receive(u32::from(buf.read_volatile())); + state.as_ref().receive(u32::from(buf.read_volatile())); } } } @@ -673,8 +673,8 @@ pub fn post_load(&mut self, _version_id: u32) -> Result= <(), ()> { pub unsafe extern "C" fn pl011_event(opaque: *mut c_void, event: QEMUChrEv= ent) { unsafe { debug_assert!(!opaque.is_null()); - let mut state =3D NonNull::new_unchecked(opaque.cast::= ()); - state.as_mut().event(event) + let state =3D NonNull::new_unchecked(opaque.cast::()); + state.as_ref().event(event) } } =20 @@ -700,7 +700,7 @@ pub fn post_load(&mut self, _version_id: u32) -> Result= <(), ()> { } =20 #[repr(C)] -#[derive(Debug, qemu_api_macros::Object)] +#[derive(qemu_api_macros::Object)] /// PL011 Luminary device model. pub struct PL011Luminary { parent_obj: ParentField, diff --git a/rust/hw/char/pl011/src/device_class.rs b/rust/hw/char/pl011/sr= c/device_class.rs index e25645ceb0d..06178778a8e 100644 --- a/rust/hw/char/pl011/src/device_class.rs +++ b/rust/hw/char/pl011/src/device_class.rs @@ -6,7 +6,7 @@ use std::os::raw::{c_int, c_void}; =20 use qemu_api::{ - bindings::*, c_str, vmstate_clock, vmstate_fields, vmstate_of, vmstate= _struct, + bindings::*, c_str, prelude::*, vmstate_clock, vmstate_fields, vmstate= _of, vmstate_struct, vmstate_subsections, vmstate_unused, zeroable::Zeroable, }; =20 @@ -35,8 +35,8 @@ extern "C" fn pl011_clock_needed(opaque: *mut c_void) -> = bool { extern "C" fn pl011_post_load(opaque: *mut c_void, version_id: c_int) -> c= _int { unsafe { debug_assert!(!opaque.is_null()); - let mut state =3D NonNull::new_unchecked(opaque.cast::= ()); - let result =3D state.as_mut().post_load(version_id as u32); + let state =3D NonNull::new_unchecked(opaque.cast::()); + let result =3D state.as_ref().post_load(version_id as u32); if result.is_err() { -1 } else { @@ -76,7 +76,7 @@ extern "C" fn pl011_post_load(opaque: *mut c_void, versio= n_id: c_int) -> c_int { post_load: Some(pl011_post_load), fields: vmstate_fields! { vmstate_unused!(core::mem::size_of::()), - vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, PL011Regist= ers), + vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, BqlRefCell<= PL011Registers>), }, subsections: vmstate_subsections! { VMSTATE_PL011_CLOCK diff --git a/rust/hw/char/pl011/src/memory_ops.rs b/rust/hw/char/pl011/src/= memory_ops.rs index c4e8599ba43..8f66c8d492c 100644 --- a/rust/hw/char/pl011/src/memory_ops.rs +++ b/rust/hw/char/pl011/src/memory_ops.rs @@ -26,7 +26,7 @@ unsafe extern "C" fn pl011_read(opaque: *mut c_void, addr: hwaddr, size: c= _uint) -> u64 { assert!(!opaque.is_null()); let mut state =3D unsafe { NonNull::new_unchecked(opaque.cast::()) }; - let val =3D unsafe { state.as_mut().read(addr, size) }; + let val =3D unsafe { state.as_mut() }.read(addr, size); match val { std::ops::ControlFlow::Break(val) =3D> val, std::ops::ControlFlow::Continue(val) =3D> { --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106110; cv=none; d=zohomail.com; s=zohoarc; b=oHvtslX1kb4GLz7r4bOexa4BOa6DFWDwdSoACKoXhghM3pZqCYEnFoHhTMuBx9uzZfxR23CU2fooDcvEdSVx+ONLuOLTJJdJ7vdOHnuNv6f/gSfKtA2jixyruZtwMLrYY4y8gNfmaRfos4r6/3awJvhQo+4zt1nK2seynnjmiMQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106110; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=538rbrB5J5+iKYFhFGUAKX87kAz6wpkNaI2Nuc/tl2c=; b=YasAR5rYOf14MqIK0lmP+j3+8sP4/baOiB+twuUiakvvxEeNN4GyJEytwoZtbJWyNlYzMgXaqX57mDeOvuC7AnVxilMqejajrJqyqMDBx1deOac/avKZZHMPUHFQxsxJTh59rWU+h9E3WEHn4WZrmKlnt1h6FFcRjwVHMvPkO9A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106110242402.3019860802709; Fri, 17 Jan 2025 01:28:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidT-0002c7-A3; Fri, 17 Jan 2025 04:27:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidR-0002be-Rz for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:25 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidO-0003S8-0p for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:24 -0500 Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-665-Syxuow68MSKB7yo_uGLjlg-1; Fri, 17 Jan 2025 04:27:19 -0500 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-aa634496f58so186393866b.2 for ; Fri, 17 Jan 2025 01:27:19 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384c61388sm138174466b.20.2025.01.17.01.27.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106041; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=538rbrB5J5+iKYFhFGUAKX87kAz6wpkNaI2Nuc/tl2c=; b=Alzo2H7PjS+6TbpZhb0uTHaKdftLykdXno0HdKQpu/KHN58ScOkeNbIvz9+NuSrBHCmfZj m660AtDga8H+UI3abf3B6U0aoSsKEhYmHuT/uGeE6t3h5oXo4uL7J+ysJA3qLqMNcELGLL 8GTpNpEv0Ocy8WnK2rpsQJD0afyP1o8= X-MC-Unique: Syxuow68MSKB7yo_uGLjlg-1 X-Mimecast-MFC-AGG-ID: Syxuow68MSKB7yo_uGLjlg X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106038; x=1737710838; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=538rbrB5J5+iKYFhFGUAKX87kAz6wpkNaI2Nuc/tl2c=; b=wg77tZERefBD+bvaEfqjvoMKSMI78bvy2nJOrP/0UcTixcYj88yEbcc5A/FYvX6qx4 duFjP52QHNSDjuGRT6SEgJz5Eret4lPj5HmsZTMXjzP5Irbw+aT43wwNUZ0qjb2I2/cc 1wmhY7sl4WVTJevzb5xbhJjoTPTtc8V+AElp8ityNj9mqWFojTqSh+ytj+6BB+Qmsany rWvY0qK7Ndymn1BSt/njGkdiyt68wbhYnR68zgDWU56baaUiUum7dvefHo4kIxjrd4ew RoHBxLNLd4xOpjwtce/MLgd8nVZSTWeO6pax4XNzDQwWelGLU/Qr5auIKv8adny2XFQV lnEQ== X-Gm-Message-State: AOJu0YyUrWLJ3cigFoOPbkXuhG949ZtEUpSkf296I8h2lXItzmLsPocu mJU0ovk481CVZpvGmuTlNXvmbKhBLEyG+rREW+DHD7xHJZ9uUkKdn3MvDblD1Nf/ZMXxXiiU8tN pQqFMn6qnbvKh8fPBsSIq5iZyRGJ+xoEFuEiT+5B+qgyJiagZ60rGqtkkuVEaIsiIh7C6zVWC9c 254bQBhiV3R5OvIRq8vs7DR9I2rrSiUmOYzGoDVfk= X-Gm-Gg: ASbGncsxoV9ZoDOtMUC7P1X3lMMD27xxrkNrp+RIKqdTNnELgi0nymukc4k1CZBNoV0 5+6NZh3P1axvTdzrfmBNtyMd2v9kKlhiKxpE7E7zP7+udusaB32GTPHokgKbKNcHk9pk2c2ixKS PBnnklL9KeQuL/d33QPgUqFns/dk1JwMnff2iCuvBKshdrvKmEDhkO8VFyf+rwbt+rb3Rrv15gA ZZhOjgHwKia4lDjkYCxtch6/T9NcWoqAoTahe/DVvTeroPiT8TpzIQul7HD X-Received: by 2002:a17:907:7da2:b0:aa6:8a1b:8b84 with SMTP id a640c23a62f3a-ab38b5342demr211529066b.57.1737106037641; Fri, 17 Jan 2025 01:27:17 -0800 (PST) X-Google-Smtp-Source: AGHT+IGVqG+RfH01JbScVMhK0hergPcEkoF02jSu7bcLe4UjTPb/cCZHpm3dL7gwCCHZiJ7iTX4U9Q== X-Received: by 2002:a17:907:7da2:b0:aa6:8a1b:8b84 with SMTP id a640c23a62f3a-ab38b5342demr211526766b.57.1737106037144; Fri, 17 Jan 2025 01:27:17 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 08/10] rust: pl011: remove duplicate definitions Date: Fri, 17 Jan 2025 10:26:55 +0100 Message-ID: <20250117092657.1051233-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106112421019000 Content-Type: text/plain; charset="utf-8" Unify the "Interrupt" enum and the "INT_*" constants with a struct that contains the bits. The "int_level" and "int_enabled" fields could use a crate such as "bitflags". Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 36 ++++++++++++------------- rust/hw/char/pl011/src/lib.rs | 46 +++++++++++--------------------- 2 files changed, 33 insertions(+), 49 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 1d3da59e481..6ecbfb9ac84 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -183,7 +183,7 @@ pub(self) fn read(&mut self, offset: RegisterOffset) ->= ControlFlow { self.flags.set_receive_fifo_empty(true); } if self.read_count + 1 =3D=3D self.read_trigger { - self.int_level &=3D !registers::INT_RX; + self.int_level &=3D !Interrupt::RX.0; } // Update error bits. self.receive_status_error_clear.set_from_data(c); @@ -232,7 +232,7 @@ pub(self) fn write( } // interrupts always checked let _ =3D self.loopback_tx(value); - self.int_level |=3D registers::INT_TX; + self.int_level |=3D Interrupt::TX.0; return true; } RSR =3D> { @@ -356,19 +356,19 @@ fn loopback_mdmctrl(&mut self) -> bool { // Change interrupts based on updated FR let mut il =3D self.int_level; =20 - il &=3D !Interrupt::MS; + il &=3D !Interrupt::MS.0; =20 if self.flags.data_set_ready() { - il |=3D Interrupt::DSR as u32; + il |=3D Interrupt::DSR.0; } if self.flags.data_carrier_detect() { - il |=3D Interrupt::DCD as u32; + il |=3D Interrupt::DCD.0; } if self.flags.clear_to_send() { - il |=3D Interrupt::CTS as u32; + il |=3D Interrupt::CTS.0; } if self.flags.ring_indicator() { - il |=3D Interrupt::RI as u32; + il |=3D Interrupt::RI.0; } self.int_level =3D il; true @@ -446,7 +446,7 @@ pub fn put_fifo(&mut self, value: u32) -> bool { } =20 if self.read_count =3D=3D self.read_trigger { - self.int_level |=3D registers::INT_RX; + self.int_level |=3D Interrupt::RX.0; return true; } false @@ -622,16 +622,16 @@ pub fn post_load(&self, _version_id: u32) -> Result<(= ), ()> { /// Which bits in the interrupt status matter for each outbound IRQ line ? const IRQMASK: [u32; 6] =3D [ /* combined IRQ */ - Interrupt::E - | Interrupt::MS - | Interrupt::RT as u32 - | Interrupt::TX as u32 - | Interrupt::RX as u32, - Interrupt::RX as u32, - Interrupt::TX as u32, - Interrupt::RT as u32, - Interrupt::MS, - Interrupt::E, + Interrupt::E.0 + | Interrupt::MS.0 + | Interrupt::RT.0 + | Interrupt::TX.0 + | Interrupt::RX.0, + Interrupt::RX.0, + Interrupt::TX.0, + Interrupt::RT.0, + Interrupt::MS.0, + Interrupt::E.0, ]; =20 /// # Safety diff --git a/rust/hw/char/pl011/src/lib.rs b/rust/hw/char/pl011/src/lib.rs index 2baacba2306..300c732ae1d 100644 --- a/rust/hw/char/pl011/src/lib.rs +++ b/rust/hw/char/pl011/src/lib.rs @@ -100,7 +100,6 @@ enum RegisterOffset { //Reserved =3D 0x04C, } =20 -#[allow(dead_code)] mod registers { //! Device registers exposed as typed structs which are backed by arbi= trary //! integer bitmaps. [`Data`], [`Control`], [`LineControl`], etc. @@ -521,38 +520,23 @@ fn default() -> Self { } =20 /// Interrupt status bits in UARTRIS, UARTMIS, UARTIMSC - pub const INT_OE: u32 =3D 1 << 10; - pub const INT_BE: u32 =3D 1 << 9; - pub const INT_PE: u32 =3D 1 << 8; - pub const INT_FE: u32 =3D 1 << 7; - pub const INT_RT: u32 =3D 1 << 6; - pub const INT_TX: u32 =3D 1 << 5; - pub const INT_RX: u32 =3D 1 << 4; - pub const INT_DSR: u32 =3D 1 << 3; - pub const INT_DCD: u32 =3D 1 << 2; - pub const INT_CTS: u32 =3D 1 << 1; - pub const INT_RI: u32 =3D 1 << 0; - pub const INT_E: u32 =3D INT_OE | INT_BE | INT_PE | INT_FE; - pub const INT_MS: u32 =3D INT_RI | INT_DSR | INT_DCD | INT_CTS; - - #[repr(u32)] - pub enum Interrupt { - OE =3D 1 << 10, - BE =3D 1 << 9, - PE =3D 1 << 8, - FE =3D 1 << 7, - RT =3D 1 << 6, - TX =3D 1 << 5, - RX =3D 1 << 4, - DSR =3D 1 << 3, - DCD =3D 1 << 2, - CTS =3D 1 << 1, - RI =3D 1 << 0, - } + pub struct Interrupt(pub u32); =20 impl Interrupt { - pub const E: u32 =3D INT_OE | INT_BE | INT_PE | INT_FE; - pub const MS: u32 =3D INT_RI | INT_DSR | INT_DCD | INT_CTS; + pub const OE: Self =3D Self(1 << 10); + pub const BE: Self =3D Self(1 << 9); + pub const PE: Self =3D Self(1 << 8); + pub const FE: Self =3D Self(1 << 7); + pub const RT: Self =3D Self(1 << 6); + pub const TX: Self =3D Self(1 << 5); + pub const RX: Self =3D Self(1 << 4); + pub const DSR: Self =3D Self(1 << 3); + pub const DCD: Self =3D Self(1 << 2); + pub const CTS: Self =3D Self(1 << 1); + pub const RI: Self =3D Self(1 << 0); + + pub const E: Self =3D Self(Self::OE.0 | Self::BE.0 | Self::PE.0 | = Self::FE.0); + pub const MS: Self =3D Self(Self::RI.0 | Self::DSR.0 | Self::DCD.0= | Self::CTS.0); } } =20 --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106138; cv=none; d=zohomail.com; s=zohoarc; b=CWRSDHhPG8MTLf+6OKIuTqBWl02b1ChzxHv1r4O4/d/PiYiOFpykPbyAXPgHkLTmjrbWgP6TTOxy6QVlRheajKeBaRNS4USQEOn3vmwc75rTkpIJeTAr1MjRdSFcF79fTClphbAe8vi+8o7TK7QUst6bAXaDNKppUoJtIXsOuiA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106138; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=innpU5AETiIp3OnYooXzip5b0I/ePQPwX7sHlhJog2Y=; b=n21DCWjjHyD4HUEyP5gWgUNhLbXXnT4bH9j98LkT2Hl1auTpMuIDMEk9TuHsGWfLdieUN++fKMdx3rzsvJ68/KaQu5xxcvGSd26RNjNJQLuyyh8qfp81ihV5FbrYQUB3ZxO8G5AYYlPS3C3pXyPVqv1DGnVQo+cM8YT/ksUOM34= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106138064553.1622761540613; Fri, 17 Jan 2025 01:28:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYida-0002fv-Jz; Fri, 17 Jan 2025 04:27:34 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidT-0002cD-Gz for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:29 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidR-0003Sr-LQ for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:26 -0500 Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-274-KUz72XynM9KTgljEY2qvLQ-1; Fri, 17 Jan 2025 04:27:21 -0500 Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-ab2b300e5daso240417066b.1 for ; Fri, 17 Jan 2025 01:27:21 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384c5c465sm140626866b.17.2025.01.17.01.27.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106044; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=innpU5AETiIp3OnYooXzip5b0I/ePQPwX7sHlhJog2Y=; b=hUKlzin/pLOjrnnVxx+xdxTiD7aKhADH1NHNtl+sXic/29cvwUb5K5kQAcfaRMYOXhWh6I aWoaSveAI5Q1oLoq2pFoW6a9dg3VbwAget94eC0TjxQyxHvmvCu9Mxr37iYBMI8EC6qR1T oON16ESPhO2gQtfwbMDNVH+PIrhnFZQ= X-MC-Unique: KUz72XynM9KTgljEY2qvLQ-1 X-Mimecast-MFC-AGG-ID: KUz72XynM9KTgljEY2qvLQ X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106040; x=1737710840; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=innpU5AETiIp3OnYooXzip5b0I/ePQPwX7sHlhJog2Y=; b=q0mOw+CDuiYosOOCvLCJ/ek2MO3dLeUrdxAbYPhhO8Ov7rZgsNbV1tAkNAYWQu1M81 VzhHTMIvOH5W5f4/CE292I/F+4N56Vl8CrQWIThjZ1qeHqcNts+OlnHxup3ZokGsOakL 8sOgXaB4hZ+Ix8N1jaqo1GxbL7JJlWFa0xlHLTHwI/JjhvlEc4hUgm054LbNVK/dZzpa uYN5wcPxWzgomypCjVfGEpB/qnM1F/OXRpiwIQYQDDRog/IbUcTp4InnfNzmjFn2TP/C Aq9Yvte3W5/HixYa59z7mdIfdkhqU3zQaFQ4lfDSU2Z9lXvkVF48RumI8oPAc7rBayhi xm5w== X-Gm-Message-State: AOJu0YxKXqjm53HPKVUWdgVLGd/TGVoOrCbuLtMI8ZYeN42UXS0vqC9U KKHIz+riMpOzHsqa+y7omzSeg0zx2GBI63j8rqPZHKZH5AfgX9gu9zqYFeXKN5FBB4BSjrUX/Se Y7ZdZKS0q2ZY6tmw6+whre9R4BJDA5fJBEbABYVxtC7pozCDjatF7HJTDUZbpZm8t4xvquP+323 /m20Yz6hRRckwFBvZj3+pKgVZp2qk6LB5FyJ3isvQ= X-Gm-Gg: ASbGncuK+r//WPnM9vm7mYZlDUnok3n2ieGlR5B06J54uD3sYN4PghwHCUPDDCbjNjl bsRj3JruAUHjH52LXxa4obWcxFk05whuM1KCKvjToKc36TNYR8Jdf8GTcj8r+JUQEK1v5CIrYke Z2zjL8XHeoXT08xLtgonOj0tqOXtFGc7dB8SEi+Dm9nVaMLIEBb9TbrRtgB/DBcLg5b5tK1f52H Y60LWZ2mObQMbZ4yTTtU+9JSpbF0qem4WBqAGxpEzW3x6QYg6ayUpXzTdeZ X-Received: by 2002:a17:907:969f:b0:ab2:c9b8:aaa7 with SMTP id a640c23a62f3a-ab38b36b7f6mr198023866b.44.1737106039741; Fri, 17 Jan 2025 01:27:19 -0800 (PST) X-Google-Smtp-Source: AGHT+IFLf0NVPirfPpmEV2RQNxzEbAJ6LIgyOIMuXLNELlVnAE9rs6fRKq/StbmIUrTDGfStPnff1w== X-Received: by 2002:a17:907:969f:b0:ab2:c9b8:aaa7 with SMTP id a640c23a62f3a-ab38b36b7f6mr198021866b.44.1737106039335; Fri, 17 Jan 2025 01:27:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 09/10] rust: pl011: pull device-specific code out of MemoryRegionOps callbacks Date: Fri, 17 Jan 2025 10:26:56 +0100 Message-ID: <20250117092657.1051233-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -39 X-Spam_score: -4.0 X-Spam_bar: ---- X-Spam_report: (-4.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-1.797, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106138532019000 Content-Type: text/plain; charset="utf-8" read() can now return a simple u64. Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 16 +++++++++------- rust/hw/char/pl011/src/memory_ops.rs | 23 ++++------------------- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index 6ecbfb9ac84..af0f451deb2 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -171,7 +171,7 @@ impl PL011Registers { pub(self) fn read(&mut self, offset: RegisterOffset) -> ControlFlow { use RegisterOffset::*; =20 - std::ops::ControlFlow::Break(match offset { + ControlFlow::Break(match offset { DR =3D> { self.flags.set_receive_fifo_full(false); let c =3D self.read_fifo[self.read_pos]; @@ -530,22 +530,24 @@ fn post_init(&self) { } } =20 - #[allow(clippy::needless_pass_by_ref_mut)] - pub fn read(&mut self, offset: hwaddr, _size: u32) -> ControlFlow { + pub fn read(&mut self, offset: hwaddr, _size: u32) -> u64 { match RegisterOffset::try_from(offset) { Err(v) if (0x3f8..0x400).contains(&(v >> 2)) =3D> { let device_id =3D self.get_class().device_id; - ControlFlow::Break(u64::from(device_id[(offset - 0xfe0) >>= 2])) + u64::from(device_id[(offset - 0xfe0) >> 2]) } Err(_) =3D> { // qemu_log_mask(LOG_GUEST_ERROR, "pl011_read: Bad offset = 0x%x\n", (int)offset); - ControlFlow::Break(0) + 0 } Ok(field) =3D> match self.regs.borrow_mut().read(field) { - ControlFlow::Break(value) =3D> ControlFlow::Break(value.in= to()), + ControlFlow::Break(value) =3D> value.into(), ControlFlow::Continue(value) =3D> { self.update(); - ControlFlow::Continue(value.into()) + unsafe { + qemu_chr_fe_accept_input(&mut self.char_backend); + } + value.into() }, } } diff --git a/rust/hw/char/pl011/src/memory_ops.rs b/rust/hw/char/pl011/src/= memory_ops.rs index 8f66c8d492c..95b4df794e4 100644 --- a/rust/hw/char/pl011/src/memory_ops.rs +++ b/rust/hw/char/pl011/src/memory_ops.rs @@ -26,26 +26,11 @@ unsafe extern "C" fn pl011_read(opaque: *mut c_void, addr: hwaddr, size: c= _uint) -> u64 { assert!(!opaque.is_null()); let mut state =3D unsafe { NonNull::new_unchecked(opaque.cast::()) }; - let val =3D unsafe { state.as_mut() }.read(addr, size); - match val { - std::ops::ControlFlow::Break(val) =3D> val, - std::ops::ControlFlow::Continue(val) =3D> { - // SAFETY: self.char_backend is a valid CharBackend instance a= fter it's been - // initialized in realize(). - let cb_ptr =3D unsafe { core::ptr::addr_of_mut!(state.as_mut()= .char_backend) }; - unsafe { - qemu_chr_fe_accept_input(cb_ptr); - } - - val - } - } + unsafe { state.as_mut() }.read(addr, size) } =20 unsafe extern "C" fn pl011_write(opaque: *mut c_void, addr: hwaddr, data: = u64, _size: c_uint) { - unsafe { - assert!(!opaque.is_null()); - let mut state =3D NonNull::new_unchecked(opaque.cast::= ()); - state.as_mut().write(addr, data) - } + assert!(!opaque.is_null()); + let mut state =3D unsafe { NonNull::new_unchecked(opaque.cast::()) }; + unsafe { state.as_mut() }.write(addr, data); } --=20 2.47.1 From nobody Wed Feb 5 12:56:40 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1737106082; cv=none; d=zohomail.com; s=zohoarc; b=CcYR1kP2Oy66+e5OBc4GXq412JzNd/RP0aBorceM4RMVG03t6w9EVD9iVstSOH1ZUj3u0aTVYdqknmOrSvtVOnYCLjsNhZQyxlvE45CHDu7OwKVJQLyZWy3rceTNrEDU54iRDojP4CWKPVw+Xrvr/MnXHWFh1j4mvYl0TgOo1gc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1737106082; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=dQr5RCbFdS/oHuH0+9xIml7K7ZNy+hcaQwV4qGT2rv8=; b=GNXe0M7bHMrKUyD3113WiLf6Pcp2iUG0o2vUuzSr5V9kHZOTDDFPnckvV0X9OMm1mu01wZomTv6wyRSz+eWExePTgziRTX+PHZdlctTgDczq2u0uoUOHzmwbxk3b8KuPGb9T/PsRyjUF+giZMdFsI7XPJVlDCR9lhl35X7QJAXk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1737106082650980.3260698650058; Fri, 17 Jan 2025 01:28:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tYidd-0002lD-50; Fri, 17 Jan 2025 04:27:37 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidW-0002dJ-8D for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:31 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tYidS-0003T1-AH for qemu-devel@nongnu.org; Fri, 17 Jan 2025 04:27:30 -0500 Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-610-D3StjTfANsWSJ4wxWltlhg-1; Fri, 17 Jan 2025 04:27:23 -0500 Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-aa689b88293so170728566b.3 for ; Fri, 17 Jan 2025 01:27:23 -0800 (PST) Received: from [192.168.10.3] ([176.206.124.70]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab384fcb5desm135754966b.165.2025.01.17.01.27.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 01:27:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1737106045; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dQr5RCbFdS/oHuH0+9xIml7K7ZNy+hcaQwV4qGT2rv8=; b=jH8lxNlFZTlPO0rm7WUyG0rDu/1BSVh5dmeWEMitBxG/D5l3SZ/jPTzLvwq/It41ZkDO+0 a/ajvdRPynI56dhyvw728l1fL33E2sW6pRnRgx7D9goD9hktPcs1N5lY6eJARdqtvwLr1F xfq/q0kvbaxsA67UsMUM50qp+MeAnus= X-MC-Unique: D3StjTfANsWSJ4wxWltlhg-1 X-Mimecast-MFC-AGG-ID: D3StjTfANsWSJ4wxWltlhg X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737106042; x=1737710842; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dQr5RCbFdS/oHuH0+9xIml7K7ZNy+hcaQwV4qGT2rv8=; b=hP6MUH4fqtW2PBPMgbSYiwZkF/NgUqjJ7sjMzM2wSb5uJvtP53UXTxP6D1lMFmbYFB 2/rPoiiQGOSjIojp7zxcBVfVlEFpbmgGly4cNHyluA6BbqeopM5GMfHlGhQuAlNZBX1m +JTqbv2U+CCJNdMt3F35jBKCUH6RIGp7agoL9g6O3MvuQNkvlvrA7CctPmtaZwSuFGzW tGmH43zI069A6NNZ6YC0ljSem0rixxsog4y90LqWNYtKRjRLm4hYF6yxweyVE4RK9d2o BgRjhJFoXNquBNXKMTxvQenXtuAisj1AbTNKhanBC4tz/tvBtPqsHVThwRQJPHSvK7zY 7Ffg== X-Gm-Message-State: AOJu0Yy1953pPOW0E8JPXE9p69+FRXEpYVgHY1k4T2WQswYMf7OWbEm/ CljYL4EqKt4rw3iYETZdBRgwLDanY2YI7wuiUCFlIUa5zT6W/9HpItiyHSyi0umBYY9WkfWoJlX ZybiKcBbexDDojUpmMrAe2DfheL45uT1XSbaVYEkvttywP5NRhLToKa4ceM4wm4Pwn7tYS6AKDO XTynBGE6tXB18SBw7X2hmO++zaxwfZIpkFVPhdcaU= X-Gm-Gg: ASbGnctvWJATknF9jODpsgEhl7D7yKy1KFKcjhqQACtFdq9NGyGV5FfHY1mbeX06RRb rjRIpa1lyDV59k2Oo1hn6n9UF2ZMGwDirNN20Ci9k6xCaen4PMth0Kck5L2m3BdDM5FIWQ1Usx2 HOCgaWXDE3GPkpQztgpiPrqg/PENCGiOu/QYsGW2lCqtoH/RcXPhAt2cAg14b1v4mHdyZ9cPR5I 8YniI6bepX59KtUFxTmpLii45uG2TT+3n6kwsyVh/vhEyfPodPbBT6MJ3Jx X-Received: by 2002:a17:907:7f03:b0:ab2:d96d:6364 with SMTP id a640c23a62f3a-ab38b10ade0mr170623166b.18.1737106042097; Fri, 17 Jan 2025 01:27:22 -0800 (PST) X-Google-Smtp-Source: AGHT+IGSdKkAVtnSSAasBosqLjZLUARijfc4OnYQL6bPMd9C4NKnh3l5NI42h6VDZaIVxZs5bkT+5w== X-Received: by 2002:a17:907:7f03:b0:ab2:d96d:6364 with SMTP id a640c23a62f3a-ab38b10ade0mr170620566b.18.1737106041655; Fri, 17 Jan 2025 01:27:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: qemu-rust@nongnu.org Subject: [PATCH 10/10] rust: qdev: make reset take a shared reference Date: Fri, 17 Jan 2025 10:26:57 +0100 Message-ID: <20250117092657.1051233-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250117092657.1051233-1-pbonzini@redhat.com> References: <20250117092657.1051233-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -39 X-Spam_score: -4.0 X-Spam_bar: ---- X-Spam_report: (-4.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.093, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-1.797, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1737106084159019000 Content-Type: text/plain; charset="utf-8" Because register reset is within a borrow_mut() call, reset does not need anymore a mut reference to the PL011State. Signed-off-by: Paolo Bonzini Reviewed-by: Zhao Liu --- rust/hw/char/pl011/src/device.rs | 4 ++-- rust/qemu-api/src/qdev.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/devi= ce.rs index af0f451deb2..019c1617807 100644 --- a/rust/hw/char/pl011/src/device.rs +++ b/rust/hw/char/pl011/src/device.rs @@ -164,7 +164,7 @@ fn vmsd() -> Option<&'static VMStateDescription> { Some(&device_class::VMSTATE_PL011) } const REALIZE: Option =3D Some(Self::realize); - const RESET: Option =3D Some(Self::reset); + const RESET: Option =3D Some(Self::reset); } =20 impl PL011Registers { @@ -604,7 +604,7 @@ pub fn realize(&mut self) { } } =20 - pub fn reset(&mut self) { + pub fn reset(&self) { self.regs.borrow_mut().reset(); } =20 diff --git a/rust/qemu-api/src/qdev.rs b/rust/qemu-api/src/qdev.rs index 686054e737a..4658409bebb 100644 --- a/rust/qemu-api/src/qdev.rs +++ b/rust/qemu-api/src/qdev.rs @@ -30,7 +30,7 @@ pub trait DeviceImpl { /// /// Rust does not yet support the three-phase reset protocol; this is /// usually okay for leaf classes. - const RESET: Option =3D None; + const RESET: Option =3D None; =20 /// An array providing the properties that the user can set on the /// device. Not a `const` because referencing statics in constants --=20 2.47.1