Skip to content

Commit 915a751

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 <yegorlz@amazon.co.uk>
1 parent a75f28a commit 915a751

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
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: 19 additions & 3 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,12 +190,28 @@ impl KvmVcpu {
190190
Some(kvi) => kvi,
191191
None => Self::default_kvi(vm_fd, self.index)?,
192192
};
193+
self.kvi = state.kvi;
193194

194195
self.init_vcpu(&kvi)?;
196+
197+
// If KVM_REG_ARM64_SVE_VLS is present it needs to
198+
// be set before vcpu is finalized.
199+
if let Some(sve_vls_reg) = state
200+
.regs
201+
.iter()
202+
.find(|reg| reg.id == KVM_REG_ARM64_SVE_VLS)
203+
{
204+
set_register(&self.fd, sve_vls_reg).map_err(KvmVcpuError::RestoreState)?;
205+
}
206+
195207
self.finilize_vcpu(&kvi)?;
196-
self.kvi = state.kvi;
197208

198-
for reg in state.regs.iter() {
209+
// KVM_REG_ARM64_SVE_VLS needs to be skipped after vcpu is finalized.
210+
for reg in state
211+
.regs
212+
.iter()
213+
.filter(|reg| reg.id != KVM_REG_ARM64_SVE_VLS)
214+
{
199215
set_register(&self.fd, reg).map_err(KvmVcpuError::RestoreState)?;
200216
}
201217
set_mpstate(&self.fd, state.mp_state).map_err(KvmVcpuError::RestoreState)?;

0 commit comments

Comments
 (0)