Skip to content

Commit 6750f86

Browse files
committed
fix(aarch64/vcpu): correct handling of KVM_REG_ARM64_SVE_VLS
KVM_REG_ARM64_SVE_VLS needs to be treated differently from other SVE registers. It needs to be set before vcpu is finalized. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent 7c85370 commit 6750f86

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/vmm/src/arch/aarch64/regs.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ arm64_sys_reg!(ID_AA64MMFR2_EL1, 3, 0, 0, 7, 2);
109109
// EL0 Virtual Timer Registers
110110
arm64_sys_reg!(KVM_REG_ARM_TIMER_CNT, 3, 3, 14, 3, 2);
111111

112+
/// Vector lengths pseudo-register
113+
pub const KVM_REG_ARM64_SVE_VLS: u64 =
114+
KVM_REG_ARM64 | KVM_REG_ARM64_SVE as u64 | KVM_REG_SIZE_U512 | 0xffff;
115+
112116
/// Different aarch64 registers sizes
113117
#[derive(Debug)]
114118
pub enum RegSize {

src/vmm/src/vstate/vcpu/aarch64.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use kvm_ioctls::*;
1212
use serde::{Deserialize, Serialize};
1313

1414
use crate::arch::aarch64::regs::{
15-
arm64_core_reg_id, offset__of, Aarch64RegisterVec, KVM_REG_ARM_TIMER_CNT,
15+
arm64_core_reg_id, offset__of, Aarch64RegisterVec, KVM_REG_ARM64_SVE_VLS, KVM_REG_ARM_TIMER_CNT,
1616
};
1717
use crate::arch::aarch64::vcpu::{
1818
get_all_registers, get_all_registers_ids, get_mpidr, get_mpstate, get_registers, set_mpstate,
@@ -190,10 +190,25 @@ impl KvmVcpu {
190190
None => Self::default_kvi(vm_fd, self.index)?,
191191
};
192192

193+
// KVM_REG_ARM64_SVE_VLS needs to be set before vcpu is
194+
// finalized. Vcpu is finalized in `init_vcpu_fd`.
195+
if let Some(sve_vls_reg) = state
196+
.regs
197+
.iter()
198+
.find(|reg| reg.id == KVM_REG_ARM64_SVE_VLS)
199+
{
200+
set_register(&self.fd, sve_vls_reg).map_err(KvmVcpuError::RestoreState)?;
201+
}
202+
193203
self.init_vcpu_fd(&kvi)?;
194204
self.kvi = state.kvi;
195205

196-
for reg in state.regs.iter() {
206+
// KVM_REG_ARM64_SVE_VLS needs to be skipped after vcpu is finalized.
207+
for reg in state
208+
.regs
209+
.iter()
210+
.filter(|reg| reg.id != KVM_REG_ARM64_SVE_VLS)
211+
{
197212
set_register(&self.fd, reg).map_err(KvmVcpuError::RestoreState)?;
198213
}
199214
set_mpstate(&self.fd, state.mp_state).map_err(KvmVcpuError::RestoreState)?;

0 commit comments

Comments
 (0)