blob: 52bd36fe4937529be09987ae00c24c863c53c06c [file]
/*
* 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);