From 0d8c56fc911fd59d79ef553f84e9b43d798630fa Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 27 Sep 2024 17:45:00 +0200 Subject: [PATCH] [WIP] llext: test running in IMR 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 --- src/audio/drc/drc.c | 31 ++++++++++++++++++++++++++++- src/library_manager/llext_manager.c | 18 +++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/audio/drc/drc.c b/src/audio/drc/drc.c index f02c8ff2a4fe..6838988f7d44 100644 --- a/src/audio/drc/drc.c +++ b/src/audio/drc/drc.c @@ -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) @@ -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); diff --git a/src/library_manager/llext_manager.c b/src/library_manager/llext_manager.c index fba70ffd2491..771978f816c4 100644 --- a/src/library_manager/llext_manager.c +++ b/src/library_manager/llext_manager.c @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -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);