@@ -954,6 +954,14 @@ static int kvm_xen_hypercall_complete_userspace(struct kvm_vcpu *vcpu)
954
954
return kvm_xen_hypercall_set_result (vcpu , run -> xen .u .hcall .result );
955
955
}
956
956
957
+ static inline int max_evtchn_port (struct kvm * kvm )
958
+ {
959
+ if (IS_ENABLED (CONFIG_64BIT ) && kvm -> arch .xen .long_mode )
960
+ return EVTCHN_2L_NR_CHANNELS ;
961
+ else
962
+ return COMPAT_EVTCHN_2L_NR_CHANNELS ;
963
+ }
964
+
957
965
static bool wait_pending_event (struct kvm_vcpu * vcpu , int nr_ports ,
958
966
evtchn_port_t * ports )
959
967
{
@@ -1042,6 +1050,10 @@ static bool kvm_xen_schedop_poll(struct kvm_vcpu *vcpu, bool longmode,
1042
1050
* r = - EFAULT ;
1043
1051
goto out ;
1044
1052
}
1053
+ if (ports [i ] >= max_evtchn_port (vcpu -> kvm )) {
1054
+ * r = - EINVAL ;
1055
+ goto out ;
1056
+ }
1045
1057
}
1046
1058
1047
1059
if (sched_poll .nr_ports == 1 )
@@ -1215,6 +1227,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
1215
1227
bool longmode ;
1216
1228
u64 input , params [6 ], r = - ENOSYS ;
1217
1229
bool handled = false;
1230
+ u8 cpl ;
1218
1231
1219
1232
input = (u64 )kvm_register_read (vcpu , VCPU_REGS_RAX );
1220
1233
@@ -1242,9 +1255,17 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
1242
1255
params [5 ] = (u64 )kvm_r9_read (vcpu );
1243
1256
}
1244
1257
#endif
1258
+ cpl = static_call (kvm_x86_get_cpl )(vcpu );
1245
1259
trace_kvm_xen_hypercall (input , params [0 ], params [1 ], params [2 ],
1246
1260
params [3 ], params [4 ], params [5 ]);
1247
1261
1262
+ /*
1263
+ * Only allow hypercall acceleration for CPL0. The rare hypercalls that
1264
+ * are permitted in guest userspace can be handled by the VMM.
1265
+ */
1266
+ if (unlikely (cpl > 0 ))
1267
+ goto handle_in_userspace ;
1268
+
1248
1269
switch (input ) {
1249
1270
case __HYPERVISOR_xen_version :
1250
1271
if (params [0 ] == XENVER_version && vcpu -> kvm -> arch .xen .xen_version ) {
@@ -1279,10 +1300,11 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
1279
1300
if (handled )
1280
1301
return kvm_xen_hypercall_set_result (vcpu , r );
1281
1302
1303
+ handle_in_userspace :
1282
1304
vcpu -> run -> exit_reason = KVM_EXIT_XEN ;
1283
1305
vcpu -> run -> xen .type = KVM_EXIT_XEN_HCALL ;
1284
1306
vcpu -> run -> xen .u .hcall .longmode = longmode ;
1285
- vcpu -> run -> xen .u .hcall .cpl = static_call ( kvm_x86_get_cpl )( vcpu ) ;
1307
+ vcpu -> run -> xen .u .hcall .cpl = cpl ;
1286
1308
vcpu -> run -> xen .u .hcall .input = input ;
1287
1309
vcpu -> run -> xen .u .hcall .params [0 ] = params [0 ];
1288
1310
vcpu -> run -> xen .u .hcall .params [1 ] = params [1 ];
@@ -1297,14 +1319,6 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
1297
1319
return 0 ;
1298
1320
}
1299
1321
1300
- static inline int max_evtchn_port (struct kvm * kvm )
1301
- {
1302
- if (IS_ENABLED (CONFIG_64BIT ) && kvm -> arch .xen .long_mode )
1303
- return EVTCHN_2L_NR_CHANNELS ;
1304
- else
1305
- return COMPAT_EVTCHN_2L_NR_CHANNELS ;
1306
- }
1307
-
1308
1322
static void kvm_xen_check_poller (struct kvm_vcpu * vcpu , int port )
1309
1323
{
1310
1324
int poll_evtchn = vcpu -> arch .xen .poll_evtchn ;
0 commit comments