/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/zephyr.h>
#include <zephyr/sys/printk.h>
#include <zephyr/ztest.h>

uint32_t var_sram2_data = 10U;
uint32_t var_sram2_bss;
K_SEM_DEFINE(test, 0, 1);
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);

ZTEST(code_relocation, test_function_in_sram2)
{
	extern uint32_t __sram2_text_start;
	extern uint32_t __sram2_text_end;
	extern uint32_t __sram2_data_start;
	extern uint32_t __sram2_data_end;
	extern uint32_t __sram2_bss_start;
	extern uint32_t __sram2_bss_end;
	extern uint32_t __sram2_rodata_start;
	extern uint32_t __sram2_rodata_end;
	extern uint32_t __custom_section_start;
	extern uint32_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((uint32_t)&var_sram2_data,
		(uint32_t)&__sram2_data_start,
		(uint32_t)&__sram2_data_end,
		"var_sram2_data not in sram2 region");
	zassert_between_inclusive((uint32_t)&k_sem_give,
		(uint32_t)&__sram2_text_start,
		(uint32_t)&__sram2_text_end,
		"k_sem_give not in sram_text region");
	zassert_between_inclusive((uint32_t)&var_sram2_rodata,
		(uint32_t)&__sram2_rodata_start,
		(uint32_t)&__sram2_rodata_end,
		"var_sram2_rodata not in sram2_rodata region");
	zassert_between_inclusive((uint32_t)&var_sram2_bss,
		(uint32_t)&__sram2_bss_start,
		(uint32_t)&__sram2_bss_end,
		"var_sram2_bss not in sram2_bss region");

	/* Print values from sram */
	function_in_sram(var_sram2_data);

	/* 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((uint32_t)&function_in_custom_section,
		(uint32_t)&__custom_section_start,
		(uint32_t)&__custom_section_end,
		"function_in_custom_section not in custom_section region");
	zassert_between_inclusive((uint32_t)&var_custom_data,
		(uint32_t)&__custom_section_start,
		(uint32_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)
{
}
