[SeaBIOS] [PATCH v4 1/5] romfile_loader: utility to patch in-memory ROM files

Kevin O'Connor kevin at koconnor.net
Wed Sep 25 01:32:10 CEST 2013


On Mon, Sep 23, 2013 at 09:20:25PM +0300, Michael S. Tsirkin wrote:
> Add ability for a ROM file to point to
> it's image in memory. When file is in memory,
> add utility that can patch it, storing
> pointers to one file within another file.
> 
> This is not a lot of code: together with the follow-up patch to load
> ACPI tables from ROM, it's about 1K extra.
> 
> Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
> ---
>  Makefile             |   2 +-
>  src/romfile_loader.h |  72 +++++++++++++++++++++
>  src/fw/paravirt.c    |   2 +
>  src/romfile_loader.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 251 insertions(+), 1 deletion(-)
>  create mode 100644 src/romfile_loader.h
>  create mode 100644 src/romfile_loader.c
> 
> diff --git a/Makefile b/Makefile
> index 3984d35..ae36dba 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -23,7 +23,7 @@ SRC32FLAT=$(SRCBOTH) post.c memmap.c malloc.c pmm.c romfile.c optionroms.c \
>      hw/usb-hub.c \
>      fw/coreboot.c fw/lzmadecode.c fw/csm.c fw/biostables.c \
>      fw/paravirt.c fw/shadow.c fw/pciinit.c fw/smm.c fw/mtrr.c fw/xen.c \
> -    fw/acpi.c fw/mptable.c fw/pirtable.c fw/smbios.c
> +    fw/acpi.c fw/mptable.c fw/pirtable.c fw/smbios.c romfile_loader.c

romfile_loader is a firmware file and show go in the fw/ directory.

[...]
> --- a/src/fw/paravirt.c
> +++ b/src/fw/paravirt.c
> @@ -365,6 +365,8 @@ void qemu_cfg_init(void)
>      for (e = 0; e < count; e++) {
>          struct QemuCfgFile qfile;
>          qemu_cfg_read(&qfile, sizeof(qfile));
> +	if (!*qfile.name)
> +		return;

What is this for?

SeaBIOS uses spaces and no tabs.

[...]
> +int romfile_loader_execute(const char *name)
> +{
> +    struct romfile_loader_entry_s *entry;
> +    int size, offset = 0, nfiles = 0;
> +    struct romfile_loader_files *files;
> +    void *data = romfile_loadfile(name, &size);
> +    if (!data)
> +        return -1;
> +
> +    /* Validate and count files */
> +    for (offset = 0; offset < size; offset += sizeof(*entry)) {
> +        entry = data + offset;
> +        /* Check that entry fits in buffer. */
> +        if (offset + sizeof(*entry) > size) {
> +            warn_internalerror();
> +            return -1;
> +        }
> +
> +        if (le32_to_cpu(entry->command) == ROMFILE_LOADER_COMMAND_ALLOCATE) {
> +            nfiles++;
> +	}
> +    }
> +
> +    files = malloc_tmp(sizeof(*files) + nfiles * sizeof(files->files[0]));
> +    files->nfiles = 0;

Nitpick, but this would be much simpler if it was just:
files = malloc_tmp(size / sizeof(*entry) * sizeof(*files));
Also, you should check that that the malloc succeeds.

Otherwise, it looks okay to me.

-Kevin



More information about the SeaBIOS mailing list