@@ -2251,4 +2251,48 @@ mod tests {
22512251 assert ! ( vm. register_enc_memory_region( & memory_region) . is_ok( ) ) ;
22522252 assert ! ( vm. unregister_enc_memory_region( & memory_region) . is_ok( ) ) ;
22532253 }
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+ }
22542298}
0 commit comments