summaryrefslogtreecommitdiffstats
path: root/common/elf.c
diff options
context:
space:
mode:
authorDenis Orlov <denorl2009@gmail.com>2023-03-15 13:11:26 +0300
committerSascha Hauer <s.hauer@pengutronix.de>2023-03-16 10:50:55 +0100
commit9c432ede2cb016b2a98902a8b3aa1f8f26f29ee4 (patch)
tree965652792ecbc6831bf943a35f9edfe526acb752 /common/elf.c
parent6b2232b64f0e33ff21e36d87dd94bcf39dc17b01 (diff)
downloadbarebox-9c432ede2cb016b2a98902a8b3aa1f8f26f29ee4.tar.gz
barebox-9c432ede2cb016b2a98902a8b3aa1f8f26f29ee4.tar.xz
common: elf: use proper field to get segment memory size
For a program header, the value of 'p_filesz' may be less than the one of 'p_memsz', in which case the leftover amount of space should be filled with zeroes. This is done correctly when loading elf to memory. However, when we are requesting memory beforehand we do pass the value of 'p_filesz', instead of 'p_memsz', to 'request_sdram_region', resulting in potentially smaller amount of memory to be reserved. As 'p_memsz' is always greater or equal to 'p_filesz', use only the former for checking memory requirements in 'request_elf_segment'. Signed-off-by: Denis Orlov <denorl2009@gmail.com> Link: https://lore.barebox.org/20230315101126.4101087-1-denorl2009@gmail.com Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/elf.c')
-rw-r--r--common/elf.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/common/elf.c b/common/elf.c
index eec62cad61..c9b3d7bb37 100644
--- a/common/elf.c
+++ b/common/elf.c
@@ -59,14 +59,13 @@ static int request_elf_segment(struct elf_image *elf, void *phdr)
{
void *dst = (void *) (phys_addr_t) elf_phdr_p_paddr(elf, phdr);
int ret;
- u64 p_filesz = elf_phdr_p_filesz(elf, phdr);
u64 p_memsz = elf_phdr_p_memsz(elf, phdr);
/* we care only about PT_LOAD segments */
if (elf_phdr_p_type(elf, phdr) != PT_LOAD)
return 0;
- if (!p_filesz)
+ if (!p_memsz)
return 0;
if (dst < elf->low_addr)
@@ -74,9 +73,9 @@ static int request_elf_segment(struct elf_image *elf, void *phdr)
if (dst + p_memsz > elf->high_addr)
elf->high_addr = dst + p_memsz;
- pr_debug("Requesting segment 0x%p (%llu bytes)\n", dst, p_filesz);
+ pr_debug("Requesting segment 0x%p (%llu bytes)\n", dst, p_memsz);
- ret = elf_request_region(elf, (resource_size_t)dst, p_filesz, phdr);
+ ret = elf_request_region(elf, (resource_size_t)dst, p_memsz, phdr);
if (ret)
return ret;