/*
 * Copyright (c) 2017 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <tc_util.h>
#include <linker/linker-defs.h>
#include <ztest.h>

struct test_struct {
	int foo;
	int bar;
	char *baz;
};

/* Check that the __kenrnel* macros work properly */
struct test_struct __kernel kernel_data = {1, 2, NULL};
struct test_struct __kernel_bss kernel_bss;
struct test_struct __kernel_noinit kernel_noinit;

/* Real kernel variable, check it is in the right place */
extern volatile u64_t _sys_clock_tick_count;

struct test_struct app_data = {3, 4, NULL};
struct test_struct app_bss;
struct test_struct __noinit app_noinit;

int data_loc(char *start, char *end, void *ptr)
{
	if ((char *)ptr >= start && (char *)ptr < end) {
		return 1;
	}

	printk("Address %p outside range %p - %p\n", ptr, start, end);
	return 0;
}

int app_loc(void *ptr)
{
	return data_loc(__app_ram_start, __app_ram_end, ptr);
}

int kernel_loc(void *ptr)
{
	return data_loc(__kernel_ram_start, __kernel_ram_end, ptr);
}

void test_app_memory(void)
{
	printk("Memory bounds:\n");
	printk("Application  %p - %p\n", __app_ram_start, __app_ram_end);
	printk("Kernel       %p - %p\n", __kernel_ram_start, __kernel_ram_end);

	zassert_true(app_loc(&app_data), "not in app memory");
	zassert_true(app_loc(&app_bss), "not in app memory");
	zassert_true(app_loc(&app_noinit), "not in app memory");

	zassert_true(kernel_loc(&kernel_data), "not in kernel memory");
	zassert_true(kernel_loc(&kernel_bss), "not in kernel memory");
	zassert_true(kernel_loc(&kernel_noinit), "not in kernel memory");

	zassert_true(kernel_loc((void *)&_sys_clock_tick_count),
		     "not in kernel memory");
}

void test_main(void)
{
	ztest_test_suite(app_memory,
			 ztest_unit_test(test_app_memory));

	ztest_run_test_suite(app_memory);
}
