From patchwork Sat May 15 09:50:33 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Blue Swirl X-Patchwork-Id: 52703 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 90341B7DFE for ; Sat, 15 May 2010 19:53:10 +1000 (EST) Received: from localhost ([127.0.0.1]:55525 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1ODE3O-0004nE-O6 for incoming@patchwork.ozlabs.org; Sat, 15 May 2010 05:53:06 -0400 Received: from [140.186.70.92] (port=41862 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1ODE12-0004lS-Re for qemu-devel@nongnu.org; Sat, 15 May 2010 05:50:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1ODE0w-00015M-Qt for qemu-devel@nongnu.org; Sat, 15 May 2010 05:50:40 -0400 Received: from mail-pv0-f173.google.com ([74.125.83.173]:65138) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1ODE0w-00012o-GB for qemu-devel@nongnu.org; Sat, 15 May 2010 05:50:34 -0400 Received: by mail-pv0-f173.google.com with SMTP id 30so551289pvc.4 for ; Sat, 15 May 2010 02:50:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=VuUqIWc3lBSxYjfLvoEMH5lv9hTSOtSze6lVk4Zswtg=; b=H4Xx5Mg1w9ahBEO/Tz4NpExN0MEY7Z4yzR2sXvH9LDcbpnuUgz+QDo8nF+vc5RnbLo D3PKDeJzWLogmafGaNIQ+QrdobkQpaEJ5G0nua/LNBANtKxtW9X80jMSgffLKjOxjwtJ oqrwRpgdvKwxIPeQu3U0Ehq6rpoqGHVFGDTxM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=j9CLufyJDofDUI57kukh4wYCjL/QXiD0he1ty35ZeSUfwWcyidwvg3yg13ch+T4Wny dZCgP+v/CQlqRr0DBcbBdQQGNpmTluoKXE8I4PFoYyBBUZJKtgM2pFHGAk7X9nJ1gYz5 H2BNo7Q0Ls2LRVQjY46B0cIWp8+DPiO2hPGIc= MIME-Version: 1.0 Received: by 10.140.255.14 with SMTP id c14mr1626397rvi.270.1273917034032; Sat, 15 May 2010 02:50:34 -0700 (PDT) Received: by 10.141.44.12 with HTTP; Sat, 15 May 2010 02:50:33 -0700 (PDT) Date: Sat, 15 May 2010 12:50:33 +0300 Message-ID: From: Blue Swirl To: qemu-devel X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: [Qemu-devel] [PATCH 2/2] Compile pckbd only once X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Use a qemu_irq to indicate A20 line changes. This changes the A20 logic so that when checking A20 line, i8042 and I/O port 92 may see different values if the other method is used to change the A20 line. Signed-off-by: Blue Swirl --- Makefile.objs | 1 + Makefile.target | 8 ++-- default-configs/i386-softmmu.mak | 1 + default-configs/mips-softmmu.mak | 1 + default-configs/mips64-softmmu.mak | 1 + default-configs/mips64el-softmmu.mak | 1 + default-configs/mipsel-softmmu.mak | 1 + default-configs/ppc-softmmu.mak | 1 + default-configs/ppc64-softmmu.mak | 1 + default-configs/ppcemb-softmmu.mak | 1 + default-configs/sparc64-softmmu.mak | 1 + default-configs/x86_64-softmmu.mak | 1 + hw/pc.c | 20 +++++++--- hw/pc.h | 6 ++-- hw/pckbd.c | 64 +++++++++++++++++++++------------- hw/vmmouse.c | 2 +- 16 files changed, 73 insertions(+), 38 deletions(-) static void vmmouse_update_handler(VMMouseState *s) diff --git a/Makefile.objs b/Makefile.objs index 110f8fd..814b9e1 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -151,6 +151,7 @@ hw-obj-$(CONFIG_SERIAL) += serial.o hw-obj-$(CONFIG_PARALLEL) += parallel.o hw-obj-$(CONFIG_I8254) += i8254.o hw-obj-$(CONFIG_PCSPK) += pcspk.o +hw-obj-$(CONFIG_PCKBD) += pckbd.o hw-obj-$(CONFIG_USB_UHCI) += usb-uhci.o hw-obj-$(CONFIG_FDC) += fdc.o hw-obj-$(CONFIG_ACPI) += acpi.o diff --git a/Makefile.target b/Makefile.target index b62117c..559a44a 100644 --- a/Makefile.target +++ b/Makefile.target @@ -188,7 +188,7 @@ obj-y += rtl8139.o obj-y += e1000.o # Hardware support -obj-i386-y = pckbd.o dma.o +obj-i386-y = dma.o obj-i386-y += vga.o obj-i386-y += mc146818rtc.o i8259.o pc.o obj-i386-y += cirrus_vga.o apic.o ioapic.o piix_pci.o @@ -200,7 +200,7 @@ obj-i386-y += debugcon.o multiboot.o obj-ppc-y = ppc.o obj-ppc-y += vga.o dma.o # PREP target -obj-ppc-y += pckbd.o i8259.o mc146818rtc.o +obj-ppc-y += i8259.o mc146818rtc.o obj-ppc-y += ppc_prep.o # OldWorld PowerMac obj-ppc-y += ppc_oldworld.o @@ -218,7 +218,7 @@ obj-mips-y = mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o obj-mips-y += mips_addr.o mips_timer.o mips_int.o obj-mips-y += dma.o vga.o i8259.o obj-mips-y += g364fb.o jazz_led.o -obj-mips-y += gt64xxx.o pckbd.o mc146818rtc.o +obj-mips-y += gt64xxx.o mc146818rtc.o obj-mips-y += piix4.o cirrus_vga.o obj-microblaze-y = petalogix_s3adsp1800_mmu.o @@ -242,7 +242,7 @@ obj-cris-y += etraxfs_timer.o obj-cris-y += etraxfs_ser.o ifeq ($(TARGET_ARCH), sparc64) -obj-sparc-y = sun4u.o pckbd.o apb_pci.o +obj-sparc-y = sun4u.o apb_pci.o obj-sparc-y += vga.o obj-sparc-y += mc146818rtc.o obj-sparc-y += cirrus_vga.o diff --git a/default-configs/i386-softmmu.mak b/default-configs/i386-softmmu.mak index 4c1495f..92ef535 100644 --- a/default-configs/i386-softmmu.mak +++ b/default-configs/i386-softmmu.mak @@ -8,6 +8,7 @@ CONFIG_SERIAL=y CONFIG_PARALLEL=y CONFIG_I8254=y CONFIG_PCSPK=y +CONFIG_PCKBD=y CONFIG_USB_UHCI=y CONFIG_FDC=y CONFIG_ACPI=y diff --git a/default-configs/mips-softmmu.mak b/default-configs/mips-softmmu.mak index 7793dbc..15015c3 100644 --- a/default-configs/mips-softmmu.mak +++ b/default-configs/mips-softmmu.mak @@ -10,6 +10,7 @@ CONFIG_SERIAL=y CONFIG_PARALLEL=y CONFIG_I8254=y CONFIG_PCSPK=y +CONFIG_PCKBD=y CONFIG_USB_UHCI=y CONFIG_FDC=y CONFIG_ACPI=y diff --git a/default-configs/mips64-softmmu.mak b/default-configs/mips64-softmmu.mak index aa65d92..982462a 100644 --- a/default-configs/mips64-softmmu.mak +++ b/default-configs/mips64-softmmu.mak @@ -10,6 +10,7 @@ CONFIG_SERIAL=y CONFIG_PARALLEL=y CONFIG_I8254=y CONFIG_PCSPK=y +CONFIG_PCKBD=y CONFIG_USB_UHCI=y CONFIG_FDC=y CONFIG_ACPI=y diff --git a/default-configs/mips64el-softmmu.mak b/default-configs/mips64el-softmmu.mak index b9b8c71..c23d186 100644 --- a/default-configs/mips64el-softmmu.mak +++ b/default-configs/mips64el-softmmu.mak @@ -10,6 +10,7 @@ CONFIG_SERIAL=y CONFIG_PARALLEL=y CONFIG_I8254=y CONFIG_PCSPK=y +CONFIG_PCKBD=y CONFIG_USB_UHCI=y CONFIG_FDC=y CONFIG_ACPI=y diff --git a/default-configs/mipsel-softmmu.mak b/default-configs/mipsel-softmmu.mak index e14831e..cd76389 100644 --- a/default-configs/mipsel-softmmu.mak +++ b/default-configs/mipsel-softmmu.mak @@ -10,6 +10,7 @@ CONFIG_SERIAL=y CONFIG_PARALLEL=y CONFIG_I8254=y CONFIG_PCSPK=y +CONFIG_PCKBD=y CONFIG_USB_UHCI=y CONFIG_FDC=y CONFIG_ACPI=y diff --git a/default-configs/ppc-softmmu.mak b/default-configs/ppc-softmmu.mak index 958bf75..03cc20f 100644 --- a/default-configs/ppc-softmmu.mak +++ b/default-configs/ppc-softmmu.mak @@ -8,6 +8,7 @@ CONFIG_M48T59=y CONFIG_VGA_PCI=y CONFIG_SERIAL=y CONFIG_I8254=y +CONFIG_PCKBD=y CONFIG_FDC=y CONFIG_OPENPIC=y CONFIG_PREP_PCI=y diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak index 9896662..8c77133 100644 --- a/default-configs/ppc64-softmmu.mak +++ b/default-configs/ppc64-softmmu.mak @@ -8,6 +8,7 @@ CONFIG_M48T59=y CONFIG_VGA_PCI=y CONFIG_SERIAL=y CONFIG_I8254=y +CONFIG_PCKBD=y CONFIG_FDC=y CONFIG_OPENPIC=y CONFIG_PREP_PCI=y diff --git a/default-configs/ppcemb-softmmu.mak b/default-configs/ppcemb-softmmu.mak index 2e41a94..2a0210d 100644 --- a/default-configs/ppcemb-softmmu.mak +++ b/default-configs/ppcemb-softmmu.mak @@ -8,6 +8,7 @@ CONFIG_M48T59=y CONFIG_VGA_PCI=y CONFIG_SERIAL=y CONFIG_I8254=y +CONFIG_PCKBD=y CONFIG_FDC=y CONFIG_OPENPIC=y CONFIG_PREP_PCI=y diff --git a/default-configs/sparc64-softmmu.mak b/default-configs/sparc64-softmmu.mak index 514d334..1cc3f13 100644 --- a/default-configs/sparc64-softmmu.mak +++ b/default-configs/sparc64-softmmu.mak @@ -6,6 +6,7 @@ CONFIG_PTIMER=y CONFIG_VGA_PCI=y CONFIG_SERIAL=y CONFIG_PARALLEL=y +CONFIG_PCKBD=y CONFIG_FDC=y CONFIG_IDE_CORE=y CONFIG_IDE_QDEV=y diff --git a/default-configs/x86_64-softmmu.mak b/default-configs/x86_64-softmmu.mak index 6662b94..9f3fc71 100644 --- a/default-configs/x86_64-softmmu.mak +++ b/default-configs/x86_64-softmmu.mak @@ -8,6 +8,7 @@ CONFIG_SERIAL=y CONFIG_PARALLEL=y CONFIG_I8254=y CONFIG_PCSPK=y +CONFIG_PCKBD=y CONFIG_USB_UHCI=y CONFIG_FDC=y CONFIG_ACPI=y diff --git a/hw/pc.c b/hw/pc.c index 938b2e0..5d86e4c 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -382,13 +382,15 @@ static void 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 ioport_set_a20(void *opaque, int irq, int level) { + CPUState *cpu = opaque; + /* XXX: send to all CPUs ? */ - cpu_x86_set_a20(first_cpu, enable); + cpu_x86_set_a20(cpu, level); } -int ioport_get_a20(void) +static int ioport_get_a20(void) { return ((first_cpu->a20_mask >> 20) & 1); } @@ -396,7 +398,7 @@ int ioport_get_a20(void) static void ioport92_write(void *opaque, uint32_t addr, uint32_t val) { DPRINTF_IO("write addr %x data %x\n", addr, val); - ioport_set_a20((val >> 1) & 1); + ioport_set_a20(opaque, 0, (val >> 1) & 1); /* XXX: bit 0 is fast reset */ } @@ -835,6 +837,8 @@ static void pc_init1(ram_addr_t ram_size, qemu_irq *i8259; qemu_irq *cmos_s3; qemu_irq *smi_irq; + qemu_irq *a20_line; + ISADevice *i8042; IsaIrqState *isa_irq_state; DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; DriveInfo *fd[MAX_FD]; @@ -978,7 +982,7 @@ static void pc_init1(ram_addr_t ram_size, 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); + register_ioport_write(0x92, 1, 1, ioport92_write, first_cpu); if (pci_enabled) { isa_irq_state->ioapic = ioapic_init(); @@ -1028,7 +1032,11 @@ static void pc_init1(ram_addr_t ram_size, } } - isa_create_simple("i8042"); + a20_line = qemu_allocate_irqs(ioport_set_a20, first_cpu, 1); + i8042 = isa_create_simple("i8042"); + i8042_setup_a20_line(i8042, a20_line); + vmmouse_init(i8042); + DMA_init(0); #ifdef HAS_AUDIO audio_init(pci_enabled ? pci_bus : NULL, isa_irq); diff --git a/hw/pc.h b/hw/pc.h index d11a576..56b1aab 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -3,6 +3,7 @@ #include "qemu-common.h" #include "ioport.h" +#include "isa.h" /* PC-style peripherals (also used by other machines). */ @@ -65,6 +66,8 @@ void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base); void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_phys_addr_t base, ram_addr_t size, target_phys_addr_t mask); +void i8042_isa_mouse_fake_event(void *opaque); +void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out); /* mc146818rtc.c */ @@ -77,9 +80,6 @@ void rtc_set_date(RTCState *s, const struct tm *tm); /* pc.c */ extern int fd_bootchk; -void ioport_set_a20(int enable); -int ioport_get_a20(void); - /* acpi.c */ extern int acpi_enabled; extern char *acpi_tables; diff --git a/hw/pckbd.c b/hw/pckbd.c index e83b8a6..bac07b4 100644 --- a/hw/pckbd.c +++ b/hw/pckbd.c @@ -87,6 +87,12 @@ #define KBD_MODE_KCC 0x40 /* Scan code conversion to PC format */ #define KBD_MODE_RFU 0x80 +/* Output Port Bits */ +#define KBD_OUT_RESET 0x01 /* 1=normal mode, 0=reset */ +#define KBD_OUT_A20 0x02 /* x86 only */ +#define KBD_OUT_OBF 0x10 /* Keyboard output buffer full */ +#define KBD_OUT_MOUSE_OBF 0x20 /* Mouse output buffer full */ + /* Mouse Commands */ #define AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */ #define AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */ @@ -116,6 +122,7 @@ typedef struct KBDState { uint8_t write_cmd; /* if non zero, write data to port 60 is expected */ uint8_t status; uint8_t mode; + uint8_t outport; /* Bitmask of devices with data available. */ uint8_t pending; void *kbd; @@ -123,6 +130,7 @@ typedef struct KBDState { qemu_irq irq_kbd; qemu_irq irq_mouse; + qemu_irq *a20_out; target_phys_addr_t mask; } KBDState; @@ -136,11 +144,14 @@ static void kbd_update_irq(KBDState *s) irq_kbd_level = 0; irq_mouse_level = 0; s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); + s->outport &= ~(KBD_OUT_OBF | KBD_OUT_MOUSE_OBF); if (s->pending) { s->status |= KBD_STAT_OBF; + s->outport |= KBD_OUT_OBF; /* kbd data takes priority over aux data. */ if (s->pending == KBD_PENDING_AUX) { s->status |= KBD_STAT_MOUSE_OBF; + s->outport |= KBD_OUT_MOUSE_OBF; if (s->mode & KBD_MODE_MOUSE_INT) irq_mouse_level = 1; } else { @@ -240,26 +251,20 @@ static void kbd_write_command(void *opaque, uint32_t addr, uint32_t val) kbd_queue(s, 0x00, 0); break; case KBD_CCMD_READ_OUTPORT: - /* XXX: check that */ -#ifdef TARGET_I386 - val = 0x01 | (ioport_get_a20() << 1); -#else - val = 0x01; -#endif - if (s->status & KBD_STAT_OBF) - val |= 0x10; - if (s->status & KBD_STAT_MOUSE_OBF) - val |= 0x20; - kbd_queue(s, val, 0); + kbd_queue(s, s->outport, 0); break; -#ifdef TARGET_I386 case KBD_CCMD_ENABLE_A20: - ioport_set_a20(1); + if (s->a20_out) { + qemu_irq_raise(*s->a20_out); + } + s->outport |= KBD_OUT_A20; break; case KBD_CCMD_DISABLE_A20: - ioport_set_a20(0); + if (s->a20_out) { + qemu_irq_lower(*s->a20_out); + } + s->outport &= ~KBD_OUT_A20; break; -#endif case KBD_CCMD_RESET: qemu_system_reset_request(); break; @@ -313,9 +318,10 @@ static void kbd_write_data(void *opaque, uint32_t addr, uint32_t val) kbd_queue(s, val, 1); break; case KBD_CCMD_WRITE_OUTPORT: -#ifdef TARGET_I386 - ioport_set_a20((val >> 1) & 1); -#endif + s->outport = val; + if (s->a20_out) { + qemu_set_irq(*s->a20_out, (val >> 1) & 1); + } if (!(val & 1)) { qemu_system_reset_request(); } @@ -335,6 +341,7 @@ static void kbd_reset(void *opaque) s->mode = KBD_MODE_KBD_INT | KBD_MODE_MOUSE_INT; s->status = KBD_STAT_CMD | KBD_STAT_UNLOCKED; + s->outport = KBD_OUT_RESET | KBD_OUT_A20; } static const VMStateDescription vmstate_kbd = { @@ -401,9 +408,6 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); -#ifdef TARGET_I386 - vmmouse_init(s->mouse); -#endif qemu_register_reset(kbd_reset, s); } @@ -412,6 +416,21 @@ typedef struct ISAKBDState { KBDState kbd; } ISAKBDState; +void i8042_isa_mouse_fake_event(void *opaque) +{ + ISADevice *dev = opaque; + KBDState *s = &(DO_UPCAST(ISAKBDState, dev, dev)->kbd); + + ps2_mouse_fake_event(s->mouse); +} + +void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out) +{ + KBDState *s = &(DO_UPCAST(ISAKBDState, dev, dev)->kbd); + + s->a20_out = a20_out; +} + static const VMStateDescription vmstate_kbd_isa = { .name = "pckbd", .version_id = 3, @@ -437,9 +456,6 @@ static int i8042_initfn(ISADevice *dev) s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); -#ifdef TARGET_I386 - vmmouse_init(s->mouse); -#endif qemu_register_reset(kbd_reset, s); return 0; } diff --git a/hw/vmmouse.c b/hw/vmmouse.c index bb6e605..afebad9 100644 --- a/hw/vmmouse.c +++ b/hw/vmmouse.c @@ -97,7 +97,7 @@ static void vmmouse_mouse_event(void *opaque, int x, int y, int dz, int buttons_ /* need to still generate PS2 events to notify driver to read from queue */ - ps2_mouse_fake_event(s->ps2_mouse); + i8042_isa_mouse_fake_event(s->ps2_mouse); }