Skip to content

Commit

Permalink
[WIP] llext: test running in IMR
Browse files Browse the repository at this point in the history
A simple test to test minimal code as running in IMR. Some pointer
loading and function calling is working already, but some issues
remain. Also note, that we don't support FLIX instructions yet,
this has been tested with -mno-generate-flix.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
  • Loading branch information
lyakh committed Sep 27, 2024
1 parent 1fa751a commit 0d8c56f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
31 changes: 30 additions & 1 deletion src/audio/drc/drc.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,27 @@ static void drc_params(struct processing_module *mod)
}
#endif /* CONFIG_IPC_MAJOR_4 */

void *my_addr(void);

void *drc_who_called(void)
{
return my_addr();
//return __builtin_return_address(0);
}
void sof_addr_assign(const void *src, const void **tgt);

__attribute__((section(".text.imr")))
int drc_test_imr(struct processing_module *mod, void **addr, void **addr2)
{
void *(*fn)(void) = my_addr;

*addr = drc_who_called();
*addr2 = fn();
comp_info(mod->dev, "%p", *addr);

return mod->period_bytes;
}

static int drc_prepare(struct processing_module *mod,
struct sof_source **sources, int num_of_sources,
struct sof_sink **sinks, int num_of_sinks)
Expand All @@ -322,7 +343,15 @@ static int drc_prepare(struct processing_module *mod,
int rate;
int ret;

comp_info(dev, "drc_prepare()");
const int (*fptr)(struct processing_module *mod, void **addr, void **addr2);
const void *pfptr;
void *addr = drc_test_imr, *addr2 = NULL;

sof_addr_assign(drc_test_imr, &pfptr);
fptr = pfptr;
comp_info(dev, "IMR test %p %p", (void *)addr, (void *)fptr);
ret = fptr(mod, &addr, &addr2);
comp_info(dev, "IMR test %p: %d, %p %p", fptr, ret, addr, addr2);

#if CONFIG_IPC_MAJOR_4
drc_params(mod);
Expand Down
18 changes: 18 additions & 0 deletions src/library_manager/llext_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#include <rtos/sof.h>
#include <rtos/spinlock.h>
#include <rtos/symbol.h>
#include <sof/lib/cpu-clk-manager.h>
#include <sof/lib_manager.h>
#include <sof/llext_manager.h>
Expand Down Expand Up @@ -381,3 +382,20 @@ bool comp_is_llext(struct comp_dev *comp)

return mod && module_is_llext(mod);
}

void *my_addr(void)
{
uintptr_t reta;

__asm__ __volatile__("mov %0, a0" : "=r"(reta));
tr_info(&lib_manager_tr, "caller %#lx", reta);

return __builtin_return_address(0);
}
EXPORT_SYMBOL(my_addr);

void sof_addr_assign(const void *src, const void **tgt)
{
*tgt = src;
}
EXPORT_SYMBOL(sof_addr_assign);

0 comments on commit 0d8c56f

Please sign in to comment.