/*
 * Copyright (c) 2016-2020 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Measure time
 *
 */
#include <zephyr/kernel.h>
#include <ksched.h>
#include <zephyr/syscall_handler.h>
#include <zephyr/app_memory/app_memdomain.h>

#include "footprint.h"
#include "userspace.h"

#define STACK_SIZE	512

K_SEM_DEFINE(test_sema, 1, 10);

struct k_thread my_thread_user;

int z_impl_dummy_syscall(void)
{
	return 0;
}

static inline int z_vrfy_dummy_syscall(void)
{
	return 0;
}
#include <syscalls/dummy_syscall_mrsh.c>

int z_impl_validation_overhead_syscall(void)
{
	return 0;
}

static inline int z_vrfy_validation_overhead_syscall(void)
{
	bool status_0 = Z_SYSCALL_OBJ_INIT(&test_sema, K_OBJ_SEM);

	bool status_1 = Z_SYSCALL_OBJ(&test_sema, K_OBJ_SEM);

	return status_0 || status_1;
}
#include <syscalls/validation_overhead_syscall_mrsh.c>


void test_drop_to_user_mode_1(void *p1, void *p2, void *p3)
{
	volatile uint32_t dummy = 100U;

	dummy++;
}

void drop_to_user_mode_thread(void *p1, void *p2, void *p3)
{
	k_thread_user_mode_enter(test_drop_to_user_mode_1, NULL, NULL, NULL);
}

void drop_to_user_mode(void)
{
	k_thread_create(&my_thread_user, my_stack_area_0, STACK_SIZE,
			drop_to_user_mode_thread,
			NULL, NULL, NULL,
			-1, K_INHERIT_PERMS, K_NO_WAIT);

	k_yield();
}

void user_thread_creation(void)
{
	k_thread_create(&my_thread_user, my_stack_area, STACK_SIZE,
			test_drop_to_user_mode_1,
			NULL, NULL, NULL,
			0, K_INHERIT_PERMS | K_USER, K_FOREVER);

	k_thread_abort(&my_thread_user);
}

void syscall_overhead_user_thread(void *p1, void *p2, void *p3)
{
	int val = dummy_syscall();

	val |= 0xFF;
}

void syscall_overhead(void)
{
	k_thread_create(&my_thread_user, my_stack_area_0, STACK_SIZE,
			syscall_overhead_user_thread,
			NULL, NULL, NULL,
			-1, K_INHERIT_PERMS | K_USER, K_NO_WAIT);
}

void validation_overhead_user_thread(void *p1, void *p2, void *p3)
{
	/* get validation numbers */
	validation_overhead_syscall();
}

void validation_overhead(void)
{
	k_thread_access_grant(k_current_get(), &test_sema);

	k_thread_create(&my_thread_user, my_stack_area, STACK_SIZE,
			validation_overhead_user_thread,
			NULL, NULL, NULL,
			-1 /*priority*/, K_INHERIT_PERMS | K_USER, K_NO_WAIT);
}

void run_userspace(void)
{
	k_mem_domain_add_thread(&footprint_mem_domain, k_current_get());

	drop_to_user_mode();

	user_thread_creation();

	syscall_overhead();

	validation_overhead();

}
