From ef42bb7e581a8be1e50a71d7ce20cdad85887278 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 17 Apr 2020 01:38:42 +0200 Subject: [PATCH] Some slight PIIX and IDE fixes. --- src/disk/hdc_ide.c | 25 +++++++++++++++---------- src/intel_piix.c | 3 +++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index ea8f05566..8cffe3dbd 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1194,6 +1194,9 @@ ide_writew(uint16_t addr, uint16_t val, void *priv) case 0x0: /* Data */ ide_write_data(ide, val, 2); break; + case 0x7: + ide_writeb(addr, val & 0xff, priv); + break; default: ide_writeb(addr, val & 0xff, priv); ide_writeb(addr + 1, (val >> 8) & 0xff, priv); @@ -1228,6 +1231,9 @@ ide_writel(uint16_t addr, uint32_t val, void *priv) else ide_writew(addr + 2, (val >> 16) & 0xffff, priv); break; + case 0x6: case 0x7: + ide_writew(addr, val & 0xffff, priv); + break; default: ide_writew(addr, val & 0xffff, priv); ide_writew(addr + 2, (val >> 16) & 0xffff, priv); @@ -1891,6 +1897,9 @@ ide_readw(uint16_t addr, void *priv) case 0x0: /* Data */ temp = ide_read_data(ide, 2); break; + case 0x7: + temp = ide_readb(addr, priv); + break; default: temp = ide_readb(addr, priv) | (ide_readb(addr + 1, priv) << 8); break; @@ -1923,6 +1932,9 @@ ide_readl(uint16_t addr, void *priv) else temp = temp2 | (ide_readw(addr + 2, priv) << 16); break; + case 0x6: case 0x7: + temp = ide_readw(addr, priv); + break; default: temp = ide_readw(addr, priv) | (ide_readw(addr + 2, priv) << 16); break; @@ -2367,11 +2379,7 @@ ide_set_handlers(uint8_t board) return; if (ide_boards[board]->base_main) { - io_sethandler(ide_boards[board]->base_main, 1, - ide_readb, ide_readw, ide_readl, - ide_writeb, ide_writew, ide_writel, - ide_boards[board]); - io_sethandler(ide_boards[board]->base_main + 1, 7, + io_sethandler(ide_boards[board]->base_main, 8, ide_readb, ide_readw, ide_readl, ide_writeb, ide_writew, ide_writel, ide_boards[board]); @@ -2393,15 +2401,12 @@ ide_remove_handlers(uint8_t board) return; if (ide_boards[board]->base_main) { - io_removehandler(ide_boards[board]->base_main, 1, - ide_readb, ide_readw, ide_readl, - ide_writeb, ide_writew, ide_writel, - ide_boards[board]); - io_removehandler(ide_boards[board]->base_main + 1, 7, + io_removehandler(ide_boards[board]->base_main, 8, ide_readb, ide_readw, ide_readl, ide_writeb, ide_writew, ide_writel, ide_boards[board]); } + if (ide_boards[board]->side_main) { io_removehandler(ide_boards[board]->side_main, 1, ide_read_alt_status, NULL, NULL, diff --git a/src/intel_piix.c b/src/intel_piix.c index 95c592e0e..ebd3d83ff 100644 --- a/src/intel_piix.c +++ b/src/intel_piix.c @@ -1229,6 +1229,9 @@ piix_reset_hard(piix_t *dev) else fregs[0x09] = 0x80; fregs[0x0a] = 0x01; fregs[0x0b] = 0x01; + if (dev->type == 5) { + fregs[0x10] = fregs[0x14] = fregs[0x18] = fregs[0x1c] = 0x01; + } fregs[0x20] = 0x01; if (dev->type == 5) { fregs[0x3c] = 0x0e;