@@ -239,11 +239,12 @@ static bool llext_manager_section_detached(const elf_shdr_t *shdr)
239
239
return shdr -> sh_addr < SOF_MODULE_DRAM_LINK_END ;
240
240
}
241
241
242
- static int llext_manager_link (struct llext_loader * ldr , const char * name ,
242
+ static int llext_manager_link (const char * name ,
243
243
struct lib_manager_module * mctx , const void * * buildinfo ,
244
244
const struct sof_man_module_manifest * * mod_manifest )
245
245
{
246
246
struct llext * * llext = & mctx -> llext ;
247
+ struct llext_loader * ldr = & mctx -> ebl -> loader ;
247
248
int ret ;
248
249
249
250
if (* llext && !mctx -> mapped ) {
@@ -353,6 +354,7 @@ static int llext_manager_mod_init(struct lib_manager_mod_ctx *ctx,
353
354
offs = mod_array [i ].segment [LIB_MANAGER_TEXT ].file_offset ;
354
355
ctx -> mod [n_mod ].mapped = false;
355
356
ctx -> mod [n_mod ].llext = NULL ;
357
+ ctx -> mod [n_mod ].ebl = NULL ;
356
358
ctx -> mod [n_mod ++ ].start_idx = i ;
357
359
}
358
360
@@ -431,15 +433,30 @@ static int llext_manager_link_single(uint32_t module_id, const struct sof_man_fw
431
433
PAGE_SZ );
432
434
433
435
uintptr_t dram_base = (uintptr_t )desc - SOF_MAN_ELF_TEXT_OFFSET ;
434
- struct llext_buf_loader ebl = LLEXT_BUF_LOADER ((uint8_t * )dram_base + mod_offset , mod_size );
436
+
437
+ if (!mctx -> ebl ) {
438
+ /* allocate once, never freed */
439
+ mctx -> ebl = rmalloc (SOF_MEM_ZONE_RUNTIME_SHARED , 0 , SOF_MEM_CAPS_RAM ,
440
+ sizeof (struct llext_buf_loader ));
441
+ if (!mctx -> ebl ) {
442
+ tr_err (& lib_manager_tr , "loader alloc failed" );
443
+ return 0 ;
444
+ }
445
+
446
+ /* initialize via a temporary */
447
+ struct llext_buf_loader tmp_ebl = LLEXT_BUF_LOADER ((uint8_t * )dram_base +
448
+ mod_offset , mod_size );
449
+
450
+ * mctx -> ebl = tmp_ebl ;
451
+ }
435
452
436
453
/*
437
454
* LLEXT linking is only needed once for all the "drivers" in the
438
455
* module. This calls llext_load(), which also takes references to any
439
456
* dependencies, sets up sections and retrieves buildinfo and
440
457
* mod_manifest
441
458
*/
442
- ret = llext_manager_link (& ebl . loader , mod_array [entry_index - inst_idx ].name , mctx ,
459
+ ret = llext_manager_link (mod_array [entry_index - inst_idx ].name , mctx ,
443
460
buildinfo , mod_manifest );
444
461
if (ret < 0 ) {
445
462
tr_err (& lib_manager_tr , "linking failed: %d" , ret );
0 commit comments