* [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer @ 2021-05-26 9:02 Lucas Stach 2021-05-26 9:02 ` [PATCH v2 2/2] bootm: add support for booting compressed images Lucas Stach 2021-05-27 6:50 ` [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer Sascha Hauer 0 siblings, 2 replies; 4+ messages in thread From: Lucas Stach @ 2021-05-26 9:02 UTC (permalink / raw) To: barebox The decompression algorithms want all of the requested buffer size to be filled and don't cope with less bytes being returned. Use read_full to satisfy this requirement. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- lib/uncompress.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/uncompress.c b/lib/uncompress.c index c47d319dbb5f..5c0d1e9f4d66 100644 --- a/lib/uncompress.c +++ b/lib/uncompress.c @@ -24,6 +24,7 @@ #include <filetype.h> #include <malloc.h> #include <fs.h> +#include <libfile.h> static void *uncompress_buf; static unsigned int uncompress_size; @@ -142,7 +143,7 @@ static int uncompress_infd, uncompress_outfd; static int fill_fd(void *buf, unsigned int len) { - return read(uncompress_infd, buf, len); + return read_full(uncompress_infd, buf, len); } static int flush_fd(void *buf, unsigned int len) -- 2.29.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] bootm: add support for booting compressed images 2021-05-26 9:02 [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer Lucas Stach @ 2021-05-26 9:02 ` Lucas Stach 2021-05-28 7:06 ` Ahmad Fatoum 2021-05-27 6:50 ` [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer Sascha Hauer 1 sibling, 1 reply; 4+ messages in thread From: Lucas Stach @ 2021-05-26 9:02 UTC (permalink / raw) To: barebox ARM64 does not have a self extracting image format, but relies on the image being externally compressed with one of the standard compression algorithms. Add support for decompressing the bootm OS image. It is added in common code as it may also be useful for other images/architectures. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- v2: Add proper error handling if nested bootm fails. --- common/bootm.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/common/bootm.c b/common/bootm.c index 092116beb94a..f5c0e5184b0a 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -12,6 +12,7 @@ #include <environment.h> #include <linux/stat.h> #include <magicvar.h> +#include <uncompress.h> static LIST_HEAD(handler_list); @@ -808,6 +809,86 @@ err_out: return ret; } +static int do_bootm_compressed(struct image_data *img_data) +{ + struct bootm_data bootm_data = { + .oftree_file = img_data->oftree_file, + .initrd_file = img_data->initrd_file, + .tee_file = img_data->tee_file, + .verbose = img_data->verbose, + .verify = img_data->verify, + .force = img_data->force, + .dryrun = img_data->dryrun, + .initrd_address = img_data->initrd_address, + .os_address = img_data->os_address, + .os_entry = img_data->os_entry, + }; + int from, to, ret; + char *dstpath; + + from = open(img_data->os_file, O_RDONLY); + if (from < 0) + return -ENODEV; + + dstpath = make_temp("bootm-compressed"); + if (!dstpath) { + ret = -ENOMEM; + goto fail_from; + } + + to = open(dstpath, O_CREAT | O_WRONLY); + if (to < 0) { + ret = -ENODEV; + goto fail_make_temp; + } + + ret = uncompress_fd_to_fd(from, to, uncompress_err_stdout); + if (ret) + goto fail_to; + + bootm_data.os_file = dstpath; + ret = bootm_boot(&bootm_data); + +fail_to: + close(to); + unlink(dstpath); +fail_make_temp: + free(dstpath); +fail_from: + close(from); + return ret; +} + +static struct image_handler bzip2_bootm_handler = { + .name = "BZIP2 compressed file", + .bootm = do_bootm_compressed, + .filetype = filetype_bzip2, +}; + +static struct image_handler gzip_bootm_handler = { + .name = "GZIP compressed file", + .bootm = do_bootm_compressed, + .filetype = filetype_gzip, +}; + +static struct image_handler lzo_bootm_handler = { + .name = "LZO compressed file", + .bootm = do_bootm_compressed, + .filetype = filetype_lzo_compressed, +}; + +static struct image_handler lz4_bootm_handler = { + .name = "LZ4 compressed file", + .bootm = do_bootm_compressed, + .filetype = filetype_lz4_compressed, +}; + +static struct image_handler xz_bootm_handler = { + .name = "XZ compressed file", + .bootm = do_bootm_compressed, + .filetype = filetype_xz_compressed, +}; + static int bootm_init(void) { globalvar_add_simple("bootm.image", NULL); @@ -830,6 +911,18 @@ static int bootm_init(void) globalvar_add_simple_enum("bootm.verify", (unsigned int *)&bootm_verify_mode, bootm_verify_names, ARRAY_SIZE(bootm_verify_names)); + + if (IS_ENABLED(CONFIG_BZLIB)) + register_image_handler(&bzip2_bootm_handler); + if (IS_ENABLED(CONFIG_ZLIB)) + register_image_handler(&gzip_bootm_handler); + if (IS_ENABLED(CONFIG_LZO_DECOMPRESS)) + register_image_handler(&lzo_bootm_handler); + if (IS_ENABLED(CONFIG_LZ4_DECOMPRESS)) + register_image_handler(&lz4_bootm_handler); + if (IS_ENABLED(CONFIG_XZ_DECOMPRESS)) + register_image_handler(&xz_bootm_handler); + return 0; } late_initcall(bootm_init); -- 2.29.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 2/2] bootm: add support for booting compressed images 2021-05-26 9:02 ` [PATCH v2 2/2] bootm: add support for booting compressed images Lucas Stach @ 2021-05-28 7:06 ` Ahmad Fatoum 0 siblings, 0 replies; 4+ messages in thread From: Ahmad Fatoum @ 2021-05-28 7:06 UTC (permalink / raw) To: Lucas Stach, barebox On 26.05.21 11:02, Lucas Stach wrote: > ARM64 does not have a self extracting image format, but relies on the image > being externally compressed with one of the standard compression algorithms. > > Add support for decompressing the bootm OS image. It is added in common > code as it may also be useful for other images/architectures. > > Signed-off-by: Lucas Stach <l.stach@pengutronix.de> FWIW: Tested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> # RISC-V 64-bit > --- > v2: Add proper error handling if nested bootm fails. > --- > common/bootm.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 93 insertions(+) > > diff --git a/common/bootm.c b/common/bootm.c > index 092116beb94a..f5c0e5184b0a 100644 > --- a/common/bootm.c > +++ b/common/bootm.c > @@ -12,6 +12,7 @@ > #include <environment.h> > #include <linux/stat.h> > #include <magicvar.h> > +#include <uncompress.h> > > static LIST_HEAD(handler_list); > > @@ -808,6 +809,86 @@ err_out: > return ret; > } > > +static int do_bootm_compressed(struct image_data *img_data) > +{ > + struct bootm_data bootm_data = { > + .oftree_file = img_data->oftree_file, > + .initrd_file = img_data->initrd_file, > + .tee_file = img_data->tee_file, > + .verbose = img_data->verbose, > + .verify = img_data->verify, > + .force = img_data->force, > + .dryrun = img_data->dryrun, > + .initrd_address = img_data->initrd_address, > + .os_address = img_data->os_address, > + .os_entry = img_data->os_entry, > + }; > + int from, to, ret; > + char *dstpath; > + > + from = open(img_data->os_file, O_RDONLY); > + if (from < 0) > + return -ENODEV; > + > + dstpath = make_temp("bootm-compressed"); > + if (!dstpath) { > + ret = -ENOMEM; > + goto fail_from; > + } > + > + to = open(dstpath, O_CREAT | O_WRONLY); > + if (to < 0) { > + ret = -ENODEV; > + goto fail_make_temp; > + } > + > + ret = uncompress_fd_to_fd(from, to, uncompress_err_stdout); > + if (ret) > + goto fail_to; > + > + bootm_data.os_file = dstpath; > + ret = bootm_boot(&bootm_data); > + > +fail_to: > + close(to); > + unlink(dstpath); > +fail_make_temp: > + free(dstpath); > +fail_from: > + close(from); > + return ret; > +} > + > +static struct image_handler bzip2_bootm_handler = { > + .name = "BZIP2 compressed file", > + .bootm = do_bootm_compressed, > + .filetype = filetype_bzip2, > +}; > + > +static struct image_handler gzip_bootm_handler = { > + .name = "GZIP compressed file", > + .bootm = do_bootm_compressed, > + .filetype = filetype_gzip, > +}; > + > +static struct image_handler lzo_bootm_handler = { > + .name = "LZO compressed file", > + .bootm = do_bootm_compressed, > + .filetype = filetype_lzo_compressed, > +}; > + > +static struct image_handler lz4_bootm_handler = { > + .name = "LZ4 compressed file", > + .bootm = do_bootm_compressed, > + .filetype = filetype_lz4_compressed, > +}; > + > +static struct image_handler xz_bootm_handler = { > + .name = "XZ compressed file", > + .bootm = do_bootm_compressed, > + .filetype = filetype_xz_compressed, > +}; > + > static int bootm_init(void) > { > globalvar_add_simple("bootm.image", NULL); > @@ -830,6 +911,18 @@ static int bootm_init(void) > globalvar_add_simple_enum("bootm.verify", (unsigned int *)&bootm_verify_mode, > bootm_verify_names, ARRAY_SIZE(bootm_verify_names)); > > + > + if (IS_ENABLED(CONFIG_BZLIB)) > + register_image_handler(&bzip2_bootm_handler); > + if (IS_ENABLED(CONFIG_ZLIB)) > + register_image_handler(&gzip_bootm_handler); > + if (IS_ENABLED(CONFIG_LZO_DECOMPRESS)) > + register_image_handler(&lzo_bootm_handler); > + if (IS_ENABLED(CONFIG_LZ4_DECOMPRESS)) > + register_image_handler(&lz4_bootm_handler); > + if (IS_ENABLED(CONFIG_XZ_DECOMPRESS)) > + register_image_handler(&xz_bootm_handler); > + > return 0; > } > late_initcall(bootm_init); > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer 2021-05-26 9:02 [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer Lucas Stach 2021-05-26 9:02 ` [PATCH v2 2/2] bootm: add support for booting compressed images Lucas Stach @ 2021-05-27 6:50 ` Sascha Hauer 1 sibling, 0 replies; 4+ messages in thread From: Sascha Hauer @ 2021-05-27 6:50 UTC (permalink / raw) To: Lucas Stach; +Cc: barebox On Wed, May 26, 2021 at 11:02:15AM +0200, Lucas Stach wrote: > The decompression algorithms want all of the requested buffer size > to be filled and don't cope with less bytes being returned. > Use read_full to satisfy this requirement. > > Signed-off-by: Lucas Stach <l.stach@pengutronix.de> > --- > lib/uncompress.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) Applied, thanks Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-05-28 7:08 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-05-26 9:02 [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer Lucas Stach 2021-05-26 9:02 ` [PATCH v2 2/2] bootm: add support for booting compressed images Lucas Stach 2021-05-28 7:06 ` Ahmad Fatoum 2021-05-27 6:50 ` [PATCH v2 1/2] uncompress: use read_full to fill decompression buffer Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox