From nobody Sun Sep 28 16:35:30 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=1757854815; cv=none; d=zohomail.com; s=zohoarc; b=L1ZiM1IyPYUJg7XmMBDBwbGTUZK3A0LUoUlDFwKgPvn5pKCtfOe1eo8MfByHl8d/1XJkKEaQCBSvxinJSOtpMkas3bZV/KcbEzowQmyAoKWM844RrrLyIG2nANPBcKE+j8NKUQU54uKjR19ovY+ydYSdEeRzZ0UMzhU6EjGSyXg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1757854815; 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=9kg7dAy8SrX16vADrsAZRSF9godIAqn610Eq+o94Rw0=; b=C850dFvWUw63A/FhBcDICSLsUu8ur1Rjx3buxzn123yTG2kw7yVi7xPdTy2vJxzNo4XWnFU7awQNiGPIaBcEHwulm9i9oWDqm1r+FfCbkMWYBt0mhj6yfYBch9yKcdQxfI7FfuHUkv9CLDUbLrLRuHixaMQfrd1TBbbSj/TWVkE= 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 1757854815985440.7380936950159; Sun, 14 Sep 2025 06:00:15 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uxmIH-0004Xi-45; Sun, 14 Sep 2025 08:57:25 -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 1uxmI5-0004UL-PR for qemu-devel@nongnu.org; Sun, 14 Sep 2025 08:57:15 -0400 Received: from mta-64-226.siemens.flowmailer.net ([185.136.64.226]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uxmHw-0002ND-Rt for qemu-devel@nongnu.org; Sun, 14 Sep 2025 08:57:13 -0400 Received: by mta-64-226.siemens.flowmailer.net with ESMTPSA id 202509141246488b648be968000207a2 for ; Sun, 14 Sep 2025 14:46:48 +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=9kg7dAy8SrX16vADrsAZRSF9godIAqn610Eq+o94Rw0=; b=qArgQk0psgyBT0x2sNAowtDpQgVztXIBrVm0lB1+DrARXyBlMy7x5gY26qdKOrrtSO0TgH 1dSKyFafWRzZSqRZAsFGsrXOoupSZB5TfcG1kgKWwN3kRBmlsfCpNg9ZuUYl3NSYu8uLmynY 2UmRBiDO6adaNsoCn6kh87A9UJgXsZ1hLYMxoWK7xu1zXSv0zkGtwJzKU2nnhTdTqrxkv/tw hOx+GfWJ4sX70x8N891rO6oJmRYY6pSkFap91oifybiQ8ERZrWAOnPeMVEK3Uhy/5qd9wkBz x2J+6wWC+FFb4xTu9rifvzoDibKfqZRJ1wXef0LPXEUBOcwiuuPcFy2A==; 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 v4 1/6] hw/sd/sdcard: Fix size check for backing block image Date: Sun, 14 Sep 2025 14:46:41 +0200 Message-ID: <48930c1092424d22dc2171140378de19e0814ef3.1757854006.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.226; envelope-from=fm-294854-202509141246488b648be968000207a2-G54YOY@rts-flowmailer.siemens.com; helo=mta-64-226.siemens.flowmailer.net X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.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=-1, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-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 jan.kiszka@siemens.com) X-ZM-MESSAGEID: 1757854816875116600 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