@@ -782,6 +782,9 @@ static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its,
782
782
783
783
ite = find_ite (its , device_id , event_id );
784
784
if (ite && its_is_collection_mapped (ite -> collection )) {
785
+ struct its_device * device = find_its_device (its , device_id );
786
+ int ite_esz = vgic_its_get_abi (its )-> ite_esz ;
787
+ gpa_t gpa = device -> itt_addr + ite -> event_id * ite_esz ;
785
788
/*
786
789
* Though the spec talks about removing the pending state, we
787
790
* don't bother here since we clear the ITTE anyway and the
@@ -790,7 +793,8 @@ static int vgic_its_cmd_handle_discard(struct kvm *kvm, struct vgic_its *its,
790
793
vgic_its_invalidate_cache (its );
791
794
792
795
its_free_ite (kvm , ite );
793
- return 0 ;
796
+
797
+ return vgic_its_write_entry_lock (its , gpa , 0 , ite_esz );
794
798
}
795
799
796
800
return E_ITS_DISCARD_UNMAPPED_INTERRUPT ;
@@ -1139,9 +1143,11 @@ static int vgic_its_cmd_handle_mapd(struct kvm *kvm, struct vgic_its *its,
1139
1143
bool valid = its_cmd_get_validbit (its_cmd );
1140
1144
u8 num_eventid_bits = its_cmd_get_size (its_cmd );
1141
1145
gpa_t itt_addr = its_cmd_get_ittaddr (its_cmd );
1146
+ int dte_esz = vgic_its_get_abi (its )-> dte_esz ;
1142
1147
struct its_device * device ;
1148
+ gpa_t gpa ;
1143
1149
1144
- if (!vgic_its_check_id (its , its -> baser_device_table , device_id , NULL ))
1150
+ if (!vgic_its_check_id (its , its -> baser_device_table , device_id , & gpa ))
1145
1151
return E_ITS_MAPD_DEVICE_OOR ;
1146
1152
1147
1153
if (valid && num_eventid_bits > VITS_TYPER_IDBITS )
@@ -1162,7 +1168,7 @@ static int vgic_its_cmd_handle_mapd(struct kvm *kvm, struct vgic_its *its,
1162
1168
* is an error, so we are done in any case.
1163
1169
*/
1164
1170
if (!valid )
1165
- return 0 ;
1171
+ return vgic_its_write_entry_lock ( its , gpa , 0 , dte_esz ) ;
1166
1172
1167
1173
device = vgic_its_alloc_device (its , device_id , itt_addr ,
1168
1174
num_eventid_bits );
@@ -2086,7 +2092,6 @@ static int scan_its_table(struct vgic_its *its, gpa_t base, int size, u32 esz,
2086
2092
static int vgic_its_save_ite (struct vgic_its * its , struct its_device * dev ,
2087
2093
struct its_ite * ite , gpa_t gpa , int ite_esz )
2088
2094
{
2089
- struct kvm * kvm = its -> dev -> kvm ;
2090
2095
u32 next_offset ;
2091
2096
u64 val ;
2092
2097
@@ -2095,7 +2100,8 @@ static int vgic_its_save_ite(struct vgic_its *its, struct its_device *dev,
2095
2100
((u64 )ite -> irq -> intid << KVM_ITS_ITE_PINTID_SHIFT ) |
2096
2101
ite -> collection -> collection_id ;
2097
2102
val = cpu_to_le64 (val );
2098
- return vgic_write_guest_lock (kvm , gpa , & val , ite_esz );
2103
+
2104
+ return vgic_its_write_entry_lock (its , gpa , val , ite_esz );
2099
2105
}
2100
2106
2101
2107
/**
@@ -2239,7 +2245,6 @@ static int vgic_its_restore_itt(struct vgic_its *its, struct its_device *dev)
2239
2245
static int vgic_its_save_dte (struct vgic_its * its , struct its_device * dev ,
2240
2246
gpa_t ptr , int dte_esz )
2241
2247
{
2242
- struct kvm * kvm = its -> dev -> kvm ;
2243
2248
u64 val , itt_addr_field ;
2244
2249
u32 next_offset ;
2245
2250
@@ -2250,7 +2255,8 @@ static int vgic_its_save_dte(struct vgic_its *its, struct its_device *dev,
2250
2255
(itt_addr_field << KVM_ITS_DTE_ITTADDR_SHIFT ) |
2251
2256
(dev -> num_eventid_bits - 1 ));
2252
2257
val = cpu_to_le64 (val );
2253
- return vgic_write_guest_lock (kvm , ptr , & val , dte_esz );
2258
+
2259
+ return vgic_its_write_entry_lock (its , ptr , val , dte_esz );
2254
2260
}
2255
2261
2256
2262
/**
@@ -2437,7 +2443,8 @@ static int vgic_its_save_cte(struct vgic_its *its,
2437
2443
((u64 )collection -> target_addr << KVM_ITS_CTE_RDBASE_SHIFT ) |
2438
2444
collection -> collection_id );
2439
2445
val = cpu_to_le64 (val );
2440
- return vgic_write_guest_lock (its -> dev -> kvm , gpa , & val , esz );
2446
+
2447
+ return vgic_its_write_entry_lock (its , gpa , val , esz );
2441
2448
}
2442
2449
2443
2450
/*
@@ -2453,8 +2460,7 @@ static int vgic_its_restore_cte(struct vgic_its *its, gpa_t gpa, int esz)
2453
2460
u64 val ;
2454
2461
int ret ;
2455
2462
2456
- BUG_ON (esz > sizeof (val ));
2457
- ret = kvm_read_guest_lock (kvm , gpa , & val , esz );
2463
+ ret = vgic_its_read_entry_lock (its , gpa , & val , esz );
2458
2464
if (ret )
2459
2465
return ret ;
2460
2466
val = le64_to_cpu (val );
@@ -2492,7 +2498,6 @@ static int vgic_its_save_collection_table(struct vgic_its *its)
2492
2498
u64 baser = its -> baser_coll_table ;
2493
2499
gpa_t gpa = GITS_BASER_ADDR_48_to_52 (baser );
2494
2500
struct its_collection * collection ;
2495
- u64 val ;
2496
2501
size_t max_size , filled = 0 ;
2497
2502
int ret , cte_esz = abi -> cte_esz ;
2498
2503
@@ -2516,10 +2521,7 @@ static int vgic_its_save_collection_table(struct vgic_its *its)
2516
2521
* table is not fully filled, add a last dummy element
2517
2522
* with valid bit unset
2518
2523
*/
2519
- val = 0 ;
2520
- BUG_ON (cte_esz > sizeof (val ));
2521
- ret = vgic_write_guest_lock (its -> dev -> kvm , gpa , & val , cte_esz );
2522
- return ret ;
2524
+ return vgic_its_write_entry_lock (its , gpa , 0 , cte_esz );
2523
2525
}
2524
2526
2525
2527
/*
0 commit comments