|
@@ -420,7 +420,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
|
|
|
*/
|
|
|
int kvm_arch_vcpu_runnable(struct kvm_vcpu *v)
|
|
|
{
|
|
|
- return ((!!v->arch.irq_lines || kvm_vgic_vcpu_pending_irq(v))
|
|
|
+ bool irq_lines = *vcpu_hcr(v) & (HCR_VI | HCR_VF);
|
|
|
+ return ((irq_lines || kvm_vgic_vcpu_pending_irq(v))
|
|
|
&& !v->arch.power_off && !v->arch.pause);
|
|
|
}
|
|
|
|
|
@@ -814,18 +815,18 @@ static int vcpu_interrupt_line(struct kvm_vcpu *vcpu, int number, bool level)
|
|
|
{
|
|
|
int bit_index;
|
|
|
bool set;
|
|
|
- unsigned long *ptr;
|
|
|
+ unsigned long *hcr;
|
|
|
|
|
|
if (number == KVM_ARM_IRQ_CPU_IRQ)
|
|
|
bit_index = __ffs(HCR_VI);
|
|
|
else /* KVM_ARM_IRQ_CPU_FIQ */
|
|
|
bit_index = __ffs(HCR_VF);
|
|
|
|
|
|
- ptr = (unsigned long *)&vcpu->arch.irq_lines;
|
|
|
+ hcr = vcpu_hcr(vcpu);
|
|
|
if (level)
|
|
|
- set = test_and_set_bit(bit_index, ptr);
|
|
|
+ set = test_and_set_bit(bit_index, hcr);
|
|
|
else
|
|
|
- set = test_and_clear_bit(bit_index, ptr);
|
|
|
+ set = test_and_clear_bit(bit_index, hcr);
|
|
|
|
|
|
/*
|
|
|
* If we didn't change anything, no need to wake up or kick other CPUs
|