diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index 051045c727..87c84d637e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -158,7 +158,20 @@ error_code sys_memory_get_page_attribute(u32 addr, vm::ptr attr attr->attribute = 0x40000ull; // SYS_MEMORY_PROT_READ_WRITE (TODO) attr->access_right = 0xFull; // SYS_MEMORY_ACCESS_RIGHT_ANY (TODO) - attr->page_size = 4096; + + if (vm::check_addr(addr, 1, vm::page_1m_size)) + { + attr->page_size = 0x100000; + } + else if (vm::check_addr(addr, 1, vm::page_64k_size)) + { + attr->page_size = 0x10000; + } + else + { + attr->page_size = 4096; + } + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index 573e04330f..a24a08be2e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -202,7 +202,7 @@ error_code sys_mmapper_free_shared_memory(u32 mem_id) // Conditionally remove memory ID const auto mem = idm::withdraw(mem_id, [&](lv2_memory& mem) -> CellError { - if (mem.addr.compare_and_swap_test(0, -1)) + if (!mem.addr.compare_and_swap_test(0, -1)) { return CELL_EBUSY; } @@ -271,7 +271,7 @@ error_code sys_mmapper_search_and_map(u32 start_addr, u32 mem_id, u64 flags, vm: const auto area = vm::get(vm::any, start_addr); - if (!area || start_addr != area->addr || start_addr < 0x30000000 || start_addr >= 0xC0000000) + if (!area || start_addr < 0x30000000 || start_addr >= 0xC0000000) { return CELL_EINVAL; }