From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 1/8] hw/sd/sdcard: Fix size check for backing block image
Date: Tue, 4 Nov 2025 18:48:16 +0100 [thread overview]
Message-ID: <20251104174823.92412-2-philmd@linaro.org> (raw)
In-Reply-To: <20251104174823.92412-1-philmd@linaro.org>
From: Jan Kiszka <jan.kiszka@siemens.com>
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 <jan.kiszka@siemens.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
Message-ID: <591f6d8a9dc86428723cb6876df6e717cc41a70e.1762261430.git.jan.kiszka@siemens.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/sd/sd.c | 69 +++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 48 insertions(+), 21 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index d7a496d77c9..76e915e1900 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);
}
+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 = sd_is_emmc(sd) ? "eMMC" : "SD card";
+ char *blk_size_str;
+
+ blk_size_str = 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 = 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 <imagefile> <new-size>'\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 = SDMMC_COMMON(dev);
+ int64_t blk_size = -ENOMEDIUM;
int ret;
switch (sd->spec_version) {
@@ -2774,32 +2797,36 @@ static void sd_realize(DeviceState *dev, Error **errp)
}
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;
}
blk_size = blk_getlength(sd->blk);
- if (blk_size > 0 && !is_power_of_2(blk_size)) {
- int64_t blk_size_aligned = pow2ceil(blk_size);
- char *blk_size_str;
-
- blk_size_str = size_to_str(blk_size);
- error_setg(errp, "Invalid SD card size: %s", blk_size_str);
- g_free(blk_size_str);
-
- blk_size_str = 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 <imagefile> <new-size>'\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 >= 0) {
+ blk_size -= sd->boot_part_size * 2;
+ if (blk_size > SDSC_MAX_CAPACITY) {
+ if (sd_is_emmc(sd) &&
+ !QEMU_IS_ALIGNED(blk_size, 1 << HWBLOCK_SHIFT)) {
+ int64_t blk_size_aligned =
+ ((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) &&
+ !QEMU_IS_ALIGNED(blk_size, 512 * KiB)) {
+ int64_t blk_size_aligned = ((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 of 2",
+ errp);
+ return;
+ } else if (blk_size < 0) {
+ error_setg(errp, "eMMC image smaller than boot partitions");
return;
}
@@ -2810,7 +2837,7 @@ static void sd_realize(DeviceState *dev, Error **errp)
}
blk_set_dev_ops(sd->blk, &sd_block_ops, sd);
}
- if (sd->boot_part_size % (128 * KiB) ||
+ if (!QEMU_IS_ALIGNED(sd->boot_part_size, 128 * KiB) ||
sd->boot_part_size > 255 * 128 * KiB) {
g_autofree char *size_str = size_to_str(sd->boot_part_size);
--
2.51.0
next prev parent reply other threads:[~2025-11-04 17:49 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-04 17:48 [PULL 0/8] Misc HW patches for 2025-11-04 Philippe Mathieu-Daudé
2025-11-04 17:48 ` Philippe Mathieu-Daudé [this message]
2025-11-04 17:48 ` [PULL 2/8] hw/sd/sdcard: Allow user creation of eMMCs Philippe Mathieu-Daudé
2025-11-04 17:48 ` [PULL 3/8] hw/sd/sdcard: Add basic support for RPMB partition Philippe Mathieu-Daudé
2025-11-04 17:48 ` [PULL 4/8] hw/sd/sdcard: Handle RPMB MAC field Philippe Mathieu-Daudé
2025-11-04 17:48 ` [PULL 5/8] scripts: Add helper script to generate eMMC block device images Philippe Mathieu-Daudé
2025-11-04 17:48 ` [PULL 6/8] docs: Add eMMC device model description Philippe Mathieu-Daudé
2025-11-04 17:48 ` [PULL 7/8] hw/i386/microvm: Use fdt field from MachineState Philippe Mathieu-Daudé
2025-11-04 17:48 ` [PULL 8/8] hw/audio: Remove dead code from ac97_realize Philippe Mathieu-Daudé
2025-11-05 9:00 ` [PULL 0/8] Misc HW patches for 2025-11-04 Philippe Mathieu-Daudé
2025-11-05 13:47 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251104174823.92412-2-philmd@linaro.org \
--to=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).