@@ -14,6 +14,7 @@ use versionize_derive::Versionize;
14
14
use vm_memory:: { Address , GuestAddress , GuestMemoryMmap } ;
15
15
16
16
use crate :: arch:: aarch64:: regs:: Aarch64Register ;
17
+ use crate :: arch:: regs:: Error as ArchError ;
17
18
use crate :: arch:: regs:: {
18
19
get_mpstate, read_mpidr, restore_registers, save_core_registers, save_registers,
19
20
save_system_registers, set_mpstate,
@@ -175,6 +176,22 @@ impl KvmVcpu {
175
176
error ! ( "Unexpected exit reason on vcpu run: {:?}" , exit) ;
176
177
Err ( super :: Error :: UnhandledKvmExit ( format ! ( "{:?}" , exit) ) )
177
178
}
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
+ }
178
195
}
179
196
180
197
/// Structure holding VCPU kvm state.
@@ -344,4 +361,22 @@ mod tests {
344
361
let vcpu2 = KvmVcpu :: new ( 1 , & vm) . unwrap ( ) ;
345
362
assert ! ( vcpu2. init( vm. fd( ) ) . is_ok( ) ) ;
346
363
}
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
+ }
347
382
}
0 commit comments