9ae3a8
From 829a4521369f93923f4787cc1e45f1a0d432d71b Mon Sep 17 00:00:00 2001
9ae3a8
Message-Id: <829a4521369f93923f4787cc1e45f1a0d432d71b.1387298827.git.minovotn@redhat.com>
9ae3a8
In-Reply-To: <3ed0fb61a3dc912ef036d7ef450bed192090709e.1387298827.git.minovotn@redhat.com>
9ae3a8
References: <3ed0fb61a3dc912ef036d7ef450bed192090709e.1387298827.git.minovotn@redhat.com>
9ae3a8
From: "Michael S. Tsirkin" <mst@redhat.com>
9ae3a8
Date: Tue, 17 Dec 2013 15:17:59 +0100
9ae3a8
Subject: [PATCH 27/56] loader: support for unmapped ROM blobs
9ae3a8
9ae3a8
RH-Author: Michael S. Tsirkin <mst@redhat.com>
9ae3a8
Message-id: <1387293161-4085-28-git-send-email-mst@redhat.com>
9ae3a8
Patchwork-id: 56333
9ae3a8
O-Subject: [PATCH qemu-kvm RHEL7.0 v2 27/57] loader: support for unmapped ROM blobs
9ae3a8
Bugzilla: 1034876
9ae3a8
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
9ae3a8
RH-Acked-by: Marcel Apfelbaum <marcel.a@redhat.com>
9ae3a8
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
9ae3a8
Support ROM blobs not mapped into guest memory:
9ae3a8
same as ROM files really but use caller's buffer.
9ae3a8
9ae3a8
Support invoking callback on access and
9ae3a8
return memory pointer making it easier
9ae3a8
for caller to update memory if necessary.
9ae3a8
9ae3a8
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
9ae3a8
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
9ae3a8
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
9ae3a8
Tested-by: Igor Mammedov <imammedo@redhat.com>
9ae3a8
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
9ae3a8
(cherry picked from commit 48354cc5a3744c9a56462e5053e1f267a0ce69de)
9ae3a8
---
9ae3a8
 hw/lm32/lm32_hwsetup.h |  2 +-
9ae3a8
 include/hw/loader.h    |  7 ++++---
9ae3a8
 hw/core/loader.c       | 23 ++++++++++++++++++++---
9ae3a8
 3 files changed, 25 insertions(+), 7 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Michal Novotny <minovotn@redhat.com>
9ae3a8
---
9ae3a8
 hw/core/loader.c       | 23 ++++++++++++++++++++---
9ae3a8
 hw/lm32/lm32_hwsetup.h |  2 +-
9ae3a8
 include/hw/loader.h    |  7 ++++---
9ae3a8
 3 files changed, 25 insertions(+), 7 deletions(-)
9ae3a8
9ae3a8
diff --git a/hw/core/loader.c b/hw/core/loader.c
9ae3a8
index 6bdbd15..2bfff48 100644
9ae3a8
--- a/hw/core/loader.c
9ae3a8
+++ b/hw/core/loader.c
9ae3a8
@@ -666,10 +666,12 @@ err:
9ae3a8
     return -1;
9ae3a8
 }
9ae3a8
 
9ae3a8
-int rom_add_blob(const char *name, const void *blob, size_t len,
9ae3a8
-                 hwaddr addr)
9ae3a8
+void *rom_add_blob(const char *name, const void *blob, size_t len,
9ae3a8
+                   hwaddr addr, const char *fw_file_name,
9ae3a8
+                   FWCfgReadCallback fw_callback, void *callback_opaque)
9ae3a8
 {
9ae3a8
     Rom *rom;
9ae3a8
+    void *data = NULL;
9ae3a8
 
9ae3a8
     rom           = g_malloc0(sizeof(*rom));
9ae3a8
     rom->name     = g_strdup(name);
9ae3a8
@@ -679,7 +681,22 @@ int rom_add_blob(const char *name, const void *blob, size_t len,
9ae3a8
     rom->data     = g_malloc0(rom->datasize);
9ae3a8
     memcpy(rom->data, blob, len);
9ae3a8
     rom_insert(rom);
9ae3a8
-    return 0;
9ae3a8
+    if (fw_file_name && fw_cfg) {
9ae3a8
+        char devpath[100];
9ae3a8
+
9ae3a8
+        snprintf(devpath, sizeof(devpath), "/rom@%s", fw_file_name);
9ae3a8
+
9ae3a8
+        if (rom_file_in_ram) {
9ae3a8
+            data = rom_set_mr(rom, devpath);
9ae3a8
+        } else {
9ae3a8
+            data = rom->data;
9ae3a8
+        }
9ae3a8
+
9ae3a8
+        fw_cfg_add_file_callback(fw_cfg, fw_file_name,
9ae3a8
+                                 fw_callback, callback_opaque,
9ae3a8
+                                 data, rom->romsize);
9ae3a8
+    }
9ae3a8
+    return data;
9ae3a8
 }
9ae3a8
 
9ae3a8
 /* This function is specific for elf program because we don't need to allocate
9ae3a8
diff --git a/hw/lm32/lm32_hwsetup.h b/hw/lm32/lm32_hwsetup.h
9ae3a8
index 3449bd8..9fd5e69 100644
9ae3a8
--- a/hw/lm32/lm32_hwsetup.h
9ae3a8
+++ b/hw/lm32/lm32_hwsetup.h
9ae3a8
@@ -73,7 +73,7 @@ static inline void hwsetup_free(HWSetup *hw)
9ae3a8
 static inline void hwsetup_create_rom(HWSetup *hw,
9ae3a8
         hwaddr base)
9ae3a8
 {
9ae3a8
-    rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE, base);
9ae3a8
+    rom_add_blob("hwsetup", hw->data, TARGET_PAGE_SIZE, base, NULL, NULL, NULL);
9ae3a8
 }
9ae3a8
 
9ae3a8
 static inline void hwsetup_add_u8(HWSetup *hw, uint8_t u)
9ae3a8
diff --git a/include/hw/loader.h b/include/hw/loader.h
9ae3a8
index 19e11ea..1381a1d 100644
9ae3a8
--- a/include/hw/loader.h
9ae3a8
+++ b/include/hw/loader.h
9ae3a8
@@ -27,8 +27,9 @@ extern bool rom_file_in_ram;
9ae3a8
 
9ae3a8
 int rom_add_file(const char *file, const char *fw_dir,
9ae3a8
                  hwaddr addr, int32_t bootindex);
9ae3a8
-int rom_add_blob(const char *name, const void *blob, size_t len,
9ae3a8
-                 hwaddr addr);
9ae3a8
+void *rom_add_blob(const char *name, const void *blob, size_t len,
9ae3a8
+                   hwaddr addr, const char *fw_file_name,
9ae3a8
+                   FWCfgReadCallback fw_callback, void *callback_opaque);
9ae3a8
 int rom_add_elf_program(const char *name, void *data, size_t datasize,
9ae3a8
                         size_t romsize, hwaddr addr);
9ae3a8
 int rom_load_all(void);
9ae3a8
@@ -40,7 +41,7 @@ void do_info_roms(Monitor *mon, const QDict *qdict);
9ae3a8
 #define rom_add_file_fixed(_f, _a, _i)          \
9ae3a8
     rom_add_file(_f, NULL, _a, _i)
9ae3a8
 #define rom_add_blob_fixed(_f, _b, _l, _a)      \
9ae3a8
-    rom_add_blob(_f, _b, _l, _a)
9ae3a8
+    (rom_add_blob(_f, _b, _l, _a, NULL, NULL, NULL) ? 0 : -1)
9ae3a8
 
9ae3a8
 #define PC_ROM_MIN_VGA     0xc0000
9ae3a8
 #define PC_ROM_MIN_OPTION  0xc8000
9ae3a8
-- 
9ae3a8
1.7.11.7
9ae3a8