| /* |
| * Copyright (c) 2012-2014 Wind River Systems, Inc. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <zephyr/sys/printk.h> |
| #include <zephyr/ztest.h> |
| |
| #include "test_lib.h" |
| |
| /* |
| * These values will typically be placed in the appropriate sections, but may be moved around |
| * by the compiler; for instance var_sram2_data might end up in .rodata if the compiler can prove |
| * that it's never modified. To prevent that, we explicitly specify sections. |
| */ |
| __in_section(data, sram2, var) uint32_t var_sram2_data = 10U; |
| __in_section(bss, sram2, var) uint32_t var_sram2_bss; |
| K_SEM_DEFINE(test, 0, 1); |
| __in_section(rodata, sram2, var) const uint32_t var_sram2_rodata = 100U; |
| |
| __in_section(custom_section, static, var) uint32_t var_custom_data = 1U; |
| |
| extern void function_in_sram(int32_t value); |
| void function_in_custom_section(void); |
| |
| #define HAS_SRAM2_DATA_SECTION (CONFIG_ARM) |
| |
| ZTEST(code_relocation, test_function_in_sram2) |
| { |
| extern uintptr_t __sram2_text_start; |
| extern uintptr_t __sram2_text_end; |
| extern uintptr_t __sram2_data_start; |
| extern uintptr_t __sram2_data_end; |
| extern uintptr_t __sram2_bss_start; |
| extern uintptr_t __sram2_bss_end; |
| extern uintptr_t __sram2_rodata_start; |
| extern uintptr_t __sram2_rodata_end; |
| extern uintptr_t __custom_section_start; |
| extern uintptr_t __custom_section_end; |
| |
| /* Print values from sram2 */ |
| printk("Address of var_sram2_data %p\n", &var_sram2_data); |
| printk("Address of k_sem_give %p\n", &k_sem_give); |
| printk("Address of var_sram2_rodata %p\n", &var_sram2_rodata); |
| printk("Address of var_sram2_bss %p\n\n", &var_sram2_bss); |
| |
| zassert_between_inclusive((uintptr_t)&var_sram2_data, |
| (uintptr_t)&__sram2_data_start, |
| (uintptr_t)&__sram2_data_end, |
| "var_sram2_data not in sram2 region"); |
| zassert_between_inclusive((uintptr_t)&k_sem_give, |
| (uintptr_t)&__sram2_text_start, |
| (uintptr_t)&__sram2_text_end, |
| "k_sem_give not in sram_text region"); |
| zassert_between_inclusive((uintptr_t)&var_sram2_rodata, |
| (uintptr_t)&__sram2_rodata_start, |
| (uintptr_t)&__sram2_rodata_end, |
| "var_sram2_rodata not in sram2_rodata region"); |
| zassert_between_inclusive((uintptr_t)&var_sram2_bss, |
| (uintptr_t)&__sram2_bss_start, |
| (uintptr_t)&__sram2_bss_end, |
| "var_sram2_bss not in sram2_bss region"); |
| |
| /* Print values from sram */ |
| function_in_sram(var_sram2_data); |
| /* Call library function */ |
| relocated_library(); |
| |
| /* Print values which were placed using attributes */ |
| printk("Address of custom_section, func placed using attributes %p\n", |
| &function_in_custom_section); |
| printk("Address of custom_section data placed using attributes %p\n\n", |
| &var_custom_data); |
| zassert_between_inclusive((uintptr_t)&function_in_custom_section, |
| (uintptr_t)&__custom_section_start, |
| (uintptr_t)&__custom_section_end, |
| "function_in_custom_section not in custom_section region"); |
| zassert_between_inclusive((uintptr_t)&var_custom_data, |
| (uintptr_t)&__custom_section_start, |
| (uintptr_t)&__custom_section_end, |
| "var_custom_data not in custom_section region"); |
| |
| k_sem_give(&test); |
| } |
| |
| __in_section(custom_section, static, fun) void function_in_custom_section(void) |
| { |
| } |