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

/**
 * @file
 * @brief Per-arch thread definition
 *
 * This file contains definitions for
 *
 *  struct _thread_arch
 *  struct _callee_saved
 *
 * necessary to instantiate instances of struct k_thread.
 */

#ifndef ZEPHYR_ARCH_RISCV32_INCLUDE_KERNEL_ARCH_THREAD_H_
#define ZEPHYR_ARCH_RISCV32_INCLUDE_KERNEL_ARCH_THREAD_H_

#ifndef _ASMLANGUAGE
#include <zephyr/types.h>

/*
 * The following structure defines the list of registers that need to be
 * saved/restored when a cooperative context switch occurs.
 */
struct _callee_saved {
	u32_t sp;       /* Stack pointer, (x2 register) */

	u32_t s0;       /* saved register/frame pointer */
	u32_t s1;       /* saved register */
	u32_t s2;       /* saved register */
	u32_t s3;       /* saved register */
	u32_t s4;       /* saved register */
	u32_t s5;       /* saved register */
	u32_t s6;       /* saved register */
	u32_t s7;       /* saved register */
	u32_t s8;       /* saved register */
	u32_t s9;       /* saved register */
	u32_t s10;      /* saved register */
	u32_t s11;      /* saved register */
};
typedef struct _callee_saved _callee_saved_t;

struct _thread_arch {
	u32_t swap_return_value; /* Return value of z_swap() */
};

typedef struct _thread_arch _thread_arch_t;

#endif /* _ASMLANGUAGE */

#endif /* ZEPHYR_ARCH_RISCV32_INCLUDE_KERNEL_ARCH_THREAD_H_ */

