9
0
Fork 0

ARM: start: Fix image size calculation

In barebox_non_pbl_start() we do not run at the address we are linked
at, so we must read linker variables using ld_var(). Since ld_var()
current is not available on arm64 we create two zero sized arrays,
one at the begin of the image and one at the end. The difference
between both is the image size we are looking for.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2017-02-06 11:18:07 +01:00
parent f7165017f4
commit 857f69ba8c
8 changed files with 13 additions and 6 deletions

View File

@ -52,10 +52,10 @@ struct zynq_flash_header __flash_header_section flash_header = {
.enc_stat = 0x0,
.user = 0x0,
.flash_offset = 0x8c0,
.length = barebox_image_size,
.length = (unsigned int)&_barebox_image_size,
.res0 = 0x0,
.start_of_exec = 0x0,
.total_len = barebox_image_size,
.total_len = (unsigned int)&_barebox_image_size,
.res1 = 0x1,
.checksum = 0x0,
.res2 = 0x0,

View File

@ -97,7 +97,7 @@ void __bare_init barebox_arm_reset_vector(void)
debug_led(1, 1);
if (! load_stage2((void*)(ld_var(_text) - 16),
ld_var(_barebox_image_size) + 16)) {
barebox_image_size + 16)) {
debug_led(3, 1);
while (1) { } /* hang */
}

View File

@ -78,3 +78,6 @@ int __pure cpu_architecture(void)
return __cpu_architecture;
}
#endif
char __image_start[0] __attribute__((section(".__image_start")));
char __image_end[0] __attribute__((section(".__image_end")));

View File

@ -179,4 +179,6 @@ static inline unsigned long arm_mem_barebox_image(unsigned long membase,
*/
#define MAX_BSS_SIZE SZ_1M
#define barebox_image_size (__image_end - __image_start)
#endif /* _BAREBOX_ARM_H_ */

View File

@ -30,6 +30,7 @@ SECTIONS
#else
. = TEXT_BASE;
#endif
.image_start : { *(.__image_start) }
#ifndef CONFIG_PBL_IMAGE
PRE_IMAGE
@ -116,6 +117,7 @@ SECTIONS
}
_edata = .;
.image_end : { *(.__image_end) }
. = ALIGN(4);
__bss_start = .;

View File

@ -39,7 +39,6 @@ ld_var_entry __rel_dyn_start
ld_var_entry __rel_dyn_end
ld_var_entry __dynsym_start
ld_var_entry __dynsym_end
ld_var_entry _barebox_image_size
ld_var_entry __bss_start
ld_var_entry __bss_stop
#ifdef __PBL__

View File

@ -614,7 +614,7 @@ void __nand_boot_init s3c24x0_nand_load_image(void *dest, int size, int page)
void __nand_boot_init nand_boot(void)
{
void *dest = _text;
int size = ld_var(_barebox_image_size);
int size = barebox_image_size;
int page = 0;
s3c24x0_nand_load_image(dest, size, page);

View File

@ -6,12 +6,13 @@ extern char __bss_start[], __bss_stop[];
extern char _sdata[], _edata[];
extern char __bare_init_start[], __bare_init_end[];
extern char _end[];
extern char __image_start[];
extern char __image_end[];
extern void *_barebox_image_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 (__image_end - __image_start)
#define barebox_bare_init_size (unsigned int)&_barebox_bare_init_size
#define barebox_pbl_size (unsigned int)&_barebox_pbl_size