/*
 * 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)
{
}
