Skip to content

Commit 59cbea3

Browse files
committed
llext_manager: refactor: directly pass llext_loader
llext_manager_link() is only interested in the 'llext_loader' part of the 'llext_buf_loader' structure. This patch refactors the code to pass a pointer to the llext_loader directly, making the code more readable. In preparation for the new inspection API, this patch also changes the checks for the buildinfo and mod_manifest pointers to be more explicit. No functional change is intended. Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
1 parent 1d1b1dd commit 59cbea3

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

src/library_manager/llext_manager.c

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ static bool llext_manager_section_detached(const elf_shdr_t *shdr)
238238
return shdr->sh_addr < SOF_MODULE_DRAM_LINK_END;
239239
}
240240

241-
static int llext_manager_link(struct llext_buf_loader *ebl, const char *name,
241+
static int llext_manager_link(struct llext_loader *ldr, const char *name,
242242
struct lib_manager_module *mctx, const void **buildinfo,
243243
const struct sof_man_module_manifest **mod_manifest)
244244
{
@@ -268,54 +268,56 @@ static int llext_manager_link(struct llext_buf_loader *ebl, const char *name,
268268
.section_detached = llext_manager_section_detached,
269269
};
270270

271-
ret = llext_load(&ebl->loader, name, llext, &ldr_parm);
271+
ret = llext_load(ldr, name, llext, &ldr_parm);
272272
if (ret)
273273
return ret;
274274
}
275275

276-
mctx->segment[LIB_MANAGER_TEXT].addr = ebl->loader.sects[LLEXT_MEM_TEXT].sh_addr;
277-
mctx->segment[LIB_MANAGER_TEXT].size = ebl->loader.sects[LLEXT_MEM_TEXT].sh_size;
276+
mctx->segment[LIB_MANAGER_TEXT].addr = ldr->sects[LLEXT_MEM_TEXT].sh_addr;
277+
mctx->segment[LIB_MANAGER_TEXT].size = ldr->sects[LLEXT_MEM_TEXT].sh_size;
278278

279279
tr_dbg(&lib_manager_tr, ".text: start: %#lx size %#x",
280280
mctx->segment[LIB_MANAGER_TEXT].addr,
281281
mctx->segment[LIB_MANAGER_TEXT].size);
282282

283283
/* All read-only data sections */
284284
mctx->segment[LIB_MANAGER_RODATA].addr =
285-
ebl->loader.sects[LLEXT_MEM_RODATA].sh_addr;
286-
mctx->segment[LIB_MANAGER_RODATA].size = ebl->loader.sects[LLEXT_MEM_RODATA].sh_size;
285+
ldr->sects[LLEXT_MEM_RODATA].sh_addr;
286+
mctx->segment[LIB_MANAGER_RODATA].size = ldr->sects[LLEXT_MEM_RODATA].sh_size;
287287

288288
tr_dbg(&lib_manager_tr, ".rodata: start: %#lx size %#x",
289289
mctx->segment[LIB_MANAGER_RODATA].addr,
290290
mctx->segment[LIB_MANAGER_RODATA].size);
291291

292292
/* All writable data sections */
293293
mctx->segment[LIB_MANAGER_DATA].addr =
294-
ebl->loader.sects[LLEXT_MEM_DATA].sh_addr;
295-
mctx->segment[LIB_MANAGER_DATA].size = ebl->loader.sects[LLEXT_MEM_DATA].sh_size;
294+
ldr->sects[LLEXT_MEM_DATA].sh_addr;
295+
mctx->segment[LIB_MANAGER_DATA].size = ldr->sects[LLEXT_MEM_DATA].sh_size;
296296

297297
tr_dbg(&lib_manager_tr, ".data: start: %#lx size %#x",
298298
mctx->segment[LIB_MANAGER_DATA].addr,
299299
mctx->segment[LIB_MANAGER_DATA].size);
300300

301-
mctx->segment[LIB_MANAGER_BSS].addr = ebl->loader.sects[LLEXT_MEM_BSS].sh_addr;
302-
mctx->segment[LIB_MANAGER_BSS].size = ebl->loader.sects[LLEXT_MEM_BSS].sh_size;
301+
mctx->segment[LIB_MANAGER_BSS].addr = ldr->sects[LLEXT_MEM_BSS].sh_addr;
302+
mctx->segment[LIB_MANAGER_BSS].size = ldr->sects[LLEXT_MEM_BSS].sh_size;
303303

304304
tr_dbg(&lib_manager_tr, ".bss: start: %#lx size %#x",
305305
mctx->segment[LIB_MANAGER_BSS].addr,
306306
mctx->segment[LIB_MANAGER_BSS].size);
307307

308-
ssize_t binfo_o = llext_find_section(&ebl->loader, ".mod_buildinfo");
308+
*buildinfo = NULL;
309+
ssize_t binfo_o = llext_find_section(ldr, ".mod_buildinfo");
309310

310311
if (binfo_o >= 0)
311-
*buildinfo = llext_peek(&ebl->loader, binfo_o);
312+
*buildinfo = llext_peek(ldr, binfo_o);
312313

313-
ssize_t mod_o = llext_find_section(&ebl->loader, ".module");
314+
*mod_manifest = NULL;
315+
ssize_t mod_o = llext_find_section(ldr, ".module");
314316

315317
if (mod_o >= 0)
316-
*mod_manifest = llext_peek(&ebl->loader, mod_o);
318+
*mod_manifest = llext_peek(ldr, mod_o);
317319

318-
return binfo_o >= 0 && mod_o >= 0 ? 0 : -EPROTO;
320+
return *buildinfo && *mod_manifest ? 0 : -EPROTO;
319321
}
320322

321323
/* Count "module files" in the library, allocate and initialize memory for their descriptors */
@@ -427,16 +429,16 @@ static int llext_manager_link_single(uint32_t module_id, const struct sof_man_fw
427429
mod_size = ALIGN_UP(mod_array[i].segment[LIB_MANAGER_TEXT].file_offset - mod_offset,
428430
PAGE_SZ);
429431

430-
uintptr_t dram_base = (uintptr_t)desc - SOF_MAN_ELF_TEXT_OFFSET;
431-
struct llext_buf_loader ebl = LLEXT_BUF_LOADER((uint8_t *)dram_base + mod_offset, mod_size);
432+
uint8_t *dram_base = (uint8_t *)desc - SOF_MAN_ELF_TEXT_OFFSET;
433+
struct llext_buf_loader ebl = LLEXT_BUF_LOADER(dram_base + mod_offset, mod_size);
432434

433435
/*
434436
* LLEXT linking is only needed once for all the "drivers" in the
435437
* module. This calls llext_load(), which also takes references to any
436438
* dependencies, sets up sections and retrieves buildinfo and
437439
* mod_manifest
438440
*/
439-
ret = llext_manager_link(&ebl, mod_array[entry_index - inst_idx].name, mctx,
441+
ret = llext_manager_link(&ebl.loader, mod_array[entry_index - inst_idx].name, mctx,
440442
buildinfo, mod_manifest);
441443
if (ret < 0) {
442444
tr_err(&lib_manager_tr, "linking failed: %d", ret);

0 commit comments

Comments
 (0)