diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index 77dc070a12..5248d31ef6 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -235,7 +235,7 @@ error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u6 case 0x40000000: case 0x80000000: { - if (const auto area = vm::find_map(static_cast(size), static_cast(alignment), flags & SYS_MEMORY_PAGE_SIZE_MASK)) + if (const auto area = vm::find_map(static_cast(size), static_cast(alignment), vm::mapping_comp | (flags & SYS_MEMORY_PAGE_SIZE_MASK))) { sys_mmapper.warning("sys_mmapper_allocate_address(): Found VM 0x%x area (vsize=0x%x)", area->addr, size); @@ -638,7 +638,7 @@ error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr) const auto mem = vm::get(vm::any, addr); - if (!mem || mem->addr != addr) + if (!mem || mem->addr != addr || !(mem->flags & vm::mapping_comp)) { return {CELL_EINVAL, addr}; } @@ -733,7 +733,7 @@ error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id, const auto area = vm::get(vm::any, addr); - if (!area || addr < 0x20000000 || addr >= 0xC0000000) + if (!area || !(area->flags & vm::mapping_comp)) { return CELL_EINVAL; } @@ -813,7 +813,7 @@ error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_i const auto area = vm::get(vm::any, start_addr); - if (!area || start_addr != area->addr || start_addr < 0x20000000 || start_addr >= 0xC0000000) + if (!area || start_addr != area->addr || !(area->flags & vm::mapping_comp)) { return {CELL_EINVAL, start_addr}; } @@ -894,7 +894,7 @@ error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr= 0xC0000000) + if (!area || !(area->flags & vm::mapping_comp)) { return {CELL_EINVAL, addr}; } @@ -943,7 +943,7 @@ error_code sys_mmapper_enable_page_fault_notification(ppu_thread& ppu, u32 start sys_mmapper.warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, event_queue_id=0x%x)", start_addr, event_queue_id); auto mem = vm::get(vm::any, start_addr); - if (!mem || start_addr != mem->addr || start_addr < 0x20000000 || start_addr >= 0xC0000000) + if (!mem || start_addr != mem->addr || !(mem->flags & vm::mapping_comp)) { return {CELL_EINVAL, start_addr}; } diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index f6b0e59b3b..be1d24f3c3 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1286,7 +1286,7 @@ namespace vm return true; } - static constexpr u64 process_block_flags(u64 flags) + static constexpr u64 process_block_flags(u64 flags, bool is_savestate = false, u32 addr = 0) { if ((flags & block_size_mask) == 0) { @@ -1302,6 +1302,20 @@ namespace vm flags &= ~stack_guarded; } + if (is_savestate) + { + // For backwards compatibility + const s32 version = GET_SERIALIZATION_VERSION(lv2_memory); + + if (version < 4) + { + if (addr >= 0x20000000 && addr < 0xC0000000) + { + flags |= mapping_comp; + } + } + } + return flags; } @@ -1811,6 +1825,8 @@ namespace vm void block_t::save(utils::serial& ar, std::map& shared) { + USING_SERIALIZATION_VERSION(lv2_memory); + auto& m_map = (m.*block_map)(); ar(addr, size, flags); @@ -1853,7 +1869,7 @@ namespace vm : m_id(init_block_id()) , addr(ar) , size(ar) - , flags(process_block_flags(ar.pop())) + , flags(process_block_flags(ar.pop(), true, addr)) { if (flags & preallocated) { diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index ab43e3cec8..63f60c28a2 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -132,6 +132,7 @@ namespace vm bf0_0x1 = 0x1, // TODO: document bf0_0x2 = 0x2, // TODO: document rsx_incomp = 0x4, // Block is not compatible for RSX mappings, despite 1MB pages + mapping_comp = 0x8, // Block is compatible for sys_mmapper mappings bf0_mask = bf0_0x1 | bf0_0x2, }; diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 753037b3b8..746097a32f 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -48,9 +48,14 @@ SERIALIZATION_VER(lv2_vm, 4, 1) SERIALIZATION_VER(lv2_net, 5, 1, 2/*TCP Feign conection loss*/, 3/*P2PS stream_disconnected status*/) SERIALIZATION_VER(lv2_fs, 6, 1, 2/*NPDRM key saving*/) SERIALIZATION_VER(lv2_prx_overlay, 7, 2) -SERIALIZATION_VER(lv2_memory, 8, 3) +SERIALIZATION_VER(lv2_memory, 8, 3, 4/*sys_mmapper strict mapping*/) SERIALIZATION_VER(lv2_config, 9, 1) +namespace vm +{ + SERIALIZATION_VER(lv2_memory, 8, 3, 4/*sys_mmapper string mapping*/) +} + namespace rsx { SERIALIZATION_VER(rsx, 10, 1, 2/*Pending flip*/, 3/*avconf scan_mode*/)