Fixed the behavior of PS/2-style keyboard controllers when no PS/2 mouse is attached, fixes NetBSD 7.1 hanging.

This commit is contained in:
OBattler
2018-01-06 01:01:50 +01:00
parent 519ab94945
commit 2173f14ec0

View File

@@ -8,7 +8,7 @@
*
* Intel 8042 (AT keyboard controller) emulation.
*
* Version: @(#)keyboard_at.c 1.0.16 2018/01/04
* Version: @(#)keyboard_at.c 1.0.17 2018/01/06
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -130,6 +130,7 @@ uint8_t keyboard_set3_all_break;
/* Bits 0 - 1 = scan code set, bit 6 = translate or not. */
uint8_t keyboard_mode = 0x42;
#define ENABLE_KEYBOARD_AT_LOG 1
#ifdef ENABLE_KEYBOARD_AT_LOG
int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG;
#endif
@@ -655,7 +656,7 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val)
static void
kbd_output_write(atkbd_t *kbd, uint8_t val)
{
kbdlog("Write output port\n");
kbdlog("Write output port: %02X\n", val);
if ((kbd->output_port ^ val) & 0x20) { /*IRQ 12*/
if (val & 0x20)
picint(1 << 12);
@@ -663,7 +664,7 @@ kbd_output_write(atkbd_t *kbd, uint8_t val)
picintc(1 << 12);
}
if ((kbd->output_port ^ val) & 0x10) { /*IRQ 1*/
if (val & 0x20)
if (val & 0x10)
picint(1 << 1);
else
picintc(1 << 1);
@@ -725,6 +726,20 @@ kbd_write64_generic(void *p, uint8_t val)
kbd_adddata(kbd->input_port | 4 | fdc_ps1_525());
kbd->input_port = ((kbd->input_port + 1) & 3) | (kbd->input_port & 0xfc) | fdc_ps1_525();
return 0;
case 0xd3: /*Write mouse output buffer*/
if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) {
kbdlog("ATkbd: write mouse output buffer\n");
kbd->want60 = 1;
return 0;
}
break;
case 0xd4: /*Write to mouse*/
if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) {
kbdlog("ATkbd: write to mouse\n");
kbd->want60 = 1;
return 0;
}
break;
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
case 0xf4: case 0xf5: case 0xf6: case 0xf7:
@@ -732,7 +747,7 @@ kbd_write64_generic(void *p, uint8_t val)
case 0xfc: case 0xfd: case 0xfe: case 0xff:
kbdlog("ATkbd: pulse\n");
kbd_output_pulse(kbd, val & 0x0f);
break;
return 0;
}
return 1;
@@ -838,13 +853,23 @@ kbd_write64_ibm_mca(void *p, uint8_t val)
atkbd_t *kbd = (atkbd_t *) p;
switch (val) {
case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/
kbdlog("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n");
kbd->status &= 0xf;
kbd->status |= ((((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf) << 4);
return 0;
case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/
kbdlog("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n");
kbd->status &= 0xf;
kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0);
return 0;
case 0xf0: case 0xf1: case 0xf2: case 0xf3:
case 0xf4: case 0xf5: case 0xf6: case 0xf7:
case 0xf8: case 0xf9: case 0xfa: case 0xfb:
case 0xfc: case 0xfd: case 0xfe: case 0xff:
kbdlog("ATkbd: pulse\n");
kbd_output_pulse(kbd, val & 0x03);
break;
return 0;
}
return kbd_write64_generic(kbd, val);
@@ -1012,6 +1037,7 @@ write_register:
case 0xd3: /*Write to mouse output buffer*/
kbdlog("ATkbd: write to mouse output buffer\n");
if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1))
keyboard_at_adddata_mouse(val);
break;
@@ -1019,8 +1045,6 @@ write_register:
kbdlog("ATkbd: write to mouse (%02X)\n", val);
if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1))
mouse_write(val, mouse_p);
else
keyboard_at_adddata_mouse(0xff);
break;
default:
@@ -1295,18 +1319,6 @@ write_register:
kbd->mem[0] &= ~0x10;
break;
case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/
kbdlog("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n");
kbd->status &= 0xf;
kbd->status |= ((((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf) << 4);
break;
case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/
kbdlog("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n");
kbd->status &= 0xf;
kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0);
break;
case 0xd0: /*Read output port*/
kbdlog("ATkbd: read output port\n");
kbd_adddata(kbd->output_port);
@@ -1322,16 +1334,6 @@ write_register:
kbd->want60 = 1;
break;
case 0xd3: /*Write mouse output buffer*/
kbdlog("ATkbd: write mouse output buffer\n");
kbd->want60 = 1;
break;
case 0xd4: /*Write to mouse*/
kbdlog("ATkbd: write to mouse\n");
kbd->want60 = 1;
break;
case 0xdd: /* Disable A20 Address Line */
kbdlog("ATkbd: disable A20 Address Line\n");
kbd->output_port &= ~0x02;