Skip to content

Commit 867a0f3

Browse files
committed
devices/vcpu/hvf: deal with CNTHCTL_EL2 properly
So far, we were returning 0 when the guest reads CNTHCTL_EL2, and ignoring writes. That works, but isn't the right way. Since we're now doing it right for MDCCINT_EL1, let's do it also for CNTHCTL_EL2. Signed-off-by: Sergio Lopez <[email protected]>
1 parent 1fb1bc3 commit 867a0f3

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

src/devices/src/legacy/vcpu.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use std::sync::Mutex;
55
use arch::aarch64::layout::VTIMER_IRQ;
66
use arch::aarch64::sysreg::*;
77
use hvf::bindings::{
8-
hv_sys_reg_t_HV_SYS_REG_MDCCINT_EL1, hv_vcpu_get_sys_reg, hv_vcpu_set_sys_reg, HV_SUCCESS,
8+
hv_sys_reg_t_HV_SYS_REG_CNTHCTL_EL2, hv_sys_reg_t_HV_SYS_REG_MDCCINT_EL1, hv_vcpu_get_sys_reg,
9+
hv_vcpu_set_sys_reg, HV_SUCCESS,
910
};
1011
use hvf::{vcpu_request_exit, Vcpus};
1112

@@ -149,7 +150,6 @@ impl Vcpus for VcpuList {
149150
}
150151

151152
match reg {
152-
SYSREG_CNTHCTL_EL2 => Some(0),
153153
SYSREG_ICC_IAR1_EL1 => Some(
154154
self.vcpus[vcpuid as usize]
155155
.lock()
@@ -163,6 +163,21 @@ impl Vcpus for VcpuList {
163163
| (1 << ICC_CTLR_EL1_ID_BITS_SHIFT)
164164
| (4 << ICC_CTLR_EL1_PRI_BITS_SHIFT),
165165
),
166+
SYSREG_CNTHCTL_EL2 => {
167+
let val: u64 = 0;
168+
let ret = unsafe {
169+
hv_vcpu_get_sys_reg(
170+
vcpuid,
171+
hv_sys_reg_t_HV_SYS_REG_CNTHCTL_EL2,
172+
&val as *const _ as *mut _,
173+
)
174+
};
175+
if ret == HV_SUCCESS {
176+
Some(val)
177+
} else {
178+
None
179+
}
180+
}
166181
SYSREG_MDCCINT_EL1 => {
167182
let val: u64 = 0;
168183
let ret = unsafe {
@@ -222,14 +237,19 @@ impl Vcpus for VcpuList {
222237

223238
true
224239
}
240+
SYSREG_CNTHCTL_EL2 => {
241+
let ret = unsafe {
242+
hv_vcpu_set_sys_reg(vcpuid, hv_sys_reg_t_HV_SYS_REG_CNTHCTL_EL2, val)
243+
};
244+
ret == HV_SUCCESS
245+
}
225246
SYSREG_MDCCINT_EL1 => {
226247
let ret = unsafe {
227248
hv_vcpu_set_sys_reg(vcpuid, hv_sys_reg_t_HV_SYS_REG_MDCCINT_EL1, val)
228249
};
229250
ret == HV_SUCCESS
230251
}
231-
SYSREG_CNTHCTL_EL2
232-
| SYSREG_ICC_EOIR1_EL1
252+
SYSREG_ICC_EOIR1_EL1
233253
| SYSREG_ICC_IGRPEN1_EL1
234254
| SYSREG_ICC_PMR_EL1
235255
| SYSREG_ICC_BPR1_EL1

0 commit comments

Comments
 (0)