[PATCH kvm-unit-tests] x86: ioapic: add tests around retriggering of level interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Test resampling of level interrupts after EOI, by leaving the IRQ
line set in the ISR.  One tests does reset the IRQ line after a while,
the other uses masking instead in the ISR.

Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
---
 x86/ioapic.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/x86/ioapic.c b/x86/ioapic.c
index 1fcf67e..d43d5c1 100644
--- a/x86/ioapic.c
+++ b/x86/ioapic.c
@@ -188,6 +188,31 @@ static void test_ioapic_level_sequential(void)
 	report("sequential level interrupts", g_isr_99 == 2);
 }
 
+static volatile int g_isr_9a;
+
+static void ioapic_isr_9a(isr_regs_t *regs)
+{
+	++g_isr_9a;
+	if (g_isr_9a == 2)
+		set_irq_line(0x0e, 0);
+	eoi();
+}
+
+static void test_ioapic_level_retrigger(void)
+{
+	handle_irq(0x9a, ioapic_isr_9a);
+	set_ioapic_redir(0x0e, 0x9a, LEVEL_TRIGGERED);
+
+	asm volatile ("cli");
+	set_irq_line(0x0e, 1);
+	while (g_isr_9a != 2)
+		asm volatile ("sti; hlt; cli");
+
+	asm volatile ("sti");
+
+	report("retriggered level interrupts without masking", g_isr_9a == 2);
+}
+
 static volatile int g_isr_81;
 
 static void ioapic_isr_81(isr_regs_t *regs)
@@ -242,6 +267,30 @@ static void test_ioapic_level_mask(void)
 	report("unmasked level interrupt", g_isr_82 == 1);
 }
 
+static volatile int g_isr_83;
+
+static void ioapic_isr_83(isr_regs_t *regs)
+{
+	++g_isr_83;
+	set_mask(0x0e, true);
+	eoi();
+}
+
+static void test_ioapic_level_retrigger_mask(void)
+{
+	handle_irq(0x83, ioapic_isr_83);
+	set_ioapic_redir(0x0e, 0x83, LEVEL_TRIGGERED);
+
+	set_irq_line(0x0e, 1);
+	asm volatile ("nop");
+	set_mask(0x0e, false);
+	asm volatile ("nop");
+	report("retriggered level interrupts with mask", g_isr_83 == 2);
+
+	set_irq_line(0x0e, 0);
+	set_mask(0x0e, false);
+}
+
 
 int main(void)
 {
@@ -263,9 +312,11 @@ int main(void)
 	test_ioapic_simultaneous();
 	test_ioapic_level_coalesce();
 	test_ioapic_level_sequential();
+	test_ioapic_level_retrigger();
 
 	test_ioapic_edge_mask();
 	test_ioapic_level_mask();
+	test_ioapic_level_retrigger_mask();
 
 	return report_summary();
 }
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux