rom_add_file_buf is similar to rom_add_file, except the rom's
contents are provided in a buffer.

rom_add_file is modified to call rom_add_file_buf after
reading the rom's contents from the file.

Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com>
---
 hw/loader.c |   71 +++++++++++++++++++++++++++++++++++++++-------------------
 hw/loader.h |    5 ++++
 2 files changed, 53 insertions(+), 23 deletions(-)

diff --git a/hw/loader.c b/hw/loader.c
index 5676c18..d1a4a98 100644
--- a/hw/loader.c
+++ b/hw/loader.c
@@ -557,11 +557,11 @@ static void rom_insert(Rom *rom)
     QTAILQ_INSERT_TAIL(&roms, rom, next);
 }
 
-int rom_add_file(const char *file, const char *fw_dir,
-                 target_phys_addr_t addr, int32_t bootindex)
+int rom_add_file_buf(const char *file, const void *data, size_t size,
+                     const char *fw_dir,
+                     target_phys_addr_t addr, int32_t bootindex)
 {
     Rom *rom;
-    int rc, fd = -1;
     char devpath[100];
 
     rom = g_malloc0(sizeof(*rom));
@@ -571,28 +571,16 @@ int rom_add_file(const char *file, const char *fw_dir,
         rom->path = g_strdup(file);
     }
 
-    fd = open(rom->path, O_RDONLY | O_BINARY);
-    if (fd == -1) {
-        fprintf(stderr, "Could not open option rom '%s': %s\n",
-                rom->path, strerror(errno));
-        goto err;
-    }
-
     if (fw_dir) {
         rom->fw_dir  = g_strdup(fw_dir);
         rom->fw_file = g_strdup(file);
     }
     rom->addr    = addr;
-    rom->romsize = lseek(fd, 0, SEEK_END);
+    rom->romsize = size;
     rom->data    = g_malloc0(rom->romsize);
-    lseek(fd, 0, SEEK_SET);
-    rc = read(fd, rom->data, rom->romsize);
-    if (rc != rom->romsize) {
-        fprintf(stderr, "rom: file %-20s: read error: rc=%d (expected %zd)\n",
-                rom->name, rc, rom->romsize);
-        goto err;
-    }
-    close(fd);
+
+    memcpy(rom->data, data, rom->romsize);
+
     rom_insert(rom);
     if (rom->fw_file && fw_cfg) {
         const char *basename;
@@ -614,14 +602,51 @@ int rom_add_file(const char *file, const char *fw_dir,
 
     add_boot_device_path(bootindex, NULL, devpath);
     return 0;
+}
+
+int rom_add_file(const char *file, const char *fw_dir,
+                 target_phys_addr_t addr, int32_t bootindex)
+{
+    char *filename;
+    void *data = NULL;
+    size_t size;
+    int rc, fd = -1;
+
+    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, file);
+    if (filename == NULL) {
+        filename = g_strdup(file);
+    }
+
+    fd = open(filename, O_RDONLY | O_BINARY);
+    if (fd == -1) {
+        fprintf(stderr, "Could not open option rom '%s': %s\n",
+                filename, strerror(errno));
+        goto err;
+    }
+
+    size = lseek(fd, 0, SEEK_END);
+    data = g_malloc0(size);
+    lseek(fd, 0, SEEK_SET);
+    rc = read(fd, data, size);
+    if (rc != size) {
+        fprintf(stderr, "rom: file %-20s: read error: rc=%d (expected %zd)\n",
+                filename, rc, size);
+        goto err;
+    }
+    close(fd);
+
+    rc = rom_add_file_buf(filename, data, size, fw_dir, addr, bootindex);
+    if (rc != 0) {
+        goto err;
+    }
+
+    g_free(data);
+    return 0;
 
 err:
     if (fd != -1)
         close(fd);
-    g_free(rom->data);
-    g_free(rom->path);
-    g_free(rom->name);
-    g_free(rom);
+    g_free(data);
     return -1;
 }
 
diff --git a/hw/loader.h b/hw/loader.h
index fc6bdff..9efe64a 100644
--- a/hw/loader.h
+++ b/hw/loader.h
@@ -21,6 +21,9 @@ void pstrcpy_targphys(const char *name,
                       const char *source);
 
 
+int rom_add_file_buf(const char *file, const void *data, size_t size,
+                     const char *fw_dir,
+                     target_phys_addr_t addr, int32_t bootindex);
 int rom_add_file(const char *file, const char *fw_dir,
                  target_phys_addr_t addr, int32_t bootindex);
 int rom_add_blob(const char *name, const void *blob, size_t len,
@@ -31,6 +34,8 @@ int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t 
size);
 void *rom_ptr(target_phys_addr_t addr);
 void do_info_roms(Monitor *mon);
 
+#define rom_add_file_buf_fixed(_f, _d, _s, _a, _i)          \
+    rom_add_file_buf(_f, _d, _s, NULL, _a, _i)
 #define rom_add_file_fixed(_f, _a, _i)          \
     rom_add_file(_f, NULL, _a, _i)
 #define rom_add_blob_fixed(_f, _b, _l, _a)      \
-- 
1.7.1


Reply via email to