@@ -42,13 +42,12 @@ static int kvm_xen_shared_info_init(struct kvm *kvm, gfn_t gfn)
42
42
int idx = srcu_read_lock (& kvm -> srcu );
43
43
44
44
if (gfn == GPA_INVALID ) {
45
- kvm_gpc_deactivate (kvm , gpc );
45
+ kvm_gpc_deactivate (gpc );
46
46
goto out ;
47
47
}
48
48
49
49
do {
50
- ret = kvm_gpc_activate (kvm , gpc , NULL , KVM_HOST_USES_PFN , gpa ,
51
- PAGE_SIZE );
50
+ ret = kvm_gpc_activate (gpc , gpa , PAGE_SIZE );
52
51
if (ret )
53
52
goto out ;
54
53
@@ -273,14 +272,14 @@ static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic)
273
272
* gfn_to_pfn caches that cover the region.
274
273
*/
275
274
read_lock_irqsave (& gpc1 -> lock , flags );
276
- while (!kvm_gpc_check (v -> kvm , gpc1 , gpc1 -> gpa , user_len1 )) {
275
+ while (!kvm_gpc_check (gpc1 , user_len1 )) {
277
276
read_unlock_irqrestore (& gpc1 -> lock , flags );
278
277
279
278
/* When invoked from kvm_sched_out() we cannot sleep */
280
279
if (atomic )
281
280
return ;
282
281
283
- if (kvm_gpc_refresh (v -> kvm , gpc1 , gpc1 -> gpa , user_len1 ))
282
+ if (kvm_gpc_refresh (gpc1 , user_len1 ))
284
283
return ;
285
284
286
285
read_lock_irqsave (& gpc1 -> lock , flags );
@@ -309,7 +308,7 @@ static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic)
309
308
*/
310
309
read_lock (& gpc2 -> lock );
311
310
312
- if (!kvm_gpc_check (v -> kvm , gpc2 , gpc2 -> gpa , user_len2 )) {
311
+ if (!kvm_gpc_check (gpc2 , user_len2 )) {
313
312
read_unlock (& gpc2 -> lock );
314
313
read_unlock_irqrestore (& gpc1 -> lock , flags );
315
314
@@ -323,8 +322,8 @@ static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic)
323
322
* to the second page now because the guest changed to
324
323
* 64-bit mode, the second GPC won't have been set up.
325
324
*/
326
- if (kvm_gpc_activate (v -> kvm , gpc2 , NULL , KVM_HOST_USES_PFN ,
327
- gpc1 -> gpa + user_len1 , user_len2 ))
325
+ if (kvm_gpc_activate (gpc2 , gpc1 -> gpa + user_len1 ,
326
+ user_len2 ))
328
327
return ;
329
328
330
329
/*
@@ -489,12 +488,10 @@ void kvm_xen_inject_pending_events(struct kvm_vcpu *v)
489
488
* little more honest about it.
490
489
*/
491
490
read_lock_irqsave (& gpc -> lock , flags );
492
- while (!kvm_gpc_check (v -> kvm , gpc , gpc -> gpa ,
493
- sizeof (struct vcpu_info ))) {
491
+ while (!kvm_gpc_check (gpc , sizeof (struct vcpu_info ))) {
494
492
read_unlock_irqrestore (& gpc -> lock , flags );
495
493
496
- if (kvm_gpc_refresh (v -> kvm , gpc , gpc -> gpa ,
497
- sizeof (struct vcpu_info )))
494
+ if (kvm_gpc_refresh (gpc , sizeof (struct vcpu_info )))
498
495
return ;
499
496
500
497
read_lock_irqsave (& gpc -> lock , flags );
@@ -554,8 +551,7 @@ int __kvm_xen_has_interrupt(struct kvm_vcpu *v)
554
551
sizeof_field (struct compat_vcpu_info , evtchn_upcall_pending ));
555
552
556
553
read_lock_irqsave (& gpc -> lock , flags );
557
- while (!kvm_gpc_check (v -> kvm , gpc , gpc -> gpa ,
558
- sizeof (struct vcpu_info ))) {
554
+ while (!kvm_gpc_check (gpc , sizeof (struct vcpu_info ))) {
559
555
read_unlock_irqrestore (& gpc -> lock , flags );
560
556
561
557
/*
@@ -569,8 +565,7 @@ int __kvm_xen_has_interrupt(struct kvm_vcpu *v)
569
565
if (in_atomic () || !task_is_running (current ))
570
566
return 1 ;
571
567
572
- if (kvm_gpc_refresh (v -> kvm , gpc , gpc -> gpa ,
573
- sizeof (struct vcpu_info ))) {
568
+ if (kvm_gpc_refresh (gpc , sizeof (struct vcpu_info ))) {
574
569
/*
575
570
* If this failed, userspace has screwed up the
576
571
* vcpu_info mapping. No interrupts for you.
@@ -711,31 +706,27 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
711
706
offsetof(struct compat_vcpu_info , time ));
712
707
713
708
if (data -> u .gpa == GPA_INVALID ) {
714
- kvm_gpc_deactivate (vcpu -> kvm , & vcpu -> arch .xen .vcpu_info_cache );
709
+ kvm_gpc_deactivate (& vcpu -> arch .xen .vcpu_info_cache );
715
710
r = 0 ;
716
711
break ;
717
712
}
718
713
719
- r = kvm_gpc_activate (vcpu -> kvm ,
720
- & vcpu -> arch .xen .vcpu_info_cache , NULL ,
721
- KVM_HOST_USES_PFN , data -> u .gpa ,
722
- sizeof (struct vcpu_info ));
714
+ r = kvm_gpc_activate (& vcpu -> arch .xen .vcpu_info_cache ,
715
+ data -> u .gpa , sizeof (struct vcpu_info ));
723
716
if (!r )
724
717
kvm_make_request (KVM_REQ_CLOCK_UPDATE , vcpu );
725
718
726
719
break ;
727
720
728
721
case KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO :
729
722
if (data -> u .gpa == GPA_INVALID ) {
730
- kvm_gpc_deactivate (vcpu -> kvm ,
731
- & vcpu -> arch .xen .vcpu_time_info_cache );
723
+ kvm_gpc_deactivate (& vcpu -> arch .xen .vcpu_time_info_cache );
732
724
r = 0 ;
733
725
break ;
734
726
}
735
727
736
- r = kvm_gpc_activate (vcpu -> kvm ,
737
- & vcpu -> arch .xen .vcpu_time_info_cache ,
738
- NULL , KVM_HOST_USES_PFN , data -> u .gpa ,
728
+ r = kvm_gpc_activate (& vcpu -> arch .xen .vcpu_time_info_cache ,
729
+ data -> u .gpa ,
739
730
sizeof (struct pvclock_vcpu_time_info ));
740
731
if (!r )
741
732
kvm_make_request (KVM_REQ_CLOCK_UPDATE , vcpu );
@@ -751,10 +742,8 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
751
742
if (data -> u .gpa == GPA_INVALID ) {
752
743
r = 0 ;
753
744
deactivate_out :
754
- kvm_gpc_deactivate (vcpu -> kvm ,
755
- & vcpu -> arch .xen .runstate_cache );
756
- kvm_gpc_deactivate (vcpu -> kvm ,
757
- & vcpu -> arch .xen .runstate2_cache );
745
+ kvm_gpc_deactivate (& vcpu -> arch .xen .runstate_cache );
746
+ kvm_gpc_deactivate (& vcpu -> arch .xen .runstate2_cache );
758
747
break ;
759
748
}
760
749
@@ -770,20 +759,18 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
770
759
771
760
/* How much fits in the (first) page? */
772
761
sz1 = PAGE_SIZE - (data -> u .gpa & ~PAGE_MASK );
773
- r = kvm_gpc_activate (vcpu -> kvm , & vcpu -> arch .xen .runstate_cache ,
774
- NULL , KVM_HOST_USES_PFN , data -> u .gpa , sz1 );
762
+ r = kvm_gpc_activate (& vcpu -> arch .xen .runstate_cache ,
763
+ data -> u .gpa , sz1 );
775
764
if (r )
776
765
goto deactivate_out ;
777
766
778
767
/* Either map the second page, or deactivate the second GPC */
779
768
if (sz1 >= sz ) {
780
- kvm_gpc_deactivate (vcpu -> kvm ,
781
- & vcpu -> arch .xen .runstate2_cache );
769
+ kvm_gpc_deactivate (& vcpu -> arch .xen .runstate2_cache );
782
770
} else {
783
771
sz2 = sz - sz1 ;
784
772
BUG_ON ((data -> u .gpa + sz1 ) & ~PAGE_MASK );
785
- r = kvm_gpc_activate (vcpu -> kvm , & vcpu -> arch .xen .runstate2_cache ,
786
- NULL , KVM_HOST_USES_PFN ,
773
+ r = kvm_gpc_activate (& vcpu -> arch .xen .runstate2_cache ,
787
774
data -> u .gpa + sz1 , sz2 );
788
775
if (r )
789
776
goto deactivate_out ;
@@ -1167,7 +1154,7 @@ static bool wait_pending_event(struct kvm_vcpu *vcpu, int nr_ports,
1167
1154
1168
1155
idx = srcu_read_lock (& kvm -> srcu );
1169
1156
read_lock_irqsave (& gpc -> lock , flags );
1170
- if (!kvm_gpc_check (kvm , gpc , gpc -> gpa , PAGE_SIZE ))
1157
+ if (!kvm_gpc_check (gpc , PAGE_SIZE ))
1171
1158
goto out_rcu ;
1172
1159
1173
1160
ret = false;
@@ -1201,20 +1188,45 @@ static bool kvm_xen_schedop_poll(struct kvm_vcpu *vcpu, bool longmode,
1201
1188
evtchn_port_t port , * ports ;
1202
1189
gpa_t gpa ;
1203
1190
1204
- if (!longmode || ! lapic_in_kernel (vcpu ) ||
1191
+ if (!lapic_in_kernel (vcpu ) ||
1205
1192
!(vcpu -> kvm -> arch .xen_hvm_config .flags & KVM_XEN_HVM_CONFIG_EVTCHN_SEND ))
1206
1193
return false;
1207
1194
1208
1195
idx = srcu_read_lock (& vcpu -> kvm -> srcu );
1209
1196
gpa = kvm_mmu_gva_to_gpa_system (vcpu , param , NULL );
1210
1197
srcu_read_unlock (& vcpu -> kvm -> srcu , idx );
1211
-
1212
- if (!gpa || kvm_vcpu_read_guest (vcpu , gpa , & sched_poll ,
1213
- sizeof (sched_poll ))) {
1198
+ if (!gpa ) {
1214
1199
* r = - EFAULT ;
1215
1200
return true;
1216
1201
}
1217
1202
1203
+ if (IS_ENABLED (CONFIG_64BIT ) && !longmode ) {
1204
+ struct compat_sched_poll sp32 ;
1205
+
1206
+ /* Sanity check that the compat struct definition is correct */
1207
+ BUILD_BUG_ON (sizeof (sp32 ) != 16 );
1208
+
1209
+ if (kvm_vcpu_read_guest (vcpu , gpa , & sp32 , sizeof (sp32 ))) {
1210
+ * r = - EFAULT ;
1211
+ return true;
1212
+ }
1213
+
1214
+ /*
1215
+ * This is a 32-bit pointer to an array of evtchn_port_t which
1216
+ * are uint32_t, so once it's converted no further compat
1217
+ * handling is needed.
1218
+ */
1219
+ sched_poll .ports = (void * )(unsigned long )(sp32 .ports );
1220
+ sched_poll .nr_ports = sp32 .nr_ports ;
1221
+ sched_poll .timeout = sp32 .timeout ;
1222
+ } else {
1223
+ if (kvm_vcpu_read_guest (vcpu , gpa , & sched_poll ,
1224
+ sizeof (sched_poll ))) {
1225
+ * r = - EFAULT ;
1226
+ return true;
1227
+ }
1228
+ }
1229
+
1218
1230
if (unlikely (sched_poll .nr_ports > 1 )) {
1219
1231
/* Xen (unofficially) limits number of pollers to 128 */
1220
1232
if (sched_poll .nr_ports > 128 ) {
@@ -1564,7 +1576,7 @@ int kvm_xen_set_evtchn_fast(struct kvm_xen_evtchn *xe, struct kvm *kvm)
1564
1576
idx = srcu_read_lock (& kvm -> srcu );
1565
1577
1566
1578
read_lock_irqsave (& gpc -> lock , flags );
1567
- if (!kvm_gpc_check (kvm , gpc , gpc -> gpa , PAGE_SIZE ))
1579
+ if (!kvm_gpc_check (gpc , PAGE_SIZE ))
1568
1580
goto out_rcu ;
1569
1581
1570
1582
if (IS_ENABLED (CONFIG_64BIT ) && kvm -> arch .xen .long_mode ) {
@@ -1598,7 +1610,7 @@ int kvm_xen_set_evtchn_fast(struct kvm_xen_evtchn *xe, struct kvm *kvm)
1598
1610
gpc = & vcpu -> arch .xen .vcpu_info_cache ;
1599
1611
1600
1612
read_lock_irqsave (& gpc -> lock , flags );
1601
- if (!kvm_gpc_check (kvm , gpc , gpc -> gpa , sizeof (struct vcpu_info ))) {
1613
+ if (!kvm_gpc_check (gpc , sizeof (struct vcpu_info ))) {
1602
1614
/*
1603
1615
* Could not access the vcpu_info. Set the bit in-kernel
1604
1616
* and prod the vCPU to deliver it for itself.
@@ -1696,7 +1708,7 @@ static int kvm_xen_set_evtchn(struct kvm_xen_evtchn *xe, struct kvm *kvm)
1696
1708
break ;
1697
1709
1698
1710
idx = srcu_read_lock (& kvm -> srcu );
1699
- rc = kvm_gpc_refresh (kvm , gpc , gpc -> gpa , PAGE_SIZE );
1711
+ rc = kvm_gpc_refresh (gpc , PAGE_SIZE );
1700
1712
srcu_read_unlock (& kvm -> srcu , idx );
1701
1713
} while (!rc );
1702
1714
@@ -2026,37 +2038,41 @@ void kvm_xen_init_vcpu(struct kvm_vcpu *vcpu)
2026
2038
2027
2039
timer_setup (& vcpu -> arch .xen .poll_timer , cancel_evtchn_poll , 0 );
2028
2040
2029
- kvm_gpc_init (& vcpu -> arch .xen .runstate_cache );
2030
- kvm_gpc_init (& vcpu -> arch .xen .runstate2_cache );
2031
- kvm_gpc_init (& vcpu -> arch .xen .vcpu_info_cache );
2032
- kvm_gpc_init (& vcpu -> arch .xen .vcpu_time_info_cache );
2041
+ kvm_gpc_init (& vcpu -> arch .xen .runstate_cache , vcpu -> kvm , NULL ,
2042
+ KVM_HOST_USES_PFN );
2043
+ kvm_gpc_init (& vcpu -> arch .xen .runstate2_cache , vcpu -> kvm , NULL ,
2044
+ KVM_HOST_USES_PFN );
2045
+ kvm_gpc_init (& vcpu -> arch .xen .vcpu_info_cache , vcpu -> kvm , NULL ,
2046
+ KVM_HOST_USES_PFN );
2047
+ kvm_gpc_init (& vcpu -> arch .xen .vcpu_time_info_cache , vcpu -> kvm , NULL ,
2048
+ KVM_HOST_USES_PFN );
2033
2049
}
2034
2050
2035
2051
void kvm_xen_destroy_vcpu (struct kvm_vcpu * vcpu )
2036
2052
{
2037
2053
if (kvm_xen_timer_enabled (vcpu ))
2038
2054
kvm_xen_stop_timer (vcpu );
2039
2055
2040
- kvm_gpc_deactivate (vcpu -> kvm , & vcpu -> arch .xen .runstate_cache );
2041
- kvm_gpc_deactivate (vcpu -> kvm , & vcpu -> arch .xen .runstate2_cache );
2042
- kvm_gpc_deactivate (vcpu -> kvm , & vcpu -> arch .xen .vcpu_info_cache );
2043
- kvm_gpc_deactivate (vcpu -> kvm , & vcpu -> arch .xen .vcpu_time_info_cache );
2056
+ kvm_gpc_deactivate (& vcpu -> arch .xen .runstate_cache );
2057
+ kvm_gpc_deactivate (& vcpu -> arch .xen .runstate2_cache );
2058
+ kvm_gpc_deactivate (& vcpu -> arch .xen .vcpu_info_cache );
2059
+ kvm_gpc_deactivate (& vcpu -> arch .xen .vcpu_time_info_cache );
2044
2060
2045
2061
del_timer_sync (& vcpu -> arch .xen .poll_timer );
2046
2062
}
2047
2063
2048
2064
void kvm_xen_init_vm (struct kvm * kvm )
2049
2065
{
2050
2066
idr_init (& kvm -> arch .xen .evtchn_ports );
2051
- kvm_gpc_init (& kvm -> arch .xen .shinfo_cache );
2067
+ kvm_gpc_init (& kvm -> arch .xen .shinfo_cache , kvm , NULL , KVM_HOST_USES_PFN );
2052
2068
}
2053
2069
2054
2070
void kvm_xen_destroy_vm (struct kvm * kvm )
2055
2071
{
2056
2072
struct evtchnfd * evtchnfd ;
2057
2073
int i ;
2058
2074
2059
- kvm_gpc_deactivate (kvm , & kvm -> arch .xen .shinfo_cache );
2075
+ kvm_gpc_deactivate (& kvm -> arch .xen .shinfo_cache );
2060
2076
2061
2077
idr_for_each_entry (& kvm -> arch .xen .evtchn_ports , evtchnfd , i ) {
2062
2078
if (!evtchnfd -> deliver .port .port )
0 commit comments