mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 18:44:58 -06:00
intc/arm_gic: Support IRQ injection for more than 256 vpus
Host kernels that expose the KVM_CAP_ARM_IRQ_LINE_LAYOUT_2 capability allow injection of interrupts along with vcpu ids larger than 255. Let's encode the vpcu id on 12 bits according to the upgraded KVM_IRQ_LINE ABI when needed. Given that we have two callsites that need to assemble the value for kvm_set_irq(), a new helper routine, kvm_arm_set_irq is introduced. Without that patch qemu exits with "kvm_set_irq: Invalid argument" message. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reported-by: Zenghui Yu <yuzenghui@huawei.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Andrew Jones <drjones@redhat.com> Acked-by: Marc Zyngier <maz@kernel.org> Message-id: 20191003154640.22451-3-eric.auger@redhat.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
f363d039e8
commit
f6530926e2
4 changed files with 19 additions and 11 deletions
|
@ -55,7 +55,7 @@ void kvm_arm_gic_set_irq(uint32_t num_irq, int irq, int level)
|
|||
* has separate fields in the irq number for type,
|
||||
* CPU number and interrupt number.
|
||||
*/
|
||||
int kvm_irq, irqtype, cpu;
|
||||
int irqtype, cpu;
|
||||
|
||||
if (irq < (num_irq - GIC_INTERNAL)) {
|
||||
/* External interrupt. The kernel numbers these like the GIC
|
||||
|
@ -72,10 +72,7 @@ void kvm_arm_gic_set_irq(uint32_t num_irq, int irq, int level)
|
|||
cpu = irq / GIC_INTERNAL;
|
||||
irq %= GIC_INTERNAL;
|
||||
}
|
||||
kvm_irq = (irqtype << KVM_ARM_IRQ_TYPE_SHIFT)
|
||||
| (cpu << KVM_ARM_IRQ_VCPU_SHIFT) | irq;
|
||||
|
||||
kvm_set_irq(kvm_state, kvm_irq, !!level);
|
||||
kvm_arm_set_irq(cpu, irqtype, irq, !!level);
|
||||
}
|
||||
|
||||
static void kvm_arm_gicv2_set_irq(void *opaque, int irq, int level)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue