Make apic.flat test pass again
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(-)
PATCH 1/2 test: Mask PIC interrupts before APIC test
We aren't ready to handle PIC interrupts, so mask them.
Signed-off-by Avi Kivity <[email protected]>
--- kvm/user/test/x86/apic.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
kvm/user/test/x86/apic.c +13 -0
@@ -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) +{ + asmvolatile ("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
PATCH 2/2 test-device: add support for irq injection
In reply to Avi KivityThis allows apic.flat to pass.
Signed-off-by Avi Kivity <[email protected]>
--- hw/pc.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-)
hw/pc.c +13 -5
@@ -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