Skip to content

Commit

Permalink
llext: add a test for inter-extension linking
Browse files Browse the repository at this point in the history
This test uses two LLEXT objects: one of them exports a symbol and
the other one calls the exported function.

Signed-off-by: Guennadi Liakhovetski <[email protected]>
  • Loading branch information
lyakh authored and nashif committed Sep 12, 2024
1 parent 697c5fd commit 96852bc
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 1 deletion.
11 changes: 10 additions & 1 deletion tests/subsys/llext/simple/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,16 @@ target_include_directories(app PRIVATE
${ZEPHYR_BASE}/arch/${ARCH}/include
)

set(ext_names hello_world logging relative_jump object syscalls threads_kernel_objects)
set(ext_names
hello_world
logging
relative_jump
object
syscalls
threads_kernel_objects
export_dependent
export_dependency
)

if(CONFIG_ARM)
if(NOT CONFIG_CPU_CORTEX_M0 AND NOT CONFIG_CPU_CORTEX_M0PLUS AND NOT CONFIG_CPU_CORTEX_M1)
Expand Down
15 changes: 15 additions & 0 deletions tests/subsys/llext/simple/src/export_dependency_ext.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright (c) 2024 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/

/* Test exporting symbols, imported by other LLEXTs */

#include <zephyr/llext/symbol.h>

long test_dependency(int a, int b)
{
return (long)a * b;
}
EXPORT_SYMBOL(test_dependency);
24 changes: 24 additions & 0 deletions tests/subsys/llext/simple/src/export_dependent_ext.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright (c) 2024 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/

/* Test importing symbols, exported by other LLEXTs */

#include <zephyr/ztest.h>
#include <zephyr/llext/symbol.h>
#include <zephyr/sys/util.h>

extern long test_dependency(int a, int b);

void test_entry(void)
{
unsigned long half_ptr_bits = sizeof(uintptr_t) * 8 / 2;
unsigned long mask = BIT(half_ptr_bits) - 1;
int a = mask & (uintptr_t)test_entry;
int b = mask & ((uintptr_t)test_entry >> half_ptr_bits);

zassert_equal(test_dependency(a, b), (long)a * b);
}
EXPORT_SYMBOL(test_entry);
39 changes: 39 additions & 0 deletions tests/subsys/llext/simple/src/test_llext_simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,45 @@ static LLEXT_CONST uint8_t multi_file_ext[] ELF_ALIGN = {
LLEXT_LOAD_UNLOAD(multi_file)
#endif

#ifndef CONFIG_USERSPACE
static LLEXT_CONST uint8_t export_dependent_ext[] ELF_ALIGN = {
#include "export_dependent.inc"
};

static LLEXT_CONST uint8_t export_dependency_ext[] ELF_ALIGN = {
#include "export_dependency.inc"
};

ZTEST(llext, test_inter_ext)
{
const void *dependency_buf = export_dependency_ext;
const void *dependent_buf = export_dependent_ext;
struct llext_buf_loader buf_loader_dependency =
LLEXT_BUF_LOADER(dependency_buf, sizeof(hello_world_ext));
struct llext_buf_loader buf_loader_dependent =
LLEXT_BUF_LOADER(dependent_buf, sizeof(export_dependent_ext));
struct llext_loader *loader_dependency = &buf_loader_dependency.loader;
struct llext_loader *loader_dependent = &buf_loader_dependent.loader;
const struct llext_load_param ldr_parm = LLEXT_LOAD_PARAM_DEFAULT;
struct llext *ext_dependency = NULL, *ext_dependent = NULL;
int ret = llext_load(loader_dependency, "inter_ext_dependency", &ext_dependency, &ldr_parm);

zassert_ok(ret, "dependency load should succeed");

ret = llext_load(loader_dependent, "export_dependent", &ext_dependent, &ldr_parm);

zassert_ok(ret, "dependent load should succeed");

int (*test_entry_fn)() = llext_find_sym(&ext_dependent->exp_tab, "test_entry");

zassert_not_null(test_entry_fn, "test_dependent should be an exported symbol");
test_entry_fn();

llext_unload(&ext_dependent);
llext_unload(&ext_dependency);
}
#endif

#if defined(CONFIG_LLEXT_TYPE_ELF_RELOCATABLE) && defined(CONFIG_XTENSA)
static LLEXT_CONST uint8_t pre_located_ext[] ELF_ALIGN = {
#include "pre_located.inc"
Expand Down

0 comments on commit 96852bc

Please sign in to comment.