Index: qemu-kvm-0.14.0+dfsg.mod/hw/isa.h
===================================================================
--- qemu-kvm-0.14.0+dfsg.mod.orig/hw/isa.h	2011-06-01 14:43:57.000000000 +0200
+++ qemu-kvm-0.14.0+dfsg.mod/hw/isa.h	2011-06-01 14:44:25.000000000 +0200
@@ -35,6 +35,7 @@
 ISADevice *isa_create_simple(const char *name);
 
 extern target_phys_addr_t isa_mem_base;
+extern int isa_psaux;
 
 void isa_mmio_init(target_phys_addr_t base, target_phys_addr_t size);
 
Index: qemu-kvm-0.14.0+dfsg.mod/hw/pckbd.c
===================================================================
--- qemu-kvm-0.14.0+dfsg.mod.orig/hw/pckbd.c	2011-06-01 14:43:57.000000000 +0200
+++ qemu-kvm-0.14.0+dfsg.mod/hw/pckbd.c	2011-06-01 19:02:47.000000000 +0200
@@ -126,6 +126,8 @@
 #define KBD_PENDING_KBD         1
 #define KBD_PENDING_AUX         2
 
+int isa_psaux = 1;
+
 typedef struct KBDState {
     uint8_t write_cmd; /* if non zero, write data to port 60 is expected */
     uint8_t status;
@@ -169,7 +171,7 @@
         }
     }
     qemu_set_irq(s->irq_kbd, irq_kbd_level);
-    qemu_set_irq(s->irq_mouse, irq_mouse_level);
+    if (s->mouse) qemu_set_irq(s->irq_mouse, irq_mouse_level);
 }
 
 static void kbd_update_kbd_irq(void *opaque, int level)
@@ -205,10 +207,11 @@
 
 static void kbd_queue(KBDState *s, int b, int aux)
 {
-    if (aux)
-        ps2_queue(s->mouse, b);
-    else
+    if (aux) {
+        if (s->mouse) ps2_queue(s->mouse, b);
+    } else {
         ps2_queue(s->kbd, b);
+    }
 }
 
 static void outport_write(KBDState *s, uint32_t val)
@@ -311,12 +314,13 @@
 static uint32_t kbd_read_data(void *opaque, uint32_t addr)
 {
     KBDState *s = opaque;
-    uint32_t val;
+    uint32_t val = 0;
 
-    if (s->pending == KBD_PENDING_AUX)
-        val = ps2_read_data(s->mouse);
-    else
+    if (s->pending == KBD_PENDING_AUX) {
+        if (s->mouse) val = ps2_read_data(s->mouse);
+    } else {
         val = ps2_read_data(s->kbd);
+    }
 
     DPRINTF("kbd: read data=0x%02x\n", val);
     return val;
@@ -342,13 +346,13 @@
         kbd_queue(s, val, 0);
         break;
     case KBD_CCMD_WRITE_AUX_OBUF:
-        kbd_queue(s, val, 1);
+        if (s->mouse) kbd_queue(s, val, 1);
         break;
     case KBD_CCMD_WRITE_OUTPORT:
         outport_write(s, val);
         break;
     case KBD_CCMD_WRITE_MOUSE:
-        ps2_write_mouse(s->mouse, val);
+        if (s->mouse) ps2_write_mouse(s->mouse, val);
         break;
     default:
         break;
@@ -420,7 +424,7 @@
     int s_io_memory;
 
     s->irq_kbd = kbd_irq;
-    s->irq_mouse = mouse_irq;
+    if (isa_psaux) s->irq_mouse = mouse_irq;
     s->mask = mask;
 
     vmstate_register(NULL, 0, &vmstate_kbd, s);
@@ -429,7 +433,7 @@
     cpu_register_physical_memory(base, size, s_io_memory);
 
     s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
-    s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
+    if (isa_psaux) s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
     qemu_register_reset(kbd_reset, s);
 }
 
@@ -469,7 +473,7 @@
     KBDState *s = &(DO_UPCAST(ISAKBDState, dev, dev)->kbd);
 
     isa_init_irq(dev, &s->irq_kbd, 1);
-    isa_init_irq(dev, &s->irq_mouse, 12);
+    if (isa_psaux) isa_init_irq(dev, &s->irq_mouse, 12);
 
     register_ioport_read(0x60, 1, 1, kbd_read_data, s);
     register_ioport_write(0x60, 1, 1, kbd_write_data, s);
@@ -479,7 +483,7 @@
     isa_init_ioport(dev, 0x64);
 
     s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
-    s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
+    if (isa_psaux) s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
     qemu_register_reset(kbd_reset, s);
     return 0;
 }
Index: qemu-kvm-0.14.0+dfsg.mod/vl.c
===================================================================
--- qemu-kvm-0.14.0+dfsg.mod.orig/vl.c	2011-06-01 14:43:57.000000000 +0200
+++ qemu-kvm-0.14.0+dfsg.mod/vl.c	2011-06-01 14:44:25.000000000 +0200
@@ -2179,6 +2179,9 @@
             case QEMU_OPTION_portrait:
                 graphic_rotate = 1;
                 break;
+            case QEMU_OPTION_nopsaux:
+                isa_psaux = 0;
+                break;
             case QEMU_OPTION_kernel:
                 kernel_filename = optarg;
                 break;
Index: qemu-kvm-0.14.0+dfsg.mod/qemu-options.hx
===================================================================
--- qemu-kvm-0.14.0+dfsg.mod.orig/qemu-options.hx	2011-02-22 14:34:38.000000000 +0100
+++ qemu-kvm-0.14.0+dfsg.mod/qemu-options.hx	2011-06-01 14:50:35.000000000 +0200
@@ -2366,6 +2366,17 @@
     "                allocate MEGABYTES for kvm mmu shadowing\n",
     QEMU_ARCH_I386)
 
+DEF("no-psaux", 0, QEMU_OPTION_nopsaux, \
+    "-no-psaux Disables the PS/2 mouse port on machines which have it hanging from the i8042.\n",
+    QEMU_ARCH_ALL)
+STEXI
+@item -no-psaux @var{dev}
+@findex -no-psaux
+This option can be used to simulate a computer with only the PS/2 keyboard
+connected. Mostly useful for debugging PS/2 driver issues on i386 but some
+other architectures may use the i8042 harware as well.
+ETEXI
+
 HXCOMM This is the last statement. Insert new options before this line!
 STEXI
 @end table
