/* Copyright 2019 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */

#ifndef METAL__PRIVILEGE_H
#define METAL__PRIVILEGE_H

/*!
 * @file metal/privilege.h
 *
 * @brief API for manipulating the privilege mode of a RISC-V system
 *
 * Additional information about privilege modes on RISC-V systems can be found
 * by reading the RISC-V Privileged Architecture Specification v1.10.
 */

#include <stdint.h>

enum metal_privilege_mode {
	METAL_PRIVILEGE_USER = 0,
	METAL_PRIVILEGE_SUPERVISOR = 1,
	METAL_PRIVELEGE_MACHINE = 3,
};

#if __riscv_xlen == 32
typedef uint32_t metal_xreg_t;
#elif __riscv_xlen == 64
typedef uint64_t metal_xreg_t;
#endif

#if __riscv_flen == 32
typedef uint32_t metal_freg_t;
#elif __riscv_flen == 64
typedef uint64_t metal_freg_t;
#endif

struct metal_register_file {
	metal_xreg_t ra;
	metal_xreg_t sp;
	metal_xreg_t gp;
	metal_xreg_t tp;

	metal_xreg_t t0;
	metal_xreg_t t1;
	metal_xreg_t t2;

	metal_xreg_t s0;
	metal_xreg_t s1;

	metal_xreg_t a0;
	metal_xreg_t a1;
	metal_xreg_t a2;
	metal_xreg_t a3;
	metal_xreg_t a4;
	metal_xreg_t a5;
#ifndef __riscv_32e
	metal_xreg_t a6;
	metal_xreg_t a7;

	metal_xreg_t s2;
	metal_xreg_t s3;
	metal_xreg_t s4;
	metal_xreg_t s5;
	metal_xreg_t s6;
	metal_xreg_t s7;
	metal_xreg_t s8;
	metal_xreg_t s9;
	metal_xreg_t s10;
	metal_xreg_t s11;

	metal_xreg_t t3;
	metal_xreg_t t4;
	metal_xreg_t t5;
	metal_xreg_t t6;
#endif /* __riscv_32e */

#ifdef __riscv_flen
	metal_freg_t ft0;
	metal_freg_t ft1;
	metal_freg_t ft2;
	metal_freg_t ft3;
	metal_freg_t ft4;
	metal_freg_t ft5;
	metal_freg_t ft6;
	metal_freg_t ft7;

	metal_freg_t fs0;
	metal_freg_t fs1;

	metal_freg_t fa0;
	metal_freg_t fa1;
	metal_freg_t fa2;
	metal_freg_t fa3;
	metal_freg_t fa4;
	metal_freg_t fa5;
	metal_freg_t fa6;
	metal_freg_t fa7;

	metal_freg_t fs2;
	metal_freg_t fs3;
	metal_freg_t fs4;
	metal_freg_t fs5;
	metal_freg_t fs6;
	metal_freg_t fs7;
	metal_freg_t fs8;
	metal_freg_t fs9;
	metal_freg_t fs10;
	metal_freg_t fs11;

	metal_freg_t ft8;
	metal_freg_t ft9;
	metal_freg_t ft10;
	metal_freg_t ft11;
#endif /* __riscv_flen */
};

typedef void (*metal_privilege_entry_point_t)();

void metal_privilege_drop_to_mode(enum metal_privilege_mode mode,
				  struct metal_register_file regfile,
				  metal_privilege_entry_point_t entry_point);

#endif
