[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 09/17] hw/sd/sdcard: Special case the -ENOMEDIUM error
From: |
Philippe Mathieu-Daudé |
Subject: |
[PATCH v7 09/17] hw/sd/sdcard: Special case the -ENOMEDIUM error |
Date: |
Tue, 30 Jun 2020 15:39:03 +0200 |
As we have no interest in the underlying block geometry,
directly call blk_getlength(). We have to care about machines
creating SD card with not drive attached (probably incorrect
API use). Simply emit a warning when such Frankenstein cards
of zero size are reset.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
hw/sd/sd.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index e5adcc8055..548745614e 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -545,18 +545,30 @@ static inline uint64_t sd_addr_to_wpnum(uint64_t addr)
static void sd_reset(DeviceState *dev)
{
SDState *sd = SD_CARD(dev);
- uint64_t size;
- uint64_t sect;
trace_sdcard_reset();
if (sd->blk) {
- blk_get_geometry(sd->blk, §);
- } else {
- sect = 0;
- }
- size = sect << 9;
+ int64_t size = blk_getlength(sd->blk);
+
+ if (size == -ENOMEDIUM) {
+ /*
+ * FIXME blk should be set once per device in sd_realize(),
+ * and we shouldn't be checking it in sed_reset(). But this
+ * is how the reparent currently works.
+ */
+ char *id = object_get_canonical_path_component(OBJECT(dev));
+
+ warn_report("sd-card '%s' created with no drive.",
+ id ? id : "unknown");
+ g_free(id);
+ size = 0;
+ }
+ assert(size >= 0);
+ sd->size = size;
+ } else {
+ sd->size = 0;
+ }
- sd->size = size;
sd->state = sd_idle_state;
sd->rca = 0x0000;
sd_set_ocr(sd);
--
2.21.3
- [PATCH v7 00/17] hw/sd/sdcard: Fix CVE-2020-13253 & cleanups, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 02/17] hw/sd/sdcard: Update coding style to make checkpatch.pl happy, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 03/17] hw/sd/sdcard: Move some definitions to use them earlier, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 01/17] MAINTAINERS: Cc qemu-block mailing list, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 04/17] hw/sd/sdcard: Use the HWBLOCK_SIZE definition, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 05/17] hw/sd/sdcard: Do not switch to ReceivingData if address is invalid, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 06/17] hw/sd/sdcard: Restrict Class 6 commands to SCSD cards, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 07/17] hw/sd/sdcard: Move sd->size initialization, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 08/17] hw/sd/sdcard: Call sd_addr_to_wpnum where it is used, consider zero size, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 09/17] hw/sd/sdcard: Special case the -ENOMEDIUM error,
Philippe Mathieu-Daudé <=
- [PATCH v7 13/17] hw/sd/sdcard: Constify sd_crc*()'s message argument, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 14/17] hw/sd/sdcard: Make iolen unsigned, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 11/17] hw/sd/sdcard: Update the SDState documentation, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 10/17] hw/sd/sdcard: Check address is in range, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 12/17] hw/sd/sdcard: Simplify cmd_valid_while_locked(), Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 15/17] hw/sd/sdcard: Correctly display the command name in trace events, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 16/17] hw/sd/sdcard: Display offset in read/write_data() trace events, Philippe Mathieu-Daudé, 2020/06/30
- [PATCH v7 17/17] hw/sd/sdcard: Simplify realize() a bit, Philippe Mathieu-Daudé, 2020/06/30