On Mon, Oct 17, 2011 at 7:16 PM, Jordan Justen <jordan.l.jus...@intel.com> wrote: > 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);
This is not optimal, instead the data should be used directly. That way also mmap()ed, deduplicated ROM files are possible. > + > 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); It should be easy to replace this with mmap(), maybe later. > + 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 > > >