From: Toni Wilen Date: Sat, 1 Aug 2015 07:00:45 +0000 (+0300) Subject: Autoconfig memory bank validation. X-Git-Tag: 3200~120 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=67ed9e200a4903cd17379356dd6a9f60fd6d777e;p=francis%2Fwinuae.git Autoconfig memory bank validation. --- diff --git a/cd32_fmv.cpp b/cd32_fmv.cpp index 6538e723..8177b35f 100644 --- a/cd32_fmv.cpp +++ b/cd32_fmv.cpp @@ -1551,8 +1551,11 @@ addrbank *cd32_fmv_init (uaecptr start) write_log (_T("CD32 FMV mapped @$%x\n"), start); if (start != fmv_start) { write_log(_T("CD32 FMV invalid base address!\n")); - return &fmv_rom_bank; + return &expamem_null; } + if (!validate_banks_z2(&fmv_bank, fmv_start >> 16, expamem_z2_size >> 16)) + return &expamem_null; + z = read_rom_name(currprefs.cartfile); if (!z) { int ids[] = { 74, 23, -1 }; @@ -1578,7 +1581,7 @@ addrbank *cd32_fmv_init (uaecptr start) } if (!fmv_rom_bank.baseaddr) { write_log(_T("CD32 FMV without ROM is not supported.\n")); - return &fmv_rom_bank; + return &expamem_null; } if (!audioram) audioram = xmalloc(uae_u8, 262144); @@ -1597,7 +1600,6 @@ addrbank *cd32_fmv_init (uaecptr start) mpeg_decoder = mpeg2_init(); mpeg_info = mpeg2_info(mpeg_decoder); } - fmv_bank.mask = fmv_board_size - 1; map_banks(&fmv_rom_bank, (fmv_start + ROM_BASE) >> 16, fmv_rom_size >> 16, 0); map_banks(&fmv_ram_bank, (fmv_start + RAM_BASE) >> 16, fmv_ram_size >> 16, 0); diff --git a/pci.cpp b/pci.cpp index 0e3e65a0..7a82ed52 100644 --- a/pci.cpp +++ b/pci.cpp @@ -953,13 +953,15 @@ static void REGPARAM2 pci_bridge_wput(uaecptr addr, uae_u32 b) { case 0x44: if (pcib->type == PCI_BRIDGE_PROMETHEUS) { - map_banks(&pci_io_bank, (expamem_z3_pointer) >> 16, 0xf0000 >> 16, 0); - map_banks(&pci_mem_bank, (expamem_z3_pointer + 0x100000) >> 16, (511 * 1024 * 1024) >> 16, 0); - map_banks(&pci_config_bank, (expamem_z3_pointer + 0xf0000) >> 16, 0x10000 >> 16, 0); + if (validate_banks_z3(&pci_io_bank, (expamem_z3_pointer) >> 16, expamem_z3_size >> 16)) { + map_banks_z3(&pci_io_bank, (expamem_z3_pointer) >> 16, 0xf0000 >> 16); + map_banks_z3(&pci_mem_bank, (expamem_z3_pointer + 0x100000) >> 16, (511 * 1024 * 1024) >> 16); + map_banks_z3(&pci_config_bank, (expamem_z3_pointer + 0xf0000) >> 16, 0x10000 >> 16); + } pcib->baseaddress_offset = pcib->baseaddress; pcib->io_offset = expamem_z3_pointer; } else if (pcib->type == PCI_BRIDGE_MEDIATOR) { - map_banks(&pci_mem_bank, expamem_z3_pointer >> 16, expamem_z3_size >> 16, 0); + map_banks_z3(&pci_mem_bank, expamem_z3_pointer >> 16, expamem_z3_size >> 16); pcib->baseaddress_offset = 0; } pcib->baseaddress = expamem_z3_pointer; @@ -1206,9 +1208,11 @@ static void REGPARAM2 pci_bridge_wput_2(uaecptr addr, uae_u32 b) { case 0x44: // Mediator 4000 IO - map_banks(pcib->bank_2, expamem_z3_pointer >> 16, 0x800000 >> 16, 0); - map_banks(&pci_config_bank, (expamem_z3_pointer + 0x800000) >> 16, 0x400000 >> 16, 0); - map_banks(&pci_io_bank, (expamem_z3_pointer + 0xc00000) >> 16, 0x400000 >> 16, 0); + if (validate_banks_z3(&pci_io_bank, expamem_z3_pointer >> 16, expamem_z3_size >> 16)) { + map_banks(pcib->bank_2, expamem_z3_pointer >> 16, 0x800000 >> 16, 0); + map_banks(&pci_config_bank, (expamem_z3_pointer + 0x800000) >> 16, 0x400000 >> 16, 0); + map_banks(&pci_io_bank, (expamem_z3_pointer + 0xc00000) >> 16, 0x400000 >> 16, 0); + } pcib->baseaddress_2 = expamem_z3_pointer; pcib->baseaddress_end_2 = expamem_z3_pointer + expamem_z3_size; pcib->board_size_2 = expamem_z3_size;