1 /* Copyright 2019 SiFive, Inc */
2 /* SPDX-License-Identifier: Apache-2.0 */
4 #ifndef METAL__PRIVILEGE_H
5 #define METAL__PRIVILEGE_H
8 * @file metal/privilege.h
10 * @brief API for manipulating the privilege mode of a RISC-V system
12 * Additional information about privilege modes on RISC-V systems can be found
13 * by reading the RISC-V Privileged Architecture Specification v1.10.
18 enum metal_privilege_mode {
19 METAL_PRIVILEGE_USER = 0,
20 METAL_PRIVILEGE_SUPERVISOR = 1,
21 METAL_PRIVELEGE_MACHINE = 3,
24 #if __riscv_xlen == 32
25 typedef uint32_t metal_xreg_t;
26 #elif __riscv_xlen == 64
27 typedef uint64_t metal_xreg_t;
30 #if __riscv_flen == 32
31 typedef uint32_t metal_freg_t;
32 #elif __riscv_flen == 64
33 typedef uint64_t metal_freg_t;
36 struct metal_register_file {
74 #endif /* __riscv_32e */
113 #endif /* __riscv_flen */
116 typedef void (*metal_privilege_entry_point_t)();
118 void metal_privilege_drop_to_mode(enum metal_privilege_mode mode,
119 struct metal_register_file regfile,
120 metal_privilege_entry_point_t entry_point);