Skip to content

Commit 45f4b10

Browse files
committed
feat(vmm): add KvmVcpu::get_regs()
Add `KvmVcpu::get_regs()` to retrieve values for the given register IDs through `KVM_GET_ONE_REG`. This will be consumed in a successive commit. Signed-off-by: Takahiro Itazuri <[email protected]>
1 parent 1d07062 commit 45f4b10

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

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

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ pub enum Error {
4848
/// Failed to set a system register.
4949
#[error("Failed to set register {0}: {1}")]
5050
SetSysRegister(u64, kvm_ioctls::Error),
51+
/// Failed to get a register value.
52+
#[error("Failed to get register {0}: {1}")]
53+
GetOneReg(u64, kvm_ioctls::Error),
5154
/// Failed to get the register list.
5255
#[error("Failed to retrieve list of registers: {0}")]
5356
GetRegList(kvm_ioctls::Error),

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

+35
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use versionize_derive::Versionize;
1414
use vm_memory::{Address, GuestAddress, GuestMemoryMmap};
1515

1616
use crate::arch::aarch64::regs::Aarch64Register;
17+
use crate::arch::regs::Error as ArchError;
1718
use crate::arch::regs::{
1819
get_mpstate, read_mpidr, restore_registers, save_core_registers, save_registers,
1920
save_system_registers, set_mpstate,
@@ -175,6 +176,22 @@ impl KvmVcpu {
175176
error!("Unexpected exit reason on vcpu run: {:?}", exit);
176177
Err(super::Error::UnhandledKvmExit(format!("{:?}", exit)))
177178
}
179+
180+
/// Get registers for the given register IDs.
181+
pub fn get_regs(
182+
&self,
183+
reg_list: &[u64],
184+
) -> std::result::Result<Vec<Aarch64Register>, ArchError> {
185+
reg_list
186+
.iter()
187+
.map(|id| {
188+
self.fd
189+
.get_one_reg(*id)
190+
.map(|value| Aarch64Register { id: *id, value })
191+
.map_err(|err| ArchError::GetOneReg(*id, err))
192+
})
193+
.collect::<std::result::Result<Vec<_>, ArchError>>()
194+
}
178195
}
179196

180197
/// Structure holding VCPU kvm state.
@@ -344,4 +361,22 @@ mod tests {
344361
let vcpu2 = KvmVcpu::new(1, &vm).unwrap();
345362
assert!(vcpu2.init(vm.fd()).is_ok());
346363
}
364+
365+
#[test]
366+
fn test_get_valid_regs() {
367+
// Test `get_regs()` with valid register IDs.
368+
// - X0: 0x6030 0000 0010 0000
369+
// - X1: 0x6030 0000 0010 0002
370+
let (_, vcpu, _) = setup_vcpu(0x10000);
371+
let reg_list = Vec::<u64>::from([0x6030000000100000, 0x6030000000100002]);
372+
assert!(vcpu.get_regs(&reg_list).is_ok());
373+
}
374+
375+
#[test]
376+
fn test_get_invalid_regs() {
377+
// Test `get_regs()` with invalid register IDs.
378+
let (_, vcpu, _) = setup_vcpu(0x10000);
379+
let reg_list = Vec::<u64>::from([0x6030000000100001, 0x6030000000100003]);
380+
assert!(vcpu.get_regs(&reg_list).is_err());
381+
}
347382
}

0 commit comments

Comments
 (0)