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
//! Hypervisor Interrupt Pending Register.
use bit_field::BitField;
use riscv::{clear, read_csr_as, set, set_clear_csr, write_csr};
/// Hypervisor Interrupt Registers.
#[derive(Copy, Clone, Debug)]
pub struct Hip {
bits: usize,
}
impl Hip {
/// Returns the raw bits of the register.
#[inline]
pub fn bits(&self) -> usize {
return self.bits;
}
/// Creates a register value from raw bits.
#[inline]
pub fn from_bits(x: usize) -> Self {
return Hip { bits: x };
}
/// Writes the register value to the CSR.
#[inline]
pub unsafe fn write(&self) {
_write(self.bits);
}
/// Returns the virtual supervisor software interrupt pending.
#[inline]
pub fn vssip(&self) -> bool {
self.bits.get_bit(2)
}
/// Sets the virtual supervisor software interrupt pending.
#[inline]
pub fn set_vssip(&mut self, val: bool) {
self.bits.set_bit(2, val);
}
/// Returns the virtual supervisor timer interrupt pending.
#[inline]
pub fn vstip(&self) -> bool {
self.bits.get_bit(6)
}
/// Sets the virtual supervisor timer interrupt pending.
#[inline]
pub fn set_vstip(&mut self, val: bool) {
self.bits.set_bit(6, val);
}
/// Returns the virtual supervisor external interrupt pending.
#[inline]
pub fn vseip(&self) -> bool {
self.bits.get_bit(10)
}
/// Sets the virtual supervisor external interrupt pending.
#[inline]
pub fn set_vseip(&mut self, val: bool) {
self.bits.set_bit(10, val);
}
/// Returns the supervisor guest external interrupt pending.
#[inline]
pub fn sgeip(&self) -> bool {
self.bits.get_bit(12)
}
/// Sets the supervisor guest external interrupt pending.
#[inline]
pub fn set_sgeip(&mut self, val: bool) {
self.bits.set_bit(12, val);
}
}
read_csr_as!(Hip, 0x644);
write_csr!(0x644);
set!(0x644);
clear!(0x644);
// bit ops
set_clear_csr!(
/// Virtual supervisor software interrupt pending enable.
, set_vssip, clear_vssip, 1 << 2);
set_clear_csr!(
/// Virtual supervisor timer interrupt pending enable.
, set_vstip, clear_vstip, 1 << 6);
set_clear_csr!(
/// Virtual supervisor external interrupt pending enable.
, set_vseip, clear_vseip, 1 << 10);
set_clear_csr!(
/// Supervisor guest external interrupt pending enable.
, set_sgeip, clear_sgeip, 1 << 12);
// enums