From nobody Tue Nov 26 20:27:44 2024 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=1704730197; cv=none; d=zohomail.com; s=zohoarc; b=CsJb4HHfxgY9FgVAtRPYLK70/FMjWmxHfToP6OWA7bMZOZQwGNYMbjcFLfDPAfz+bfmYEqx6KM7rSm0D2U+HvyIHd+C5fThuZokFRe1eLuFh06IxMPz95MjLIhiOTsUFaIKok0KbML9rT6i2ufjePylGwf/fdpsVulsBo0C2crY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1704730197; 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=FAeSf6AyHlWJ1aj4AEUmp5aZamGhHrmjKFEVdVz+6yI=; b=NolAieLYtCnBmT4sXo5sJlcyh8ZwH85bo6JTeBw6VWnoP4LZEBsUJ9Ji0PhCPxjd0j7cZpbGTbGEZTJ7fZfy1iPkKXvinDr/McEqPbrkoQ78iM7hKjFvqyy2xKfmhsusOkU++ZOtZSRFp3uN3WRJOxR17wzXrL+Q6rtfoYsVmGs= 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 1704730197889119.90823654355961; Mon, 8 Jan 2024 08:09:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rMsBh-0006oP-TQ; Mon, 08 Jan 2024 11:09:17 -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 1rMsBg-0006nz-5Y for qemu-devel@nongnu.org; Mon, 08 Jan 2024 11:09:16 -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 1rMsBd-0000mw-Ag for qemu-devel@nongnu.org; Mon, 08 Jan 2024 11:09:14 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-86-7GUMMKH7ME-p_skRFJWbvw-1; Mon, 08 Jan 2024 11:09:01 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 72FA0918569; Mon, 8 Jan 2024 16:09:01 +0000 (UTC) Received: from sirius.home.kraxel.org (unknown [10.39.194.130]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 418BC2166B33; Mon, 8 Jan 2024 16:09:01 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 2A656180092F; Mon, 8 Jan 2024 17:09:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704730144; 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=FAeSf6AyHlWJ1aj4AEUmp5aZamGhHrmjKFEVdVz+6yI=; b=VsWD730qGsSNjzlntBTn87GqgJ8rRiMybUUo032vyeRI9FG/BkYibdcYtjnMMGsoMvU+4H 9eO+aMyrByM1y15LtJ3S6ttLcF4FCI1RFb4IoA73vb4EMzYTqADzrocElxHA02mBNS+p/0 D3nUlV072eppkJqf73OMO0MH8PjUa6Y= X-MC-Unique: 7GUMMKH7ME-p_skRFJWbvw-1 From: Gerd Hoffmann To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Kevin Wolf , Gerd Hoffmann Subject: [PATCH v2 1/3] hw/pflash: refactor pflash_data_write() Date: Mon, 8 Jan 2024 17:08:57 +0100 Message-ID: <20240108160900.104835-2-kraxel@redhat.com> In-Reply-To: <20240108160900.104835-1-kraxel@redhat.com> References: <20240108160900.104835-1-kraxel@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 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=kraxel@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.243, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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: 1704730199355100002 Content-Type: text/plain; charset="utf-8" Move the offset calculation, do it once at the start of the function and let the 'p' variable point directly to the memory location which should be updated. This makes it simpler to update other buffers than pfl->storage in an upcoming patch. No functional change. Signed-off-by: Gerd Hoffmann Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/pflash_cfi01.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 3e2dc08bd78f..67f1c9773ab3 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -403,33 +403,35 @@ static void pflash_update(PFlashCFI01 *pfl, int offse= t, static inline void pflash_data_write(PFlashCFI01 *pfl, hwaddr offset, uint32_t value, int width, int be) { - uint8_t *p =3D pfl->storage; + uint8_t *p; =20 trace_pflash_data_write(pfl->name, offset, width, value, pfl->counter); + p =3D pfl->storage + offset; + switch (width) { case 1: - p[offset] =3D value; + p[0] =3D value; break; case 2: if (be) { - p[offset] =3D value >> 8; - p[offset + 1] =3D value; + p[0] =3D value >> 8; + p[1] =3D value; } else { - p[offset] =3D value; - p[offset + 1] =3D value >> 8; + p[0] =3D value; + p[1] =3D value >> 8; } break; case 4: if (be) { - p[offset] =3D value >> 24; - p[offset + 1] =3D value >> 16; - p[offset + 2] =3D value >> 8; - p[offset + 3] =3D value; + p[0] =3D value >> 24; + p[1] =3D value >> 16; + p[2] =3D value >> 8; + p[3] =3D value; } else { - p[offset] =3D value; - p[offset + 1] =3D value >> 8; - p[offset + 2] =3D value >> 16; - p[offset + 3] =3D value >> 24; + p[0] =3D value; + p[1] =3D value >> 8; + p[2] =3D value >> 16; + p[3] =3D value >> 24; } break; } --=20 2.43.0 From nobody Tue Nov 26 20:27:44 2024 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=1704730201; cv=none; d=zohomail.com; s=zohoarc; b=SGn/4h7Jhv7dJFMLple3Yjd0ePvpd/CG7d6gVi4B6gPu6OtgKwlSXzNWXj/lVmMYhuwdZ/tf7h7D/b3O4Urp9Tp2rD79f0oyimHcgWcCqWPagD1oNq1nJtDnZ5KdL+fzR7ku1fKwM2x8zydVwtAjC8FErIw3uwuGMc3jMAnt8gw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1704730201; h=Content-Type: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=+UMeANDd14nL6Odyxug03PTmTfnYlzkXPTCXfG6UNpQ=; b=GkOH1FPZxEvD9qx+eOyYgvdWPYddYIteYQHOAI7fx/fZWQqRy7P3wlKsjNRZYzGLwMGylSE0TveicRdLICUrVHskC4E01Ct5CM5uQh2b4WgsfpzzcSY8n8u8j/0DVklTlBqUw9Lvwx/VGgOO70SCsi1NQfp2dJi41qFsWIxg9lU= 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 1704730201600356.50647142224886; Mon, 8 Jan 2024 08:10:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rMsBf-0006nj-EV; Mon, 08 Jan 2024 11:09:15 -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 1rMsBc-0006mk-Ef for qemu-devel@nongnu.org; Mon, 08 Jan 2024 11:09:12 -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 1rMsBa-0000oZ-1Y for qemu-devel@nongnu.org; Mon, 08 Jan 2024 11:09:11 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-182-XAHmDmgONGONQOHLsiwQqw-1; Mon, 08 Jan 2024 11:09:03 -0500 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C28E8101A49F; Mon, 8 Jan 2024 16:09:02 +0000 (UTC) Received: from sirius.home.kraxel.org (unknown [10.39.194.130]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9A1BD492BC7; Mon, 8 Jan 2024 16:09:02 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 37B8C18009BD; Mon, 8 Jan 2024 17:09:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704730146; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+UMeANDd14nL6Odyxug03PTmTfnYlzkXPTCXfG6UNpQ=; b=WhHmASzPoo+1aaVQwHDG/tUSarVtrPgQiE4KmTUuLfU9YYkJx5KvObXEoNFn3HaGUcfzoc 176G5pN9rZx1v75MizLk8IvVel9t2uM0DsqrJZvzbHIC4aLj+2SKV+z192d92cy3WMDQS9 DuSoIbt4NZsnu4VmGIa8RWiy0o27qWs= X-MC-Unique: XAHmDmgONGONQOHLsiwQqw-1 From: Gerd Hoffmann To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Kevin Wolf , Gerd Hoffmann Subject: [PATCH v2 2/3] hw/pflash: use ldn_{be,le}_p and stn_{be,le}_p Date: Mon, 8 Jan 2024 17:08:58 +0100 Message-ID: <20240108160900.104835-3-kraxel@redhat.com> In-Reply-To: <20240108160900.104835-1-kraxel@redhat.com> References: <20240108160900.104835-1-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.9 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=kraxel@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.243, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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: 1704730203214100003 Use the helper functions we have to read/write multi-byte values in correct byte order. Suggested-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Gerd Hoffmann Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/pflash_cfi01.c | 63 ++++++----------------------------------- 1 file changed, 8 insertions(+), 55 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 67f1c9773ab3..8434a45cabb0 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -225,34 +225,10 @@ static uint32_t pflash_data_read(PFlashCFI01 *pfl, hw= addr offset, uint32_t ret; =20 p =3D pfl->storage; - switch (width) { - case 1: - ret =3D p[offset]; - break; - case 2: - if (be) { - ret =3D p[offset] << 8; - ret |=3D p[offset + 1]; - } else { - ret =3D p[offset]; - ret |=3D p[offset + 1] << 8; - } - break; - case 4: - if (be) { - ret =3D p[offset] << 24; - ret |=3D p[offset + 1] << 16; - ret |=3D p[offset + 2] << 8; - ret |=3D p[offset + 3]; - } else { - ret =3D p[offset]; - ret |=3D p[offset + 1] << 8; - ret |=3D p[offset + 2] << 16; - ret |=3D p[offset + 3] << 24; - } - break; - default: - abort(); + if (be) { + ret =3D ldn_be_p(p + offset, width); + } else { + ret =3D ldn_le_p(p + offset, width); } trace_pflash_data_read(pfl->name, offset, width, ret); return ret; @@ -408,34 +384,11 @@ static inline void pflash_data_write(PFlashCFI01 *pfl= , hwaddr offset, trace_pflash_data_write(pfl->name, offset, width, value, pfl->counter); p =3D pfl->storage + offset; =20 - switch (width) { - case 1: - p[0] =3D value; - break; - case 2: - if (be) { - p[0] =3D value >> 8; - p[1] =3D value; - } else { - p[0] =3D value; - p[1] =3D value >> 8; - } - break; - case 4: - if (be) { - p[0] =3D value >> 24; - p[1] =3D value >> 16; - p[2] =3D value >> 8; - p[3] =3D value; - } else { - p[0] =3D value; - p[1] =3D value >> 8; - p[2] =3D value >> 16; - p[3] =3D value >> 24; - } - break; + if (be) { + stn_be_p(p, width, value); + } else { + stn_le_p(p, width, value); } - } =20 static void pflash_write(PFlashCFI01 *pfl, hwaddr offset, --=20 2.43.0 From nobody Tue Nov 26 20:27:44 2024 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=1704730222; cv=none; d=zohomail.com; s=zohoarc; b=Uszurdz4rkyx+b3Ek2UdwHISB1qdy08LxCsZnxwn42tL32pv7ZZDhItyOIUBc3GHMJ7bdWCkGwNEMOJ00JxlbjTtiYpQQi/xtgnVUPm9KlEfAXKrPKNeMexbwPcOZy88RBBNvE/Ve1WEyDIH7TijG/6kL8OFQ+J4IriRHgqjBBo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1704730222; 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=r8mtw+h6B0EMxH6LprYC5smO9JVUNI4HSvZlhjoQ0uE=; b=dnzPXNCY7VZXwB5XiuwY6UghPxlzlMZiFC25H14cxsS4pkDAsQzIGKsam5LiWuZB0dTF+nHAEZvJnPY7TYQrh1Msf8rU8UjADoHidkcngLxMlqHI/upz06CNHpb18klDHTLao8P0iY6LrEfwv1e3ouxgsjhDvKOS5c0nzdD+cec= 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 1704730222732702.7188241254535; Mon, 8 Jan 2024 08:10:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rMsBi-0006oZ-GL; Mon, 08 Jan 2024 11:09:18 -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 1rMsBg-0006o0-64 for qemu-devel@nongnu.org; Mon, 08 Jan 2024 11:09:16 -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 1rMsBd-0000oc-B1 for qemu-devel@nongnu.org; Mon, 08 Jan 2024 11:09:15 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-13-J7iEtQL5OymJMla8Rv6b8A-1; Mon, 08 Jan 2024 11:09:03 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DE99C91856D; Mon, 8 Jan 2024 16:09:02 +0000 (UTC) Received: from sirius.home.kraxel.org (unknown [10.39.194.130]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 99E782166B33; Mon, 8 Jan 2024 16:09:02 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 4A4551800D67; Mon, 8 Jan 2024 17:09:00 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704730146; 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=r8mtw+h6B0EMxH6LprYC5smO9JVUNI4HSvZlhjoQ0uE=; b=NM/8lce4jMRNTHBfXCTnZGwY9YX/QiHDHRWicPrZQ6AGVPRrvx03L0v39muNLOCvp9p8kG onGIieSvDxMm6KkNCFqtWKqbWZS6Gr+cB9UMQHsRksW99WF7Ridm27pLtL3PP9BRTvEoyL uvI2jDygUp/Lyhyu2uYX3h8/E/0sv8w= X-MC-Unique: J7iEtQL5OymJMla8Rv6b8A-1 From: Gerd Hoffmann To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Hanna Reitz , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Kevin Wolf , Gerd Hoffmann Subject: [PATCH v2 3/3] hw/pflash: implement update buffer for block writes Date: Mon, 8 Jan 2024 17:08:59 +0100 Message-ID: <20240108160900.104835-4-kraxel@redhat.com> In-Reply-To: <20240108160900.104835-1-kraxel@redhat.com> References: <20240108160900.104835-1-kraxel@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 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=kraxel@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.243, 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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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: 1704730223374100003 Content-Type: text/plain; charset="utf-8" Add an update buffer where all block updates are staged. Flush or discard updates properly, so we should never see half-completed block writes in pflash storage. Drop a bunch of FIXME comments ;) Signed-off-by: Gerd Hoffmann Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- hw/block/pflash_cfi01.c | 110 ++++++++++++++++++++++++++++++---------- hw/block/pflash_cfi02.c | 2 +- hw/block/trace-events | 7 ++- 3 files changed, 89 insertions(+), 30 deletions(-) diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 8434a45cabb0..f956f8bcf72a 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -80,16 +80,39 @@ struct PFlashCFI01 { uint16_t ident3; uint8_t cfi_table[0x52]; uint64_t counter; - unsigned int writeblock_size; + uint32_t writeblock_size; MemoryRegion mem; char *name; void *storage; VMChangeStateEntry *vmstate; bool old_multiple_chip_handling; + + /* block update buffer */ + unsigned char *blk_bytes; + uint32_t blk_offset; }; =20 static int pflash_post_load(void *opaque, int version_id); =20 +static bool pflash_blk_write_state_needed(void *opaque) +{ + PFlashCFI01 *pfl =3D opaque; + + return (pfl->blk_offset !=3D -1); +} + +static const VMStateDescription vmstate_pflash_blk_write =3D { + .name =3D "pflash_cfi01_blk_write", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D pflash_blk_write_state_needed, + .fields =3D (const VMStateField[]) { + VMSTATE_VBUFFER_UINT32(blk_bytes, PFlashCFI01, 0, NULL, writeblock= _size), + VMSTATE_UINT32(blk_offset, PFlashCFI01), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_pflash =3D { .name =3D "pflash_cfi01", .version_id =3D 1, @@ -101,6 +124,10 @@ static const VMStateDescription vmstate_pflash =3D { VMSTATE_UINT8(status, PFlashCFI01), VMSTATE_UINT64(counter, PFlashCFI01), VMSTATE_END_OF_LIST() + }, + .subsections =3D (const VMStateDescription * const []) { + &vmstate_pflash_blk_write, + NULL } }; =20 @@ -376,13 +403,55 @@ static void pflash_update(PFlashCFI01 *pfl, int offse= t, } } =20 +/* copy current flash content to block update buffer */ +static void pflash_blk_write_start(PFlashCFI01 *pfl, hwaddr offset) +{ + hwaddr mask =3D ~(pfl->writeblock_size - 1); + + trace_pflash_write_block_start(pfl->name, pfl->counter); + pfl->blk_offset =3D offset & mask; + memcpy(pfl->blk_bytes, pfl->storage + pfl->blk_offset, + pfl->writeblock_size); +} + +/* commit block update buffer changes */ +static void pflash_blk_write_flush(PFlashCFI01 *pfl) +{ + g_assert(pfl->blk_offset !=3D -1); + trace_pflash_write_block_flush(pfl->name); + memcpy(pfl->storage + pfl->blk_offset, pfl->blk_bytes, + pfl->writeblock_size); + pflash_update(pfl, pfl->blk_offset, pfl->writeblock_size); + pfl->blk_offset =3D -1; +} + +/* discard block update buffer changes */ +static void pflash_blk_write_abort(PFlashCFI01 *pfl) +{ + trace_pflash_write_block_abort(pfl->name); + pfl->blk_offset =3D -1; +} + static inline void pflash_data_write(PFlashCFI01 *pfl, hwaddr offset, uint32_t value, int width, int be) { uint8_t *p; =20 - trace_pflash_data_write(pfl->name, offset, width, value, pfl->counter); - p =3D pfl->storage + offset; + if (pfl->blk_offset !=3D -1) { + /* block write: redirect writes to block update buffer */ + if ((offset < pfl->blk_offset) || + (offset + width > pfl->blk_offset + pfl->writeblock_size)) { + pfl->status |=3D 0x10; /* Programming error */ + return; + } + trace_pflash_data_write_block(pfl->name, offset, width, value, + pfl->counter); + p =3D pfl->blk_bytes + (offset - pfl->blk_offset); + } else { + /* write directly to storage */ + trace_pflash_data_write(pfl->name, offset, width, value); + p =3D pfl->storage + offset; + } =20 if (be) { stn_be_p(p, width, value); @@ -503,9 +572,9 @@ static void pflash_write(PFlashCFI01 *pfl, hwaddr offse= t, } else { value =3D extract32(value, 0, pfl->bank_width * 8); } - trace_pflash_write_block(pfl->name, value); pfl->counter =3D value; pfl->wcycle++; + pflash_blk_write_start(pfl, offset); break; case 0x60: if (cmd =3D=3D 0xd0) { @@ -536,12 +605,7 @@ static void pflash_write(PFlashCFI01 *pfl, hwaddr offs= et, switch (pfl->cmd) { case 0xe8: /* Block write */ /* FIXME check @offset, @width */ - if (!pfl->ro) { - /* - * FIXME writing straight to memory is *wrong*. We - * should write to a buffer, and flush it to memory - * only on confirm command (see below). - */ + if (!pfl->ro && (pfl->blk_offset !=3D -1)) { pflash_data_write(pfl, offset, value, width, be); } else { pfl->status |=3D 0x10; /* Programming error */ @@ -550,18 +614,8 @@ static void pflash_write(PFlashCFI01 *pfl, hwaddr offs= et, pfl->status |=3D 0x80; =20 if (!pfl->counter) { - hwaddr mask =3D pfl->writeblock_size - 1; - mask =3D ~mask; - trace_pflash_write(pfl->name, "block write finished"); pfl->wcycle++; - if (!pfl->ro) { - /* Flush the entire write buffer onto backing storage.= */ - /* FIXME premature! */ - pflash_update(pfl, offset & mask, pfl->writeblock_size= ); - } else { - pfl->status |=3D 0x10; /* Programming error */ - } } =20 pfl->counter--; @@ -573,20 +627,17 @@ static void pflash_write(PFlashCFI01 *pfl, hwaddr off= set, case 3: /* Confirm mode */ switch (pfl->cmd) { case 0xe8: /* Block write */ - if (cmd =3D=3D 0xd0) { - /* FIXME this is where we should write out the buffer */ + if ((cmd =3D=3D 0xd0) && !(pfl->status & 0x10)) { + pflash_blk_write_flush(pfl); pfl->wcycle =3D 0; pfl->status |=3D 0x80; } else { - qemu_log_mask(LOG_UNIMP, - "%s: Aborting write to buffer not implemented," - " the data is already written to storage!\n" - "Flash device reset into READ mode.\n", - __func__); + pflash_blk_write_abort(pfl); goto mode_read_array; } break; default: + pflash_blk_write_abort(pfl); goto error_flash; } break; @@ -820,6 +871,9 @@ static void pflash_cfi01_realize(DeviceState *dev, Erro= r **errp) pfl->cmd =3D 0x00; pfl->status =3D 0x80; /* WSM ready */ pflash_cfi01_fill_cfi_table(pfl); + + pfl->blk_bytes =3D g_malloc(pfl->writeblock_size); + pfl->blk_offset =3D -1; } =20 static void pflash_cfi01_system_reset(DeviceState *dev) @@ -839,6 +893,8 @@ static void pflash_cfi01_system_reset(DeviceState *dev) * This model deliberately ignores this delay. */ pfl->status =3D 0x80; + + pfl->blk_offset =3D -1; } =20 static Property pflash_cfi01_properties[] =3D { diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index 2a99b286b073..6fa56f14c020 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -546,7 +546,7 @@ static void pflash_write(void *opaque, hwaddr offset, u= int64_t value, } goto reset_flash; } - trace_pflash_data_write(pfl->name, offset, width, value, 0); + trace_pflash_data_write(pfl->name, offset, width, value); if (!pfl->ro) { p =3D (uint8_t *)pfl->storage + offset; if (pfl->be) { diff --git a/hw/block/trace-events b/hw/block/trace-events index bab21d3a1ca8..cc9a9f246039 100644 --- a/hw/block/trace-events +++ b/hw/block/trace-events @@ -12,7 +12,8 @@ fdctrl_tc_pulse(int level) "TC pulse: %u" pflash_chip_erase_invalid(const char *name, uint64_t offset) "%s: chip era= se: invalid address 0x%" PRIx64 pflash_chip_erase_start(const char *name) "%s: start chip erase" pflash_data_read(const char *name, uint64_t offset, unsigned size, uint32_= t value) "%s: data offset:0x%04"PRIx64" size:%u value:0x%04x" -pflash_data_write(const char *name, uint64_t offset, unsigned size, uint32= _t value, uint64_t counter) "%s: data offset:0x%04"PRIx64" size:%u value:0x= %04x counter:0x%016"PRIx64 +pflash_data_write(const char *name, uint64_t offset, unsigned size, uint32= _t value) "%s: data offset:0x%04"PRIx64" size:%u value:0x%04x" +pflash_data_write_block(const char *name, uint64_t offset, unsigned size, = uint32_t value, uint64_t counter) "%s: data offset:0x%04"PRIx64" size:%u va= lue:0x%04x counter:0x%016"PRIx64 pflash_device_id(const char *name, uint16_t id) "%s: read device ID: 0x%04= x" pflash_device_info(const char *name, uint64_t offset) "%s: read device inf= ormation offset:0x%04" PRIx64 pflash_erase_complete(const char *name) "%s: sector erase complete" @@ -32,7 +33,9 @@ pflash_unlock0_failed(const char *name, uint64_t offset, = uint8_t cmd, uint16_t a pflash_unlock1_failed(const char *name, uint64_t offset, uint8_t cmd) "%s:= unlock0 failed 0x%" PRIx64 " 0x%02x" pflash_unsupported_device_configuration(const char *name, uint8_t width, u= int8_t max) "%s: unsupported device configuration: device_width:%d max_devi= ce_width:%d" pflash_write(const char *name, const char *str) "%s: %s" -pflash_write_block(const char *name, uint32_t value) "%s: block write: byt= es:0x%x" +pflash_write_block_start(const char *name, uint32_t value) "%s: block writ= e start: bytes:0x%x" +pflash_write_block_flush(const char *name) "%s: block write flush" +pflash_write_block_abort(const char *name) "%s: block write abort" pflash_write_block_erase(const char *name, uint64_t offset, uint64_t len) = "%s: block erase offset:0x%" PRIx64 " bytes:0x%" PRIx64 pflash_write_failed(const char *name, uint64_t offset, uint8_t cmd) "%s: c= ommand failed 0x%" PRIx64 " 0x%02x" pflash_write_invalid(const char *name, uint8_t cmd) "%s: invalid write for= command 0x%02x" --=20 2.43.0