diff --git a/src/library_manager/llext_manager.c b/src/library_manager/llext_manager.c index 8628fbe59b1a..deb76f1c62f5 100644 --- a/src/library_manager/llext_manager.c +++ b/src/library_manager/llext_manager.c @@ -87,11 +87,31 @@ static int llext_manager_load_data_from_storage(const struct llext_loader *ldr, return ret; } + /* DEBUG */ + size_t init_offset = 0; + const elf_shdr_t *shdr; + + /* Need to copy sections within regions individually, offsets may differ */ + for (i = 0, shdr = llext_section_headers(ext); i < llext_section_count(ext); i++, shdr++) { + if ((uintptr_t)shdr->sh_addr < (uintptr_t)vma || + (uintptr_t)shdr->sh_addr >= (uintptr_t)vma + size) + continue; + + if (!init_offset) + init_offset = shdr->sh_offset; + + /* found a section within the region */ + size_t offset = shdr->sh_offset - init_offset; + + tr_info(&lib_manager_tr, "[%i OLD]: %u, %p <- %p, %u", region, i, + (void *)shdr->sh_addr, + (void *)((uint8_t *)ext->mem[region] + offset), shdr->sh_size); + } + llext_get_region_info(ldr, ext, region, NULL, ®ion_addr, NULL); /* Need to copy sections within regions individually, offsets may differ */ for (i = 0; i < llext_section_count(ext); i++) { - const elf_shdr_t *shdr; enum llext_mem s_region = LLEXT_MEM_COUNT; size_t s_offset = 0; @@ -100,6 +120,10 @@ static int llext_manager_load_data_from_storage(const struct llext_loader *ldr, if (s_region != region) continue; + tr_info(&lib_manager_tr, "[%i NEW]: %u, %p <- %p, %u", region, i, + (void *)shdr->sh_addr, + (void *)((uint8_t *)region_addr + s_offset), shdr->sh_size); + ret = memcpy_s((__sparse_force void *)shdr->sh_addr, size - s_offset, (const uint8_t *)region_addr + s_offset, shdr->sh_size); if (ret < 0) @@ -248,6 +272,8 @@ static int llext_manager_link(const char *name, const elf_shdr_t *hdr; int ret; + tr_info(&lib_manager_tr, "%s: reloc %i mapped %i", name, !*llext, mctx->mapped); + if (*llext && !mctx->mapped) { /* * All module instances have been terminated, so we freed SRAM, @@ -282,27 +308,27 @@ static int llext_manager_link(const char *name, mctx->segment[LIB_MANAGER_TEXT].addr = hdr->sh_addr; mctx->segment[LIB_MANAGER_TEXT].size = hdr->sh_size; - tr_dbg(&lib_manager_tr, ".text: start: %#lx size %#x", - mctx->segment[LIB_MANAGER_TEXT].addr, - mctx->segment[LIB_MANAGER_TEXT].size); + tr_info(&lib_manager_tr, ".text: start: %#lx size %#x", + mctx->segment[LIB_MANAGER_TEXT].addr, + mctx->segment[LIB_MANAGER_TEXT].size); /* All read-only data sections */ llext_get_region_info(ldr, *llext, LLEXT_MEM_RODATA, &hdr, NULL, NULL); mctx->segment[LIB_MANAGER_RODATA].addr = hdr->sh_addr; mctx->segment[LIB_MANAGER_RODATA].size = hdr->sh_size; - tr_dbg(&lib_manager_tr, ".rodata: start: %#lx size %#x", - mctx->segment[LIB_MANAGER_RODATA].addr, - mctx->segment[LIB_MANAGER_RODATA].size); + tr_info(&lib_manager_tr, ".rodata: start: %#lx size %#x", + mctx->segment[LIB_MANAGER_RODATA].addr, + mctx->segment[LIB_MANAGER_RODATA].size); /* All writable data sections */ llext_get_region_info(ldr, *llext, LLEXT_MEM_DATA, &hdr, NULL, NULL); mctx->segment[LIB_MANAGER_DATA].addr = hdr->sh_addr; mctx->segment[LIB_MANAGER_DATA].size = hdr->sh_size; - tr_dbg(&lib_manager_tr, ".data: start: %#lx size %#x", - mctx->segment[LIB_MANAGER_DATA].addr, - mctx->segment[LIB_MANAGER_DATA].size); + tr_info(&lib_manager_tr, ".data: start: %#lx size %#x", + mctx->segment[LIB_MANAGER_DATA].addr, + mctx->segment[LIB_MANAGER_DATA].size); /* Writable uninitialized data section */ llext_get_region_info(ldr, *llext, LLEXT_MEM_BSS, &hdr, NULL, NULL); @@ -640,6 +666,9 @@ int llext_manager_free_module(const uint32_t component_id) */ int ret = llext_unload(&mctx->llext); + tr_info(&lib_manager_tr, + "mod_id: %#x: llext_unload(): %d", + component_id, ret); if (ret <= 0) { tr_err(&lib_manager_tr, "mod_id: %#x: invalid return code from llext_unload(): %d",