Skip to content

Commit

Permalink
llext: add test for section and symbol alignment
Browse files Browse the repository at this point in the history
Add a test case for the alignment support in loadable extensions. This
test case creates a set of constants with specific alignment requirements
and verifies that they are placed in memory as expected.

Fix the detached section test to use a more standard syntax for the
section attribute, avoiding issues with different toolchains.

Signed-off-by: Luca Burelli <l.burelli@arduino.cc>
  • Loading branch information
pillo79 committed Feb 6, 2025
1 parent bcd257f commit f2d631a
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 1 deletion.
1 change: 1 addition & 0 deletions tests/subsys/llext/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ set(ext_names
threads_kernel_objects
export_dependent
export_dependency
align
)

if(CONFIG_ARM)
Expand Down
72 changes: 72 additions & 0 deletions tests/subsys/llext/src/align_ext.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright (c) 2025 Arduino SA
*
* SPDX-License-Identifier: Apache-2.0
*/

/*
* Define symbols with different alignment requirements and verify that LLEXT
* correctly handles them by testing the runtime address and the contents of
* each defined symbol.
*/

#include <stdint.h>
#include <zephyr/kernel.h>
#include <zephyr/llext/symbol.h>
#include <zephyr/ztest_assert.h>

/*
* Create constants requesting a specific alignment in memory and with a value
* that is related but not equal to their alignment requirement.
*/
#define ALIGNED_ENTRY(name, n) \
const int name ## _ ## n __aligned(n) = n / 2 + 1

ALIGNED_ENTRY(common, 8);
ALIGNED_ENTRY(common, 16);
ALIGNED_ENTRY(common, 32);
ALIGNED_ENTRY(common, 64);
ALIGNED_ENTRY(common, 128);
ALIGNED_ENTRY(common, 256);
ALIGNED_ENTRY(common, 512);

/*
* Create similar constants in a set of independent sections to test merging.
*/
#define ALIGNED_SECT_ENTRY(name, n) \
Z_GENERIC_SECTION(name ## _sect_ ## n) ALIGNED_ENTRY(name, n)

ALIGNED_SECT_ENTRY(independent, 8);
ALIGNED_SECT_ENTRY(independent, 16);
ALIGNED_SECT_ENTRY(independent, 32);
ALIGNED_SECT_ENTRY(independent, 64);
ALIGNED_SECT_ENTRY(independent, 128);
ALIGNED_SECT_ENTRY(independent, 256);
ALIGNED_SECT_ENTRY(independent, 512);

/*
* Test that each symbol matches its expected value and alignment.
*/
#define ASSERT_ENTRY(name, n) \
zassert_equal(name ## _ ## n, n / 2 + 1); \
zassert_true(IS_ALIGNED(&name ## _ ## n, n))

void test_entry(void)
{
ASSERT_ENTRY(common, 8);
ASSERT_ENTRY(common, 16);
ASSERT_ENTRY(common, 32);
ASSERT_ENTRY(common, 64);
ASSERT_ENTRY(common, 128);
ASSERT_ENTRY(common, 256);
ASSERT_ENTRY(common, 512);

ASSERT_ENTRY(independent, 8);
ASSERT_ENTRY(independent, 16);
ASSERT_ENTRY(independent, 32);
ASSERT_ENTRY(independent, 64);
ASSERT_ENTRY(independent, 128);
ASSERT_ENTRY(independent, 256);
ASSERT_ENTRY(independent, 512);
}
EXPORT_SYMBOL(test_entry);
2 changes: 1 addition & 1 deletion tests/subsys/llext/src/detached_fn_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include <zephyr/sys/printk.h>
#include <zephyr/ztest_assert.h>

__section(".detach") void detached_entry(void)
Z_GENERIC_SECTION(.detach) void detached_entry(void)
{
static int data_cnt = -3;
static unsigned int bss_cnt;
Expand Down
5 changes: 5 additions & 0 deletions tests/subsys/llext/src/test_llext.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,11 @@ LLEXT_LOAD_UNLOAD(threads_kernel_objects,
.test_setup = threads_objects_test_setup,
)

static LLEXT_CONST uint8_t align_ext[] ELF_ALIGN = {
#include "align.inc"
};
LLEXT_LOAD_UNLOAD(align)

#ifndef CONFIG_LLEXT_TYPE_ELF_OBJECT
static LLEXT_CONST uint8_t multi_file_ext[] ELF_ALIGN = {
#include "multi_file.inc"
Expand Down

0 comments on commit f2d631a

Please sign in to comment.