1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
// SPDX-License-Identifier: MPL-2.0
// SPDX-FileCopyrightText: 2022 repnop
//
// This Source Code Form is subject to the terms of the Mozilla Public License,
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
// obtain one at https://mozilla.org/MPL/2.0/.
use asm;
/// `sbi_set_timer` extension ID
pub const SET_TIMER_EID: usize = 0x00;
/// Schedule an interrupt for `time` in the future. To clear the timer interrupt
/// without scheduling another timer event, set a time infinitely far into the
/// future (`u64::MAX`) or mask the `STIE` bit of the `sie` CSR. This function
/// will clear the pending timer interrupt bit.
///
/// Note: `time` is an absolute time, not an offset from when the call is made.
/// This means that if you want to set a time that is _n_ ticks in the future,
/// you will need to read the `time` CSR first, then add the ticks to that. How
/// you determine the number of time each tick represents is platform-dependent,
/// and the frequency of the clock should be expressed in the
/// `timebase-frequency` property of the CPU nodes in the devicetree, if you
/// have one available.
/// `sbi_console_putchar` extension ID
pub const CONSOLE_PUTCHAR_EID: usize = 0x01;
/// Write a character to the debug console. This call will block if there is
/// still pending console output. If no console exists, no action is taken.
/// `sbi_console_getchar` extension ID
pub const CONSOLE_GETCHAR_EID: usize = 0x02;
/// Attempt to retrieve a character from the debug console. If there is no
/// character waiting to be read, or if there is no debug console device, this
/// function will return [`None`].
/// `sbi_clear_ipi` extension ID
pub const CLEAR_IPI_EID: usize = 0x03;
/// Clears any pending interprocessor interrupts (IPIs) for the hart this
/// function is called from.
/// `sbi_send_ipi` extension ID
pub const SEND_IPI_EID: usize = 0x04;
/// Send an interprocessor interrupt (IPI) to all of the harts specified by
/// the `hart_mask` bitmask. Received IPIs are represented as Supervisor
/// Software Interrupts.
///
/// `hart_mask` is a bit vector of length `n_harts / size_of::<usize>()`,
/// rounded up to the next `usize`.
/// `sbi_remote_fence_i` extension ID
pub const REMOTE_FENCE_I_EID: usize = 0x05;
/// Execute a `FENCE.I` instruction on the harts specified by `hart_mask`
/// bitmask.
///
/// `hart_mask` is a bit vector of length `n_harts / size_of::<usize>()`,
/// rounded up to the next `usize`.
/// `sbi_remote_sfence_vma` extension ID
pub const REMOTE_SFENCE_VMA_EID: usize = 0x06;
/// Execute a `SFENCE.VMA` instruction on the harts specified by `hart_mask`
/// bitmask for the virtual memory range specified by `start` and `size`.
///
/// `hart_mask` is a bit vector of length `n_harts / size_of::<usize>()`,
/// rounded up to the next `usize`.
///
/// `start` is the starting virtual address to execute the `SFENCE.VMA` on.
///
/// `size` is the size of the region to `SFENCE.VMA` in bytes. For example, to
/// invalidate a region of 2 4-KiB pages, you would pass `8192` for `size`.
///
/// If `start` and `size` are both `0`, or if `size` is [`usize::MAX`], a full
/// `SFENCE.VMA` will be executed instead of one or more page-sized
/// `SFENCE.VMA`s.
/// `sbi_remote_sfence_vma_asid` extension ID
pub const REMOTE_SFENCE_VMA_ASID_EID: usize = 0x07;
/// Execute a `SFENCE.VMA` instruction on the harts specified by `hart_mask`
/// bitmask for the virtual memory range specified by `start` and `size` for the
/// given Address Space ID (ASID) only.
///
/// `hart_mask` is a bit vector of length `n_harts / size_of::<usize>()`,
/// rounded up to the next `usize`.
///
/// `start` is the starting virtual address to execute the `SFENCE.VMA` on.
///
/// `size` is the size of the region to `SFENCE.VMA` in bytes. For example, to
/// invalidate a region of 2 4-KiB pages, you would pass `8192` for `size`.
///
/// If `start` and `size` are both `0`, or if `size` is [`usize::MAX`], a full
/// `SFENCE.VMA` will be executed instead of one or more page-sized
/// `SFENCE.VMA`s.
/// `sbi_shutdown` extension ID
pub const SHUTDOWN_EID: usize = 0x08;
/// Puts all harts into a shutdown state wherein the execution mode of the
/// processors is more privileged than the current supervisor mode. This call
/// does not return.
!