From 54691e38b7f99574a1c42af159e22ed1b0bde858 Mon Sep 17 00:00:00 2001 From: Luca Burelli Date: Tue, 11 Feb 2025 17:39:42 +0100 Subject: [PATCH] [TMP] add debugging code Add debugging code for comparing memory copy operations between previous and current situations. Signed-off-by: Luca Burelli --- src/library_manager/lib_manager.c | 1 + src/library_manager/llext_manager.c | 46 ++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/library_manager/lib_manager.c b/src/library_manager/lib_manager.c index c4e4d03cc19f..411328b01e80 100644 --- a/src/library_manager/lib_manager.c +++ b/src/library_manager/lib_manager.c @@ -562,6 +562,7 @@ static void lib_manager_module_free(struct comp_dev *dev) if (mod->priv.llext) { ret = llext_unload(&mod->priv.llext); + tr_info(&lib_manager_tr, "llext_unload(): %i", ret); } if (!ret) { /* Free module resources allocated in L2 memory. */ diff --git a/src/library_manager/llext_manager.c b/src/library_manager/llext_manager.c index 9ae8122cef23..bb49bdd3b169 100644 --- a/src/library_manager/llext_manager.c +++ b/src/library_manager/llext_manager.c @@ -86,11 +86,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; @@ -99,6 +119,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) @@ -240,6 +264,8 @@ static int llext_manager_link(struct llext_loader *ldr, const char *name, const void **buildinfo, const struct sof_man_module_manifest **mod_manifest) { + tr_info(&lib_manager_tr, "reloc %i", !mctx->segment[LIB_MANAGER_TEXT].size); + /* Identify if this is the first time loading this module */ struct llext_load_param ldr_parm = { .relocate_local = !mctx->segment[LIB_MANAGER_TEXT].size, @@ -259,27 +285,27 @@ static int llext_manager_link(struct llext_loader *ldr, 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); *buildinfo = NULL; ret = llext_section_shndx(ldr, *llext, ".mod_buildinfo");