Dear Kevin,

Am Sonntag, den 16.01.2011, 13:23 -0500 schrieb Kevin O'Connor:
> This is a resend of a patch I sent last year.  Current distros ship a
> version of lzma that does not set the "size" property of the
> compressed archive.  This makes files compressed via the system
> version of lzma unusable for coreboot and seabios.  This patch adds a
> helper to cbfstool so users can easily add compressed "raw" files.
> 
> -Kevin
> 
> --------------------------- patch -----------------------
> 
> Enhance cbfstool so that it can support "cbfstool ROM add-lzma FILE
> NAME" calls.  This is useful for callers that wish to add an lzma
> compressed raw file.
> 
> Right now, SeaBIOS supports lzma raw files for things like floppy
> images.  Today, adding one of these files requires a two step process
> - for example:
> 
> $ lzma -zc /path/to/myfloppy.img > myfloppy.img.lzma
> $ cbfstool coreboot.rom add myfloppy.img.lzma floppyimg/MyFloppy.lzma raw
> 
> Unfortunately, various versions of "lzma" are quirky and the above can
> be troublesome.

could you give a hint what versions of `lzma` are quirky. Is that an
upstream problem and is this problem reported upstream?

> With this patch, a user need only execute:

s/a user need only execute:/a user only needs to execute:/ (?)

> $ cbfstool coreboot.rom add-lzma myfloppy.img floppyimg/MyFloppy.lzma
> 
> Signed-off-by: Kevin O'Connor <[email protected]>
> ---
>  util/cbfstool/cbfs.h     |    1 +
>  util/cbfstool/cbfstool.c |   71 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  util/cbfstool/common.c   |    1 +
>  3 files changed, 73 insertions(+), 0 deletions(-)
> 
> diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h
> index 6fb9edd..44c1fa0 100644
> --- a/util/cbfstool/cbfs.h
> +++ b/util/cbfstool/cbfs.h
> @@ -73,6 +73,7 @@ struct cbfs_payload {
>  #define CBFS_COMPONENT_OPTIONROM  0x30
>  #define CBFS_COMPONENT_BOOTSPLASH 0x40
>  #define CBFS_COMPONENT_RAW        0x50
> +#define CBFS_COMPONENT_LZMA_RAW   0x40000050
>  #define CBFS_COMPONENT_VSA        0x51
>  #define CBFS_COMPONENT_MBI        0x52
>  #define CBFS_COMPONENT_MICROCODE  0x53
> diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
> index 507edc2..d437994 100644
> --- a/util/cbfstool/cbfstool.c
> +++ b/util/cbfstool/cbfstool.c
> @@ -18,6 +18,7 @@
>   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
>   */
>  
> +#include <stdlib.h>

I do not know the coding style. Are headers sorted alphabetically?

>  #include <stdio.h>
>  #include <string.h>
>  #include "common.h"
> @@ -27,6 +28,7 @@ typedef enum {
>       CMD_ADD,
>       CMD_ADD_PAYLOAD,
>       CMD_ADD_STAGE,
> +     CMD_ADD_LZMA,
>       CMD_CREATE,
>       CMD_LOCATE,
>       CMD_PRINT,
> @@ -187,6 +189,73 @@ static int cbfs_add_stage(int argc, char **argv)
>       return 0;
>  }
>  
> +static int cbfs_add_lzma(int argc, char **argv)
> +{
> +     char *romname = argv[1];
> +     char *cmd = argv[2];
> +     void *rom = loadrom(romname);
> +
> +     if (rom == NULL) {
> +             printf("Could not load ROM image '%s'.\n", romname);
> +             return 1;
> +     }
> +
> +     if (argc < 5) {
> +             printf("not enough arguments to '%s'.\n", cmd);

Capital letter at the start and s/to/to run/ (?).

Sorry if this is incorrect. I am no native speaker.

> +             return 1;
> +     }
> +
> +     char *filename = argv[3];
> +     char *cbfsname = argv[4];
> +
> +     uint32_t filesize = 0;
> +     void *filedata = loadfile(filename, &filesize, 0, SEEK_SET);
> +     if (filedata == NULL) {
> +             printf("Could not load file '%s'.\n", filename);
> +             return 1;
> +     }
> +
> +     uint32_t base = 0;
> +     void *cbfsfile = NULL;
> +
> +     uint32_t type = CBFS_COMPONENT_LZMA_RAW;
> +     if (argc > 5) {
> +             if (intfiletype(argv[5]) != ((uint64_t) - 1))
> +                     type = intfiletype(argv[5]);
> +             else
> +                     type = strtoul(argv[5], NULL, 0);
> +     }
> +     if (argc > 6) {
> +             base = strtoul(argv[6], NULL, 0);
> +     }
> +     uint32_t compresssize = filesize;
> +     void *compressed_data;
> +     for (;;) {
> +             compressed_data = malloc(compresssize);
> +             if (! compressed_data) {
> +                     printf("Could not allocate %d space\n", compresssize);
> +                     return 1;
> +             }
> +             uint32_t actualsize = compresssize;
> +             extern void do_lzma_compress(char *in, int in_len,
> +                                          char *out, int *out_len);
> +             do_lzma_compress(filedata, filesize, compressed_data,
> +                              &compresssize);
> +             if (compresssize <= actualsize)
> +                     break;
> +             // Try again with required size.
> +             free(compressed_data);
> +     }
> +
> +     cbfsfile = create_cbfs_file(cbfsname, compressed_data,
> +                                 &compresssize, type, &base);
> +     if (add_file_to_cbfs(cbfsfile, compresssize, base))
> +             return 1;
> +     if (writerom(romname, rom, romsize))
> +             return 1;
> +     return 0;
> +}
> +
>  static int cbfs_create(int argc, char **argv)
>  {
>       char *romname = argv[1];
> @@ -269,6 +338,7 @@ struct command commands[] = {
>       {CMD_ADD, "add", cbfs_add},
>       {CMD_ADD_PAYLOAD, "add-payload", cbfs_add_payload},
>       {CMD_ADD_STAGE, "add-stage", cbfs_add_stage},
> +     {CMD_ADD_LZMA, "add-lzma", cbfs_add_lzma},
>       {CMD_CREATE, "create", cbfs_create},
>       {CMD_LOCATE, "locate", cbfs_locate},
>       {CMD_PRINT, "print", cbfs_print},
> @@ -286,6 +356,7 @@ void usage(void)
>            " add FILE NAME TYPE [base address]    Add a component\n"
>            " add-payload FILE NAME [COMP] [base]  Add a payload to the ROM\n"
>            " add-stage FILE NAME [COMP] [base]    Add a stage to the ROM\n"
> +          " add-lzma FILE NAME [TYPE] [base]     Lzma compress and add\n"
>            " create SIZE BOOTBLOCK [ALIGN]        Create a ROM file\n"
>            " locate FILE NAME ALIGN               Find a place for a file of 
> that size\n"
>            " print                                Show the contents of the 
> ROM\n"
> diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
> index 0fb0200..788d843 100644
> --- a/util/cbfstool/common.c
> +++ b/util/cbfstool/common.c
> @@ -142,6 +142,7 @@ struct filetypes_t {
>       {CBFS_COMPONENT_OPTIONROM, "optionrom"},
>       {CBFS_COMPONENT_BOOTSPLASH, "bootsplash"},
>       {CBFS_COMPONENT_RAW, "raw"},
> +     {CBFS_COMPONENT_LZMA_RAW, "lzma-raw"},
>       {CBFS_COMPONENT_VSA, "vsa"},
>       {CBFS_COMPONENT_MBI, "mbi"},
>       {CBFS_COMPONENT_MICROCODE, "microcode"},

I have not had time to test, so only

Reviewed-by: Paul Menzel <[email protected]>


Thanks,

Paul

Attachment: signature.asc
Description: This is a digitally signed message part

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to