Skip to contentSkip to conversation

Make apic.flat test pass again

PATCH New Avi Kivity 1 participant 3 messages Sep 14, 2009 KVM

lore
Share & tools
lore

Avi Kivity

author
#0 lore raw

cover Make apic.flat test pass again

The apic test doesn't run under qemu; this patchset make it pass again.

Avi Kivity (2):
test: Mask PIC interrupts before APIC test
test-device: add support for irq injection

 hw/pc.c                  |   18 +++++++++++++-----
 kvm/user/test/x86/apic.c |   13 +++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)
author
#1 lore raw

PATCH 1/2 test: Mask PIC interrupts before APIC test

We aren't ready to handle PIC interrupts, so mask them.

---
 kvm/user/test/x86/apic.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)
kvm/user/test/x86/apic.c +13 -0
index 7794615..b712ef8 100644
@@ -102,6 +102,11 @@ static idt_entry_t idt[256];
 static int g_fail;
 static int g_tests;
 
+static void outb(unsigned char data, unsigned short port)
+{
+    asm volatile ("out %0, %1" : : "a"(data), "d"(port));
+}
+
 static void report(const char *msg, int pass)
 {
     ++g_tests;
@@ -325,9 +330,16 @@ static void test_ioapic_simultaneous(void)
 
 static void enable_apic(void)
 {
+    printf("enabling apic\n");
     apic_write(0xf0, 0x1ff); /* spurious vector register */
 }
 
+static void mask_pic_interrupts(void)
+{
+    outb(0xff, 0x21);
+    outb(0xff, 0xa1);
+}
+
 int main()
 {
     setup_vm();
@@ -337,6 +349,7 @@ int main()
 
     test_lapic_existence();
 
+    mask_pic_interrupts();
     enable_apic();
     init_idt();
 
Signature · 1 line
1.6.4.1
author
#2 lore raw

PATCH 2/2 test-device: add support for irq injection

In reply to Avi Kivity

This allows apic.flat to pass.

---
 hw/pc.c |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)
hw/pc.c +13 -5
index 360dbfb..ea31b0f 100644
@@ -1131,12 +1131,20 @@ static uint32_t test_device_memsize_read(void *opaque, uint32_t addr)
     return (intptr_t)opaque;
 }
 
-static void create_test_device(ram_addr_t ram_size)
+static void test_device_irq_line(void *opaque, uint32_t addr, uint32_t data)
+{
+    qemu_irq *isa_irq = opaque;
+
+    qemu_set_irq(isa_irq[addr - 0x2000], !!data);
+}
+
+static void create_test_device(ram_addr_t ram_size, qemu_irq *isa_irq)
 {
     register_ioport_write(0xf1, 1, 1, test_device_serial_write, NULL);
     register_ioport_write(0xf4, 1, 4, test_device_exit, NULL);
     register_ioport_read(0xd1, 1, 4, test_device_memsize_read,
                          (void *)(intptr_t)ram_size);
+    register_ioport_write(0x2000, 24, 1, test_device_irq_line, isa_irq);
 }
 
 /* PC hardware initialisation */
@@ -1169,10 +1177,6 @@ static void pc_init1(ram_addr_t ram_size,
     void *fw_cfg;
     extern int testdevice;
 
-    if (testdevice) {
-        create_test_device(ram_size);
-    }
-
     if (ram_size >= 0xe0000000 ) {
         above_4g_mem_size = ram_size - 0xe0000000;
         below_4g_mem_size = 0xe0000000;
@@ -1499,6 +1503,10 @@ static void pc_init1(ram_addr_t ram_size,
         assigned_dev_load_option_roms(pci_option_rom_offset);
     }
 #endif /* USE_KVM_DEVICE_ASSIGNMENT */
+
+    if (testdevice) {
+        create_test_device(ram_size, isa_irq);
+    }
 }
 
 static void pc_init_pci(ram_addr_t ram_size,
Signature · 1 line
1.6.4.1