From nobody Fri Nov 14 18:06:34 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=1760703322; cv=none; d=zohomail.com; s=zohoarc; b=SHsX7xMvrqM8Nv6ixVjbGBRsuJ78popb34hn7PRFavwiF5gVvdHltAZER/JKz4sdIeyeK6THY8c4ZS79gLAiS3ZbTPj2RKJcGvJeTnKEJ0chZDSPHoR+ZJP5UJ+idNtuqvIIwGr+wVT5sOj/xxfy60MUyCFK/k0jZeg5htVMwl0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760703322; 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=HxxhKBES+3zG9ZSkNpE9YD9nYqg9bjkdysluV/Zv9HY=; b=CqdaEeJyqPAqa5WQd1bbgavdRttO8AjtIEOzK9l4K9KecxBo9/sQ916RhT6ybgZj9l1bW1D/gYt5XfDMThiUxWZ59Fma+JiCrMKhz5sNN/4wSlIGmJHo79elWY1aSiIvfTy1NSn/OFj0MTreIW0lzyfIgYyC93MuSXhdPxti4z8= 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 1760703322194725.8466700988381; Fri, 17 Oct 2025 05:15:22 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v9jLz-0005q4-NS; Fri, 17 Oct 2025 08:14:41 -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 1v9jLq-0005pH-3J for qemu-devel@nongnu.org; Fri, 17 Oct 2025 08:14:30 -0400 Received: from mta-65-228.siemens.flowmailer.net ([185.136.65.228]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v9jLe-0005EM-Qm for qemu-devel@nongnu.org; Fri, 17 Oct 2025 08:14:29 -0400 Received: by mta-65-228.siemens.flowmailer.net with ESMTPSA id 20251017120400d7318f6f0300020795 for ; Fri, 17 Oct 2025 14:04:00 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm2; 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=HxxhKBES+3zG9ZSkNpE9YD9nYqg9bjkdysluV/Zv9HY=; b=XOJRtpy/KMKOv+atG7mgkN9ktGIs4J9IEQetdf5GjIf1F5cWPRg1gVqC9ZwuyYDgFFRBJn fXCPfKLnSQ4BBZEFK00Zn6h7c6t0kpHBGbcAExe+WbGKFPDT09Yepwz9hKf4iAQR0y98deH3 mgHBbI/RBLElqyuXPbqTCNtQFb13QlaV4dhSg38p0z6/mmciaHeeYsG9ycCW6tLAhIOmYjK2 Gx9gAeg/F4ScHpLeVhbGJQYDP9DcFFIoJA696V47vNygcpLBT0MlDN264Pb5cNR9waHwUE5H 4L6rRGIPu4HM5aPLE4ir+0xmdi72oTU97Khq4e/gBU5bhKP8Psgf3bvw==; 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?= , Jerome Forissier , Warner Losh , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Joel Stanley , Alistair Francis , Alexander Bulekov Subject: [PATCH v5 1/6] hw/sd/sdcard: Fix size check for backing block image Date: Fri, 17 Oct 2025 14:03:53 +0200 Message-ID: <484a8687e5cd44d94597512502180ba1aba57572.1760702638.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.65.228; envelope-from=fm-294854-20251017120400d7318f6f0300020795-bpZw4t@rts-flowmailer.siemens.com; helo=mta-65-228.siemens.flowmailer.net X-Spam_score_int: -23 X-Spam_score: -2.4 X-Spam_bar: -- X-Spam_report: (-2.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.272, 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: 1760703326259154100 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: C=C3=A9dric Le Goater Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- CC: Warner Losh CC: C=C3=A9dric Le Goater CC: Joel Stanley CC: Alistair Francis CC: Alexander Bulekov --- hw/sd/sd.c | 65 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/hw/sd/sd.c b/hw/sd/sd.c index d7a496d77c..d1e1bb4f0e 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -2759,9 +2759,32 @@ 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); + int64_t blk_size =3D -ENOMEDIUM; int ret; =20 switch (sd->spec_version) { @@ -2774,32 +2797,34 @@ static void sd_realize(DeviceState *dev, Error **er= rp) } =20 if (sd->blk) { - int64_t blk_size; - if (!blk_supports_write_perm(sd->blk)) { error_setg(errp, "Cannot use read-only drive as SD card"); 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); - + } + if (blk_size >=3D 0) { + blk_size -=3D 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