/* main.c - Hello World demo */

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

#include <zephyr.h>
#include <misc/printk.h>

/* size of stack area used by each thread */
#define STACKSIZE 1024

/* scheduling priority used by each thread */
#define PRIORITY 7

/* delay between greetings (in ms) */
#define SLEEPTIME 500

/* Focaccia tastes better than DEEDBEEF ;-) */
#define STACK_GUARD_CANARY 0xF0CACC1A

struct stack_guard_buffer {
	/* Make sure canary is not optimized by the compiler */
	volatile u32_t canary;
	u8_t stack[STACKSIZE];
};

struct stack_guard_buffer buf;

u32_t recursive_loop(u32_t counter)
{
	if (buf.canary != STACK_GUARD_CANARY) {
		printk("Canary = 0x%08x\tTest not passed.\n", buf.canary);

		while (1) {
			k_sleep(SLEEPTIME);
		}
	}

	counter++;

	return recursive_loop(counter) + recursive_loop(counter);
}

/* stack_guard_thread is a dynamic thread */
void stack_guard_thread(void *dummy1, void *dummy2, void *dummy3)
{
	ARG_UNUSED(dummy1);
	ARG_UNUSED(dummy2);
	ARG_UNUSED(dummy3);

	u32_t result = recursive_loop(0);

	/* We will never arrive here */
	printk("Result: %d", result);
}

void main(void)
{
	buf.canary = STACK_GUARD_CANARY;

	printk("MPU STACK GUARD Test\n");
	printk("Canary Initial Value = 0x%x\n", buf.canary);

	/* spawn stack_guard_thread */
	k_thread_spawn(buf.stack, STACKSIZE, stack_guard_thread, NULL, NULL,
		       NULL, PRIORITY, 0, K_NO_WAIT);
}
