On Tue, Oct 18, 2011 at 11:05, Blue Swirl <blauwir...@gmail.com> wrote:
> 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.

In my 4th patch I use a buffer from a memory region via
memory_region_get_ram_ptr.  Comments for memory_region_get_ram_ptr say
'Use with care'.

So, would the best thing be for me to allocate a new buffer in my 4th
patch, do the memcpy there, and then use the pointer directly here?

Thanks,

-Jordan

>
>> +
>>     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
>>
>>
>>
>
>

Reply via email to