From 95894198bf8691a095021819da1224e05e8a4911 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 18:26:10 +0200 Subject: [PATCH] Genoa Unknown 486: Reset BIOS memory state on soft reset, fixes hangs on soft reset after saving CMOS Setup. --- src/chipset/compaq_386.c | 12 +++++++++--- src/cpu/x86.c | 4 ++-- src/include/86box/device.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/chipset/compaq_386.c b/src/chipset/compaq_386.c index 6a015937e..a0bd036f3 100644 --- a/src/chipset/compaq_386.c +++ b/src/chipset/compaq_386.c @@ -752,7 +752,7 @@ compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) { if (port == 0x0c02) { if (val) - mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); else mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); @@ -760,6 +760,12 @@ compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) } } +static void +compaq_genoa_reset(void *priv) +{ + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); +} + static void * compaq_genoa_init(UNUSED(const device_t *info)) { @@ -787,11 +793,11 @@ const device_t compaq_386_device = { const device_t compaq_genoa_device = { .name = "Compaq Genoa Memory Control", .internal_name = "compaq_genoa", - .flags = 0, + .flags = DEVICE_SOFTRESET, .local = 0, .init = compaq_genoa_init, .close = NULL, - .reset = NULL, + .reset = compaq_genoa_reset, { .available = NULL }, .speed_changed = NULL, .force_redraw = NULL, diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 32b274f06..5435f366d 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -240,7 +240,6 @@ reset_common(int hard) if (!hard && reset_on_hlt) { hlt_reset_pending++; - pclog("hlt_reset_pending = %i\n", hlt_reset_pending); if (hlt_reset_pending == 2) hlt_reset_pending = 0; else @@ -352,7 +351,8 @@ reset_common(int hard) /* If we have an AT or PS/2 keyboard controller, make sure the A20 state is correct. */ device_reset_all(DEVICE_KBC); - } + } else + device_reset_all(DEVICE_SOFTRESET); if (!is286) reset_808x(hard); diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 1a2a6fd8b..67a30b1c8 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -101,6 +101,7 @@ enum { DEVICE_COM = 0x100000, /* requires a serial port */ DEVICE_LPT = 0x200000, /* requires a parallel port */ DEVICE_KBC = 0x400000, /* is a keyboard controller */ + DEVICE_SOFTRESET = 0x800000, /* requires to be reset on soft reset */ DEVICE_ONBOARD = 0x40000000, /* is on-board */ DEVICE_PIT = 0x80000000, /* device is a PIT */