@ -1086,11 +1086,17 @@ static void vgic_dispatch_sgi(struct kvm_vcpu *vcpu, u32 reg)
}
}
static int vgic_nr_shared_irqs ( struct vgic_dist * dist )
{
return dist - > nr_irqs - VGIC_NR_PRIVATE_IRQS ;
}
static int compute_pending_for_cpu ( struct kvm_vcpu * vcpu )
{
struct vgic_dist * dist = & vcpu - > kvm - > arch . vgic ;
unsigned long * pending , * enabled , * pend_percpu , * pend_shared ;
unsigned long pending_private , pending_shared ;
int nr_shared = vgic_nr_shared_irqs ( dist ) ;
int vcpu_id ;
vcpu_id = vcpu - > vcpu_id ;
@ -1103,15 +1109,15 @@ static int compute_pending_for_cpu(struct kvm_vcpu *vcpu)
pending = vgic_bitmap_get_shared_map ( & dist - > irq_pending ) ;
enabled = vgic_bitmap_get_shared_map ( & dist - > irq_enabled ) ;
bitmap_and ( pend_shared , pending , enabled , VGIC_NR_SHARED_IRQS ) ;
bitmap_and ( pend_shared , pending , enabled , nr_shared ) ;
bitmap_and ( pend_shared , pend_shared ,
vgic_bitmap_get_shared_map ( & dist - > irq_spi_target [ vcpu_id ] ) ,
VGIC_NR_SHARED_IRQS ) ;
nr_shared ) ;
pending_private = find_first_bit ( pend_percpu , VGIC_NR_PRIVATE_IRQS ) ;
pending_shared = find_first_bit ( pend_shared , VGIC_NR_SHARED_IRQS ) ;
pending_shared = find_first_bit ( pend_shared , nr_shared ) ;
return ( pending_private < VGIC_NR_PRIVATE_IRQS | |
pending_shared < VGIC_NR_SHARED_IRQS ) ;
pending_shared < vgic_nr_shared_irqs ( dist ) ) ;
}
/*
@ -1368,7 +1374,7 @@ static void __kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
}
/* SPIs */
for_each_set_bit ( i , vgic_cpu - > pending_shared , VGIC_NR_SHARED_IRQS ) {
for_each_set_bit ( i , vgic_cpu - > pending_shared , vgic_nr_shared_irqs ( dist ) ) {
if ( ! vgic_queue_hwirq ( vcpu , i + VGIC_NR_PRIVATE_IRQS ) )
overflow = 1 ;
}