@@ -2251,4 +2251,48 @@ mod tests {
2251
2251
assert ! ( vm. register_enc_memory_region( & memory_region) . is_ok( ) ) ;
2252
2252
assert ! ( vm. unregister_enc_memory_region( & memory_region) . is_ok( ) ) ;
2253
2253
}
2254
+
2255
+ #[ test]
2256
+ #[ cfg( target_arch = "aarch64" ) ]
2257
+ fn test_kvm_steal_time_capability ( ) {
2258
+ let kvm = Kvm :: new ( ) . unwrap ( ) ;
2259
+ let vm = kvm. create_vm ( ) . unwrap ( ) ;
2260
+ let vcpu = vm. create_vcpu ( 0 ) . unwrap ( ) ;
2261
+ create_gic_device ( & vm, 0 ) ;
2262
+
2263
+ if kvm. check_extension ( Cap :: KvmCapStealTime ) {
2264
+ const PVTIME_REGION_SIZE : u64 = 0x10000 ;
2265
+ const TEST_KVM_MEM_SLOT : u32 = 0 ;
2266
+ const TEST_IPA : u64 = 0x20000000 ;
2267
+ let hva = unsafe {
2268
+ libc:: mmap (
2269
+ std:: ptr:: null_mut ( ) ,
2270
+ PVTIME_REGION_SIZE as usize ,
2271
+ libc:: PROT_READ | libc:: PROT_WRITE ,
2272
+ libc:: MAP_PRIVATE | libc:: MAP_ANONYMOUS ,
2273
+ 0 ,
2274
+ 0 ,
2275
+ )
2276
+ } as * const u8 as u64 ;
2277
+
2278
+ let mem_region = kvm_bindings:: kvm_userspace_memory_region {
2279
+ slot : TEST_KVM_MEM_SLOT ,
2280
+ guest_phys_addr : TEST_IPA ,
2281
+ memory_size : PVTIME_REGION_SIZE ,
2282
+ userspace_addr : hva,
2283
+ flags : 0 ,
2284
+ } ;
2285
+ unsafe {
2286
+ vm. set_user_memory_region ( mem_region) . unwrap ( ) ;
2287
+ }
2288
+
2289
+ let device_attribute = kvm_device_attr {
2290
+ group : KVM_ARM_VCPU_PVTIME_CTRL ,
2291
+ attr : KVM_ARM_VCPU_PVTIME_IPA as u64 ,
2292
+ addr : & TEST_IPA as * const _ as u64 ,
2293
+ ..Default :: default ( )
2294
+ } ;
2295
+ assert ! ( vcpu. set_device_attr( & device_attribute) . is_ok( ) )
2296
+ }
2297
+ }
2254
2298
}
0 commit comments