From nobody Sun Sep 28 17:07:14 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=jan.kiszka@siemens.com; 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=reject dis=none) header.from=siemens.com ARC-Seal: i=1; a=rsa-sha256; t=1757422964; cv=none; d=zohomail.com; s=zohoarc; b=TukFieDtofdBBs68xruDIbzmE6/oXbVfsGkYazkg/L/WZ8x67ksthyBa63gDt2KG6noXLRFDJlI1XD59lntvysm+QfXzLkCXlxvSBp3rdLv6EqJmQxou4Irl7TpSCp0vNuzYZtEzhLqwby7d2xp8Qdtob0JJFccuGSP7SEc1Aow= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1757422964; 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=kliDhElVMfZaRHJVGqrzcFIpPd+7cusPCd8jbt9glxA=; b=eJdWrvJ2eTkzg48BSda5EN45EdaJUTPLmDjWyeSobjnQlEe54w+jxXgfo5G+00jU3ZOidIxtdcp0tyCTC+NFPBNPHNDRzQlkrQdP+UFmheqazCL0L3O85FmvVnXxQGX10tlRskDSRYZmV9oDNlfL/O8sAR2iAP3RJah9IyjPVgY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=jan.kiszka@siemens.com; 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 175742296435629.720225082106026; Tue, 9 Sep 2025 06:02:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uvxzI-00010k-Vr; Tue, 09 Sep 2025 09:02:21 -0400 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 1uvxyP-0000OT-Bp for qemu-devel@nongnu.org; Tue, 09 Sep 2025 09:01:34 -0400 Received: from mta-64-228.siemens.flowmailer.net ([185.136.64.228]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uvxyG-0003pg-Lh for qemu-devel@nongnu.org; Tue, 09 Sep 2025 09:01:24 -0400 Received: by mta-64-228.siemens.flowmailer.net with ESMTPSA id 20250909125100548c0e3bfb00020785 for ; Tue, 09 Sep 2025 14:51:00 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=jan.kiszka@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=kliDhElVMfZaRHJVGqrzcFIpPd+7cusPCd8jbt9glxA=; b=t5l5hlFxNKF45hlWyR2nOZij0McUCii44XK+ECzCq+upOIXxKYh4/en5Y0/u5JmH3NwadE bYL6nMFlWJ2dYmbmRp8lVDBUbTeqYUyx1uF2ThLsSga9MDwWme531sDK6d/MUw1OZNJUdLu8 bjxRnJW0Yw8/V6uhUL+DfQJMevAgqEvoPFnCYW6rqkPUq9Y94FYTLK2R8jAiICsrfkpKH4H2 nAKuK0IWn4F4tbx/Jr5oHMMaFVEY+n+e3b63ukOR+X9usdD09IeC8VMlQJiR2AINW+Rf9+/I k5YU/hng2mgwlju4LQOw/xb/vyTJZYRNUCkp4bkQp3WReQx/rTSfUuwQ==; From: Jan Kiszka To: qemu-devel Cc: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Bin Meng , qemu-block@nongnu.org, Ilias Apalodimas , =?UTF-8?q?Alex=20Benn=C3=A9e?= , =?UTF-8?q?Jan=20L=C3=BCbbe?= , Warner Losh , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Joel Stanley , Alistair Francis , Alexander Bulekov Subject: [PATCH v3 1/6] hw/sd/sdcard: Fix size check for backing block image Date: Tue, 9 Sep 2025 14:50:51 +0200 Message-ID: <8fa0fa4158dc2e62edb59d5af8fa54a41e50e306.1757422256.git.jan.kiszka@siemens.com> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-294854:519-21489:flowmailer 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=185.136.64.228; envelope-from=fm-294854-20250909125100548c0e3bfb00020785-A2IZY3@rts-flowmailer.siemens.com; helo=mta-64-228.siemens.flowmailer.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, 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_PASS=-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 jan.kiszka@siemens.com) X-ZM-MESSAGEID: 1757422966617116600 From: Jan Kiszka Alignment rules apply the the individual partitions (user, boot, later on also RPMB) and depend both on the size of the image and the type of the device. Up to and including 2GB, the power-of-2 rule applies to the user data area. For larger images, multiples of 512 sectors must be used for eMMC and multiples of 512K for SD-cards. Fix the check accordingly and also detect if the image is too small to even hold the boot partitions. Signed-off-by: Jan Kiszka Reviewed-by: Warner Losh --- CC: Warner Losh CC: C=C3=A9dric Le Goater CC: Joel Stanley CC: Alistair Francis CC: Alexander Bulekov --- hw/sd/sd.c | 61 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index d7a496d77c..b42cd01d1f 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -2759,6 +2759,28 @@ static void sd_instance_finalize(Object *obj) timer_free(sd->ocr_power_timer); } =20 +static void sd_blk_size_error(SDState *sd, int64_t blk_size, + int64_t blk_size_aligned, const char *rule, + Error **errp) +{ + const char *dev_type =3D sd_is_emmc(sd) ? "eMMC" : "SD card"; + char *blk_size_str; + + blk_size_str =3D size_to_str(blk_size); + error_setg(errp, "Invalid %s size: %s", dev_type, blk_size_str); + g_free(blk_size_str); + + blk_size_str =3D size_to_str(blk_size_aligned); + error_append_hint(errp, + "%s size has to be %s, e.g. %s.\n" + "You can resize disk images with" + " 'qemu-img resize '\n" + "(note that this will lose data if you make the" + " image smaller than it currently is).\n", + dev_type, rule, blk_size_str); + g_free(blk_size_str); +} + static void sd_realize(DeviceState *dev, Error **errp) { SDState *sd =3D SDMMC_COMMON(dev); @@ -2781,25 +2803,26 @@ static void sd_realize(DeviceState *dev, Error **er= rp) return; } =20 - blk_size =3D blk_getlength(sd->blk); - if (blk_size > 0 && !is_power_of_2(blk_size)) { - int64_t blk_size_aligned =3D pow2ceil(blk_size); - char *blk_size_str; - - blk_size_str =3D size_to_str(blk_size); - error_setg(errp, "Invalid SD card size: %s", blk_size_str); - g_free(blk_size_str); - - blk_size_str =3D size_to_str(blk_size_aligned); - error_append_hint(errp, - "SD card size has to be a power of 2, e.g. %= s.\n" - "You can resize disk images with" - " 'qemu-img resize '\n" - "(note that this will lose data if you make = the" - " image smaller than it currently is).\n", - blk_size_str); - g_free(blk_size_str); - + blk_size =3D blk_getlength(sd->blk) - sd->boot_part_size * 2; + if (blk_size > SDSC_MAX_CAPACITY) { + if (sd_is_emmc(sd) && blk_size % (1 << HWBLOCK_SHIFT) !=3D 0) { + int64_t blk_size_aligned =3D + ((blk_size >> HWBLOCK_SHIFT) + 1) << HWBLOCK_SHIFT; + sd_blk_size_error(sd, blk_size, blk_size_aligned, + "multiples of 512", errp); + return; + } else if (!sd_is_emmc(sd) && blk_size % (512 * KiB)) { + int64_t blk_size_aligned =3D ((blk_size >> 19) + 1) << 19; + sd_blk_size_error(sd, blk_size, blk_size_aligned, + "multiples of 512K", errp); + return; + } + } else if (blk_size > 0 && !is_power_of_2(blk_size)) { + sd_blk_size_error(sd, blk_size, pow2ceil(blk_size), "a power o= f 2", + errp); + return; + } else if (blk_size < 0) { + error_setg(errp, "eMMC image smaller than boot partitions"); return; } =20 --=20 2.51.0