diff --git a/core/hw/mem/_vmem.cpp b/core/hw/mem/_vmem.cpp index b294ccda6..4f23bed76 100644 --- a/core/hw/mem/_vmem.cpp +++ b/core/hw/mem/_vmem.cpp @@ -547,10 +547,6 @@ static void _vmem_term_mappings() aica_ram.data = NULL; } } - else - { - vmem_platform_delete_mappings(); - } } void _vmem_init_mappings() @@ -583,7 +579,6 @@ void _vmem_init_mappings() const vmem_mapping mem_mappings[] = { {0x00000000, 0x00800000, 0, 0, false}, // Area 0 -> unused {0x00800000, 0x01000000, MAP_ARAM_START_OFFSET, ARAM_SIZE, false}, // Aica - {0x20000000, 0x20000000+ARAM_SIZE, MAP_ARAM_START_OFFSET, ARAM_SIZE, true}, {0x01000000, 0x04000000, 0, 0, false}, // More unused {0x04000000, 0x05000000, MAP_VRAM_START_OFFSET, VRAM_SIZE, true}, // Area 1 (vram, 16MB, wrapped on DC as 2x8MB) {0x05000000, 0x06000000, 0, 0, false}, // 32 bit path (unused) @@ -592,6 +587,8 @@ void _vmem_init_mappings() {0x08000000, 0x0C000000, 0, 0, false}, // Area 2 {0x0C000000, 0x10000000, MAP_RAM_START_OFFSET, RAM_SIZE, true}, // Area 3 (main RAM + 3 mirrors) {0x10000000, 0x20000000, 0, 0, false}, // Area 4-7 (unused) + // This is outside of the 512MB addr space + {0x20000000, 0x20800000, MAP_ARAM_START_OFFSET, ARAM_SIZE, true}, // writable aica ram }; vmem_platform_create_mappings(&mem_mappings[0], ARRAY_SIZE(mem_mappings)); diff --git a/core/hw/mem/_vmem.h b/core/hw/mem/_vmem.h index 007d92f4f..d83705497 100644 --- a/core/hw/mem/_vmem.h +++ b/core/hw/mem/_vmem.h @@ -22,8 +22,6 @@ void vmem_platform_reset_mem(void *ptr, unsigned size_bytes); void vmem_platform_ondemand_page(void *address, unsigned size_bytes); // To create the mappings in the address space. void vmem_platform_create_mappings(const vmem_mapping *vmem_maps, unsigned nummaps); -// Delete (unmap) the previously mapped regions -void vmem_platform_delete_mappings(); // Just tries to wipe as much as possible in the relevant area. void vmem_platform_destroy(); // Given a block of data in the .text section, prepares it for JIT action. diff --git a/core/linux/posix_vmem.cpp b/core/linux/posix_vmem.cpp index c3b963504..921dfd16c 100644 --- a/core/linux/posix_vmem.cpp +++ b/core/linux/posix_vmem.cpp @@ -235,14 +235,6 @@ void vmem_platform_create_mappings(const vmem_mapping *vmem_maps, unsigned numma } } -void vmem_platform_delete_mappings() -{ - if (vmem_4gb_space) - vmem_platform_reset_mem(virt_ram_base, 0x100000000); - else - vmem_platform_reset_mem(virt_ram_base, 0x20000000); -} - // Prepares the code region for JIT operations, thus marking it as RWX bool vmem_platform_prepare_jit_block(void *code_area, unsigned size, void **code_area_rwx) { // Try to map is as RWX, this fails apparently on OSX (and perhaps other systems?) diff --git a/core/windows/win_vmem.cpp b/core/windows/win_vmem.cpp index 42cb06d45..fbd5aa953 100644 --- a/core/windows/win_vmem.cpp +++ b/core/windows/win_vmem.cpp @@ -66,7 +66,11 @@ static std::vector mapped_regions; // Plase read the POSIX implementation for more information. On Windows this is // rather straightforward. -VMemType vmem_platform_init(void **vmem_base_addr, void **sh4rcb_addr) { +VMemType vmem_platform_init(void **vmem_base_addr, void **sh4rcb_addr) +{ + unmapped_regions.reserve(32); + mapped_regions.reserve(32); + // Firt let's try to allocate the in-memory file mem_handle = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, RAM_SIZE_MAX + VRAM_SIZE_MAX + ARAM_SIZE_MAX, 0); @@ -116,7 +120,12 @@ void vmem_platform_create_mappings(const vmem_mapping *vmem_maps, unsigned numma // we unmap the whole thing only to remap it later. // Unmap the whole section - vmem_platform_delete_mappings(); + for (void *p : mapped_regions) + mem_region_unmap_file(p, 0); + mapped_regions.clear(); + for (void *p : unmapped_regions) + mem_region_release(p, 0); + unmapped_regions.clear(); for (unsigned i = 0; i < nummaps; i++) { unsigned address_range_size = vmem_maps[i].end_address - vmem_maps[i].start_address; @@ -146,16 +155,6 @@ void vmem_platform_create_mappings(const vmem_mapping *vmem_maps, unsigned numma } } -void vmem_platform_delete_mappings() -{ - for (void *p : mapped_regions) - mem_region_unmap_file(p, 0); - mapped_regions.clear(); - for (void *p : unmapped_regions) - mem_region_release(p, 0); - unmapped_regions.clear(); -} - typedef void* (*mapper_fn) (void *addr, unsigned size); // This is a tempalted function since it's used twice