AT KBC: Do not attempt to remove the I/O handlers if they had not been set first, fixes crash when attempting to use the Compaq Presario 4500.

This commit is contained in:
OBattler
2024-05-09 01:41:24 +02:00
parent 3995d1d786
commit a4fe16c9a0

View File

@@ -164,6 +164,8 @@ kbc_at_port_t *kbc_at_ports[2] = { NULL, NULL };
static uint8_t kbc_ami_revision = '8'; static uint8_t kbc_ami_revision = '8';
static uint8_t kbc_award_revision = 0x42; static uint8_t kbc_award_revision = 0x42;
static uint8_t kbc_handler_set = 0;
static void (*kbc_at_do_poll)(atkbc_t *dev); static void (*kbc_at_do_poll)(atkbc_t *dev);
/* Non-translated to translated scan codes. */ /* Non-translated to translated scan codes. */
@@ -2202,10 +2204,14 @@ kbc_at_close(void *priv)
void void
kbc_at_handler(int set, void *priv) kbc_at_handler(int set, void *priv)
{ {
io_removehandler(0x0060, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv); if (kbc_handler_set) {
io_removehandler(0x0064, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv); io_removehandler(0x0060, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv);
io_removehandler(0x0064, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv);
}
if (set) { kbc_handler_set = set;
if (kbc_handler_set) {
io_sethandler(0x0060, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv); io_sethandler(0x0060, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv);
io_sethandler(0x0064, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv); io_sethandler(0x0064, 1, kbc_at_read, NULL, NULL, kbc_at_write, NULL, NULL, priv);
} }
@@ -2228,6 +2234,7 @@ kbc_at_init(const device_t *info)
if (info->flags & DEVICE_PCI) if (info->flags & DEVICE_PCI)
dev->misc_flags |= FLAG_PCI; dev->misc_flags |= FLAG_PCI;
kbc_handler_set = 0;
kbc_at_handler(1, dev); kbc_at_handler(1, dev);
timer_add(&dev->kbc_poll_timer, kbc_at_poll, dev, 1); timer_add(&dev->kbc_poll_timer, kbc_at_poll, dev, 1);