]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_FreedomStudio/freedom-metal/metal/privilege.h
Update RISCC-V-RV32-SiFive_HiFive1_FreedomStudio project to latest tools and metal...
[freertos] / FreeRTOS / Demo / RISC-V_RV32_SiFive_HiFive1_FreedomStudio / freedom-metal / metal / privilege.h
1 /* Copyright 2019 SiFive, Inc */
2 /* SPDX-License-Identifier: Apache-2.0 */
3
4 #ifndef METAL__PRIVILEGE_H
5 #define METAL__PRIVILEGE_H
6
7 /*!
8  * @file metal/privilege.h
9  *
10  * @brief API for manipulating the privilege mode of a RISC-V system
11  *
12  * Additional information about privilege modes on RISC-V systems can be found
13  * by reading the RISC-V Privileged Architecture Specification v1.10.
14  */
15
16 #include <stdint.h>
17
18 enum metal_privilege_mode {
19         METAL_PRIVILEGE_USER = 0,
20         METAL_PRIVILEGE_SUPERVISOR = 1,
21         METAL_PRIVILEGE_MACHINE = 3,
22 };
23
24 #if __riscv_xlen == 32
25 typedef uint32_t metal_xreg_t;
26 #elif __riscv_xlen == 64
27 typedef uint64_t metal_xreg_t;
28 #endif
29
30 #if __riscv_flen == 32
31 typedef uint32_t metal_freg_t;
32 #elif __riscv_flen == 64
33 typedef uint64_t metal_freg_t;
34 #endif
35
36 struct metal_register_file {
37         metal_xreg_t ra;
38         metal_xreg_t sp;
39         metal_xreg_t gp;
40         metal_xreg_t tp;
41
42         metal_xreg_t t0;
43         metal_xreg_t t1;
44         metal_xreg_t t2;
45
46         metal_xreg_t s0;
47         metal_xreg_t s1;
48
49         metal_xreg_t a0;
50         metal_xreg_t a1;
51         metal_xreg_t a2;
52         metal_xreg_t a3;
53         metal_xreg_t a4;
54         metal_xreg_t a5;
55 #ifndef __riscv_32e
56         metal_xreg_t a6;
57         metal_xreg_t a7;
58
59         metal_xreg_t s2;
60         metal_xreg_t s3;
61         metal_xreg_t s4;
62         metal_xreg_t s5;
63         metal_xreg_t s6;
64         metal_xreg_t s7;
65         metal_xreg_t s8;
66         metal_xreg_t s9;
67         metal_xreg_t s10;
68         metal_xreg_t s11;
69
70         metal_xreg_t t3;
71         metal_xreg_t t4;
72         metal_xreg_t t5;
73         metal_xreg_t t6;
74 #endif /* __riscv_32e */
75
76 #ifdef __riscv_flen
77         metal_freg_t ft0;
78         metal_freg_t ft1;
79         metal_freg_t ft2;
80         metal_freg_t ft3;
81         metal_freg_t ft4;
82         metal_freg_t ft5;
83         metal_freg_t ft6;
84         metal_freg_t ft7;
85
86         metal_freg_t fs0;
87         metal_freg_t fs1;
88
89         metal_freg_t fa0;
90         metal_freg_t fa1;
91         metal_freg_t fa2;
92         metal_freg_t fa3;
93         metal_freg_t fa4;
94         metal_freg_t fa5;
95         metal_freg_t fa6;
96         metal_freg_t fa7;
97
98         metal_freg_t fs2;
99         metal_freg_t fs3;
100         metal_freg_t fs4;
101         metal_freg_t fs5;
102         metal_freg_t fs6;
103         metal_freg_t fs7;
104         metal_freg_t fs8;
105         metal_freg_t fs9;
106         metal_freg_t fs10;
107         metal_freg_t fs11;
108
109         metal_freg_t ft8;
110         metal_freg_t ft9;
111         metal_freg_t ft10;
112         metal_freg_t ft11;
113 #endif /* __riscv_flen */
114 };
115
116 typedef void (*metal_privilege_entry_point_t)(void);
117
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);
121
122 #endif