From f6c2bca09431a5c95b2b08bedf34990347baae6d Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski <q3k@q3k.org> Date: Sat, 27 Jul 2019 14:17:30 +0200 Subject: [PATCH] l0der: support more alignment options --- epicardium/l0der/l0der.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/epicardium/l0der/l0der.c b/epicardium/l0der/l0der.c index 13f86cde..37e029ab 100644 --- a/epicardium/l0der/l0der.c +++ b/epicardium/l0der/l0der.c @@ -33,6 +33,8 @@ struct _pie_load_info { // Addresses within ELF file. uint32_t image_start; uint32_t image_limit; + // Highest alignment request for a segment. + uint32_t strictest_alignment; /// Populated by _get_load_addr // Load address of ELF file. @@ -259,6 +261,12 @@ static int _get_load_addr(struct _pie_load_info *li) li->image_load_start = li->load_address + li->image_start; li->image_load_limit = li->load_address + li->image_limit; + // Ensure within alignment requests. + if ((li->load_address % li->strictest_alignment) != 0) { + LOG_ERR("l0der", "_get_load_addr: too strict alignment request for %ld bytes", li->strictest_alignment); + return -ENOEXEC; + } + // Place stack at top of core1 memory range. li->stack_top = core1_mem_limit; @@ -378,7 +386,7 @@ static int _run_relocations(FIL *fp, struct _pie_load_info *li, Elf32_Ehdr *hdr) static int _load_pie(FIL *fp, Elf32_Ehdr *hdr, struct l0dable_info *info) { int res; - struct _pie_load_info li; + struct _pie_load_info li = {0}; // First pass over program headers: sanity check sizes and calculate // memory image bounds. l0der currently only supports loading the image into @@ -410,10 +418,13 @@ static int _load_pie(FIL *fp, Elf32_Ehdr *hdr, struct l0dable_info *info) if (phdr.p_type == PT_LOAD) { // Check alignment request. - if (phdr.p_align > 4) { + if ((phdr.p_vaddr % phdr.p_align) != 0) { LOG_ERR("l0der", "_load_pie: phdr %d alignment too strict", i); return -ENOEXEC; } + if (phdr.p_align > li.strictest_alignment) { + li.strictest_alignment = phdr.p_align; + } uint32_t mem_start = phdr.p_vaddr; uint32_t mem_limit = phdr.p_vaddr + phdr.p_memsz; -- GitLab