PCI and ACPI - when resetting all devices, also reset (ie. zero) all of the emulated RAM as well, fixes Windows 2000 after soft reset on later machines such as the ASUS P2B-LS.

This commit is contained in:
OBattler
2025-04-02 08:34:34 +02:00
parent 9592ac8904
commit 2a8e4d5a68
4 changed files with 19 additions and 1 deletions

View File

@@ -1025,8 +1025,10 @@ acpi_reg_write_common_regs(UNUSED(int size), uint16_t addr, uint8_t val, void *p
nvr_reg_write(0x000f, 0xff, dev->nvr);
}
if (sus_typ & SUS_RESET_PCI)
if (sus_typ & SUS_RESET_PCI) {
device_reset_all(DEVICE_PCI);
mem_zero();
}
if (sus_typ & SUS_RESET_CPU)
cpu_alt_reset = 0;

View File

@@ -459,6 +459,7 @@ extern void mem_a20_recalc(void);
extern void mem_init(void);
extern void mem_close(void);
extern void mem_zero(void);
extern void mem_reset(void);
extern void mem_remap_top_ex(int kb, uint32_t start);
extern void mem_remap_top_ex_nomid(int kb, uint32_t start);

View File

@@ -2792,6 +2792,17 @@ mem_init_ram_mapping(mem_mapping_t *mapping, uint32_t base, uint32_t size)
mem_add_ram_mapping(mapping, base, size);
}
void
mem_zero(void)
{
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
if (mem_size > 1048576)
memset(ram2, 0x00, ram2_size + 16);
#endif
memset(ram, 0x00, ram_size + 16);
}
/* Reset the memory state. */
void
mem_reset(void)
@@ -2867,8 +2878,10 @@ mem_reset(void)
return;
}
memset(ram, 0x00, ram_size + 16);
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
if (mem_size > 1048576)
ram2 = &(ram[1 << 30]);
#endif
}
/*

View File

@@ -419,6 +419,8 @@ pci_trc_reset(uint8_t val)
mem_a20_recalc();
flushmmucache();
mem_zero();
}
#ifdef USE_DYNAREC