qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH V2 10/10] hw/sd.c: introduce SD card "image" propert


From: Igor Mitsyanko
Subject: [Qemu-devel] [PATCH V2 10/10] hw/sd.c: introduce SD card "image" property and allow SD hot-insert
Date: Thu, 05 Apr 2012 19:48:33 +0400

New SD card "image" property can be used to:
- change image file attached to virtual SD card
- hot-insert new image file into newly initialized BlockDriverState (this was 
not
possible before).

Example usage:
./qom-set /machine/milkymist/milkymist-memcard/card.image /home/me/mynewcard.img
this will attach image file /home/me/mynewcard.img to virtual SD card connected 
to
milkymist-memcard host controller device. If virtual card was already attached 
to
some other image file, eject event is triggered before attaching new file.

Signed-off-by: Igor Mitsyanko <address@hidden>
---
 hw/sd.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/hw/sd.c b/hw/sd.c
index 8ffaa17..3e75405 100644
--- a/hw/sd.c
+++ b/hw/sd.c
@@ -1816,6 +1816,48 @@ static void sd_set_spimode(Object *obj, Visitor *v, void 
*opaque,
     }
 }
 
+static void sd_set_image_path(Object *obj, Visitor *v, void *opaque,
+                         const char *name, Error **errp)
+{
+    SDState *sd = SD_CARD(obj);
+    char *new_image;
+
+    visit_type_str(v, &new_image, "file", errp);
+
+    if (error_is_set(errp)) {
+        return;
+    }
+
+    if (sd->bdrv) {
+        qmp_change_blockdev(bdrv_get_device_name(sd->bdrv), new_image,
+                false, NULL, errp);
+    } else {
+        DriveInfo *di;
+        QemuOpts *opts = drive_add(IF_SD, sd->if_idx, new_image, "");
+
+        if (!opts) {
+            error_set(errp, QERR_OPEN_FILE_FAILED, new_image);
+            return;
+        }
+
+        di = drive_init(opts, 0);
+        if (!di) {
+            error_set(errp, QERR_OPEN_FILE_FAILED, new_image);
+            return;
+        }
+
+        sd_reset(sd, di->bdrv);
+        if (bdrv_attach_dev(sd->bdrv, sd) < 0) {
+            drive_put_ref(di);
+            error_set(errp, QERR_OPEN_FILE_FAILED, new_image);
+            return;
+        }
+        bdrv_set_dev_ops(sd->bdrv, &sd_block_ops, sd);
+        qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
+        qemu_set_irq(sd->readonly_cb, sd->wp_switch);
+    }
+}
+
 static void sd_initfn(Object *obj)
 {
     SDState *sd = SD_CARD(obj);
@@ -1826,6 +1868,8 @@ static void sd_initfn(Object *obj)
             NULL, NULL, NULL);
     object_property_add(obj, "spi-mode", "boolean", sd_is_spi, sd_set_spimode,
             NULL, NULL, NULL);
+    object_property_add(OBJECT(sd), "image", "string",
+            NULL, sd_set_image_path, NULL, NULL, NULL);
 }
 
 static TypeInfo sd_type_info = {
-- 
1.7.4.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]