VM/sys_mmapper: Fix sys_mmapper error checking

This commit is contained in:
Elad
2026-09-26 14:35:38 +03:00
parent 063586ea81
commit 3aab4c5d59
4 changed files with 31 additions and 9 deletions
+6 -6
View File
@@ -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<u32>(size), static_cast<u32>(alignment), flags & SYS_MEMORY_PAGE_SIZE_MASK))
if (const auto area = vm::find_map(static_cast<u32>(size), static_cast<u32>(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<u3
const auto area = vm::get(vm::any, addr);
if (!area || addr < 0x20000000 || addr >= 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};
}
+18 -2
View File
@@ -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<utils::shm*, usz>& 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<u64>()))
, flags(process_block_flags(ar.pop<u64>(), true, addr))
{
if (flags & preallocated)
{
+1
View File
@@ -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,
};
+6 -1
View File
@@ -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*/)