|
@@ -612,6 +612,20 @@ On some architectures it is required that an interrupt controller model has
|
|
been previously created with KVM_CREATE_IRQCHIP. Note that edge-triggered
|
|
been previously created with KVM_CREATE_IRQCHIP. Note that edge-triggered
|
|
interrupts require the level to be set to 1 and then back to 0.
|
|
interrupts require the level to be set to 1 and then back to 0.
|
|
|
|
|
|
|
|
+On real hardware, interrupt pins can be active-low or active-high. This
|
|
|
|
+does not matter for the level field of struct kvm_irq_level: 1 always
|
|
|
|
+means active (asserted), 0 means inactive (deasserted).
|
|
|
|
+
|
|
|
|
+x86 allows the operating system to program the interrupt polarity
|
|
|
|
+(active-low/active-high) for level-triggered interrupts, and KVM used
|
|
|
|
+to consider the polarity. However, due to bitrot in the handling of
|
|
|
|
+active-low interrupts, the above convention is now valid on x86 too.
|
|
|
|
+This is signaled by KVM_CAP_X86_IOAPIC_POLARITY_IGNORED. Userspace
|
|
|
|
+should not present interrupts to the guest as active-low unless this
|
|
|
|
+capability is present (or unless it is not using the in-kernel irqchip,
|
|
|
|
+of course).
|
|
|
|
+
|
|
|
|
+
|
|
ARM/arm64 can signal an interrupt either at the CPU level, or at the
|
|
ARM/arm64 can signal an interrupt either at the CPU level, or at the
|
|
in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to
|
|
in-kernel irqchip (GIC), and for in-kernel irqchip can tell the GIC to
|
|
use PPIs designated for specific cpus. The irq field is interpreted
|
|
use PPIs designated for specific cpus. The irq field is interpreted
|
|
@@ -628,7 +642,7 @@ The irq_type field has the following values:
|
|
|
|
|
|
(The irq_id field thus corresponds nicely to the IRQ ID in the ARM GIC specs)
|
|
(The irq_id field thus corresponds nicely to the IRQ ID in the ARM GIC specs)
|
|
|
|
|
|
-In both cases, level is used to raise/lower the line.
|
|
|
|
|
|
+In both cases, level is used to assert/deassert the line.
|
|
|
|
|
|
struct kvm_irq_level {
|
|
struct kvm_irq_level {
|
|
union {
|
|
union {
|