@@ -954,6 +954,14 @@ static int kvm_xen_hypercall_complete_userspace(struct kvm_vcpu *vcpu)
954954 return kvm_xen_hypercall_set_result (vcpu , run -> xen .u .hcall .result );
955955}
956956
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+
957965static bool wait_pending_event (struct kvm_vcpu * vcpu , int nr_ports ,
958966 evtchn_port_t * ports )
959967{
@@ -1042,6 +1050,10 @@ static bool kvm_xen_schedop_poll(struct kvm_vcpu *vcpu, bool longmode,
10421050 * r = - EFAULT ;
10431051 goto out ;
10441052 }
1053+ if (ports [i ] >= max_evtchn_port (vcpu -> kvm )) {
1054+ * r = - EINVAL ;
1055+ goto out ;
1056+ }
10451057 }
10461058
10471059 if (sched_poll .nr_ports == 1 )
@@ -1215,6 +1227,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
12151227 bool longmode ;
12161228 u64 input , params [6 ], r = - ENOSYS ;
12171229 bool handled = false;
1230+ u8 cpl ;
12181231
12191232 input = (u64 )kvm_register_read (vcpu , VCPU_REGS_RAX );
12201233
@@ -1242,9 +1255,17 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
12421255 params [5 ] = (u64 )kvm_r9_read (vcpu );
12431256 }
12441257#endif
1258+ cpl = static_call (kvm_x86_get_cpl )(vcpu );
12451259 trace_kvm_xen_hypercall (input , params [0 ], params [1 ], params [2 ],
12461260 params [3 ], params [4 ], params [5 ]);
12471261
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+
12481269 switch (input ) {
12491270 case __HYPERVISOR_xen_version :
12501271 if (params [0 ] == XENVER_version && vcpu -> kvm -> arch .xen .xen_version ) {
@@ -1279,10 +1300,11 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
12791300 if (handled )
12801301 return kvm_xen_hypercall_set_result (vcpu , r );
12811302
1303+ handle_in_userspace :
12821304 vcpu -> run -> exit_reason = KVM_EXIT_XEN ;
12831305 vcpu -> run -> xen .type = KVM_EXIT_XEN_HCALL ;
12841306 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 ;
12861308 vcpu -> run -> xen .u .hcall .input = input ;
12871309 vcpu -> run -> xen .u .hcall .params [0 ] = params [0 ];
12881310 vcpu -> run -> xen .u .hcall .params [1 ] = params [1 ];
@@ -1297,14 +1319,6 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu)
12971319 return 0 ;
12981320}
12991321
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-
13081322static void kvm_xen_check_poller (struct kvm_vcpu * vcpu , int port )
13091323{
13101324 int poll_evtchn = vcpu -> arch .xen .poll_evtchn ;
0 commit comments