[U-Boot] [RFC PATCH] Speed up kernel decompression
Matthias Weisser
weisserm at arcor.de
Wed Jan 19 15:54:56 CET 2011
This patch is not intended to go into mainline! It is just a RFC.
Situation:
Booting a LZO compressed legacy image containing an ELF (so, no linux) from
flash takes about 1.6 seconds after issuing the bootm command to jumping to the
elfs entry point when the patch regarding section copying I send earlier is
applied. I felt that this could be optimized a bit.
Approach:
As the image is read twice from flash (CRC checking and decompressing) I tried
to get it reduced to only reading the image once from flash. Please see the
patch.
Results:
Copy from flash CRCing LZO Decompression | Total
HEAD - 254ms 1600ms | 1854ms
hacked 226ms 100ms 880ms | 1206ms
600ms are about 15% of the total boot time in our system.
Problems:
You need a quite big malloc pool.
I found no easy way to free the allocated image memory after decompression.
Signed-off-by: Matthias Weisser <weisserm at arcor.de>
---
common/cmd_bootm.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 18019d6..0684bc0 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -722,6 +722,7 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
static image_header_t *image_get_kernel (ulong img_addr, int verify)
{
image_header_t *hdr = (image_header_t *)img_addr;
+ void *img_copy_ram;
if (!image_check_magic(hdr)) {
puts ("Bad Magic Number\n");
@@ -739,6 +740,12 @@ static image_header_t *image_get_kernel (ulong img_addr, int verify)
show_boot_progress (3);
image_print_contents (hdr);
+ img_copy_ram = malloc(image_get_image_size(hdr));
+ if (img_copy_ram != NULL) {
+ memcpy(img_copy_ram, hdr, image_get_image_size(hdr));
+ hdr = img_copy_ram;
+ }
+
if (verify) {
puts (" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) {
--
1.7.0.4
More information about the U-Boot
mailing list