-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathmmio_access_fault.rs
35 lines (30 loc) · 1.46 KB
/
mmio_access_fault.rs
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
// SPDX-FileCopyrightText: 2023 IBM Corporation
// SPDX-FileContributor: Wojciech Ozga <woz@zurich.ibm.com>, IBM Research - Zurich
// SPDX-License-Identifier: Apache-2.0
use crate::core::control_data::{ConfidentialHart, ConfidentialVmId, ConfidentialVmMmioRegion, ControlData};
use core::mem;
pub struct MmioAccessFault {
cause: usize,
mtval: usize,
instruction_length: usize,
}
impl MmioAccessFault {
pub const ADDRESS_ALIGNMENT: usize = mem::size_of::<usize>();
pub fn new(cause: usize, mtval: usize, instruction_length: usize) -> Self {
Self { cause, mtval, instruction_length }
}
pub fn apply_to_confidential_hart(&self, confidential_hart: &mut ConfidentialHart) {
let mepc = confidential_hart.csrs().mepc.read_value() + self.instruction_length;
confidential_hart.csrs_mut().vsepc.set(mepc);
let trap_vector_address = confidential_hart.csrs().vstvec.read();
confidential_hart.csrs_mut().mepc.save_value(trap_vector_address);
confidential_hart.csrs_mut().vscause.set(self.cause);
confidential_hart.csrs_mut().vstval.set(self.mtval);
}
pub fn tried_to_access_valid_mmio_region(confidential_vm_id: ConfidentialVmId, fault_address: usize) -> bool {
ControlData::try_confidential_vm(confidential_vm_id, |confidential_vm| {
Ok(confidential_vm.is_mmio_region_defined(&ConfidentialVmMmioRegion::new(fault_address, Self::ADDRESS_ALIGNMENT)?))
})
.unwrap_or(false)
}
}