Add compressed image support
This allows for creating a lzo compressed binary unsing the pbl. Only copy the piggydata if needed. Add CONFIG_PBL_FORCE_PIGGYDATA_COPY option In some case we need to copy the PIGGYDATA as the link address as example we run from SRAM and shutdown the SDRAM/DDR for reconfiguration but most of the time we just need to copy the executable code. based on Sascha Hauer Add compressed image support Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
This commit is contained in:
parent
53391b5a8d
commit
5c3db111da
|
@ -33,8 +33,33 @@ void __naked __section(.text_head_entry) pbl_start(void)
|
||||||
barebox_arm_head();
|
barebox_arm_head();
|
||||||
}
|
}
|
||||||
|
|
||||||
void barebox_pbl(uint32_t offset)
|
extern void *input_data;
|
||||||
|
extern void *input_data_end;
|
||||||
|
|
||||||
|
#define STATIC static
|
||||||
|
|
||||||
|
#ifdef CONFIG_IMAGE_COMPRESSION_LZO
|
||||||
|
#include "../../../lib/decompress_unlzo.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void barebox_uncompress(void *compressed_start, unsigned int len)
|
||||||
{
|
{
|
||||||
|
void (*barebox)(void);
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_THUMB2_BAREBOX))
|
||||||
|
barebox = (void *)(TEXT_BASE + 1);
|
||||||
|
else
|
||||||
|
barebox = (void *)TEXT_BASE;
|
||||||
|
|
||||||
|
decompress((void *)compressed_start,
|
||||||
|
len,
|
||||||
|
NULL, NULL,
|
||||||
|
(void *)TEXT_BASE, NULL, NULL);
|
||||||
|
|
||||||
|
/* flush I-cache before jumping to the uncompressed binary */
|
||||||
|
__asm__ __volatile__("mcr p15, 0, %0, c7, c5, 0" : : "r" (0));
|
||||||
|
|
||||||
|
barebox();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -44,6 +69,7 @@ void barebox_pbl(uint32_t offset)
|
||||||
void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
|
void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
|
||||||
{
|
{
|
||||||
uint32_t r, addr, offset;
|
uint32_t r, addr, offset;
|
||||||
|
uint32_t pg_start, pg_end, pg_len;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get runtime address of this function. Do not
|
* Get runtime address of this function. Do not
|
||||||
|
@ -58,6 +84,30 @@ void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
|
||||||
/* Get offset between linked address and runtime address */
|
/* Get offset between linked address and runtime address */
|
||||||
offset = (uint32_t)__ll_return - addr;
|
offset = (uint32_t)__ll_return - addr;
|
||||||
|
|
||||||
|
pg_start = (uint32_t)&input_data - offset;
|
||||||
|
pg_end = (uint32_t)&input_data_end - offset;
|
||||||
|
pg_len = pg_end - pg_start;
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_PBL_FORCE_PIGGYDATA_COPY))
|
||||||
|
goto copy_piggy_link;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the piggydata binary will be overwritten
|
||||||
|
* by the uncompressed binary or by the pbl relocation
|
||||||
|
*/
|
||||||
|
if (!offset ||
|
||||||
|
!((pg_start >= TEXT_BASE && pg_start < TEXT_BASE + pg_len * 4) ||
|
||||||
|
((uint32_t)_text >= pg_start && (uint32_t)_text <= pg_end)))
|
||||||
|
goto copy_link;
|
||||||
|
|
||||||
|
copy_piggy_link:
|
||||||
|
/*
|
||||||
|
* copy piggydata binary to its link address
|
||||||
|
*/
|
||||||
|
memcpy(&input_data, (void *)pg_start, pg_len);
|
||||||
|
pg_start = (uint32_t)&input_data;
|
||||||
|
|
||||||
|
copy_link:
|
||||||
/* relocate to link address if necessary */
|
/* relocate to link address if necessary */
|
||||||
if (offset)
|
if (offset)
|
||||||
memcpy((void *)_text, (void *)(_text - offset),
|
memcpy((void *)_text, (void *)(_text - offset),
|
||||||
|
@ -69,12 +119,13 @@ void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
|
||||||
/* flush I-cache before jumping to the copied binary */
|
/* flush I-cache before jumping to the copied binary */
|
||||||
__asm__ __volatile__("mcr p15, 0, %0, c7, c5, 0" : : "r" (0));
|
__asm__ __volatile__("mcr p15, 0, %0, c7, c5, 0" : : "r" (0));
|
||||||
|
|
||||||
r = (unsigned int)&barebox_pbl;
|
r = (unsigned int)&barebox_uncompress;
|
||||||
/* call barebox_uncompress with its absolute address */
|
/* call barebox_uncompress with its absolute address */
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"mov r0, %1\n"
|
"mov r0, %1\n"
|
||||||
|
"mov r1, %2\n"
|
||||||
"mov pc, %0\n"
|
"mov pc, %0\n"
|
||||||
:
|
:
|
||||||
: "r"(r), "r"(offset),
|
: "r"(r), "r"(pg_start), "r"(pg_len)
|
||||||
: "r0");
|
: "r0", "r1");
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,4 +74,5 @@ SECTIONS
|
||||||
__piggydata_end = .;
|
__piggydata_end = .;
|
||||||
|
|
||||||
_barebox_image_size = __piggydata_end - HEAD_TEXT_BASE;
|
_barebox_image_size = __piggydata_end - HEAD_TEXT_BASE;
|
||||||
|
_barebox_pbl_size = __bss_start - HEAD_TEXT_BASE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,11 +111,20 @@ config PBL_IMAGE
|
||||||
bool "Pre-Bootloader image"
|
bool "Pre-Bootloader image"
|
||||||
depends on HAVE_PBL_IMAGE
|
depends on HAVE_PBL_IMAGE
|
||||||
|
|
||||||
|
config PBL_FORCE_PIGGYDATA_COPY
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
In some case we need to copy the PIGGYDATA as the link address
|
||||||
|
as example we run from SRAM and shutdown the SDRAM/DDR for
|
||||||
|
reconfiguration but most of the time we just need to copy the
|
||||||
|
executable code.
|
||||||
|
|
||||||
if PBL_IMAGE
|
if PBL_IMAGE
|
||||||
|
|
||||||
config IMAGE_COMPRESSION
|
config IMAGE_COMPRESSION
|
||||||
bool "Compressed image"
|
bool
|
||||||
depends on HAVE_IMAGE_COMPRESSION
|
depends on HAVE_IMAGE_COMPRESSION
|
||||||
|
default y
|
||||||
|
|
||||||
if IMAGE_COMPRESSION
|
if IMAGE_COMPRESSION
|
||||||
|
|
||||||
|
@ -511,6 +520,7 @@ config DEFAULT_ENVIRONMENT
|
||||||
config DEFAULT_ENVIRONMENT_COMPRESSED
|
config DEFAULT_ENVIRONMENT_COMPRESSED
|
||||||
bool
|
bool
|
||||||
depends on DEFAULT_ENVIRONMENT
|
depends on DEFAULT_ENVIRONMENT
|
||||||
|
depends on !IMAGE_COMPRESSION_LZO
|
||||||
default y if ZLIB
|
default y if ZLIB
|
||||||
default y if BZLIB
|
default y if BZLIB
|
||||||
default y if LZO_DECOMPRESS
|
default y if LZO_DECOMPRESS
|
||||||
|
|
|
@ -7,8 +7,10 @@ extern char __bare_init_start[], __bare_init_end[];
|
||||||
extern char _end[];
|
extern char _end[];
|
||||||
extern void *_barebox_image_size;
|
extern void *_barebox_image_size;
|
||||||
extern void *_barebox_bare_init_size;
|
extern void *_barebox_bare_init_size;
|
||||||
|
extern void *_barebox_pbl_size;
|
||||||
|
|
||||||
#define barebox_image_size (unsigned int)&_barebox_image_size
|
#define barebox_image_size (unsigned int)&_barebox_image_size
|
||||||
#define barebox_bare_init_size (unsigned int)&_barebox_bare_init_size
|
#define barebox_bare_init_size (unsigned int)&_barebox_bare_init_size
|
||||||
|
#define barebox_pbl_size (unsigned int)&_barebox_pbl_size
|
||||||
|
|
||||||
#endif /* _ASM_GENERIC_SECTIONS_H_ */
|
#endif /* _ASM_GENERIC_SECTIONS_H_ */
|
||||||
|
|
Loading…
Reference in New Issue