|
4 | 4 | //
|
5 | 5 | // Author: Joerg Roedel <[email protected]>
|
6 | 6 |
|
| 7 | +use bitfield_struct::bitfield; |
| 8 | + |
7 | 9 | // AE Exitcodes
|
8 | 10 | // Table 15-35, AMD64 Architecture Programmer’s Manual, Vol. 2
|
9 | 11 | #[repr(u64)]
|
@@ -43,6 +45,64 @@ pub enum GuestVMExit {
|
43 | 45 | BUSY = 0xfffffffffffffffe,
|
44 | 46 | }
|
45 | 47 |
|
| 48 | +#[bitfield(u64)] |
| 49 | +pub struct VIntrCtrl { |
| 50 | + pub v_tpr: u8, |
| 51 | + pub v_irq: bool, |
| 52 | + pub vgif: bool, |
| 53 | + pub int_shadow: bool, |
| 54 | + pub v_nmi: bool, |
| 55 | + pub v_nmi_mask: bool, |
| 56 | + #[bits(3)] |
| 57 | + _rsvd_15_13: u8, |
| 58 | + #[bits(4)] |
| 59 | + pub v_intr_prio: u8, |
| 60 | + pub v_ign_tpr: bool, |
| 61 | + #[bits(5)] |
| 62 | + _rsvd_25_21: u8, |
| 63 | + v_nmi_enable: bool, |
| 64 | + #[bits(5)] |
| 65 | + _rsvd_31_27: u8, |
| 66 | + pub v_intr_vector: u8, |
| 67 | + #[bits(23)] |
| 68 | + _rsvd_62_40: u32, |
| 69 | + busy: bool, |
| 70 | +} |
| 71 | + |
| 72 | +#[derive(Copy, Clone, Debug, Eq, PartialEq)] |
| 73 | +pub enum VmsaEventType { |
| 74 | + Interrupt = 0, |
| 75 | + NMI = 2, |
| 76 | + Exception = 3, |
| 77 | + SoftwareInterrupt = 4, |
| 78 | +} |
| 79 | + |
| 80 | +impl VmsaEventType { |
| 81 | + const fn into_bits(self) -> u64 { |
| 82 | + self as _ |
| 83 | + } |
| 84 | + const fn from_bits(value: u64) -> Self { |
| 85 | + match value { |
| 86 | + 2 => Self::NMI, |
| 87 | + 3 => Self::Exception, |
| 88 | + 4 => Self::SoftwareInterrupt, |
| 89 | + _ => Self::Interrupt, |
| 90 | + } |
| 91 | + } |
| 92 | +} |
| 93 | + |
| 94 | +#[bitfield(u64)] |
| 95 | +pub struct VmsaEventInject { |
| 96 | + pub vector: u8, |
| 97 | + #[bits(3)] |
| 98 | + pub event_type: VmsaEventType, |
| 99 | + pub error_code_valid: bool, |
| 100 | + #[bits(19)] |
| 101 | + _rsvd_30_12: u32, |
| 102 | + pub valid: bool, |
| 103 | + pub error_code: u32, |
| 104 | +} |
| 105 | + |
46 | 106 | #[repr(C, packed)]
|
47 | 107 | #[derive(Debug, Default, Clone, Copy)]
|
48 | 108 | pub struct VMSASegment {
|
@@ -139,15 +199,15 @@ pub struct VMSA {
|
139 | 199 | pub reserved_380: [u8; 16],
|
140 | 200 | pub guest_exitinfo1: u64,
|
141 | 201 | pub guest_exitinfo2: u64,
|
142 |
| - pub guest_exitintinfo: u64, |
| 202 | + pub guest_exitintinfo: VmsaEventInject, |
143 | 203 | pub guest_nrip: u64,
|
144 | 204 | pub sev_features: u64,
|
145 |
| - pub vintr_ctrl: u64, |
| 205 | + pub vintr_ctrl: VIntrCtrl, |
146 | 206 | pub guest_exit_code: GuestVMExit,
|
147 | 207 | pub vtom: u64,
|
148 | 208 | pub tlb_id: u64,
|
149 | 209 | pub pcpu_id: u64,
|
150 |
| - pub event_inj: u64, |
| 210 | + pub event_inj: VmsaEventInject, |
151 | 211 | pub xcr0: u64,
|
152 | 212 | pub reserved_3f0: [u8; 16],
|
153 | 213 | pub x87_dp: u64,
|
@@ -279,13 +339,3 @@ impl Default for VMSA {
|
279 | 339 | }
|
280 | 340 | }
|
281 | 341 | }
|
282 |
| - |
283 |
| -impl VMSA { |
284 |
| - pub fn enable(&mut self) { |
285 |
| - self.efer |= 1u64 << 12; |
286 |
| - } |
287 |
| - |
288 |
| - pub fn disable(&mut self) { |
289 |
| - self.efer &= !(1u64 << 12); |
290 |
| - } |
291 |
| -} |
|
0 commit comments