diff options
Diffstat (limited to 'hw/pc.c')
| -rw-r--r-- | hw/pc.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/hw/pc.c b/hw/pc.c index 20dc7fdb51..e7f31d3848 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -365,26 +365,12 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size, rtc_set_memory(s, 0x39, val); } -void ioport_set_a20(int enable) +static void handle_a20_line_change(void *opaque, int irq, int level) { - /* XXX: send to all CPUs ? */ - cpu_x86_set_a20(first_cpu, enable); -} - -int ioport_get_a20(void) -{ - return ((first_cpu->a20_mask >> 20) & 1); -} + CPUState *cpu = opaque; -static void ioport92_write(void *opaque, uint32_t addr, uint32_t val) -{ - ioport_set_a20((val >> 1) & 1); - /* XXX: bit 0 is fast reset */ -} - -static uint32_t ioport92_read(void *opaque, uint32_t addr) -{ - return ioport_get_a20() << 1; + /* XXX: send to all CPUs ? */ + cpu_x86_set_a20(cpu, level); } /***********************************************************/ @@ -818,7 +804,7 @@ void pc_memory_init(ram_addr_t ram_size, ram_addr_t ram_addr, bios_offset, option_rom_offset; ram_addr_t below_4g_mem_size, above_4g_mem_size = 0; int bios_size, isa_bios_size; - void **fw_cfg; + void *fw_cfg; if (ram_size >= 0xe0000000 ) { above_4g_mem_size = ram_size - 0xe0000000; @@ -893,7 +879,7 @@ void pc_memory_init(ram_addr_t ram_size, rom_set_fw(fw_cfg); if (linux_boot) { - load_linux(*fw_cfg, kernel_filename, initrd_filename, kernel_cmdline, below_4g_mem_size); + load_linux(fw_cfg, kernel_filename, initrd_filename, kernel_cmdline, below_4g_mem_size); } for (i = 0; i < nb_option_roms; i++) { @@ -928,6 +914,15 @@ void pc_vga_init(PCIBus *pci_bus) } } +static void cpu_request_exit(void *opaque, int irq, int level) +{ + CPUState *env = cpu_single_env; + + if (env && level) { + cpu_exit(env); + } +} + void pc_basic_device_init(qemu_irq *isa_irq, FDCtrl **floppy_controller, ISADevice **rtc_state) @@ -935,6 +930,9 @@ void pc_basic_device_init(qemu_irq *isa_irq, int i; DriveInfo *fd[MAX_FD]; PITState *pit; + qemu_irq *a20_line; + ISADevice *i8042; + qemu_irq *cpu_exit_irq; register_ioport_write(0x80, 1, 1, ioport80_write, NULL); @@ -944,9 +942,6 @@ void pc_basic_device_init(qemu_irq *isa_irq, qemu_register_boot_set(pc_boot_set, *rtc_state); - register_ioport_read(0x92, 1, 1, ioport92_read, NULL); - register_ioport_write(0x92, 1, 1, ioport92_write, NULL); - pit = pit_init(0x40, isa_reserve_irq(0)); pcspk_init(pit); if (!no_hpet) { @@ -965,8 +960,13 @@ void pc_basic_device_init(qemu_irq *isa_irq, } } - isa_create_simple("i8042"); - DMA_init(0); + a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 1); + i8042 = isa_create_simple("i8042"); + i8042_setup_a20_line(i8042, a20_line); + vmmouse_init(i8042); + + cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1); + DMA_init(0, cpu_exit_irq); for(i = 0; i < MAX_FD; i++) { fd[i] = drive_get(IF_FLOPPY, 0, i); |