X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hw%2Fpc.c;h=ad3d5e032b92560c90d2850fd44203d009c0fef2;hb=1d14ffa97eacd3cb722271eaf6f093038396eac4;hp=dac125c094f591105f4a3d328c656db05a202e6d;hpb=b5ff2d6e2d67a14b01872d852d879a69a83242cd;p=qemu diff --git a/hw/pc.c b/hw/pc.c index dac125c..ad3d5e0 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -41,6 +41,7 @@ int dummy_refresh_clock; static fdctrl_t *floppy_controller; static RTCState *rtc_state; static PITState *pit; +static IOAPICState *ioapic; static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) { @@ -65,6 +66,31 @@ uint64_t cpu_get_tsc(CPUX86State *env) return qemu_get_clock(vm_clock); } +/* IRQ handling */ +int cpu_get_pic_interrupt(CPUState *env) +{ + int intno; + + intno = apic_get_interrupt(env); + if (intno >= 0) { + /* set irq request if a PIC irq is still pending */ + /* XXX: improve that */ + pic_update_irq(isa_pic); + return intno; + } + /* read the irq from the PIC */ + intno = pic_read_irq(isa_pic); + return intno; +} + +static void pic_irq_request(void *opaque, int level) +{ + if (level) + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HARD); + else + cpu_reset_interrupt(cpu_single_env, CPU_INTERRUPT_HARD); +} + /* PC cmos mappings */ #define REG_EQUIPMENT_BYTE 0x14 @@ -390,7 +416,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, unsigned long bios_offset, vga_bios_offset; int bios_size, isa_bios_size; PCIBus *pci_bus; - + linux_boot = (kernel_filename != NULL); /* allocate RAM */ @@ -520,7 +546,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, } } else { vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size, - vga_ram_size); + vga_ram_size, 0, 0); } rtc_state = rtc_init(0x70, 8); @@ -530,10 +556,15 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, register_ioport_read(0x92, 1, 1, ioport92_read, NULL); register_ioport_write(0x92, 1, 1, ioport92_write, NULL); - if (pci_enabled) + if (pci_enabled) { apic_init(cpu_single_env); - pic_init(); + ioapic = ioapic_init(); + } + isa_pic = pic_init(pic_irq_request, cpu_single_env); pit = pit_init(0x40, 0); + if (pci_enabled) { + pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic); + } for(i = 0; i < MAX_SERIAL_PORTS; i++) { if (serial_hds[i]) { @@ -571,18 +602,18 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, if (audio_enabled) { AUD_init(); -#ifdef USE_SB16 if (sb16_enabled) SB16_init (); -#endif #ifdef CONFIG_ADLIB if (adlib_enabled) Adlib_init (); #endif -#ifdef USE_GUS +#ifdef CONFIG_GUS if (gus_enabled) GUS_init (); #endif + if (pci_enabled && es1370_enabled) + es1370_init (pci_bus); } floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);