@@ -187,12 +187,6 @@ static int cpu_timer_irq_pending(struct kvm_vcpu *vcpu)
187
187
return kvm_s390_get_cpu_timer (vcpu ) >> 63 ;
188
188
}
189
189
190
- static inline int is_ioirq (unsigned long irq_type )
191
- {
192
- return ((irq_type >= IRQ_PEND_IO_ISC_7 ) &&
193
- (irq_type <= IRQ_PEND_IO_ISC_0 ));
194
- }
195
-
196
190
static uint64_t isc_to_isc_bits (int isc )
197
191
{
198
192
return (0x80 >> isc ) << 24 ;
@@ -236,10 +230,15 @@ static inline int kvm_s390_gisa_tac_ipm_gisc(struct kvm_s390_gisa *gisa, u32 gis
236
230
return test_and_clear_bit_inv (IPM_BIT_OFFSET + gisc , (unsigned long * ) gisa );
237
231
}
238
232
239
- static inline unsigned long pending_irqs (struct kvm_vcpu * vcpu )
233
+ static inline unsigned long pending_irqs_no_gisa (struct kvm_vcpu * vcpu )
240
234
{
241
235
return vcpu -> kvm -> arch .float_int .pending_irqs |
242
- vcpu -> arch .local_int .pending_irqs |
236
+ vcpu -> arch .local_int .pending_irqs ;
237
+ }
238
+
239
+ static inline unsigned long pending_irqs (struct kvm_vcpu * vcpu )
240
+ {
241
+ return pending_irqs_no_gisa (vcpu ) |
243
242
kvm_s390_gisa_get_ipm (vcpu -> kvm -> arch .gisa ) << IRQ_PEND_IO_ISC_7 ;
244
243
}
245
244
@@ -337,7 +336,7 @@ static void __reset_intercept_indicators(struct kvm_vcpu *vcpu)
337
336
338
337
static void set_intercept_indicators_io (struct kvm_vcpu * vcpu )
339
338
{
340
- if (!(pending_irqs (vcpu ) & IRQ_PEND_IO_MASK ))
339
+ if (!(pending_irqs_no_gisa (vcpu ) & IRQ_PEND_IO_MASK ))
341
340
return ;
342
341
else if (psw_ioint_disabled (vcpu ))
343
342
kvm_s390_set_cpuflags (vcpu , CPUSTAT_IO_INT );
@@ -1011,24 +1010,6 @@ static int __must_check __deliver_io(struct kvm_vcpu *vcpu,
1011
1010
return rc ;
1012
1011
}
1013
1012
1014
- typedef int (* deliver_irq_t )(struct kvm_vcpu * vcpu );
1015
-
1016
- static const deliver_irq_t deliver_irq_funcs [] = {
1017
- [IRQ_PEND_MCHK_EX ] = __deliver_machine_check ,
1018
- [IRQ_PEND_MCHK_REP ] = __deliver_machine_check ,
1019
- [IRQ_PEND_PROG ] = __deliver_prog ,
1020
- [IRQ_PEND_EXT_EMERGENCY ] = __deliver_emergency_signal ,
1021
- [IRQ_PEND_EXT_EXTERNAL ] = __deliver_external_call ,
1022
- [IRQ_PEND_EXT_CLOCK_COMP ] = __deliver_ckc ,
1023
- [IRQ_PEND_EXT_CPU_TIMER ] = __deliver_cpu_timer ,
1024
- [IRQ_PEND_RESTART ] = __deliver_restart ,
1025
- [IRQ_PEND_SET_PREFIX ] = __deliver_set_prefix ,
1026
- [IRQ_PEND_PFAULT_INIT ] = __deliver_pfault_init ,
1027
- [IRQ_PEND_EXT_SERVICE ] = __deliver_service ,
1028
- [IRQ_PEND_PFAULT_DONE ] = __deliver_pfault_done ,
1029
- [IRQ_PEND_VIRTIO ] = __deliver_virtio ,
1030
- };
1031
-
1032
1013
/* Check whether an external call is pending (deliverable or not) */
1033
1014
int kvm_s390_ext_call_pending (struct kvm_vcpu * vcpu )
1034
1015
{
@@ -1192,7 +1173,6 @@ void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu)
1192
1173
int __must_check kvm_s390_deliver_pending_interrupts (struct kvm_vcpu * vcpu )
1193
1174
{
1194
1175
struct kvm_s390_local_interrupt * li = & vcpu -> arch .local_int ;
1195
- deliver_irq_t func ;
1196
1176
int rc = 0 ;
1197
1177
unsigned long irq_type ;
1198
1178
unsigned long irqs ;
@@ -1212,16 +1192,57 @@ int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
1212
1192
while ((irqs = deliverable_irqs (vcpu )) && !rc ) {
1213
1193
/* bits are in the reverse order of interrupt priority */
1214
1194
irq_type = find_last_bit (& irqs , IRQ_PEND_COUNT );
1215
- if (is_ioirq (irq_type )) {
1195
+ switch (irq_type ) {
1196
+ case IRQ_PEND_IO_ISC_0 :
1197
+ case IRQ_PEND_IO_ISC_1 :
1198
+ case IRQ_PEND_IO_ISC_2 :
1199
+ case IRQ_PEND_IO_ISC_3 :
1200
+ case IRQ_PEND_IO_ISC_4 :
1201
+ case IRQ_PEND_IO_ISC_5 :
1202
+ case IRQ_PEND_IO_ISC_6 :
1203
+ case IRQ_PEND_IO_ISC_7 :
1216
1204
rc = __deliver_io (vcpu , irq_type );
1217
- } else {
1218
- func = deliver_irq_funcs [irq_type ];
1219
- if (!func ) {
1220
- WARN_ON_ONCE (func == NULL );
1221
- clear_bit (irq_type , & li -> pending_irqs );
1222
- continue ;
1223
- }
1224
- rc = func (vcpu );
1205
+ break ;
1206
+ case IRQ_PEND_MCHK_EX :
1207
+ case IRQ_PEND_MCHK_REP :
1208
+ rc = __deliver_machine_check (vcpu );
1209
+ break ;
1210
+ case IRQ_PEND_PROG :
1211
+ rc = __deliver_prog (vcpu );
1212
+ break ;
1213
+ case IRQ_PEND_EXT_EMERGENCY :
1214
+ rc = __deliver_emergency_signal (vcpu );
1215
+ break ;
1216
+ case IRQ_PEND_EXT_EXTERNAL :
1217
+ rc = __deliver_external_call (vcpu );
1218
+ break ;
1219
+ case IRQ_PEND_EXT_CLOCK_COMP :
1220
+ rc = __deliver_ckc (vcpu );
1221
+ break ;
1222
+ case IRQ_PEND_EXT_CPU_TIMER :
1223
+ rc = __deliver_cpu_timer (vcpu );
1224
+ break ;
1225
+ case IRQ_PEND_RESTART :
1226
+ rc = __deliver_restart (vcpu );
1227
+ break ;
1228
+ case IRQ_PEND_SET_PREFIX :
1229
+ rc = __deliver_set_prefix (vcpu );
1230
+ break ;
1231
+ case IRQ_PEND_PFAULT_INIT :
1232
+ rc = __deliver_pfault_init (vcpu );
1233
+ break ;
1234
+ case IRQ_PEND_EXT_SERVICE :
1235
+ rc = __deliver_service (vcpu );
1236
+ break ;
1237
+ case IRQ_PEND_PFAULT_DONE :
1238
+ rc = __deliver_pfault_done (vcpu );
1239
+ break ;
1240
+ case IRQ_PEND_VIRTIO :
1241
+ rc = __deliver_virtio (vcpu );
1242
+ break ;
1243
+ default :
1244
+ WARN_ONCE (1 , "Unknown pending irq type %ld" , irq_type );
1245
+ clear_bit (irq_type , & li -> pending_irqs );
1225
1246
}
1226
1247
}
1227
1248
@@ -1701,7 +1722,8 @@ static void __floating_irq_kick(struct kvm *kvm, u64 type)
1701
1722
kvm_s390_set_cpuflags (dst_vcpu , CPUSTAT_STOP_INT );
1702
1723
break ;
1703
1724
case KVM_S390_INT_IO_MIN ...KVM_S390_INT_IO_MAX :
1704
- kvm_s390_set_cpuflags (dst_vcpu , CPUSTAT_IO_INT );
1725
+ if (!(type & KVM_S390_INT_IO_AI_MASK && kvm -> arch .gisa ))
1726
+ kvm_s390_set_cpuflags (dst_vcpu , CPUSTAT_IO_INT );
1705
1727
break ;
1706
1728
default :
1707
1729
kvm_s390_set_cpuflags (dst_vcpu , CPUSTAT_EXT_INT );
0 commit comments